Arising from #13211 (open question Q2, option C). Filed rather than dispatched — the change is blocked on two independent things that are not a seat's to decide. ⛔ This card is not dispatchable as written.
The finding
H9 in scripts/pm/check-half-states.mjs makes pm:on-hold legal only with a machine-fireable exit:
H9 pm:on-hold without a machine-fireable Restart-when: line in EITHER channel … the hold state legal ONLY with a machine-readable exit: Restart-when: closed <owner/repo>#N … or a one-line executable predicate. A hold nothing can fire is indistinguishable from an abandoned card.
and .claude/skills/pm-dispatch/references/state-machine.md states the same rule as legality:
合法性:仅当正文或评论带机器可读行 Restart-when: closed <owner/repo>#N(由 Blocked-by: 的同一遍解锁扫描点火)或 Restart-when: <一行可执行判据> 时才合法
Both judge that the line is present and well-formed. Neither judges that the target can ever close.
So a card carrying Restart-when: closed owner/repo#N where #N does not exist, was never created, or sits in a repo the unlock scan does not cover, satisfies H9 permanently. The hold is machine-readable and un-fireable at the same time — which is exactly the state the item's own rationale says it exists to prevent, reintroduced one level down. H9 already refuses Restart-when: manual — … on precisely this reasoning ("a card no mechanism can revive is closed not planned"); a well-formed pointer at an unreachable target is the same defect wearing a machine-readable spelling.
Why it is refused, twice over
① It changes gate accept/reject behaviour. Reachability makes H9 fire on inputs it ignores today: every currently-green pm:on-hold card whose Restart-when: names a target the scan cannot resolve goes red on the first run. That is a widening of what the gate refuses, on a latch that gates the board — not a seat's call to take, and it needs the contract review chain rather than a dispatch.
② The clause cannot be landed where it belongs. The rule's canonical home is .claude/skills/pm-dispatch/references/state-machine.md, which is governed surface (.claude/** → human merge; ⛔ never armed or enqueued). It is also out of budget:
scripts/pm/check-skill-line-ratchet.mjs pins ['.claude/skills/pm-dispatch/references/state-machine.md', 44]- the file is exactly 44 lines — headroom 0
and the last raise of that ceiling is recorded as a maintainer ruling that could not be paid in place:
Raised 43 → 44 by the generated-artifact carve-out ruling (maintainer 2026-08-25) … ONE line, and it could not be paid in place: the file holds 34 content lines over 3,467 bytes, and every bullet is already packed to its own minimum at the 120-byte cap (measured per bullet), so the only in-place payment available was deleting a ruled clause.
So admitting a reachability clause costs a ceiling raise, which is a maintainer ruling, and there is no in-place payment available that does not delete an existing ruled clause. Note also line 3's standing constraint on this file — ⛔ 不引用 issue 编号 — so any new clause must be phrased without an issue reference.
What the maintainer is being asked
Only whether to take this at all, and if so in which shape. Sketched, not recommended:
- A — reachability inside H9. Truest to the item's rationale; costs the ceiling raise and re-reds existing cards.
- B — a separate lower-severity item that reports unresolvable
Restart-when: targets without changing H9's verdict. No accept/reject change to H9; still costs doc budget if written down. - C — leave it. Defensible: the unlock scan already surfaces a hold that never fires, just slowly and without naming the cause.
What this card does NOT do
- ⛔ Does not decide between A/B/C — that is the maintainer's ruling, on both the contract change and the ceiling.
- ⛔ Carries no
domain:*, priority or type label — triage's field. - ⛔ Proposes no edit to
.claude/**; nothing here should be dispatched to a dev seat in its current form.
Verification
grep -n "state-machine" scripts/pm/check-skill-line-ratchet.mjs # ceiling 44
wc -l .claude/skills/pm-dispatch/references/state-machine.md # 44 → headroom 0
sed -n '155,168p' scripts/pm/check-half-states.mjs # H9's contract
Arising from #13211 (open question Q2, option C). Filed rather than dispatched — the change is blocked on two independent things that are not a seat's to decide. ⛔ This card is not dispatchable as written.
The finding
H9 in
scripts/pm/check-half-states.mjsmakespm:on-holdlegal only with a machine-fireable exit:and
.claude/skills/pm-dispatch/references/state-machine.mdstates the same rule as legality:Both judge that the line is present and well-formed. Neither judges that the target can ever close.
So a card carrying
Restart-when: closed owner/repo#Nwhere#Ndoes not exist, was never created, or sits in a repo the unlock scan does not cover, satisfies H9 permanently. The hold is machine-readable and un-fireable at the same time — which is exactly the state the item's own rationale says it exists to prevent, reintroduced one level down. H9 already refusesRestart-when: manual — …on precisely this reasoning ("a card no mechanism can revive is closednot planned"); a well-formed pointer at an unreachable target is the same defect wearing a machine-readable spelling.Why it is refused, twice over
① It changes gate accept/reject behaviour. Reachability makes H9 fire on inputs it ignores today: every currently-green
pm:on-holdcard whoseRestart-when:names a target the scan cannot resolve goes red on the first run. That is a widening of what the gate refuses, on a latch that gates the board — not a seat's call to take, and it needs the contract review chain rather than a dispatch.② The clause cannot be landed where it belongs. The rule's canonical home is
.claude/skills/pm-dispatch/references/state-machine.md, which is governed surface (.claude/**→ human merge; ⛔ never armed or enqueued). It is also out of budget:scripts/pm/check-skill-line-ratchet.mjspins['.claude/skills/pm-dispatch/references/state-machine.md', 44]and the last raise of that ceiling is recorded as a maintainer ruling that could not be paid in place:
So admitting a reachability clause costs a ceiling raise, which is a maintainer ruling, and there is no in-place payment available that does not delete an existing ruled clause. Note also line 3's standing constraint on this file —
⛔ 不引用 issue 编号— so any new clause must be phrased without an issue reference.What the maintainer is being asked
Only whether to take this at all, and if so in which shape. Sketched, not recommended:
Restart-when:targets without changing H9's verdict. No accept/reject change to H9; still costs doc budget if written down.What this card does NOT do
domain:*, priority or type label — triage's field..claude/**; nothing here should be dispatched to a dev seat in its current form.Verification