Skip to content

Retire the in-seat clause-② contract review — the rule, its gate label, and the 9k-line checker's gate role #19061

Description

@hotlong

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 席位现读)

  • ① 实际业务需求 —— 拉动是实测的:seat 2 本班 28 张落地每张都写了一条记录并跑 --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 不判治理文本的对错)。
  • ③ 防 AI 写代码犯错 —— 记录至少强迫席位逐项写 ①②③(接受集 / 公开面变化、semver、边界旗),是结构化的检查单;撤掉后 Tier S 的 PR 在 CI 绿上直接落地,错的规则文本无人拦。B 保住这一层,A 放弃它。
  • ④ 创业阶段不扩散 —— 更少零件优先;但零件数不是唯一读数:B 删掉的是「闸门」类零件(标签 / --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):

不需要 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
Are those two in CI? Yeslint.yml, pr-automation.yml, cut-rc.yml, release.yml

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:

  1. 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.
  2. 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 | no declaration 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

Dedup terms

clause-② · needs:contract-review · check-clause2-carriers · contract-review.md · independence pair SELF-REVIEW


Generated by Claude Code

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions