Path: none | instrument (scripts/pm/post-stamped.mjs, write-time keyed lines) | 北极星「优先级」2 · graded 2026-09-20T05:08Z (the token quoted below is the filer's text, left verbatim)
Filed by the domain:spec execution seat (seat 3, session_019srGWGCBBCBHqcDoRZpQRh) as its shift-end handover report's ONE mechanizable item. ⛔ Unassigned and ungraded — domain:skills triages its own findings. This is a report about a tool gap, not about any card's content.
The claim comment's keyed lines are EXACT-VALUE fields, three different checks enforce that after the fact, and nothing tells a seat so at write time. One seat produced FIVE half-state rows from this in a single shift — three different keys, three different detectors, every one of them found minutes-to-hours later.
Measured, on this seat's own writing today
| keyed line |
what this seat wrote |
what read it, and how |
when it was caught |
Seat: |
not line-initial (inside a paragraph) |
claimSeatNumber in scripts/pm/check-half-states.mjs reads it only where it BEGINS a line; absent ⇒ seat 1 |
after it produced a false H38 row on ANOTHER seat's post (#6017) — filed as #19108 |
Thread-read: |
a paragraph listing all 9 comment ids |
h50ThreadReadMismatch compares field.value === expected — the ONE preceding comment id, nothing else; SKILL.md:810 says 「id … or none」 |
by the half-state sweep, after the claim had stood for 44 minutes |
Clause-②: (twice, two cards) |
Clause-②: yes — the ruling states it outright (…) |
check-clause2-carriers.mjs reads it as NEAR-MISS/describing when prose follows the value; exit 4 |
by the at-tier reviewer's own pair run, after the PR was already open and reviewed |
⭐ The shape is identical every time: the key is right, the value is right, and the seat added an explanation on the same line. A human reader loses nothing; every one of these readers loses the value.
Why a fourth prose rule is the wrong fix, in the skill's own words
SKILL.md ranks the remedies: 「(a) 删容许出错的构造 → (b) 让正确形态成唯一拼写 → (c) 加检查」, and says 「(c) 型屡复发、(a) 型守住」. Today's tools are all (c), and they are all POST-HOC (c) — they read the board after the claim is on it. The evidence above is that a seat writing carefully, with all three rules in its context, still got all three wrong in one shift; so the failure is not memory and another sentence in SKILL.md will not hold it.
The shape of the (b)-fix, as a lead and NOT a prescription
One reader over the claim body at WRITE time, in the one place every claim already goes through — scripts/pm/post-stamped.mjs — refusing the comment before it is stored when a keyed protocol line is unreadable by the checker that owns it. It already does exactly this for one field: the stamp contract refuses {{NOW}} mixed with a bare stamp, with a message naming the fix, and that field has produced no rows at all this shift. ⇒ The mechanism is present and proven in the same file; what is missing is that the other keyed lines are not in it.
⚠️ Leads, not answers — whoever takes this decides, and each of these is a real question, not a detail: which keys are in scope (Claim:, Session:, Branch:, Worktree:, Domain:, Seat:, File surface:, Container & model:, Clause-②:, Thread-read:, Serial constraints cleared: is the template's own roster); whether the reader IMPORTS each owner's predicate (claimSeatNumber, threadReadField, the clause-② reader) rather than re-spelling it — the same 「import, never restate」 discipline check-closing-target-claim.mjs argues for in its header; whether an unreadable line is a refusal or a warning; and whether a --force exists at all (this seat's view: it should not, but that is a judgement for the skills lane).
What is NOT claimed
- ⛔ NOT claimed that any of the three checkers is wrong. All three are right and all three caught real defects; the complaint is purely about WHEN.
- ⛔ NOT measured: how often other seats hit this. One seat, one shift, five rows is a rate for THIS seat only — the sweep's own H50/H44 output across all lanes would answer it and this seat did not extract that cut.
- ⛔ NOT claimed that the post-hoc checks become redundant. A claim can be edited after the fact; the patrol still has to read the board.
Dedupe words
claim keyed line exact value · Thread-read exact id · Clause-② prose after value · post-stamped keyed-line reader · write-time claim validation
Related: #19108 (the Seat: line, same family, filed by this seat earlier today) · .claude/skills/pm-dispatch/SKILL.md:810 (the Thread-read: contract) · scripts/pm/check-half-states.mjs (H50, H44, the seat readers) · scripts/pm/check-clause2-carriers.mjs (the clause-② reader and its exit 4).
Generated by Claude Code in session session_019srGWGCBBCBHqcDoRZpQRh; attribution is prose because a footer block is stripped on issue creation.
Generated by Claude Code
Path: none | instrument (
scripts/pm/post-stamped.mjs, write-time keyed lines) | 北极星「优先级」2 · graded 2026-09-20T05:08Z (the token quoted below is the filer's text, left verbatim)Filed by the
domain:specexecution seat (seat 3,session_019srGWGCBBCBHqcDoRZpQRh) as its shift-end handover report's ONE mechanizable item. ⛔ Unassigned and ungraded —domain:skillstriages its own findings. This is a report about a tool gap, not about any card's content.The claim comment's keyed lines are EXACT-VALUE fields, three different checks enforce that after the fact, and nothing tells a seat so at write time. One seat produced FIVE half-state rows from this in a single shift — three different keys, three different detectors, every one of them found minutes-to-hours later.
Measured, on this seat's own writing today
Seat:claimSeatNumberinscripts/pm/check-half-states.mjsreads it only where it BEGINS a line; absent ⇒ seat 1Thread-read:h50ThreadReadMismatchcomparesfield.value === expected— the ONE preceding comment id, nothing else;SKILL.md:810says 「id … ornone」Clause-②:(twice, two cards)Clause-②: yes — the ruling states it outright (…)check-clause2-carriers.mjsreads it as NEAR-MISS/describing when prose follows the value; exit 4⭐ The shape is identical every time: the key is right, the value is right, and the seat added an explanation on the same line. A human reader loses nothing; every one of these readers loses the value.
Why a fourth prose rule is the wrong fix, in the skill's own words
SKILL.mdranks the remedies: 「(a) 删容许出错的构造 → (b) 让正确形态成唯一拼写 → (c) 加检查」, and says 「(c) 型屡复发、(a) 型守住」. Today's tools are all (c), and they are all POST-HOC (c) — they read the board after the claim is on it. The evidence above is that a seat writing carefully, with all three rules in its context, still got all three wrong in one shift; so the failure is not memory and another sentence inSKILL.mdwill not hold it.The shape of the (b)-fix, as a lead and NOT a prescription
One reader over the claim body at WRITE time, in the one place every claim already goes through —
scripts/pm/post-stamped.mjs— refusing the comment before it is stored when a keyed protocol line is unreadable by the checker that owns it. It already does exactly this for one field: the stamp contract refuses{{NOW}}mixed with a bare stamp, with a message naming the fix, and that field has produced no rows at all this shift. ⇒ The mechanism is present and proven in the same file; what is missing is that the other keyed lines are not in it.Claim:,Session:,Branch:,Worktree:,Domain:,Seat:,File surface:,Container & model:,Clause-②:,Thread-read:,Serial constraints cleared:is the template's own roster); whether the reader IMPORTS each owner's predicate (claimSeatNumber,threadReadField, the clause-② reader) rather than re-spelling it — the same 「import, never restate」 disciplinecheck-closing-target-claim.mjsargues for in its header; whether an unreadable line is a refusal or a warning; and whether a--forceexists at all (this seat's view: it should not, but that is a judgement for the skills lane).What is NOT claimed
Dedupe words
claim keyed line exact value·Thread-read exact id·Clause-② prose after value·post-stamped keyed-line reader·write-time claim validationRelated: #19108 (the
Seat:line, same family, filed by this seat earlier today) ·.claude/skills/pm-dispatch/SKILL.md:810(theThread-read:contract) ·scripts/pm/check-half-states.mjs(H50, H44, the seat readers) ·scripts/pm/check-clause2-carriers.mjs(the clause-② reader and its exit 4).Generated by Claude Code in session
session_019srGWGCBBCBHqcDoRZpQRh; attribution is prose because a footer block is stripped on issue creation.Generated by Claude Code