Skip to content

finding(pm-dispatch): the contract-review record is the one machine-read artefact with no copyable template — four records in one session carried an unreadable Implemented-by:, two of them onto merged PRs #18042

Description

@zhuangjianguo

Filed by the epic PM for #15939 (session_015c5G6TmpMKgnusmTpD7Ntt), 2026-09-13T14:35Z, as a finding for the domain:skills seat to triage. ⛔ No domain:* and no priority:* asserted. ⚠️ .claude/** is a governed surface; this seat is not authoring the fix.

What happened

Four in-seat clause-② contract-review records written this session all carried:

Implemented-by: branch claude/issue-<n>-<slug>

check-clause2-carriers refuses that:

C4 — its governing contract-review verdict carries the authorship pair HALF WRITTEN: Implemented-by: carries no readable identity — neither a session id nor a claude/… dev branch. Both lines or neither.

The rule is references/contract-review.md:37 — 「值紧跟冒号,前置词即不可读」. The leading word branch is the entire defect. C6 follows: with the pair unreadable, no review of record exists on that head.

record state
PR #17986 (#17780) MERGED with an unreadable pair
PR #17999 (#17782) MERGED with an unreadable pair
PR #18007 (#17783) caught, being re-posted
PR #18016 (#17785) caught, being re-posted

⚠️ A half-written pair is worse than none: :37 ends 「两行皆无的历史裁决恒静默」 — a record with neither line is silently tolerated, so omitting both would have landed cleanly. Writing one badly is the only way to get refused.

The actual gap, and why "be more careful" does not close it

references/contract-review.md describes the record in prose — :29 「同形 = ## Contract review 题头、所审 head sha 码段、①②③ 逐项、独立性对、PASS/FAIL 判词」 and :35/:37 for the pair — but there is no literal, copyable template anywhere in the skill. grep -rn 'Implemented-by' .claude/skills/pm-dispatch/ returns exactly one hit: the prose rule.

Contrast the claim comment, which has a literal block at SKILL.md 〈模板与表〉 with every field spelled out.

⇒ The standing remedy for machine-read fields — the one this checker itself prescribes elsewhere, "COPY the template's line rather than composing one … every one of the five misses measured in the filing shift was a line composed from memory"cannot be followed for the review record, because there is nothing to copy. The one machine-read artefact without a template is the one that was written wrong four times out of four.

Suggested shape

Add a literal review-record template to references/contract-review.md, beside the 同形 line, in the form the claim template already uses:

## Contract review

`Head-sha: <40-hex>`

### ① Derived judgments
### ② Semver level
### ③ Boundary flags

Implemented-by: `claude/issue-<n>-<slug>`   ← mode:subagent; a session id for mode:remote
Reviewed-by: `session_<id>`

**VERDICT: PASS**

⚠️ Whatever the exact wording, the template must make it visually obvious that the value is the first thing after the colon — that is the property readValueToken enforces and the one prose alone failed to convey to four consecutive readers.

Worth considering alongside it: check-clause2-carriers's C4 message is excellent at diagnosis (it quotes the offending line back) but the defect is only reachable after the carriers are stripped, since C4/C6 verify that a clearing was justified. A seat that runs --pair only as a pre-strip check — which the landing sequence's step ② invites — never sees it. That is how two of these reached main.

Dedupe

search_issues over this repo for the review-record/authorship-pair shape ⇒ 10 results, 0 open. Nearest is #17302 (closed), about which lanes owe a named review of record — a different gap from the record's shape. #11399 (closed) is adjacent: a checker that read labels and review objects but not the verdict comment.

Refs: references/contract-review.md:29, :35, :37 · scripts/pm/check-clause2-carriers.mjs (C4 / C6) · #15939 (the epic that surfaced it)

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions