Skip to content

docs(pm): the clause-② contract review is tier-bound — the dispatching seat reviews in-seat at CONTRACT_REVIEW_TIER, no seat list - #18363

Merged
hotlong merged 2 commits into
mainfrom
claude/issue-18349-clause2-review-tier-bound
Sep 16, 2026
Merged

hotlong merged 2 commits into
mainfrom
claude/issue-18349-clause2-review-tier-bound

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

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 席」:

  1. 条款②复核 = 派发席在契约复审档席内做,记录写档位读数;不再有「只在 spec 席」。
  2. packages/spec 工作仍由 spec 席认领(现行规则,零延迟成本);顺手触 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:

file:line before (bytes) after (bytes)
SKILL.md :513 「强制条款②:放宽接受集或扩大公开面的卡默认判断档施工;契约复审档复核只在 spec 席。」(118) 「强制条款②:放宽接受集或扩大公开面的卡默认判断档施工;达档复核归派发席席内。」(112)
SKILL.md :523 「契约复审档留给 skills 席与 spec 席的条款②复核,其余席位 ⛔ 永不起该档子代理。」(109) 「条款②复核只在实测达档的席内做,记录写读数;未达档席 ⛔ 不审、不起该档子代理。」(114)
contract-review.md :26 「逐车道:spec 席达档审契约增量;余席默认档自审加门禁、挂标;豁免仅独立性件与保险丝。」(118) 「按档位:达档席内审契约增量;未达档默认档自审加门禁、挂标;豁免仅独立性件与保险丝。」(119)

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 a VERDICT: PASS record 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 through post-stamped.mjs were 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); on origin/main 1411cf2c it 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 the get_session fields 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, a Clause-②: yes card 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 (--pair reads Served-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; sweep grep -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 md5 3327d02c56f8a0eca88569dad2270f32.

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 unchanged 3327d02c56f8a0eca88569dad2270f32; git diff --stat = the three files and nothing else; zero raw control bytes in the touched files; every touched line ≤ 120 B (the ratchet's MAX_LINE_BYTES).

Gates (run on 55b467b0)

node scripts/pm/dispatch-gates.mjs --commands over the three paths derived 18 commands; all 18 run; --ran reconciliation: 「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). The check:pm-dispatch-gates battery was not derived for these paths. check-clause2-carriers.mjs --pair on this PR: reading in the report comment on the card.

Acceptance notes

  • Landing: the SKILL.md hunks are the rules layer, so this PR stays DRAFT; the seat hangs the four-piece and requests the authorized approval. No reviewer requested, no auto-merge, nothing flipped.
  • Region-level parallel: PR fix(pm): the enqueue bar names expected skips — a path-filtered job's skip is not a failure, and a check reports the skips outside the declared roster #18357 (SKILL.md :626–:632) and PR docs(pm): platform-readings retires the denied enqueue tool's rows and reads the REST token class per write, not per session #18359 (platform-readings :38–:63 and :126–:133) are open on the same files in other regions; this branch was not rebased onto either — whichever lands second merges origin/main.
  • Nothing versioned moves (.claude/** is shipped by no package's files[]), so skip-changeset.
  • noted, not filed (承接者: the skills seat, on this card's patch round or a follow-up card): three lines OUTSIDE the declared file surface still spell the seat-bound rule and now read against the re-keyed lines — SKILL.md :641 「交付后复核由派发席席内完成:spec 席达档,余席默认档加门禁;记录 = 同形评论落 PR 或卡。」 (it escapes the sweep pattern: 「达档,」 not 「达档审」), contract-review.md :51 「保险丝只管 spec 席条款②复核与 skills 席…」 and :52 「余席条款②复核与总监席裁决非达档裁决,⛔ 不受本丝…」 (under the ruling every clause-② review is a tier verdict, so the fuse's population becomes every reviewing seat), and :41's 「档位按逐车道」. Not edited here: outside the surface, and the fuse's post-ruling shape (:51–:52) is a design choice rather than a mechanical re-key. lanes/spec.md and lanes/skills.md: no seat-bound restatement (spec.md :19, :20, :33 and skills.md :20 are trigger and gate lines only).
  • dispatch-gates.mjs --tier prints the tier's model literal rather than the constant name; this PR names only CONTRACT_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

…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
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Sep 16, 2026
@os-zhuang os-zhuang added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 16, 2026 — with Claude
…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
@github-actions github-actions Bot added size/s and removed size/xs labels Sep 16, 2026

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: a0f37dda2326d148a180e987ef086fa4ca51b4ec

Reviewing seat: domain:skills, in-seat review at the contract-review tier — get_session read at 2026-09-16T04:26Z: configured_model = session_context.model = last_served_model, the constant's tier, no fallback notice this round. Card #18349, claim 5691755006, reports 5691933398 (head 55b467b0) and 5691993662 (the patch round, head a0f37dda) — both posted through the tool, author read back os-zhuang / User; Clause-②: no on the claim; the dev built at the review tier by the SKILL.md path mandate; seat review at tier.

① Derived judgments

  • Accept set / public surface: none moves — .claude/skills/pm-dispatch/SKILL.md :513 / :523 / :641 (in place, 118 → 112 B, 109 → 114 B, 119 → 117 B; 812 / 812; the frame block :734–:755 md5 3327d02c56f8a0eca88569dad2270f32 unchanged), references/contract-review.md :26 / :41 / :51 / :52 (in place, 118 → 119, 119 → 116, 116 → 105, 113 → 89 B; 60 / 60) and ONE new references/platform-readings.md row :429 (113 B; 463 → 464, ceiling 466 — 466 after PR docs(pm): platform-readings retires the denied enqueue tool's rows and reads the REST token class per write, not per session #18359's +2 merge, no 467th) against merge base 1411cf2c (two commits, not rebased); nothing published; skip-changeset read back (documentation + size/s + skip-changeset). GOVERNED (.claude/** ×3 by check-governed-merges --test, exit 3) ⇒ the four-piece hangs here and the PR waits for an authorized APPROVED; ruling C after it.
  • The change, read whole on a detached worktree of the head — the maintainer's ruling (「同意」, recorded verbatim at 5690995190) made text: the clause-② contract review is TIER-bound, not seat-bound. :513 「强制条款②:放宽接受集或扩大公开面的卡默认判断档施工;达档复核归派发席席内。」; :523 「条款②复核只在实测达档的席内做,记录写读数;未达档席 ⛔ 不审、不起该档子代理。」 (the ⛔ half survives as a tier condition, 「子代理」 kept greppable); :641 「交付后复核由派发席席内完成:达档审,未达档默认档加门禁;记录 = 同形评论落 PR 或卡。」; contract-review :26 「按档位:达档席内审契约增量;未达档默认档自审加门禁、挂标;豁免仅独立性件与保险丝。」 (the exemption clause verbatim), :41 「(档位按实测)」 for 「(档位按逐车道)」, :51 「保险丝管每个出条款②裁决的席,每场前必读服役档 …」 — the fuse's population follows the ruling (every seat that issues a clause-② verdict is a served-tier reader), :52 keeps the director seat's exemption and drops the 「余席条款②复核」 class that no longer exists; the SELF-REVIEW machine reading (:37) and the independence pair (:35–:36) untouched; sentence 2 of the ruling (new packages/spec work stays the spec seat's) needed no text — :25 and SKILL.md :527–:528 already say it; SKILL.md :610 (the published skills face's clause-① routing, 「档外席先交 skills 席」) deliberately untouched — a different clause. The platform-readings row: 「harness 按内容拒写:同会话派发 PR 上 PASS 拒为 [Self-Approval];同通道建卡、ACCEPT 照过。」 — the channel-and-content pair, no rule claimed beyond the measurement. The widened sweep (「只在 spec 席」/「其余席位 ⛔ 永不起该档」/「spec 席达档审」/「达档,余席」/「余席条款②」/「档位按逐车道」/「只管 spec 席」) reads 0 on the head (3 + 4 before, across the two rounds); lanes/spec.md and lanes/skills.md carry no seat-bound restatement (read by the dev; the seat's own grep agrees).
  • Seat re-runs on the head: check:pm-skill-ratchet 812 / 812 · 60 / 60 · 464 / 466; check:pm-skill-id-lint 27 files clean; check:skill-frame-sync coherent; check-governed-merges --test GOVERNED ×3; --pair 18363 0; every changed line measured ≤120 B (112 / 114 / 117 / 119 / 116 / 105 / 89 / 113); frame md5 unchanged; git diff --name-only = the three files. Gates: 18 derived, 18 run, 0 NOT MEASURED on BOTH heads (--ran DERIVED zero each round), check:doc-formula-expressions built under the verify lock then green, the battery not derived; check-closing-keyword-parity binds Fixes #18349 alone.

② Semver level

Not applicable — nothing published moves; skip-changeset measured.

③ Boundary flags

open_questions: one, answered A by the seat on the direct channel — the four residual seat-bound lines (:641, contract-review :41 / :51 / :52) folded into this PR as a second commit rather than a follow-up card, because a rules layer that says 「达档复核归派发席席内」 at :513 and 「spec 席达档,余席默认档」 at :641 for a whole approval cycle is the self-contradiction an AI reader resolves the wrong way, and the fuse's population change is the ruling's own consequence, not a new judgment. One seat premise owned: the dispatch named contract-review :25 for the 「逐车道」 line — it is :26 on 1411cf2c (matched by content). Deviations answered (both rounds): 「记录写读数」 for 「记录写档位读数」 at :523 — accepted (6 B bought the exclusivity word; 读数 is this corpus's term, Served-tier: per record is :29's); 「按档位」 for the proposal's 「逐席位」 at :26 — accepted (155 B proposal vs the cap; :29 carries the record's requirement); the row carries no date or repo (113 / 120 B) — accepted, the PR body carries provenance; the formula / lint build — accepted; the PR opened after the gate sweep — accepted; the PR body's Acceptance notes still call :641 / :51–:52 「noted, not filed」 — superseded by the second round and by the 速读终稿 below (a body PATCH is outside the dev's budget). Noted, not filed by the dev, agreed: dispatch-gates.mjs --tier prints the tier's model literal, which every quoting seat transcribes to the constant name by hand; what distinguished objectui's refused PASS from this seat's five served PASS records is unmeasured — the row claims only the pair. Landing: governed — the four-piece hangs here (this record, the 速读终稿 below, the ACCEPT on #18349, needs-user-decision, reviewer hotlong requested — os-zhuang is this PR's author under the seat's write identity); ⛔ this seat writes no approving review; ruling C after an authorized APPROVED — record on the current head, --pair 0, every check success or a rostered skip, clear needs-user-decision, ready through the CCR route, auto-merge SQUASH. Region-parallel with PR #18357 on SKILL.md (:629) — whichever lands second merges origin/main. The seat stands down this shift on the maintainer's order: the ruling-C landing falls to whoever holds the seat when the approval arrives, or to the approver's own ready + enqueue (the record is on this head).

Implemented-by: claude/issue-18349-clause2-review-tier-bound
Reviewed-by: session_01HZfg2AwVX191qCizp88gQr

VERDICT: PASS


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)— 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 被拒作 [Self-Approval],同通道建卡与 ACCEPT 照过)。裁决第二句(新 packages/spec 工作仍归 spec 席)原文已有,不动;:610 技能面条款①路由不属本卡,不动。全部原地改键,812/812、60/60、464/466(与 PR #18359 合后 466,不超),帧块 md5 不变,不带卡号与型号串。

验证:本席在 head a0f37dda 的独立 worktree 重跑:ratchet、id-lint、frame-sync 绿;受管面读数 GOVERNED ×3;--pair 18363 0;八条改动行逐行量字节(112/114/117/119/116/105/89/113,全 ≤120);扩宽后的席位绑定扫描 0 命中(两轮前共 7);dev 两轮各 18 条派生门禁全跑全绿。

要你做的:审 PR #18363,同意即 APPROVE(只能请 hotlong;os-zhuang 是 PR 作者)。⚠️ 本席本班到此收班:批准后的裁定 C 落地由届时在席者做,或你批准后自行 ready + 入队(记录在 head 上)。与 PR #18357 同改 SKILL.md 不同区域,后落地的合一次 origin/main 即可。


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

Ruling-C landing provenance — skills seat (signed off, 留守 on this PR), session session_01HZfg2AwVX191qCizp88gQr, 2026-09-16T06:42Z. Governed rules layer (SKILL.md :513 / :523 / :641, contract-review.md :26 / :41 / :51 / :52, one platform-readings row — the clause-② review made tier-bound per the maintainer's 2026-09-16 ruling): the authorized APPROVED review is hotlong's 5219294383 at 2026-09-16T06:39Z on the current head a0f37dda2326d148a180e987ef086fa4ca51b4ec (not dismissed) — the record 5692045480 PASS is on that same head, check-clause2-carriers.mjs --pair 18363 exits 0, every check on the head reads green (31 check-runs: 18 success · 13 skipped, every skip in the roster — check-expected-skips.mjs --head a0f37dda exit 0), mergeable_state: clean. The seat cleared needs-user-decision at 2026-09-16T06:41Z (read back: documentation + size/s + skip-changeset). The approver pre-empted the landing strokes: ready_for_review by hotlong at 2026-09-16T06:39Z, auto_merge_enabled by hotlong at 2026-09-16T06:39Z (the stored method reads merge; the queue rule enforces SQUASH), added_to_merge_queue at 2026-09-16T06:40Z; the queue ref refs/heads/gh-readonly-queue/main/pr-18363-* read 1 at 2026-09-16T06:41Z. Region-parallel with PR #18357 (SKILL.md :629), one queue chain ahead of this PR — the queue merges this head on top of it; the regions are disjoint. ⛔ No approving review was written by this seat; the queue is the only landing path; merged_at and the single-parent squash are the landing readings, posted on #18349.


Generated by Claude Code

Merged via the queue into main with commit 05f1cdd Sep 16, 2026
35 checks passed
@hotlong
hotlong deleted the claude/issue-18349-clause2-review-tier-bound branch September 16, 2026 07:05
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 size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants