Skip to content

skills(pm-dispatch): clause-② cards build at the default tier and are gated by the contract review at CONTRACT_REVIEW_TIER (#16905) - #16915

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-16905-clause2-build-tier
Sep 9, 2026
Merged

skills(pm-dispatch): clause-② cards build at the default tier and are gated by the contract review at CONTRACT_REVIEW_TIER (#16905)#16915
os-zhuang merged 3 commits into
mainfrom
claude/issue-16905-clause2-build-tier

Conversation

@claude

@claude claude Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Fixes #16905

Governed surface — draft only. .claude/skills/** is governed (AGENTS.md Prime Directive #14): this PR stays draft, carries needs-user-decision, a 「维护者速读」 comment (5588349195, edited in place after the patch round), and review requests to os-zhuang and hotlong; no seat approves, undrafts, queues or arms auto-merge. SKILL.md is itself a 强制条款① surface, so this PR was built at CONTRACT_REVIEW_TIER (dispatch claim comment 5588071161) — the change cannot exempt its own landing.

Patch round (head e1edc4196) after the tier contract review (comment 5588464964, CHANGES REQUIRED); body refreshed for this head after the re-review (5588691266) read a copy predating the 16:47Z body write — the head itself is unchanged: the director seat widened the file surface to references/contract-review.md, references/core-rules.md and references/lanes/cli.md, so the references/** copies of the build mandate are rewritten here, line-neutral; the :639 consequence is stated below; the :675 tripwire has an actor and a frozen comparison arm. origin/main (70f7d6d73) merged in as a merge commit (b5be3f049, plain Merge remote-tracking branch, no trailers, no content of its own), no conflicts, no overlap with these files; the two content commits are bd26a0839 and e1edc4196, and reverting those two is the rollback recipe.

What changes

Four files under .claude/skills/pm-dispatch/, 11 insertions / 11 deletions, every file keeps its line count under its own shrink-only ratchet ceiling: SKILL.md 811 → 811, references/contract-review.md 60 → 60, references/core-rules.md 150 → 150, references/lanes/cli.md 29 → 29; every rewritten line is within the 120-byte budget (widths in the table). 强制条款② goes from "clause-② cards are built AND reviewed at CONTRACT_REVIEW_TIER" to "built at the default judgment tier, reviewed at CONTRACT_REVIEW_TIER", and every references/** sentence that still described a build/dispatch mandate now says the mandate governs the review tier only. Untouched: 强制条款① (SKILL.md main file, the decision-frame copy, .claude/agents/os-dev.md); the carrier discipline (needs:contract-review on card and PR, cleared only by a posted verdict at tier; SKILL.md :646-647 byte-identical); the tier fuse references/contract-review.md:60; references/lanes/spec.md's dispatch criteria; the four-axis frame block (SKILL.md :734-752, md5 22f2339f0acb64cdb50c7adc9db681c3 on merge-base, on head, and on current origin/main).

Exact before / after of every changed line (merge-base 0939ba008 → head e1edc4196)

file:line before after B
SKILL.md:514 - 强制条款②:凡放宽接受集或扩大公开面的卡一律契约复审档;拉回已声明契约按常规档。 - 强制条款②:凡放宽接受集或扩大公开面的卡默认判断档施工、契约复审档复核。 108
SKILL.md:517 - 条款②只指已发布契约面。 - 条款②只指已发布契约面,拉回已声明契约不触它;卡面复述仍是条款②。 97
SKILL.md:522 - 卡面对条款②的复述仍是条款②;额度耗尽豁免及其 needs:contract-review 补偿一并及于它。 (deleted)
SKILL.md:525→524 - 契约复审档留给裁决/复审子代理、skills 席与条款②工作。 - 契约复审档留给裁决/复审子代理、skills 席与条款②复核。 79
SKILL.md:640→639 - --tier 嫌疑行是提示非裁定;双肢命中任一且派发档位低于契约复审档 ⇒ ⛔ 禁止入队。 - --tier 嫌疑行是提示非裁定;双肢命中任一 ⇒ 无席内契约复审档 PASS 在案 ⛔ 禁止入队。 118
SKILL.md:(new) 675 - 报告席记条款②默认档 FAIL 率入复审清单;超改制前达档史值 ⇒ 决策卡交维护者定回退。 119
contract-review.md:10 - Clause-②: yes no 按设计临时:只定派发档位的保守方向,⛔ 非终审。 - Clause-②: yes
contract-review.md:13 - 机械地板 claim 时可查树:新导出符号或已发布载荷上的新键恒 yes,直接锁契约复审档。 - 机械地板 claim 时可查树:新导出符号或已发布载荷上的新键恒 yes,锁契约复审档复核。 116
contract-review.md:15 - claim 拿不准 ⇒ 按 yes 派契约复审档;⛔ 不建全量分类学与 claim 时决策程序。 - claim 拿不准 ⇒ 按 yes 挂标走契约复审档复核;⛔ 不建全量分类学与 claim 时决策程序。 116
core-rules.md:113 - 一单一次派发调用,档位逐卡显式传参,协议语义面与契约变更卡恒走契约复审档。 - 一单一次派发调用,档位逐卡显式传参;语义面卡恒契约复审档施工,契约变更卡恒其复核。 119
core-rules.md:124 - 受管面 PR 留 draft 并向两个授权批准账户请审;档位不足的契约卡 ⛔ 禁止入队。 - 受管面 PR 留 draft 并向两个授权批准账户请审;无达档复核 PASS 的契约卡 ⛔ 禁止入队。 115
lanes/cli.md:18 - dispatch-gates.mjs 只报路径推导的地板,条款②从卡内容判且优先于它。 - dispatch-gates.mjs 只报路径推导的地板;条款②从卡内容判,只定复核档不定施工档。 109

Where each deleted or replaced piece of content lives now

  • SKILL.md:514 「一律契约复审档」 → the new rule in the same line (default-tier build, at-tier review); the mechanism is the pre-existing 「降档施工的补偿控制 = 复核席跑契约复审档」 at :512-513, which now covers clause ② too.
  • SKILL.md:514 「拉回已声明契约按常规档」 → :517 「拉回已声明契约不触它」: narrowing is not clause ② (also lanes/spec.md:19 「收窄仍是语义面,不触条款②」), so it carries neither the mandated review nor a tier mandate — "按常规档" is now every card's default and distinguishes nothing.
  • SKILL.md:522 first half 「卡面对条款②的复述仍是条款②」 → :517 「卡面复述仍是条款②」.
  • SKILL.md:522 second half 「额度耗尽豁免及其 needs:contract-review 补偿一并及于它」 → genuinely redundant: the exemption floor is the default judgment tier (:526 「⛔ 不再往下」), now the clause-② build tier anyway; the carrier hangs on every Clause-②: yes card regardless of tier (:646-647); the review never downgrades (contract-review.md:60). No guarantee is lost.
  • SKILL.md:525 「条款②工作」 → 「条款②复核」: the ceiling tier is reserved for the clause-② review, no longer the build.
  • SKILL.md:640 「且派发档位低于契约复审档」 → deleted as a dead predicate (with every clause-② build below the ceiling it is always true, and the old line would read "clause-② PRs never enqueue"); the exit it always had — the 2026-08-16 gate text 「派发席职责止于:卡上记一行认定、挂 needs:contract-review、停手;⛔ 禁止自查放行」 — is now written on the gate line itself as 「无席内契约复审档 PASS 在案 ⛔ 禁止入队」 (PASS 在案 as defined by contract-review.md:41 落地前检①). Consequence, stated for the maintainer to rule on knowingly: the rewritten gate makes an in-seat CONTRACT_REVIEW_TIER PASS on record the sole exit for every path-limb hit (diff touching packages/spec/src/**), including Clause-②: no spec-lane PRs and at-tier builds — stricter than skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912's recorded current practice (fix(spec): isValueDomainMember refuses an off-vocabulary domain instead of failing open #16899 / docs(spec): say on the title grade which INPUT it describes #16901 enqueued on check-clause2-carriers --pair exit 0 without a PASS) and stricter than skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912's own suggested wording, consistent with lanes/spec.md:33 「条款②路径肢照命中,入队前仍过契约复核」 and with 「按更严的一条行动」. If that is not intended, :639 needs 「判定 yes」 inserted before the PASS clause. skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912 remains open; this PR does not decide it.
  • SKILL.md:675 (round 1 text 「…基线待测;实质高于达档施工 ⇒ 条款②回退」) → rewritten with an actor and a comparison arm that exists after the change: the seat writing the round report (报告席) records the default-tier clause-② review FAIL rate in the 复审清单 (contract-review.md:40); the comparison arm is the historical at-tier-built FAIL rate frozen before this change (改制前达档史值 — today n = 1: 1 FAIL / 1 at-tier-built clause-② card, objectui#8583 / PR sys_position's shipped en bundle still asserts installation-wide uniqueness that #8556 corrected at source #8601; a sample of one, ⛔ not a baseline); the report seat carries the n alongside the rate on both arms so a card is never read as a threshold breach on 1 vs 1; exceeding it produces a decision card to the maintainer, who judges the n and decides the revert — never a seat act.
  • contract-review.md:10 「只定派发档位的保守方向」 → 「只定是否必过契约复审档复核的保守方向」: the declaration's purpose is now the review mandate, not the dispatch tier; 「按设计临时 … ⛔ 非终审」 kept.
  • contract-review.md:13 「直接锁契约复审档」 → 「锁契约复审档复核」; :15 「派契约复审档」 → 「挂标走契约复审档复核」: the mechanical floor and the "unsure ⇒ yes" rule now lock/route the review, not the build; 「⛔ 不建全量分类学与 claim 时决策程序」 kept.
  • core-rules.md:113 「协议语义面与契约变更卡恒走契约复审档」 → 「语义面卡恒契约复审档施工,契约变更卡恒其复核」: 条款① (build at tier) and 条款② (review at tier) separated; 「协议」 dropped for the byte budget — 「语义面卡」 is the same term the line's own context (dispatch call, per-card tier) already scopes.
  • core-rules.md:124 「档位不足的契约卡」 → 「无达档复核 PASS 的契约卡」: after the change the only tier that can be insufficient for a contract card is the review seat's (the fuse), so the enqueue bar names the missing PASS rather than an unspecified tier.
  • lanes/cli.md:18 「条款②从卡内容判且优先于它」 → 「条款②从卡内容判,只定复核档不定施工档」: clause ② no longer overrides the path-derived build floor; it sets the review tier.

The tripwire (ruling item 3)

SKILL.md :675 as above. No new script, label or state; the record lands in the round report's 复审清单, the revert is a decision-box card.

Mechanism hypotheses (verified on origin/main @ 0939ba008)

Adjacent cards

Changeset

skip-changeset, per AGENTS.md Post-Task Checklist item 3: "that label is for a diff that publishes nothing from any released package." .claude/skills/** is not part of any released package (the published skills live in skills/**). No content/docs/releases/** touched.

Gates on head e1edc4196 (exit captured before any pipe; verdict lines quoted from the gate)

command exit verdict line
pnpm check:pm-skill-ratchet 0 SKILL.md is 811 lines (ceiling 811; headroom 0) · contract-review.md is 60 lines (ceiling 60; headroom 0) · core-rules.md is 150 lines (ceiling 150; headroom 0) · lanes/cli.md is 29 lines (ceiling 29; headroom 0)
pnpm check:skill-frame-sync 0 ✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files
pnpm check:skill-frame-freshness 0 ✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).
pnpm check:pm-skill-id-lint 0 ✓ check-skill-id-lint: 26 file(s) clean (pattern /#[0-9]{3,}/g).
pnpm check:nul-bytes 0 check-nul-bytes: OK (scanned 8369 text file(s) … no raw ASCII control bytes).
node scripts/check-closing-keyword-parity.mjs (+ --self-test) 0 / 0 check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords …)
node scripts/check-comment-mask-corpus.mjs 0 ✓ comment-mask corpus sweep: 6381 files, 0 disagree, 0 unparseable
node scripts/pm/check-governed-queue-guard.mjs --self-test 0 ✓ check-governed-queue-guard self-test: 144 cases pass
pnpm --filter @objectstack/lint run check:doc-formula-expressions 0 ✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 434 files / 1373 TS blocks judged clean (prerequisite build of @objectstack/formula + @objectstack/lint under os-verify-lock.sh: VERDICT command-exit 0 · held the lock 203s)
pnpm check:agent-test-spelling 0 ✓ check-agent-test-spelling: 0 violations
pnpm check:doc-authoring 0 ✓ doc authoring guard: 46 published skill files clean
pnpm check:driver-memory-census 0 check-driver-memory-census: OK
pnpm check:pm-governed-merges 0 self-test 274 assertions
pnpm check:pm-governed-prose 0 ✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces
pnpm check:refd-timer-probe 0 ✓ check-refd-timer-probe self-test: 11 cases pass
pnpm check:watch-hint-literal 0 ✓ check-watch-hint-literal: 66 declaration(s) across 4 rostered name(s)
node scripts/pm/dispatch-gates.mjs --ran 0 ✓ dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED.derived from the tree … at commit e1edc4196

The 16 derived families and the doc-formula / comment-mask / governed-* runs were taken on the working tree that became e1edc4196 (identical bytes, before the commit existed); the ratchet family, frame-sync, id-lint, nul-bytes and --ran were re-run on the committed head and are the readings quoted above. Control-character self-scan of the four edited files: 0 lines. pnpm lint (eslint) is CI's run and was not run locally; its population is files: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}'] (eslint.config.mjs:971), which this markdown-only diff does not enter — a population reading, not a run. No package test suite is affected (.claude/**-only diff); CI runs the full farm on the PR.


Generated by Claude Code

… gated by the contract review at CONTRACT_REVIEW_TIER

强制条款② mandated CONTRACT_REVIEW_TIER for the BUILD of any card that widens the
accept set or the public surface, while the architecture already declares the
review at that tier to be the compensation for low-tier dispatch (references/
contract-review.md 降档保险丝; the 2026-08-20 「fable 当审计师用,不当施工队用」
ruling recorded in scripts/pm/dispatch-gates.mjs). Narrow the text: clause-②
cards build at the default judgment tier and are reviewed at CONTRACT_REVIEW_TIER;
the carrier discipline, 条款①, the tier fuse and the enqueue gate's outcome are
unchanged. The now-dead tier predicate on the enqueue gate and the now-vacuous
quota-exemption sentence are deleted; the counter (contract-review FAIL rate on
default-tier clause-② builds, revert if materially above at-tier builds) lands
in the round-report section. Line count 811 → 811 under the shrink-only ratchet.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TezFG8ZMrNH6n5VTNpPpdH
@claude claude Bot added needs-user-decision skip-changeset PR has no user-facing published change; bypasses the changeset gate labels Sep 8, 2026
@claude
claude Bot requested review from hotlong and os-zhuang September 8, 2026 16:19
@claude

claude Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读(补丁轮后,head e1edc4196)

  • 改了什么:.claude/skills/pm-dispatch/ 下 4 个文件、11 行改 11 行,每个文件行数不变(SKILL.md 811、contract-review.md 60、core-rules.md 150、lanes/cli.md 29),每行 ≤120 字节。强制条款②从「凡放宽接受集或扩大公开面的卡一律契约复审档」改为「默认判断档施工、契约复审档复核」;references/** 里五处仍写「条款②卡派/锁契约复审档施工」的句子(contract-review.md :10 :13 :15、core-rules.md :113、lanes/cli.md :18)同轮改成只定复核档;删掉两句因此失效的特例(额度耗尽豁免及于条款②;入队闸门里的「派发档位低于契约复审档」谓词);〈轮次报告与节奏〉加一行计数器。条款①、needs:contract-review 双载体纪律、降档保险丝、lanes/spec.md 分派判据、四轴框架块一字未动。
  • 为什么改:你的原话「开skill卡,在裁决落地之前,你直接按新规则试行」;架构本已把契约复审定为低档派发的补偿(references/contract-review.md 降档保险丝「豁免对象是派发,复核正为补偿低档派发而存在」)和 2026-08-20 的「fable 当审计师用,不当施工队用」;条款②是唯一还把贵档压在施工这条大项上的地方。施工与复审 token 量级实测 33 万 vs 21 万,档位只改单价。复审席指出 references/** 五处与 SKILL.md 互相矛盾,总监席把文件面扩到那三份,本轮一并改齐。
  • 风险与代价(含回滚):① 主风险 = 默认档施工把公开面判错的概率是否高于达档施工,这一点没有测量,卡片自己的基线是 1 FAIL / 1(样本一,不是基线)。计数器因此是改动的另一半:轮报席在复审清单记默认档施工的条款②复审 FAIL 率,与改制前达档施工的历史值比;超出 ⇒ 立决策卡交你定回退,席位不自裁。② :639 入队闸门被重写后的后果要你知情:凡路径肢命中(diff 触 packages/spec/src/**)的 PR,不论申报 Clause-②: yes 还是 no、不论施工档位,入队唯一出口都是席内契约复审档的 PASS 在案 —— 比 skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912 记录的 spec 车道现行做法(--pair 退出 0 即入队)更严。本 PR 不裁 skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912。③ references/contract-review.md 同时被排队卡 pm-dispatch: a contract-review verdict without the label handoff is invisible to every seat — name the FAIL end-state in one sentence, and add H51 for "verdict posted on this head, carrier still on" #16836(未认领、无 PR)申报,其认领者需 re-merge。回滚 = revert 本 PR 两个 commit(4 文件、11 行)。
  • 席位意见:席位推荐落地。四轴:业务需求 — 派发席实测在付的钱在施工端;长远 — 把特例并进已有的「降档施工的补偿控制 = 复核席跑契约复审档」规则,且五份拷贝与主文一致;防 AI 犯错 — 闸门只收紧不放松,清标仍只由达档裁决完成,错误由复审拦而不是靠施工档位;创业聚焦 — 不加脚本、不加标签、不加状态,只加一行计数。
  • 你要做的:读 PR 正文里 11 行的 before/after 与「每条删行的内容现在住哪」;确认上面 ② 的闸门后果是你要的(不是 ⇒ :639 需插「判定 yes」,回补丁轮);同意则 approve + 人工直合;不同意直接关 PR,文本无副作用。此 PR 是 强制条款① 面(SKILL.md 主文件),已按契约复审档施工,改动不豁免自身落地。

Generated by Claude Code

@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 8, 2026

Copy link
Copy Markdown
Contributor

Contract review (claude-fable-5-1, isolated seat) — PR #16915 @ bd26a0839

Verdict: CHANGES REQUIRED

Isolated seat: ref fetched to refs/review/16915, diffed against the merge-base 0939ba008 (= origin/main at dispatch; origin/main is now 70f7d6d73, 4 commits ahead, merge-tree onto it is clean). Nothing in the PR body was trusted; every number below is re-measured on an extracted copy of bd26a0839.

Ruling implemented: yes, exactly the ruling zone — and no more. Card #16905 records the maintainer's instruction verbatim: 「开skill卡,在裁决落地之前,你直接按新规则试行。」 — the authorisation for a trial, not a ruling on the text (the claim 5588071161 says the same: 「⛔ Not pre-approved … The PR is the place the ruling is made, by merge」). The claim's ruling zone — governed four-piece treatment · narrowing only · 条款① untouched · carrier discipline untouched · tier fuse untouched · tripwire mandatory · ratchet paid by deletion · skip-changeset · file surface SKILL.md (+ contract-review.md / lanes/skills.md only conditionally) — is implemented: 条款① (:509) byte-identical; :646-647 (carrier on card + PR) byte-identical; references/contract-review.md not in the diff, so :60 (降档保险丝) untouched; tripwire at :675; one deletion (:522) pays for the one insertion (:675); skip-changeset hung. The conditional surfaces were not needed and were not touched.

Governed paths touched: YES — maintainer-only merge. One file, .claude/skills/pm-dispatch/SKILL.md (.claude/skills/**, Prime Directive #14; the file is itself a 强制条款① surface). 5 insertions / 5 deletions, three hunks (@511, @637, @673).

Per-line reading (merge-base 0939ba008 → head bd26a0839)

line old new faithful narrowing? content lost?
:514 凡放宽接受集或扩大公开面的卡一律契约复审档;拉回已声明契约按常规档 凡放宽接受集或扩大公开面的卡默认判断档施工、契约复审档复核 yes — build tier lowered, review tier kept; the mechanism is the pre-existing :512 「降档施工的补偿控制 = 复核席跑契约复审档」 no. Carrier discipline still stated at :646 「needs:contract-review … 由 PR 创建者随可复审契约增量同笔挂」 and :647 「Clause-②: yes 认领同笔在卡上挂标」 (+ os-dev.md:286). No conflict with the exemption floor :526 「仅当契约复审档实测不可用才落默认判断档,⛔ 不再往下」 (build tier now equals the floor) nor with contract-review.md:60 (review never downgrades; unchanged).
:517 条款②只指已发布契约面。 条款②只指已发布契约面,拉回已声明契约不触它;卡面复述仍是条款②。 yes no. 「不触它」 matches lanes/spec.md:19 「收窄仍是语义面,不触条款②」 and the following negative-boundary lines :518-520 (删误拒 = no with Contract-text: citation) read the same before and after. 「卡面复述仍是条款②」 is the first half of old :522, relocated.
:522 卡面对条款②的复述仍是条款②;额度耗尽豁免及其 needs:contract-review 补偿一并及于它。 (deleted) n/a no. First half → :517. Second half's guarantees: exemption floor = default tier (:526), which is now the clause-② build tier anyway; the needs:contract-review compensation hangs on every Clause-②: yes regardless of tier (:646-647); the review itself never takes the exemption (contract-review.md:60). Every guarantee has a home.
:525→:524 …skills 席与条款②工作。 …skills 席与条款②复核。 yes — ceiling reserved for the review, consistent with :514 no
:640→:639 双肢命中任一且派发档位低于契约复审档 ⇒ ⛔ 禁止入队 双肢命中任一 ⇒ 无席内契约复审档 PASS 在案 ⛔ 禁止入队 mixed — see finding 2. The tier predicate is dead under :514 (every clause-② build is below the ceiling, so the old line would read "never enqueue"). The new predicate 「PASS 在案」 is defined at contract-review.md:41 落地前检① 「席内契约档 PASS 在案,即卡上的达档裁决评论」. the tier bar is dropped deliberately (it is what the PR changes); no other content lost
(new) :675 复审清单计条款②默认档施工的复审 FAIL 率,基线待测;实质高于达档施工 ⇒ 条款②回退。 tripwire, as the claim required n/a — see finding 3

Gate readings (extracted tree of bd26a0839, dependency-free scripts run by this seat)

  • node scripts/pm/check-skill-line-ratchet.mjs → exit 0, SKILL.md is 811 lines (ceiling 811; headroom 0). Re-measured: 811 lines; changed lines 514/517/524/639/675 are 108 / 97 / 79 / 118 / 120 bytes (:675 is exactly at the 120-byte budget).
  • node scripts/check-skill-frame-sync.mjs → exit 0, 2 copies … structurally isomorphic.
  • node scripts/pm/check-skill-id-lint.mjs → exit 0, 26 file(s) clean.
  • node scripts/check-skill-frame-freshness.mjs → exit 0 but proves nothing in an extracted tree (freshness could NOT be established: there is no origin/main). Substituted: frame block :734-752 md5 22f2339f0acb64cdb50c7adc9db681c3 on merge-base, on head, and on current origin/main 70f7d6d73 — identical all three.
  • Diff vs merge-base: exactly one file; origin/main since the merge-base does not touch .claude/skills/**, .claude/agents/os-dev.md or AGENTS.md.
  • Commit bd26a0839 trailers: Co-Authored-By + Claude-Session only — no closing keyword / Part-of / Refs bound to a card (RULE 2 of scripts/check-partof-closing-keyword.mjs); CI check Part-of PR must not also close its card green.
  • Four governed pieces: draft: true ✓ · labels needs-user-decision + skip-changeset (+ documentation, size/s) ✓ · 速读 comment 5588349195 ✓ · reviewers hotlong, os-zhuang ✓. mergeable_state: blocked (draft + required review — expected).
  • CI (get_check_runs, 32 runs): polled once at 16:28Z — 30 of 32 completed (16 success, 14 skipped, 0 failures); 2 still in_progress at 16:28Z: Lint & Repo Gates (job 102142928896) and Type Check · workspace (job 102142928428), both started 16:19Z. Not a green reading; the director seat re-reads CI before recording. This diff is markdown-only, outside eslint's files population, so neither job's verdict can vary with it.

Findings

  1. [major] The protocol still contradicts itself on the clause-② build tier inside references/**, and none of it is in pm(dispatch-gates): clause-② prose in dispatch-gates.mjs (docblocks + every --tier printout) and core-rules.md:124 still describes a BUILD-tier mandate once the 强制条款② narrowing lands #16914. After this PR, SKILL.md:514 says default-tier build, while on the same head:

    • references/contract-review.md:10Clause-②: yes | no 按设计临时:只定派发档位的保守方向」 — the declaration's stated purpose is to set the dispatch tier, which it no longer does;
    • references/contract-review.md:13 「新导出符号或已发布载荷上的新键恒 yes,直接锁契约复审档」 — a claim-time lock of the ceiling for the build;
    • references/contract-review.md:15 「claim 拿不准 ⇒ 按 yes 派契约复审档」 — an explicit instruction to dispatch at CONTRACT_REVIEW_TIER;
    • references/core-rules.md:113 「派发调用 … 协议语义面与契约变更卡恒走契约复审档」 — an explicit dispatch mandate for contract-change cards;
    • references/lanes/cli.md:18 「条款②从卡内容判且优先于它」 — clause ② overriding the path-derived tier floor only makes sense if clause ② sets a build tier.

    pm(dispatch-gates): clause-② prose in dispatch-gates.mjs (docblocks + every --tier printout) and core-rules.md:124 still describes a BUILD-tier mandate once the 强制条款② narrowing lands #16914 exists and covers exactly what its body lists: scripts/pm/dispatch-gates.mjs prose (three sites) and core-rules.md:124. It does not cover the five lines above, and the PR body's "Untouched" paragraph presents references/contract-review.md as consistent with the change (「the tier fuse … untouched」) without disclosing that :13/:15 of the same file mandate the opposite build tier. The claim fenced contract-review.md out of the file surface unless the counter lived there, so the dev could not edit it — but the claim also says 「stop on breach; explain in the report」, and the report explains neither. A PM reading contract-review.md:15 after this lands is told to dispatch at the ceiling; one reading SKILL.md:514 is told not to.
    Expectation: either (a) the director widens the surface and this PR rewrites those five lines in place — all five can be reworded line-neutrally (e.g. :15 「claim 拿不准 ⇒ 按 yes 挂标走契约复审档复核」, :13 「…恒 yes,直接锁契约复审档复核」, core-rules :113 「协议语义面卡恒走契约复审档,契约变更卡恒过契约复审档复核」), so the ratchet (contract-review.md 60/60, core-rules.md 150/150, cli.md 29/29) is not disturbed; or (b) the maintainer accepts the interim contradiction explicitly, in which case pm(dispatch-gates): clause-② prose in dispatch-gates.mjs (docblocks + every --tier printout) and core-rules.md:124 still describes a BUILD-tier mandate once the 强制条款② narrowing lands #16914 must be widened to name these five sites and the PR body's "Untouched" paragraph must disclose them. (a) is the smaller total change; the choice is the maintainer's.

  2. [minor] :639 — direction of the gate change is not "outcome unchanged" as the body says; it is the stricter of skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912's two readings and stricter than skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912's own proposal. Old text, literal (Reading A of skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912): any path-limb hit + below-ceiling dispatch ⇒ hard bar, no exit. Old text as the instrument reads it (Reading B): the diff is adjudicated, any tier can pass. New text: any limb hit ⇒ an in-seat CONTRACT_REVIEW_TIER PASS on record is the only exit, regardless of tier. Consequences: (i) for an at-tier build the gate line itself now demands a PASS, where before only :643 / 落地前检① did — narrowing; (ii) for a below-tier build the absolute bar becomes a PASS requirement — the only reading compatible with :514, and it removes the lane freeze skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912 reports; (iii) for a Clause-②: no PR whose diff merely touches packages/spec/src/** (path limb), a PASS is now required — skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912 records that fix(spec): isValueDomainMember refuses an off-vocabulary domain instead of failing open #16899 / docs(spec): say on the title grade which INPUT it describes #16901 were enqueued on --pair exit 0 without a PASS, and skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912's suggested wording would only bar a yes verdict below tier. lanes/spec.md:33 「条款②路径肢照命中,入队前仍过契约复核」 already states (iii) for the pre-approved ledger class, so the new line is consistent with the lane's own rule and with 「按更严的一条行动」 — defensible; but the 速读 tells the maintainer 「闸门不变」, which is only true against Reading A + :643. So skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912 describes exactly this ambiguity and this line resolves it. Not deciding skills(pm-dispatch): the clause-② enqueue gate at SKILL.md:640 has two incompatible readings — one of them freezes the whole domain:spec lane whenever fable is out, and makes check-clause2-carriers --pair exit 0 unreachable #16912 here.
    Expectation: the 速读 / PR body says in one sentence that every path-limb hit now needs an at-tier PASS to enqueue, including Clause-②: no spec-lane PRs, so the maintainer rules on that knowingly; if that is not intended, :639 needs 「判定 yes」 inserted before the PASS clause (fits the 120-byte budget only with compression).

  3. [minor] :675 — the recording half is executable, the revert half is not. Who/where/when: the round-report writer, in the 复审清单 section that contract-review.md:40 does define (「轮次报告设复审清单专节,形状与代裁清单同为强制审计」), every round — fine. But 「实质高于达档施工 ⇒ 条款②回退」 names no actor, no threshold, and its comparison arm 「达档施工」 is produced by nothing in the rule once every clause-② card builds at the default tier: the at-tier sample stays at the historical 1/1 unless a PM keeps exercising :508 「按卡取用」 discretion. 「基线待测」 admits this but does not say who will measure it. The revert itself is a governed-text change, so the seat's only executable action is to escalate — the line does not say so.
    Expectation: non-blocking. Acceptable as-is if the maintainer treats the counter as a report line that feeds a human decision; otherwise the line should name the escalation (决策箱) as the trigger's output.

  4. [info, non-blocking] PR body carries two attribution footers (a bare footer, then --- + footer, appended by the platform on create). AGENTS.md:432 「⛔ never re-send a body that already carries an appended footer」 — correctly left alone.

  5. [info] Process. The freshness gate cannot be run meaningfully outside a git checkout; the md5 substitute above is the reading. The dev's claim recorded CONTRACT_REVIEW_TIER for the build, as 条款① requires for this file; this seat did not verify the transcript (contract-review.md:56) — that reading belongs to the dispatching seat.

Maintainer-only merge: yes


Generated by Claude Code

… default-tier build, and give the tripwire an actor and a frozen comparison arm

Patch round after the tier contract review. The five references/** lines that
still described a clause-② card as BUILT or dispatched at CONTRACT_REVIEW_TIER
(contract-review.md :10 :13 :15, core-rules.md :113, lanes/cli.md :18) now say
the declaration and the mandate govern the REVIEW tier only; core-rules.md :124
names the at-tier review PASS, not an unspecified tier, as what a contract card
lacks when it is barred from the queue. The SKILL.md :675 counter line now names
who records the rate (the seat writing the round report), compares it against
the historical at-tier-built FAIL rate frozen before this change, and routes a
revert to the maintainer as a decision card rather than a seat act. Every touched
file keeps its line count (811 / 60 / 150 / 29) and every rewritten line is
within the 120-byte budget.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TezFG8ZMrNH6n5VTNpPpdH

Copy link
Copy Markdown
Contributor

Contract review (claude-fable-5-1, isolated seat) — PR #16915 @ e1edc4196

Verdict: CHANGES REQUIRED (record-only — the head's text needs no further edit; the one owed item is the PR body, see finding 1)

Isolated seat, re-review of the moved head. Ref fetched to refs/review/16915 = e1edc4196 (as expected). Merge-base with origin/main is 70f7d6d73 = current origin/main (the branch merged main in b5be3f049); merge-tree --write-tree onto origin/main is clean. Nothing in the PR body or the 速读 was trusted; every reading below is re-measured on git show/git diff of the ref and on an extracted copy of the head tree.

Prior findings (review 5588464964 @ bd26a0839)

# sev status evidence on e1edc4196
F1 major closed on the text; body disclosure half open (→ finding 1) all five lines rewritten in place, line-neutral (below). Residual grep of .claude/skills/pm-dispatch/** + .claude/agents/os-dev.md for 条款② / Clause-② / 契约复审档 / CONTRACT_REVIEW_TIER / 契约卡 / 契约变更 / 档位不足 / 派契约复审档 / 锁契约复审档 / 一律契约复审档: 0 remaining clause-② BUILD/dispatch-tier mandates. What remains is 条款① (SKILL.md:509, lanes/skills.md:20 「pm-dispatch 根恒契约复审档」), the ceiling definition (SKILL.md:508), review-tier statements (SKILL.md:512-513,524,612,629,642, contract-review.md:10,13,15,52,55,57) and carrier lines. #16914's body was re-scoped (updated 16:32:56Z): scripts/pm/dispatch-gates.mjs prose only, three sites, core-rules.md:124 removed from it. #16836's overlap on contract-review.md is disclosed in the 速读 (item ③) but the PR body still says the file is not touched — that is the open half.
F2 minor half closed: 速读 yes, PR body no 速读 item ② states it: every path-limb hit (packages/spec/src/**), Clause-②: yes or no, any build tier ⇒ the sole exit is an in-seat at-tier PASS on record; stricter than #16912's recorded practice; #16912 not decided. Head SKILL.md:639 「双肢命中任一 ⇒ 无席内契约复审档 PASS 在案 ⛔ 禁止入队」 does exactly that (the declaration limb at :641 and the path limb at :640 are OR-ed by 「任一」; the no declaration does not un-hit the path limb). The PR body does not say it — the body still describes bd26a0839 (→ finding 1).
F3 minor closed SKILL.md:675 「报告席记条款②默认档 FAIL 率入复审清单;超改制前达档史值 ⇒ 决策卡交维护者定回退。」 — actor 报告席 ✓, comparison arm = the at-tier-built historical value frozen before the change ✓, revert = decision card to the maintainer, not a seat act ✓, 119 B ✓. See info finding 3 on the arm's sample size.
F4 info unchanged body still carries two attribution footers; AGENTS.md:432 forbids re-sending a body that already carries the appended one — correctly left alone as a footer matter; the body's content is now the problem (finding 1).
F5 info unchanged tier of the build seat not verified by this seat (transcript reading belongs to the dispatching seat).

F1 per-line reading (origin/maine1edc4196)

file:line old new faithful (build at default tier, review at CONTRACT_REVIEW_TIER)?
contract-review.md:10 Clause-②: yes | no 按设计临时:只定派发档位的保守方向,⛔ 非终审。 …按设计临时:只定是否必过契约复审档复核的保守方向,⛔ 非终审。 yes — the declaration now governs the review obligation, not the dispatch tier (112 B)
contract-review.md:13 …新导出符号或已发布载荷上的新键恒 yes,直接锁契约复审档 …恒 yes,锁契约复审档复核 yes (116 B)
contract-review.md:15 claim 拿不准 ⇒ yes 派契约复审档;… claim 拿不准 ⇒ yes 挂标走契约复审档复核;… yes — 挂标 matches the carrier rule at SKILL.md:646-647 (116 B)
core-rules.md:113 …档位逐卡显式传参,协议语义面与契约变更卡恒走契约复审档 …档位逐卡显式传参;语义面卡恒契约复审档施工,契约变更卡恒其复核 yes — 条款① build kept, 条款② becomes review-only (119 B)
core-rules.md:124 (6th line, not in the F1 list) 档位不足的契约卡 ⛔ 禁止入队。 无达档复核 PASS 的契约卡 ⛔ 禁止入队。 yes — restates head SKILL.md:639 (115 B)
lanes/cli.md:18 dispatch-gates.mjs 只报路径推导的地板,条款②从卡内容判且优先于它 …只报路径推导的地板;条款②从卡内容判,只定复核档不定施工档 yes — 「优先于它」 (clause ② overriding the path floor for the build) is dropped because clause ② no longer sets a build tier; the 条款① path floor itself is untouched (109 B)

Measurements (extracted tree of e1edc4196)

  • Line counts head / origin/main: SKILL.md 811/811 · contract-review.md 60/60 · core-rules.md 150/150 · lanes/cli.md 29/29.
  • Diff vs origin/main: exactly 4 files, 11 insertions / 11 deletions (SKILL.md 5/5, contract-review.md 3/3, core-rules.md 2/2, cli.md 1/1). Patch commit e1edc4196 alone (vs its parent b5be3f049): the same 4 files, 7/7. The merge commit b5be3f049 adds nothing of its own (diff bd26a0839..b5be3f049 -- .claude AGENTS.md CLAUDE.md scripts/pm is empty; diff origin/main..b5be3f049 is only bd26a0839's SKILL.md 5/5). The raw bd26a0839..head --stat shows 20 files because it spans the main merge — all 16 extra files are origin/main's, none is the PR's. scripts/pm/**, .claude/agents/os-dev.md, AGENTS.md, CLAUDE.md, content/docs/releases/** untouched.
  • Every added line ≤ 120 B: max added line is 119 B (:675); changed lines measured individually: 108 / 97 / 79 / 118 / 119 / 112 / 116 / 116 / 119 / 115 / 109 B.
  • Frame block SKILL.md:734-752 md5 22f2339f0acb64cdb50c7adc9db681c3 on head and on origin/main 70f7d6d73 — unchanged.
  • node scripts/pm/check-skill-line-ratchet.mjs → exit 0; the four touched files read 811 (ceiling 811), 60 (ceiling 60), 150 (ceiling 150), 29 (ceiling 29), headroom 0 each; total ceilings down 9 lines.
  • node scripts/check-skill-frame-sync.mjs → exit 0, 2 copies … structurally isomorphic across 2 files.
  • node scripts/pm/check-skill-id-lint.mjs → exit 0, 26 file(s) clean.
  • Governed pieces: draft: true ✓ · labels needs-user-decision, skip-changeset, documentation, size/s ✓ · 速读 = one comment (5588349195), edited in place 16:40:34Z, now titled 「补丁轮后,head e1edc4196」 ✓ · reviewers hotlong, os-zhuang ✓ · mergeable_state: blocked (draft + required review, expected).
  • Commits (3): bd26a0839 and e1edc4196 carry Co-Authored-By + Claude-Session only; b5be3f049 is a plain Merge remote-tracking branch 'origin/main' (no trailers). No closing keyword / Part-of / Refs in any commit — RULE 2 of check-partof-closing-keyword.mjs clean; CI Part-of PR must not also close its card success.
  • CI on e1edc4196 (get_check_runs, read once at 16:44Z): 24 runs — 11 success, 9 skipped, 0 failures, 4 still in_progress (Lint & Repo Gates 102149754082, Type Check · debt ledger 102149754452, Type Check · consumer gates 102149754376, Type Check · source gates 102149754362; all started 16:39:36Z). Not a green reading; the director seat re-reads before recording. The diff is markdown-only under .claude/**, outside eslint's files population, so none of the four can vary with it.
  • 速读 wording 「闸门只收紧不放松」, checked line by line for what a seat may do without a review: nothing is loosened. :514 / cli:18 / core-rules:113 lower the build tier (the change itself) while every one of them keeps the at-tier review as the mandate; :639 and core-rules:124 convert a tier predicate into a PASS requirement — a narrowing for at-tier builds (the gate line itself now demands the PASS) and, for below-tier builds, the absolute bar of the literal old text becomes PASS-gated, which is exactly the replacing guarantee; the deleted :522 half's guarantees live at SKILL.md:526, :646-647 and contract-review.md:60 (降档保险丝, byte-identical). The claim holds.

Findings

  1. [minor — the one owed item] The PR body still describes bd26a0839 and now contradicts the head. On e1edc4196 the body says 「One file, .claude/skills/pm-dispatch/SKILL.md, 5 insertions / 5 deletions」, its table is headed 「after (bd26a0839)」, its :675 row quotes the superseded sentence, the 「Adjacent cards」 section says pm-dispatch: a contract-review verdict without the label handoff is invisible to every seat — name the FAIL end-state in one sentence, and add H51 for "verdict posted on this head, carrier still on" #16836's references/contract-review.md is not touched (it is: 3 lines), and neither the five references/** rewrites nor core-rules.md:124 nor the :639 consequence appear anywhere in it. The 速读 tells the maintainer 「读 PR 正文里 11 行的 before/after 与「每条删行的内容现在住哪」」 — the body holds 6 rows for 1 file. The director's item 1 asked for the pm-dispatch: a contract-review verdict without the label handoff is invisible to every seat — name the FAIL end-state in one sentence, and add H51 for "verdict posted on this head, carrier still on" #16836 overlap 「in the body」; F2's expectation named the body too. A governed PR is ruled on by the maintainer reading the body; a body that affirmatively states the wrong file surface is a record defect even though every line of the head is right.
    Expectation: rewrite the PR body for e1edc4196 — 4 files / 11 lines with the six references/** rows added to the before/after table, 「Where each deleted piece lives now」 kept, the :639 consequence sentence (as in 速读 ②), pm-dispatch: a contract-review verdict without the label handoff is invisible to every seat — name the FAIL end-state in one sentence, and add H51 for "verdict posted on this head, carrier still on" #16836 disclosed as touched, its claimant re-merges, pm(dispatch-gates): clause-② prose in dispatch-gates.mjs (docblocks + every --tier printout) and core-rules.md:124 still describes a BUILD-tier mandate once the 强制条款② narrowing lands #16914 as re-scoped. Do it the way AGENTS.md:432 prescribes: send the footer you want stored (strip the appended block first), pass draft: true explicitly (platform-readings.md:41update_pull_request sends the draft bit whether or not you pass it), read the body back. No push, no head move, no CI round; the director seat can verify the body against this table without a second tier review.

  2. [info, non-blocking] Merge commit b5be3f049 carries no trailers (author Claude <noreply@anthropic.com>). AGENTS.md:517/542 sanction git merge origin/main on a PR branch and AGENTS.md:578 exempts the merge commit itself; no closing keyword anywhere, so nothing for RULE 2. Recorded so the squash-merge author does not read the three-commit shape as two.

  3. [info, non-blocking] The frozen comparison arm of :675 is a sample of one. 「改制前达档史值」 is, per the card and the 速读, 1 FAIL / 1 at-tier-built clause-② card (objectui#8583 / PR sys_position's shipped en bundle still asserts installation-wide uniqueness that #8556 corrected at source #8601). The 速读 discloses this (「样本一,不是基线」); the line itself no longer says 「基线待测」. Acceptable because the output is a decision card to the maintainer, who judges the n — but the report seat should carry the n alongside the rate so the card is not read as a threshold breach on 1 vs 1.

  4. [info] 速读 says 「回滚 = revert 本 PR 两个 commit」. The PR has three commits; the merge commit has no changes of its own, so reverting the two content commits is the correct recipe. Neutral.

Maintainer-only merge: yes (governed .claude/skills/**)


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 9, 2026 01:59
@os-zhuang
os-zhuang enabled auto-merge September 9, 2026 01:59
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 9294959 Sep 9, 2026
45 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-16905-clause2-build-tier branch September 9, 2026 02:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants