You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
tooling(pm): the claim-side readers — a bulleted Branch: governs, and a Refs-only landing is not H8's full delivery
Three same-file cards, one flight.
#16170 — `claimedBranches` admits an optional markdown list marker before the
directive (`- Branch: …`). Measured live on #15511: `CLAIM_COMMENT_MARKER` has no
list marker either, so on a claim whose first line was an undecorated `Claim:`
and whose branch hung under it in a bullet list the two anchors failed at
different points — the comment WAS a claim and GOVERNED nothing, with nothing in
the artefact looking wrong. The claim marker is deliberately NOT widened with it
(2026-08-11, 不放宽谓词): when both lines carry a bullet the marker misses too and
"no claim comment" is then the true reading, so only the MIXED shape was
malignant and admitting the marker here is what removes it.
#16036 — H8's merged side stops reading a merged `Refs #N`-only PR on a
card-named branch as a FULL delivery. Under the partial-dispatch rule that PR is
a partial landing whose remainder is lawfully re-dispatched, and H8, which reads
no thread, was prescribing "drop `pm:dispatched`" against a card a second dev
holds. A second, narrower reader (`prFullyDeliversCard`) calls H49's own
`refsOnlyLinksFor`, so what H49 owns is exactly what H8 excludes. The shared
`prDeliversCard` relation is untouched: H8's OPEN side, H31 and `claimDelivery`
all need the wide reading, because a `Refs` half still open is live work.
#16037 — the three remaining SKILL.md line-number citations deleted, quoted text
kept, no other sentence moved.
Self-test 2535 -> 2553.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
// Direction 2 — the RE-SCOPED branch, the false-fire this widening could
14612
14718
// otherwise buy. Branch still named for 4321; body now delivers 9999. The
@@ -15832,12 +15938,48 @@ function selfTest() {
15832
15938
t('H20 branch: no directive at all yields nothing', claimedBranches('Claim: seat.\nSession: `session_x`').length, 0);
15833
15939
t('H20 branch: a missing body does not crash', claimedBranches(undefined).length, 0);
15834
15940
15941
+
// -- #16170: the directive written as a markdown BULLET --------------------
15942
+
// Measured live on #15511: a claim whose first line was an undecorated
15943
+
// `Claim:` and whose branch hung under it in a list. The marker matched and
15944
+
// this reader did not, so the comment WAS a claim that GOVERNED nothing —
15945
+
// and nothing in the artefact looked wrong.
15946
+
t('H20 branch: a bulleted directive is read (#16170)', claimedBranches('- Branch: `claude/issue-15511-zh-gap-helptext`').join(','), 'claude/issue-15511-zh-gap-helptext');
15947
+
t('H20 branch: …with `*` as the marker', claimedBranches('* Branch: claude/issue-1-a').join(','), 'claude/issue-1-a');
15948
+
t('H20 branch: …and with `+`, on the plural spelling too', claimedBranches('+ Branches: claude/issue-1-a').join(','), 'claude/issue-1-a');
15949
+
t('H20 branch: …indented under a parent item', claimedBranches(' - Branch: claude/issue-1-a').join(','), 'claude/issue-1-a');
15950
+
t('H20 branch: …and the marker composes with the documented blockquote', claimedBranches('- > Branch: `claude/issue-6752-x`').join(','), 'claude/issue-6752-x');
15951
+
// ⛔ The widening is a LIST MARKER before a `Branch:` DIRECTIVE and nothing
15952
+
// else: a bullet naming any other field, or none, stays out of scope exactly
15953
+
// as an undecorated one does.
15954
+
t('H20 branch: a bullet that is not a `Branch:` line yields nothing', claimedBranches('- Worktree: `claude/issue-1-a`').length, 0);
15955
+
t('H20 branch: …nor does a bulleted prose line that merely names a branch', claimedBranches('- rebased onto claude/issue-9-other yesterday').length, 0);
15956
+
t('H20 branch: a NUMBERED list item is not admitted', claimedBranches('1. Branch: claude/issue-1-a').length, 0);
15957
+
t('H20 branch: a HEADING is not admitted', claimedBranches('## Branch: claude/issue-1-a').length, 0);
15958
+
// ⚠️ A measured RESIDUAL, pinned as a fact rather than as a contract anybody
15959
+
// chose: the ruled anchor admits the marker only BEFORE the optional
15960
+
// blockquote, so the other order — the natural markdown for a bulleted line
15961
+
// INSIDE a blockquote — still yields nothing.
15962
+
t('H20 branch: a blockquoted BULLET (`> - `) is still out — the anchor is marker-then-quote', claimedBranches('> - Branch: `claude/issue-1-a`').length, 0);
15963
+
// ⛔ And the claim MARKER is NOT widened with it (2026-08-11, 不放宽谓词). The
15964
+
// asymmetry is the fix rather than a residue: when BOTH lines carry a bullet
15965
+
// the marker misses too, so the comment is not a claim to any reader here and
15966
+
// the sibling checker's "no claim comment" reading is TRUE. Only the MIXED
15967
+
// shape was malignant, and admitting the marker here is what removes it.
15968
+
t('H20 branch: a bulleted `Claim:` is still not a claim comment', CLAIM_COMMENT_MARKER.test('- Claim: seat.'), false);
15969
+
15835
15970
// The governing claim — the MOST RECENT one, H19's double-check ① reasoning.
15836
15971
const gov = (rows) => governingClaim(rows);
15837
15972
t('H20 claim: a claim comment naming a branch is found', gov(claim8878).branches.join(','), 'claude/issue-8878-dispatch-latency');
15838
15973
t('H20 claim: …and carries its timestamp', gov(claim8878).createdAt, minsAgo20(74));
15839
15974
t('H20 claim: a `Branch:` line in a comment that is NOT a claim is ignored', gov([claimRow(minsAgo20(90), 'Branch: `claude/issue-1-a`')]), null);
15840
15975
t('H20 claim: a claim comment naming NO branch yields nothing to check', gov([claimRow(minsAgo20(90), 'Claim: seat.\nSession: `session_x`')]), null);
15976
+
// #16170 — the MIXED shape, which is the only malignant one: an undecorated
15977
+
// `Claim:` (so the marker matches and the comment IS a claim) with the branch
15978
+
// written as a bullet under it. It governs now.
15979
+
t('H20 claim: the MIXED shape governs — undecorated `Claim:`, bulleted `Branch:` (#16170)', gov([claimRow(minsAgo20(30), 'Claim: this card is held by session `session_x`.\n\n- Branch: `claude/issue-15511-zh-gap-helptext`\n- Worktree: `/home/user/objectstack-15511`')]).branches.join(','), 'claude/issue-15511-zh-gap-helptext');
15980
+
// …while a FULLY bulleted claim governs nothing, the marker having missed it
15981
+
// — and there the sibling's "no claim comment" reading is the true one.
15982
+
t('H20 claim: …and a fully bulleted claim still governs nothing, the marker having missed', gov([claimRow(minsAgo20(30), '- Claim: seat.\n- Branch: `claude/issue-1-a`')]), null);
15841
15983
const reclaimed = [
15842
15984
claimRow(minsAgo20(600), 'Claim: first seat.\nBranch: `claude/issue-8878-abandoned`'),
15843
15985
claimRow(minsAgo20(74), claimBody8878),
@@ -19905,8 +20047,13 @@ Mutual exclusion: \`get_comments\` page 747 → \`[]\`, page 746 = my own R+117
19905
20047
t('H49 adjacency: H8 is SILENT on a `Refs` PR whose head is not named for the card', h8MergedPrStillDispatched(TAKEN49, LANDED49, []), null);
19906
20048
t('H49 adjacency: …which is the carrier this row exists for', typeof h49PartialLandingUnreleased(TAKEN49, LANDED49, [], CLAIMED49), 'string');
t('H49 adjacency: on a head NAMED for the card H8 fires through its branch fallback', typeof h8MergedPrStillDispatched(TAKEN49, ON_CARD_BRANCH49, []), 'string');
19909
-
t('H49 adjacency: …and this row fires beside it — two readings, no double silence', typeof h49PartialLandingUnreleased(TAKEN49, ON_CARD_BRANCH49, [], CLAIMED49), 'string');
20050
+
// ⚖️ #16036 flipped the first of these. H8's merged side used to fire here
20051
+
// through its branch fallback — a full-delivery verdict on a PARTIAL landing,
20052
+
// prescribing the destructive de-label against a lawfully re-dispatched
20053
+
// remainder — and its `Refs`-only exclusion now leaves this row the sole
20054
+
// reader of BOTH head shapes.
20055
+
t('H49 adjacency: on a head NAMED for the card H8 is silent too, since #16036', h8MergedPrStillDispatched(TAKEN49, ON_CARD_BRANCH49, []), null);
20056
+
t('H49 adjacency: …and this row fires there — one reading now, and no silence', typeof h49PartialLandingUnreleased(TAKEN49, ON_CARD_BRANCH49, [], CLAIMED49), 'string');
19910
20057
t('H49 adjacency: …and reads the thread H8 cannot — a fresh claim stands THIS row down', h49PartialLandingUnreleased(TAKEN49, ON_CARD_BRANCH49, [], [cm49(CLAIM49, T49_AFTER)]), null);
19911
20058
t('H49 adjacency: H1 is silent on the carrier (the card HAS an assignee)', h1DispatchedNoAssignee(TAKEN49), false);
19912
20059
t('H49 adjacency: H2 is silent (the claim comment is complete)', h2AssigneeNoClaimComment(TAKEN49, [CLAIM49]), false);
0 commit comments