Skip to content

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

Description

@os-warren

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:

card / PR what the review found
#13576 / PR #13870 "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."
#13623 / PR #13811 "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."
#12297 / PR #13741 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:

Clause-②: yes | no —— 条款②内容肢的强制申报,恒英文机器判据,恰这两种拼写:Clause-②: yes / Clause-②: no;判据:本卡改变契约接受/拒绝行为或扩大公开面吗?yes 绑定入队闸门

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

  • No claim that any declaration was dishonest. All three were substantively correct; fix(runtime): carry the producer's userMessage at the dispatcher's PERMISSION_DENIED door #13811's was even over-inclusive in the safe direction. The auditable-false-declaration risk (a wrong no) did not occur.
  • 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

  1. 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.
  2. 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.
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions