You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The Clause-②: yes | no machine spelling is missing from the claim comment on 2 of 3 measured cards — the enqueue gate's predicate reads it there, and it is not there #13914
Filed by the central triage seat (#6015, session session_01XVLjap8eh1QjiaPznpW5Ry) from the 2026-08-31 contract-review round. ⛔ Not a defect in any of the reviewed PRs — every declaration measured was honest in substance. The defect is where the declaration lives.
The measurement
Three contract reviews ran this round, each by a claude-fable-5 sub-agent with transcript-tier verification. Two of them reported, independently and unprompted, the same process gap:
"the machine spelling Clause-②: yes mandated by the pm-dispatch skill does not appear verbatim anywhere on the PR/card — the declarations are prose ("FIRES on the CONTENT limb"), honest in substance but nonconforming in spelling."
"the claim comment on #13623 does not carry the SKILL.md fixed claim shape — in particular the mandatory Clause-②: yes | no line, the declaration limb's designated carrier; the machine spelling appears only in the PR body and the os-dev report."
carried it correctly — "the PM claim comment on #12297 carries Clause-②: yes with reasoning". This is the control: the shape is achievable and is sometimes achieved, so the two misses are drift, not an impossible requirement.
⇒ 2 of 3, by two different reviewers, on two different lanes. That is a pattern in the template, not two people being careless.
Why it matters — the gate reads a spelling that is not there
.claude/skills/pm-dispatch/SKILL.md defines the declaration limb as a fixed machine criterion:
⇒ For a PR whose diff touches no contract path — which is exactly the case for both misses (#13870: six files, none under packages/spec/src/**; #13811: four files, same) — the declaration on the card is the ONLY limb that can fire. If it is prose, or lives in the PR body instead, the gate's predicate has nothing to read.
⭐ Both of these PRs happened to be caught anyway, because a human/seat routed them into the review chain by hand. That is not the mechanism working; that is the mechanism being substituted for. A card with a genuine content-limb change, a non-contract path, and a prose-only declaration is invisible to the gate.
⛔ No claim about frequency beyond the measurement. Three cards, one round, one seat. ⚠️ And it is invisible when it does not get caught — a prose-only declaration on a card nobody hand-routes leaves no trace — so 2/3 is an upper bound on conformance, i.e. a lower bound on the problem.
⛔ No claim that the reviewers should have refused. Both correctly recorded it as non-blocking and passed/reworked on substance.
Shape of a fix — for the lane PM, not prescribed
Template side: the claim-comment template in the pm-dispatch skill emits the Clause-②: line pre-filled as a required field, so omitting it takes effort rather than being the default. Cheapest.
Gate side: make the enqueue gate say why it cannot judge — a card whose PR touches no contract path and whose claim comment carries no Clause-②: line is currently indistinguishable from a card that declared no. ⭐ Those two states should not look the same; the second is a decision, the first is a missing reading.
Both — 1 stops the drift, 2 makes the residue loud.
⛔ Do not "fix" this by relaxing the spelling to accept prose. The fixed spelling is what makes it machine-readable; loosening it converts a predicate into a heuristic, and the whole point of the two-limb design is that the content limb is checkable without judgement.
Scope note
.claude/** is governed surface ⇒ human-merge only, ⛔ never armed, ⛔ never queued.
Refs
.claude/skills/pm-dispatch/SKILL.md — the Clause-② declaration definition and the enqueue-gate two-limb section
Filed by the central triage seat (#6015, session
session_01XVLjap8eh1QjiaPznpW5Ry) from the 2026-08-31 contract-review round. ⛔ Not a defect in any of the reviewed PRs — every declaration measured was honest in substance. The defect is where the declaration lives.The measurement
Three contract reviews ran this round, each by a
claude-fable-5sub-agent with transcript-tier verification. Two of them reported, independently and unprompted, the same process gap:Clause-②: yesmandated by the pm-dispatch skill does not appear verbatim anywhere on the PR/card — the declarations are prose ("FIRES on the CONTENT limb"), honest in substance but nonconforming in spelling."Clause-②: yes | noline, the declaration limb's designated carrier; the machine spelling appears only in the PR body and the os-dev report."Clause-②: yeswith reasoning". This is the control: the shape is achievable and is sometimes achieved, so the two misses are drift, not an impossible requirement.⇒ 2 of 3, by two different reviewers, on two different lanes. That is a pattern in the template, not two people being careless.
Why it matters — the gate reads a spelling that is not there
.claude/skills/pm-dispatch/SKILL.mddefines the declaration limb as a fixed machine criterion:and the enqueue gate is explicitly two-limbed, with the content limb keyed on that declaration independently of the path:
⇒ For a PR whose diff touches no contract path — which is exactly the case for both misses (#13870: six files, none under
packages/spec/src/**; #13811: four files, same) — the declaration on the card is the ONLY limb that can fire. If it is prose, or lives in the PR body instead, the gate's predicate has nothing to read.⭐ Both of these PRs happened to be caught anyway, because a human/seat routed them into the review chain by hand. That is not the mechanism working; that is the mechanism being substituted for. A card with a genuine content-limb change, a non-contract path, and a prose-only declaration is invisible to the gate.
What is NOT claimed
userMessageat the dispatcher's PERMISSION_DENIED door #13811's was even over-inclusive in the safe direction. The auditable-false-declaration risk (a wrongno) did not occur.Shape of a fix — for the lane PM, not prescribed
Clause-②:line pre-filled as a required field, so omitting it takes effort rather than being the default. Cheapest.Clause-②:line is currently indistinguishable from a card that declaredno. ⭐ Those two states should not look the same; the second is a decision, the first is a missing reading.⛔ Do not "fix" this by relaxing the spelling to accept prose. The fixed spelling is what makes it machine-readable; loosening it converts a predicate into a heuristic, and the whole point of the two-limb design is that the content limb is checkable without judgement.
Scope note
.claude/**is governed surface ⇒ human-merge only, ⛔ never armed, ⛔ never queued.Refs
.claude/skills/pm-dispatch/SKILL.md— theClause-②declaration definition and the enqueue-gate two-limb sectionIf-Match: ""silently DISABLES optimistic concurrency — a quoted-empty entity-tag is read as "no token" and the guarded write proceeds unguarded #13576 / PR fix(metadata-protocol): refuse the quoted-empty If-Match entity-tag at ingress (#13576) #13870 · APERMISSION_DENIEDrefusal never reaches the dispatcher's throw-transparent exit, so it still drops the author'suserMessage— a second door, behind #7898's trigger file #13623 / PR fix(runtime): carry the producer'suserMessageat the dispatcher's PERMISSION_DENIED door #13811 — the two misses, each recorded in its own contract-review verdictos lintnever surfaces ADR-0087 conversion notices — it normalizes with noonConversionNoticesink, the #3782 parity gapos buildwas in #12297 / PR fix(cli): os lint surfaces ADR-0087 conversion notices — console notice + a conversions key in --json #13741 — the control (carried correctly)