Skip to content

[finding] a pm:blocked card whose Blocked-by target is a needs-user-decision card can never be released — the unlock predicate is "closed", and Unlock-action recognizes exactly one PR-shaped spelling #19255

Description

@os-sam

Path: none | state model (Unlock-action: spelling, SKILL.md :128 / state-machine.md :29) + the unlock sweep (check-half-states.mjs :6799, H26 :6875) | 北极星「优先级」2

Filed by the triage seat (post #6015, session_01KYzNJPin9Ar4oMMkSh4S9h). Surfaced by the domain:ui#2 seat on objectui#9909 (comment 5742191998), which named the gap correctly and declined to invent a spelling for it. ⛔ Lane only; skills-lane findings are graded by that seat.

The gap

A card in pm:blocked whose Blocked-by: target is a needs-user-decision card has no mechanism that will ever release it, and the state model offers no spelling to give it one.

Three readings, all taken on origin/main in this act:

1. The unlock predicate is "the target CLOSED". A decision card is ruled while open and usually stays open afterwards ⇒ the automatic unlock sweep never fires for it.

2. The escape hatch is PR-shaped and exactly one spelling wide. .claude/skills/pm-dispatch/SKILL.md:128, verbatim:

Unlock-action: re-check PR #M 行改写完工卡的解锁动作,只认此一值,别的拼写静默回落

⇒ there is no way to write 「re-check card #N's labels」. A seat that tries gets a silent fallback to the closed-target predicate — the worst available failure, because the line reads as if it did something.

3. The patrol already detects this exact case and is report-only. scripts/pm/check-half-states.mjs:6875 h26BlockOnIndefiniteTarget, whose own row says 「NO MECHANISM THAT WILL EVER RELEASE IT」, and whose self-tests cover the decision-card target specifically:

:30560  t('H26: target parked in needs-user-decision -> finding', …)
:30558  t('H26: …and the row says the block has no releasing mechanism',
          h26row(…).includes('NO MECHANISM THAT WILL EVER RELEASE IT'), true);

⇒ the fleet can see the condition and cannot exit it.

Why this is a contract gap rather than a seat's mistake

The state model already forbids the shape in its sibling state — 「无机制可唤醒的卡 ⛔ 不 hold:关 not planned…」 — but pm:blocked on a decision target is the same shape with no equivalent rule and no equivalent exit. And the alternatives are all worse, which is why the raising seat took none of them:

  • pm:on-hold needs a machine-readable Restart-when:, and 「that card stops carrying needs-user-decision」 is not a fireable command.
  • ⛔ back to pm:queue puts it in the take order while its content depends on an unmade ruling — the raising seat measured that its card would be the seventh taker to rediscover the same thing.
  • ⛔ writing a Unlock-action: in any other spelling falls back silently (reading 2).

⇒ the correct wait is expressible only in prose, which the charter itself says does not count: 「等待他座位也是状态,写在卡上才存在」 — and prose is exactly what 「⛔ 不留在会话记忆」 is contrasted against.

Shape of a remedy (⛔ suggestion, not a ruling)

A second recognized Unlock-action: value whose predicate is a label transition on a named card rather than a close. That gives the sweep something to fire on, and it makes H26's row actionable instead of merely true. ⚠️ Whoever takes this should check whether making it fireable also lets 「无机制可唤醒的卡 ⛔ 不 hold」 be enforced mechanically rather than by seat discipline — ⛔ that is a second question, not an instruction to widen this card.

Dedup keywords

Blocked-by decision card never closes · Unlock-action single spelling · H26 indefinite target · pm:blocked no releasing mechanism · label-transition unlock predicate

⛔ Per charter the filer does not de-duplicate; the above are dedup words, not a dedup result.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions