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
Governing text:AGENTS.md Prime Directive #14(Tier S = 席内达档复核记录落地)· SKILL.md〈入队与落地〉条款②闸门 · references/contract-review.md · ruling #202 B(#19457)· #208(#19491)· #19244 ruling B′。 Prior rulings on this card:the maintainer's words quoted on the card (2026-09-18) — 「不需要 AI 不能自审契约改动 这种」 and 「同意你的建议」(hotlong's checker disposition, its text not on the card); since then #19133 (Tier S) and #208 made the record the landing mechanism, which changes what 「retire the rule」 removes.
Ruling (maintainer, 2026-09-18, live chat, verbatim and untranslated):
不需要 AI 不能自审契约改动 这种
and, on the disposition proposed for the checker:
同意你的建议
So this is not "fix the checker" — the rule itself is withdrawn: there is no longer a requirement that a contract-affecting change be reviewed by a seat other than the one that wrote it. What goes with it is the machinery built to enforce that rule.
What made the case — measured on main, not recalled
measurement
value
Is scripts/pm/check-clause2-carriers.mjs in any CI workflow?
No — zero hits across .github/workflows/
Its size
9,132 lines / 619 KB
Code that actually imports it
2 files, one symbol: readClause2Line, imported by scripts/check-changeset-no-major.mjs and scripts/check-adr-0087-registration.mjs
So CI depends on roughly forty lines of that file and runs none of the rest.
Two failure modes were also measured live on PR #18420, and both are about the instrument rather than the diff:
It cannot judge a PR whose branch was not named by PM dispatch.CLAIM_BRANCH_SHAPE is /claude\/issue-\d+-[A-Za-z0-9][A-Za-z0-9._-]*/g; a session-assigned branch (claude/zealous-mendel-o0o6aq) parses to zero branches, the claim cannot be resolved, and --pair exits 2 (UNJUDGED) — which by its own rules is ⛔ never "clean". Systematic, not a one-off.
Its "review of record on the head" limb self-invalidates on every base merge. Sync the branch with main and the recorded verdict names a superseded head.
Scope — what comes out, what must NOT
Out:
The rule text in .claude/skills/pm-dispatch/SKILL.md (clause ② in 〈入队与落地〉 and the landing pre-check item ②; hits at lines ~76, 152, 338, 474-477, 512-522, 635-646, 672, 766 at time of filing).
.claude/skills/pm-dispatch/references/contract-review.md in full (60 lines), plus the mentions in references/platform-readings.md.
The needs:contract-review gate label and its hang/clear discipline.
In scripts/pm/check-clause2-carriers.mjs: the C4 (independence pair), C6 (review of record) and C7 (Served-tier:) rows, and the --pair landing pre-check role.
Must survive — measure before deleting anything:
readClause2Line and the Clause-②: yes | nodeclaration line itself: the two CI gates above read it for semver level and ADR-0087 disposition, which is a different job from who reviewed the diff. Extract it to a small module (~40 lines) so those gates stop hanging off a 9k-line file.
CONTRACT_REVIEW_TIER in scripts/pm/dispatch-gates.mjs: it also mandates a model tier for path-based clause ① work (the pm-dispatch skill surfaces, the published skills/** catalog). Only its review role retires.
⚠️needs:contract-review is named in packages/spec/src/api/error-code-ledger.zod.ts and its generated reference page — a published surface. Measure what that row does before touching it; removing a published ledger row is its own decision, not a rider on this one.
Whatever check-half-states.mjs, check-governed-queue-guard.mjs, check-widening-tells.mjs, check-label-desc-cap.mjs, check-skill-line-ratchet.mjs and ensure-pm-labels.sh do with the label — each needs its own reading; several only name it in prose.
If the hazard is still wanted later
The thing the rule guarded against is an AI seat approving its own contract change and queueing it. If that is ever wanted again, the cheap form is GitHub's own required reviews / CODEOWNERS — platform-enforced, zero lines of comment archaeology — rather than a checker that is not in CI and reads two lines out of a comment body. Recorded here so a later reader knows the alternative was considered and not merely forgotten.
Sequencing
⛔ Governed surface (.claude/**, skills/**): the authoring seat never self-queues this one.
Suggested order: extract readClause2Line and prove the four CI workflows still green first, then remove the rule text and the gate role, then the label.
Ruled: 5770886272 · letter B · 2026-09-22T03:42Z — batch #211 item 3; retire label/--pair/double-carrier/independence pair, keep the one Contract review record; state pm:queue (domain:skills, Tier H)
os-decision-facets
维护者速读:这张卡是 hotlong 在 2026-09-18 按您一句话「不需要 AI 不能自审契约改动 这种」立的,要求整套撤掉「条款②契约复核」:规则文本、
needs:contract-review标签、contract-review.md、以及 9k 行 checker 的入队闸门角色。此后三天里,那句话的一半已经成了现行设计——席内自审就是 Tier S 的落地方式;但另一半机器(记录、标签、--pair、checker 的 C4 / C6 / C7)反而被 Tier S(#19133)和 #208(#19491)接上了新用途:队列守卫在 merge group 里读那条## Contract review记录放行.claude/**。所以现在不是「撤不撤」,而是「撤哪一半」。选项:A 按卡面整套撤(.claude/**改为 CI 绿 + 席位 ACCEPT 即落地,无记录)——这是削弱门禁,只能您定;B 撤标签、--pair入队前检、双载体挂清、C4 独立性对,只留一条## Contract review记录作为 Tier S 的落地记录(队列守卫继续读它),readClause2Line抽成小模块给两个 CI 门禁;C 维持现状,本卡按「已实现」关闭。席位推荐 B。请回一个字:A / B / C。四棱(2026-09-22 席位现读)
--pair;[Decision] 纯重生成提交是否重开达档复核记录?—— 生成物密集面上「基线漂移→同步→head 后移→重审」本轮实测成环两次,两张已 PASS 的 PR 因此没能落地 #19244 测到一次达档复核 83–160 次 assistant 请求、20–40 分钟,同一张 PR 因 head 后移复核四轮。您 2026-09-21 的原话「我们系统开发了太多无用的门禁,反而在浪费时间」与「受管合并审计 以后不需要了,浪费时间」都指向减零件。B 与 A 都减;C 不减。--pair+ 记录)守同一件事,而受管合并审计已退役,记录是剩下的唯一审计痕迹。B 把三层收成一层;A 连这一层也去掉,.claude/**的治理文本就只剩 CI(CI 不判治理文本的对错)。--pair/ C4),留下的是「记录」类零件(一条评论)。B 净减最多而不动地板;A 触及门禁削弱地板(人工)。Governing text:AGENTS.md Prime Directive #14(Tier S = 席内达档复核记录落地)·
SKILL.md〈入队与落地〉条款②闸门 ·references/contract-review.md· ruling #202 B(#19457)· #208(#19491)· #19244 ruling B′。Prior rulings on this card:the maintainer's words quoted on the card (2026-09-18) — 「不需要 AI 不能自审契约改动 这种」 and 「同意你的建议」(hotlong's checker disposition, its text not on the card); since then #19133 (Tier S) and #208 made the record the landing mechanism, which changes what 「retire the rule」 removes.
Ruling (maintainer, 2026-09-18, live chat, verbatim and untranslated):
and, on the disposition proposed for the checker:
So this is not "fix the checker" — the rule itself is withdrawn: there is no longer a requirement that a contract-affecting change be reviewed by a seat other than the one that wrote it. What goes with it is the machinery built to enforce that rule.
What made the case — measured on
main, not recalledscripts/pm/check-clause2-carriers.mjsin any CI workflow?.github/workflows/readClause2Line, imported byscripts/check-changeset-no-major.mjsandscripts/check-adr-0087-registration.mjslint.yml,pr-automation.yml,cut-rc.yml,release.ymlSo CI depends on roughly forty lines of that file and runs none of the rest.
Two failure modes were also measured live on PR #18420, and both are about the instrument rather than the diff:
CLAIM_BRANCH_SHAPEis/claude\/issue-\d+-[A-Za-z0-9][A-Za-z0-9._-]*/g; a session-assigned branch (claude/zealous-mendel-o0o6aq) parses to zero branches, the claim cannot be resolved, and--pairexits 2 (UNJUDGED) — which by its own rules is ⛔ never "clean". Systematic, not a one-off.mainand the recorded verdict names a superseded head.Scope — what comes out, what must NOT
Out:
.claude/skills/pm-dispatch/SKILL.md(clause ② in 〈入队与落地〉 and the landing pre-check item ②; hits at lines ~76, 152, 338, 474-477, 512-522, 635-646, 672, 766 at time of filing)..claude/skills/pm-dispatch/references/contract-review.mdin full (60 lines), plus the mentions inreferences/platform-readings.md.needs:contract-reviewgate label and its hang/clear discipline.scripts/pm/check-clause2-carriers.mjs: the C4 (independence pair), C6 (review of record) and C7 (Served-tier:) rows, and the--pairlanding pre-check role.Must survive — measure before deleting anything:
readClause2Lineand theClause-②: yes | nodeclaration line itself: the two CI gates above read it for semver level and ADR-0087 disposition, which is a different job from who reviewed the diff. Extract it to a small module (~40 lines) so those gates stop hanging off a 9k-line file.CONTRACT_REVIEW_TIERinscripts/pm/dispatch-gates.mjs: it also mandates a model tier for path-based clause ① work (the pm-dispatch skill surfaces, the publishedskills/**catalog). Only its review role retires.needs:contract-reviewis named inpackages/spec/src/api/error-code-ledger.zod.tsand its generated reference page — a published surface. Measure what that row does before touching it; removing a published ledger row is its own decision, not a rider on this one.check-half-states.mjs,check-governed-queue-guard.mjs,check-widening-tells.mjs,check-label-desc-cap.mjs,check-skill-line-ratchet.mjsandensure-pm-labels.shdo with the label — each needs its own reading; several only name it in prose.If the hazard is still wanted later
The thing the rule guarded against is an AI seat approving its own contract change and queueing it. If that is ever wanted again, the cheap form is GitHub's own required reviews / CODEOWNERS — platform-enforced, zero lines of comment archaeology — rather than a checker that is not in CI and reads two lines out of a comment body. Recorded here so a later reader knows the alternative was considered and not merely forgotten.
Sequencing
.claude/**,skills/**): the authoring seat never self-queues this one.groupruns package-authored scheduled work without a declaration, owning each run's writes per record #18420.readClause2Lineand prove the four CI workflows still green first, then remove the rule text and the gate role, then the label.Dedup terms
clause-②·needs:contract-review·check-clause2-carriers·contract-review.md·independence pair SELF-REVIEWGenerated by Claude Code