docs(pm): the clause-② contract review is tier-bound — the dispatching seat reviews in-seat at CONTRACT_REVIEW_TIER, no seat list - #18363
Conversation
…g seat reviews in-seat at CONTRACT_REVIEW_TIER, no seat list Re-keys the three lines that bound the clause-② contract review to a SEAT so the condition is the served TIER instead: SKILL.md :513 and :523 (in place, 812 / 812), contract-review.md :26 (in place, 60 / 60), and ONE new platform-readings.md row recording that the harness classifier refuses a content write by content (a PASS on a PR the same session dispatched), with the same-channel control. The SELF-REVIEW machine reading and the independence pair are untouched. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr
…e-key — the fuse covers every seat that issues a clause-② verdict Patch round on the seat's answer A: four in-place re-keys, no new line. SKILL.md :641 (119 → 117 B) drops 「spec 席达档,余席默认档」 for 「达档审,未达档默认档」; contract-review.md :41 (119 → 116 B) reads 「档位按实测」 in place of 「档位按逐车道」; :51 (116 → 105 B) makes the fuse's population every seat that issues a clause-② verdict instead of the spec and skills seats; :52 (113 → 89 B) drops the default-tier 「余席条款②复核」 class, which no longer exists under the tier condition, and keeps the director seat's exemption verbatim. SKILL.md :610 is untouched — it is clause-① routing for the published skills face, not the clause-② seat list. 812 / 812 and 60 / 60 hold. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr
Contract reviewServed-tier: Reviewing seat: ① Derived judgments
② Semver levelNot applicable — nothing published moves; ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)— PR #18363 / #18349改了什么:把你 2026-09-16 的裁决(「同意」:条款②复核 = 派发席在契约复审档席内做,记录写档位读数;不再有「只在 spec 席」)落成文本。原先三处把条款②复核绑在席位上(SKILL.md :513「契约复审档复核只在 spec 席」、:523「契约复审档留给 skills 席与 spec 席…其余席位 ⛔ 永不起该档子代理」、contract-review :26「逐车道:spec 席达档审…余席默认档自审」),现在绑在档位上::513「达档复核归派发席席内」;:523「条款②复核只在实测达档的席内做,记录写读数;未达档席 ⛔ 不审、不起该档子代理」;:26「按档位:达档席内审契约增量;未达档默认档自审加门禁、挂标」。补丁轮又把四处残留一并改掉(SKILL.md :641、contract-review :41/:51/:52):保险丝从「只管 spec 席与 skills 席」改为「管每个出条款②裁决的席」,总监席照旧豁免。platform-readings 新增一行记 harness 分类器按内容拒写(同会话派发 PR 上的 PASS 被拒作 验证:本席在 head 要你做的:审 PR #18363,同意即 APPROVE(只能请 hotlong;os-zhuang 是 PR 作者)。 Generated by Claude Code |
|
Ruling-C landing provenance — skills seat (signed off, 留守 on this PR), session Generated by Claude Code |
Fixes #18349
Clause-②: no
What changed
The maintainer ruled (2026-09-16, recorded verbatim on the card) that the clause-② contract review is done in-seat by the dispatching seat at the contract-review tier, and that there is no longer a 「只在 spec 席」:
Sentence 2 needs no text change (SKILL.md :527–:528 and contract-review.md :25 already say it). Sentence 1 re-keys the three lines that bound the review to a SEAT so that the served TIER is the condition — in place, no new line:
Plus ONE new platform-readings.md row (:429, 113 B, in 「读数陷阱」 beside the other harness readings): 「harness 按内容拒写:同会话派发 PR 上 PASS 拒为
[Self-Approval];同通道建卡、ACCEPT 照过。」 — measured 2026-09-16 on objectui PR #9578: the harness auto-mode classifier refused aVERDICT: PASSrecord on a PR the same session had dispatched as[Self-Approval], while a card create and an ACCEPT on the same channel were served seconds later; this seat's five same-shape PASS records of 2026-09-15 throughpost-stamped.mjswere not refused — so the reading is the channel-and-content pair, not the endpoint.Untouched: the SELF-REVIEW machine reading (contract-review.md :37 —
Implemented-by:is the branch for a subagent dev) and the independence pair (:35–:36).Note: the card body and the ruling comment cite the 「逐车道」 line as contract-review.md :25 (read at
500c1b56); onorigin/main1411cf2cit is :26 (:25 is the 「归属该卡派发席」 line) — the edit went to the line by content, not by number.The one design choice — how the tier condition is spelled
The question was how to spell the condition so a seat NOT at the tier cannot read itself as eligible. Options: (A) 「达档」 alone — a seat could read its configured tier as eligibility; (B) 「实测达档」 plus 「记录写读数」 — eligibility is the measured reading and the record must carry it (contract-review.md :29 already makes a record without
Served-tier:no verdict; :53 already says a self-declared tier is not a reading), with the ⛔ half 「未达档席 ⛔ 不审、不起该档子代理」 closing the escape of spawning the tier subagent; (C) naming theget_sessionfields inline — over the 120-byte budget and already recorded at platform-readings :378 and contract-review :55. Chosen: B. On the four axes — 实际业务需求: the live case is real (objectui PR #9578, aClause-②: yescard held in the safe state) and every PM seat today measures at the tier, so in-seat review removes a handoff that had no executable spelling; 项目长远合理性: a tier condition is machine-checkable (--pairreadsServed-tier:), a seat list is not; 防 AI 犯错: 实测 binds eligibility to a reading rather than a declaration, and the ⛔ half keeps the prohibition greppable; 创业阶段不扩散: no new mechanism, label, handoff artefact or line — three in-place re-keys and one fact row.Reverse verification
BEFORE (
1411cf2c): the three lines quoted above with their byte counts; sweepgrep -n '只在 spec 席\|其余席位 ⛔ 永不起该档\|spec 席达档审'over SKILL.md and references = 3 hits (:513, :523, contract-review :26);grep -c CONTRACT_REVIEW_TIER SKILL.md= 1; SKILL.md 812 lines, contract-review.md 60, platform-readings.md 463; frame block :734–:755 md53327d02c56f8a0eca88569dad2270f32.AFTER (
55b467b0): sweep = 0; constant count = 1 (unchanged); 812 / 812, 60 / 60, platform-readings 464 (ceiling 466; PR #18359, open on other regions of the same file, nets +2, so 466 once both land and no 467th); frame md5 unchanged3327d02c56f8a0eca88569dad2270f32;git diff --stat= the three files and nothing else; zero raw control bytes in the touched files; every touched line ≤ 120 B (the ratchet'sMAX_LINE_BYTES).Gates (run on
55b467b0)node scripts/pm/dispatch-gates.mjs --commandsover the three paths derived 18 commands; all 18 run;--ranreconciliation: 「18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN」. Green:check:pm-skill-ratchet,check:pm-skill-id-lint,check:skill-frame-sync,check:nul-bytes,check:pm-governed-prose,check:pm-governed-merges,check:pm-half-states,check:required-contexts,check:doc-authoring,check:agent-test-spelling,check:watch-hint-literal,check:refd-timer-probe,check:driver-memory-census,check-closing-keyword-parity(and its--self-test),check-comment-mask-corpus,check-governed-queue-guard --self-test, and@objectstack/lint check:doc-formula-expressions(first run exit 3 PREREQUISITE NOT MET — the formula and lint dist were not built; both built under the verify lock, re-run exit 0). Path face:check-governed-merges.mjs --test SKILL.md= GOVERNED (exit 3 is that verdict). Thecheck:pm-dispatch-gatesbattery was not derived for these paths.check-clause2-carriers.mjs --pairon this PR: reading in the report comment on the card.Acceptance notes
origin/main..claude/**is shipped by no package'sfiles[]), soskip-changeset.lanes/spec.mdandlanes/skills.md: no seat-bound restatement (spec.md :19, :20, :33 and skills.md :20 are trigger and gate lines only).dispatch-gates.mjs --tierprints the tier's model literal rather than the constant name; this PR names onlyCONTRACT_REVIEW_TIER.维护者速读(草稿)
改了什么:把「条款②契约复核只在 spec 席做」改成「由派发席在契约复审档席内做,记录写档位读数;未达档的席不审、不起该档子代理」—— SKILL.md 两行、contract-review.md 一行原位改写,platform-readings.md 新增一行事实(harness 按内容拒写 PASS 裁决)。行数 812 / 812、60 / 60、464 / 466。
为什么改:您 2026-09-16 裁「同意」的两句里第一句要求去掉「只在 spec 席」;objectui 那张 Clause-② 卡在没有交接拼写的情况下被卡在安全态,席内达档复核是零延迟的路。第二句(新 spec 工作仍归 spec 席)现行文本已写,无需改。
风险与代价(含回滚):三行改写全在
.claude/**,不发布、不动代码;回滚 = revert 本 PR 的一个 commit。残留:SKILL.md :641 与 contract-review.md :51–:52 仍按旧席位表述,本 PR 未动(超出派发面),需席位补一轮。席位意见:(留空,席位定稿)
你要做的:确认本 PR 的三行改写是否如实落了裁决第一句;确认后由席位走四件套 + 授权批准落地;顺带定 :641 / :51–:52 是并入本 PR 补丁轮还是另立卡。
Generated by Claude Code