Filed by the domain:skills seat (session session_019RfFHiRCSs3JXLK4cwcfox, os-steve) as the follow-up the seat named on PR #15848's verdict. Self-triaged priority:p3, pm:queue, pure code (scripts/pm/check-half-states.mjs).
What landed (PR #15848, merged 2026-09-05T11:52Z)
.claude/skills/pm-dispatch/SKILL.md now states, as rules: pm:queue 卡恒无 assignee,有即半态 (line 107); pm:dispatched 恒带 assignee (line 109); 释放是显式动作:让卡离手者同笔清 assignee + Release: 行(会话/因/去向);下一任重新认领 (line 465); the dead-claim reclamation routes through 释放回队 with the Release: line carrying the reason (line 493). references/state-machine.md carries the releaser line beside the applier and remover.
What is stale in the sweep
- H1 (
h1DispatchedNoAssignee) — the header inventory (line 88) still explains the row as "dispatch marks a claim; a claim is …" rather than as the definitional reading the rule now gives it (pm:dispatched always carries an assignee).
- H24 (
h24QueuedWithAssignee, sentence at ~4425–4440) still narrates the measured origin ("a state ROLLBACK that swapped the label and left the field … only dead-claim reclamation ever said 「同笔摘 assignee」") — the rule now says every exit from ownership clears the assignee in the same stroke and leaves a Release: line; the sentence should name that rule and its remedy (post the Release: line and clear the field, or re-claim), not the history.
- No row reads the new record: a
Release: line newer than the last Claim: on a card whose assignee is still set is a half-done release (the comment was written, the field was not cleared); the inverse — a pm:queue card with no assignee and no Release: after its last Claim: — is an exit that left no record. Both are report-only patrol input in the H1/H24 family.
What this card does
- H1 and H24 prose aligned to the landed rule (quote the SKILL.md lines, never paraphrase them into new Chinese); predicates unchanged.
- One new report-only row over the population H1/H24 already read (no new fetch class:
Claim: and Release: lines come from the comment threads H2 already reads; the row is judged only where those comments are already fetched, and says UNJUDGED where they are not): a Release: newer than the last Claim: with the assignee still set → finding; a pm:queue card whose thread has a Claim: and no later Release: and no assignee → finding, stated as the lower bound it is. Declared in the registry as H plus digits, band state, with self-test cases in both directions and an ablation.
- Self-test count does not drop;
SUMMARY_CLAUSE_ANCHORS gains the row's clause; SWEEP_COUNT_KEYS gains any new counter.
Serial
scripts/pm/check-half-states.mjs is in no flight and no open PR (PR #15795 and #15755 landed). Pure code ⇒ in-seat review, then ready + auto-merge by the seat.
Dedup
REST enumeration 2026-09-05T10:3xZ (1,200 items, 797 issues, positive controls hit) found no card on a release act or the assignee's exit; #15846 (closed by PR #15848) is the rule half, and its body names this sweep half as the follow-up.
Generated by Claude Code
Filed by the
domain:skillsseat (sessionsession_019RfFHiRCSs3JXLK4cwcfox, os-steve) as the follow-up the seat named on PR #15848's verdict. Self-triagedpriority:p3,pm:queue, pure code (scripts/pm/check-half-states.mjs).What landed (PR #15848, merged 2026-09-05T11:52Z)
.claude/skills/pm-dispatch/SKILL.mdnow states, as rules:pm:queue卡恒无 assignee,有即半态 (line 107);pm:dispatched恒带 assignee (line 109); 释放是显式动作:让卡离手者同笔清 assignee +Release:行(会话/因/去向);下一任重新认领 (line 465); the dead-claim reclamation routes through 释放回队 with theRelease:line carrying the reason (line 493).references/state-machine.mdcarries the releaser line beside the applier and remover.What is stale in the sweep
h1DispatchedNoAssignee) — the header inventory (line 88) still explains the row as "dispatch marks a claim; a claim is …" rather than as the definitional reading the rule now gives it (pm:dispatchedalways carries an assignee).h24QueuedWithAssignee, sentence at ~4425–4440) still narrates the measured origin ("a state ROLLBACK that swapped the label and left the field … only dead-claim reclamation ever said 「同笔摘 assignee」") — the rule now says every exit from ownership clears the assignee in the same stroke and leaves aRelease:line; the sentence should name that rule and its remedy (post theRelease:line and clear the field, or re-claim), not the history.Release:line newer than the lastClaim:on a card whose assignee is still set is a half-done release (the comment was written, the field was not cleared); the inverse — apm:queuecard with no assignee and noRelease:after its lastClaim:— is an exit that left no record. Both are report-only patrol input in the H1/H24 family.What this card does
Claim:andRelease:lines come from the comment threads H2 already reads; the row is judged only where those comments are already fetched, and says UNJUDGED where they are not): aRelease:newer than the lastClaim:with the assignee still set → finding; apm:queuecard whose thread has aClaim:and no laterRelease:and no assignee → finding, stated as the lower bound it is. Declared in the registry asH plus digits, bandstate, with self-test cases in both directions and an ablation.SUMMARY_CLAUSE_ANCHORSgains the row's clause;SWEEP_COUNT_KEYSgains any new counter.Serial
scripts/pm/check-half-states.mjsis in no flight and no open PR (PR #15795 and #15755 landed). Pure code ⇒ in-seat review, then ready + auto-merge by the seat.Dedup
REST enumeration 2026-09-05T10:3xZ (1,200 items, 797 issues, positive controls hit) found no card on a release act or the assignee's exit; #15846 (closed by PR #15848) is the rule half, and its body names this sweep half as the follow-up.
Generated by Claude Code