Measured 2026-08-20 by the domain:cli PM seat (session session_019bmVFqoQPq63zhKrxdYG1r) while working the half-state anchor (#9857) under the new "read the anchor's own-lane rows first" standing commitment. Filed unassigned. ⛔ No domain:* set — routing is the triage seat's channel.
The false positive, live right now
#9857 reports:
H9#9591 — pm:on-hold with no Restart-when: body line
#9591's body does carry one. Verbatim from the body:
`Restart-when: the v18 major development cycle opens (first v18 changeset-major accepted on main), or a maintainer instruction pulls it forward`
It is machine-fireable, it is not manual, and it names an executable predicate. The hold is legal. The predicate cannot see it because the line is wrapped in inline-code backticks.
Cause — measured on origin/main, not on a stale worktree
scripts/pm/check-half-states.mjs:739 (H9):
constvalues=[...(issue.body??'').matchAll(/^\s*Restart-when:[\t]*(\S.*)$/gm)]
^\s* allows only whitespace before the directive. A backtick is not whitespace ⇒ no match ⇒ H9 fires. (Had it matched, the trailing backtick would also be captured into the value.)
H4 has the same shape and is stricter — :1053:
for(constlineofString(body??'').matchAll(/^[\t]*Blocked-by:[\t]*(\S.*)$/gm))
[ \t]* rejects a backtick too, and additionally rejects a list bullet — so - Blocked-by: #123 and **Blocked-by:** #123 are both invisible to H4.
⚠️This looks like an untested gap rather than deliberate strictness. The H9 self-tests (:3096-3107) cover the bare form, the closed-upstream form, the executable-predicate form, a mid-body line, and three manual variants — no case covers a decorated line. Nothing in the documented predicate (:108-113) requires the directive to be undecorated. ⛔ But "deliberate or not" is a grading call, not mine.
Why this is worth more than a cosmetic row
The prescribed remedy is destructive. H9's own finding text says:
"Add the line, or apply the protocol's default: a card no mechanism can revive is closed not planned"
#9591 is a maintainer-commissioned v18 Feature (ruling on #9529, 2026-08-18, verbatim 「其他接受你的建议」). A seat that follows the row literally either adds a duplicate line or closes a legitimately-held commissioned card. A false positive whose remedy is "close it" is a different severity class from one that just adds noise.
⚠️ It also corrodes the anchor's own authority in exactly the direction that hurts: this lane audited its 12 pm:on-hold cards this shift and recorded "all carrying Restart-when:, zero illegal holds." The anchor contradicted that audit. Resolving it took a source read — and the audit was right. A seat that trusts the row over its own measurement mis-states its lane; a seat that trusts its memory over the row learns to discount the anchor. Neither is the behaviour the anchor exists to produce.
Backticks are the natural markdown here. The line is a machine-readable directive, so authors code-format it. This will recur, and its frequency is invisible: a decorated line reads as a missing line, and the count of "illegal holds" is inflated by an unknown amount across all six lanes.
Options, ⛔ no recommendation strong enough to pre-empt triage
- A. Relax both anchors to tolerate leading markdown decoration (backtick,
-/* bullet, **) and strip a matching trailing backtick from the captured value. Add a self-test per decoration. Smallest change; keeps every currently-legal card legal. - B. Keep the strictness and make it explicit — document "the directive must start the line bare", and have the finding text say the line may exist but be decorated, so the remedy is "unwrap it", ⛔ never "close it". Cheapest correction to the destructive-remedy half.
- C. A + B — tolerate decoration and soften the remedy text, since a "no line" finding can also be a "line I could not parse" finding.
- D. Accept and let seats resolve row-by-row. ⛔ Weakest: the cost lands on every lane, every sweep, forever.
⛔ What I did NOT do
⛔ Did not close #9591. ⛔ Did not add a duplicate Restart-when: line to it. ⛔ Did not edit check-half-states.mjs. The anchor is report-only by its own header and the remedy here is a code change in someone else's surface.
📌 Separately — two half-states of my own, which are NOT this bug
While checking this I found that #10077 and #10078 carried their Restart-when: / Blocked-by: in a comment rather than the body, because I had declined to edit another seat's card body. Both predicates read issue.body only, so both were genuinely illegal. Fixed by appending the directive to each body, marked as a seat addition with the filer's text untouched. ⇒ Recording it so the two cases are not confused: #9591 is a parser gap, #10077/#10078 were my error.
⚠️ Worth a second look during grading: PR #10075 ("H4/H14/blocking-index read comment-level Blocked-by lines") is open and would change where H4 reads. Whatever is decided here should be decided against that PR, not around it.
Refs: #9857 (the anchor) · #9591 (the live false positive) · #9529 (the ruling that commissioned it) · PR #10075 (comment-level Blocked-by, in flight) · scripts/pm/check-half-states.mjs:739, :1053, :3096-3107
Measured 2026-08-20 by the
domain:cliPM seat (sessionsession_019bmVFqoQPq63zhKrxdYG1r) while working the half-state anchor (#9857) under the new "read the anchor's own-lane rows first" standing commitment. Filed unassigned. ⛔ Nodomain:*set — routing is the triage seat's channel.The false positive, live right now
#9857 reports:
#9591's body does carry one. Verbatim from the body:
It is machine-fireable, it is not
manual, and it names an executable predicate. The hold is legal. The predicate cannot see it because the line is wrapped in inline-code backticks.Cause — measured on
origin/main, not on a stale worktreescripts/pm/check-half-states.mjs:739(H9):^\s*allows only whitespace before the directive. A backtick is not whitespace ⇒ no match ⇒ H9 fires. (Had it matched, the trailing backtick would also be captured into the value.)H4 has the same shape and is stricter —
:1053:[ \t]*rejects a backtick too, and additionally rejects a list bullet — so- Blocked-by: #123and**Blocked-by:** #123are both invisible to H4.:3096-3107) cover the bare form, the closed-upstream form, the executable-predicate form, a mid-body line, and threemanualvariants — no case covers a decorated line. Nothing in the documented predicate (:108-113) requires the directive to be undecorated. ⛔ But "deliberate or not" is a grading call, not mine.Why this is worth more than a cosmetic row
The prescribed remedy is destructive. H9's own finding text says:
#9591 is a maintainer-commissioned v18 Feature (ruling on #9529, 2026-08-18, verbatim 「其他接受你的建议」). A seat that follows the row literally either adds a duplicate line or closes a legitimately-held commissioned card. A false positive whose remedy is "close it" is a different severity class from one that just adds noise.
pm:on-holdcards this shift and recorded "all carryingRestart-when:, zero illegal holds." The anchor contradicted that audit. Resolving it took a source read — and the audit was right. A seat that trusts the row over its own measurement mis-states its lane; a seat that trusts its memory over the row learns to discount the anchor. Neither is the behaviour the anchor exists to produce.Backticks are the natural markdown here. The line is a machine-readable directive, so authors code-format it. This will recur, and its frequency is invisible: a decorated line reads as a missing line, and the count of "illegal holds" is inflated by an unknown amount across all six lanes.
Options, ⛔ no recommendation strong enough to pre-empt triage
-/*bullet,**) and strip a matching trailing backtick from the captured value. Add a self-test per decoration. Smallest change; keeps every currently-legal card legal.⛔ What I did NOT do
⛔ Did not close #9591. ⛔ Did not add a duplicate
Restart-when:line to it. ⛔ Did not editcheck-half-states.mjs. The anchor is report-only by its own header and the remedy here is a code change in someone else's surface.📌 Separately — two half-states of my own, which are NOT this bug
While checking this I found that #10077 and #10078 carried their
Restart-when:/Blocked-by:in a comment rather than the body, because I had declined to edit another seat's card body. Both predicates readissue.bodyonly, so both were genuinely illegal. Fixed by appending the directive to each body, marked as a seat addition with the filer's text untouched. ⇒ Recording it so the two cases are not confused: #9591 is a parser gap, #10077/#10078 were my error.Blocked-bylines") is open and would change where H4 reads. Whatever is decided here should be decided against that PR, not around it.Refs: #9857 (the anchor) · #9591 (the live false positive) · #9529 (the ruling that commissioned it) · PR #10075 (comment-level
Blocked-by, in flight) ·scripts/pm/check-half-states.mjs:739,:1053,:3096-3107