docs(os-dev): label step scope and precedence; maintainer digest owed on the rules layer only - #18898
Conversation
…pty-intersection action The label-timing clause stated an obligation with no scope, and the `needs:contract-review` carve-out sat twelve lines above it in the PR-body band; on a card where that carve-out was the only label owed, the literal reading hung the clause-② gate on the dev's own PR. The label band now reads as one block: scope = the labels the dispatch names, the seat's label excepted; an empty intersection means write nothing and say so in the report. The carve-out line moves down unchanged to sit inside the band it governs. Paid in-file (403/403): the size-labeler line is folded — its cause into the read-back-is-not-sufficient line, its wrap-up read-back and list-in-report into the read-back line, and its re-hang instruction was already stated there. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
…forbid The write budget and the label-timing clause read as an entitlement, while a dispatch order from a repo whose label mechanism is the seat's forbids the dev the write; each dev on such a card re-adjudicated the precedence from scratch. The timing line now names the step a default and says the dispatch may narrow or forbid it; the scope line says a forbidden write, like an empty intersection, means write nothing and say so in the report. The standing 「派发词与本文件冲突时以本文件为准:无条件条款住这里」 clause is untouched: it governs the unconditional clauses, and this step now says once that it is not one. Bytes for the tail come from dropping 「、不是 CI 的」, which 「你的默认步骤」 plus 「PR 一开出就打」 already state. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
The 速读 clause was unconditional over the governed surface while the landing is tiered: a PR whose governed paths all lie under the pm-dispatch references directory lands through the queue on the seat's contract review, so no maintainer reads its body and the five paragraphs had no reader; the body may not be patched after creation, and every fact-layer dispatch waived the clause by hand. The definition now tracks the standing tiering: the fact layer is named by its path predicate with the seat's review as its record, and the draft section is owed on the rules layer only. Paid in-file (403/403): the report-comment sentence at the top of the wrap-up section duplicated the preamble's; its two extra bits (the same JSON, the marker alone on its first line) fold into the preamble line, and the byte budget takes 「字面」 there — the next sentence already refuses the HTML-comment spelling. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
…he file's own skip-changeset criterion The scope line landed in this branch made the dispatch the only source of the label list, while the block six lines above still makes `skip-changeset` a label the dev decides by the file's own criterion; a dev whose dispatch does not name it held two readings of one file — the shape this branch treats. The scope now names both: the labels the dispatch names plus the `skip-changeset` the criterion above yields. The `needs:contract-review` carve-out leaves the scope line and is stated once, on the line directly below it (「归席位,⛔ 不挂不摘不等」), which is where it already lived; the forbidden/empty action is unchanged. 403/403, the line measures 118 bytes. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF
|
CI reading on PR #18898 @ Generated by Claude Code |
Correction to the CI reading above — the aggregator failed because a LANE did not succeed2026-09-18T05:10Z · the failing step of
Disposition unchanged: the patch commit for the seat's round-2 review is being pushed on this branch and carries a full set of runs; the seat reads the lane on the new head before any landing act, and a repeat of the same step in the same shape on a prose-only diff is judged against the base's own run of that lane, never re-run blind. Generated by Claude Code |
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)— PR #18898 · 席位定稿 2026-09-18T05:16Z(草稿在正文,以本评论为准)改了什么: 为什么改:三张卡量到同一个病——合同子句与回路实际跑的分层脱节,每次都靠现场 dev 自行裁断。已量到的代价:一次升级轮加一次板上半写状态(#18699)、两次事实层 PR 靠派发词手工豁免(#18812)、一次云端卡上 dev 从零裁断先后关系(#18821)。第一轮的范围句只认派发词,与四行之上的 风险与代价(含回滚):纯文本,不发布、不动门禁、不动 frontmatter;19 条派生门禁全绿。风险只在措辞:只读 os-dev.md 的 dev 能否答出三个问题(唯一可挂的标签是 席位意见:建议批准。三处都是把已经在跑的分层与先后关系写进合同,不新增机制;唯一取舍是为字节预算去掉了「(见 AGENTS.md)」指针,序言已说明 AGENTS.md 有约束力。 你要做的:审阅定稿三行 + 速读两行是否与你对分层落地的理解一致;一致即 APPROVE( Generated by Claude Code |
|
Landing record — ruling C, on an authorized APPROVED (skills seat, os-zhuang ( Generated by Claude Code |
Fixes #18699
Fixes #18812
Fixes #18821
Clause-②: no
Family fold of three graded cards on ONE file,
.claude/agents/os-dev.md(governed, rules layer,CONTRACT_REVIEW_TIER): the label-timing clause that had no scope (chain head), the unconditional 速读 clause against the tiered landing, and the label step against a dispatch order that forbids it. One commit per card, in that order.#18698 remains openand#18882 remains open— neither is addressed here.What changed (three commits; anchored on content — the cards' line numbers were readings at older shas)
Commit 1 — the label band gets its scope, its exception and the empty-intersection action.
needs:contract-review除外;交集为空 ⇒ 零写,报告写明。」needs:contract-review归席位,⛔ 不挂不摘不等;报 PR 上有无与--pair PR-NUMBER退出码作读数。」 moves down UNCHANGED from the PR-body band into the label band, so scope, exception and the empty-intersection action are three consecutive lines — no new special-case sentence, which the triage names as the source of the contradiction.Commit 2 — the label step is a default the dispatch may narrow or forbid.
Commit 3 — the 速读 draft is owed on the rules layer only.
## 维护者速读(草稿)节 …」 becomes two lines: the tiering 「受管路径全在.claude/skills/pm-dispatch/references/者为事实层,席位复审即记录;余为规则层。」 then the per-layer rule 「规则层 PR 正文带## 维护者速读(草稿)节,中文、业务角度,席位意见留空;事实层不欠。」 The predicate is the one AGENTS.md Prime Directive 14 and pm-dispatch SKILL.md 「受管面两层」 already use. 「(见 AGENTS.md)」 is dropped for bytes — the file's own preamble makes AGENTS.md binding.PATCH」 is untouched; the conflict closes by the definition tracking the landing, not by allowing a body patch.os-dev-report。」, duplicated the preamble's sentence; its two extra bits fold into the preamble line, now 「报告交付两次,GitHub 优先:同一段 JSON 先作 issue 评论,首行单独一行是纯文本os-dev-report。」 (「字面」 dropped for bytes; the next preamble sentence already refuses the HTML-comment spelling). This continues the dedup the previous os-dev.md PR started in the same spot.Reader tests — a dev reading ONLY os-dev.md
needs:contract-review— what do I do?」 → the scope line: it is 除外, so the intersection is empty ⇒ 零写,报告写明; the next line: report presence on the PR and the--pairexit code. Write nothing, say so..claude/skills/pm-dispatch/references/— do I write the 速读 section?」 → the tiering line says that is the fact layer and the seat's review is the record; the rule line says 事实层不欠. No.No answer needs a second text.
Line budget (
check:pm-skill-ratchet, run atee4c3c6f9).claude/agents/os-dev.md is 403 lines (ceiling 403; headroom 0)before and after; every line within the 120-byte budget. Added: the scope line, the tiering line (+2). Retired: the size-labeler line (folded, commit 1) and the wrap-up section's duplicate report-comment line (folded into the preamble, commit 3) (−2). Moved unchanged: theneeds:contract-reviewcarve-out line. Net 0 at each of the three commits, so the ratchet is green at every commit.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackatee4c3c6f9derived 19 commands (change set: 1 path vs merge base600b1e2ab); all 19 run with redirect-then-capture, exit 0 each;--ranreconciliation: 「19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN」. Named families:check:pm-skill-ratchet(403/403 as above),check:pm-skill-id-lint(27 files clean),check:agent-model-declared(os-dev.md → opus),check:nul-bytes,check:skill-frame-sync,check:agent-test-spelling,check:doc-authoring,check:commit-card-trailers,check:pm-governed-merges,check:cross-package-test-inputs,check:watch-hint-literal,check:refd-timer-probe,check:driver-memory-census, the comment-mask corpus sweep, closing-keyword parity plus its self-test, the governed-queue-guard self-test, the harness-current self-test, and@objectstack/lint check:doc-formula-expressions(first run exit 3 = PREREQUISITE NOT MET on unbuilt formula/lint packages, so not a measurement; both rebuilt under the verify lock, rerun exit 0). Also run, outside the derived set because the derivation marks its roster as sitting under.claude:check:pm-settings-deny-roster, exit 0. The 14 pending-changeset families do not apply: this PR carries no changeset (skip-changeset— nothing under any package'sfiles[]moves; the file is under.claude/**, the fast lane).The pre-push trailer check passed on the push: three commits, no card relation, no model identifier in the trailer pair.
Acceptance notes
tail --pid等它退出」 line in the wrap-up section names no pid source — a rider the previous seat left for the next os-dev.md PR; untouched here (this fold edits the section's first bullet, not that band). 承接者:the next entry on the os-dev.md serial.check:commit-card-trailersrefuses the model-named form at push — the commits and this body follow AGENTS.md. This is the shape of the card still in the decision box (#18698 remains open); not re-litigated here.维护者速读(草稿)
改了什么:
os-dev.md(开发 agent 的标准合同)三处子句改写,行数不变(403/403)。① 挂标签那条补齐范围、例外与交集为空时的动作;② 写明挂标签是默认步骤,派发词可收窄或禁;③ 「维护者速读」只在规则层受管面欠,事实层(references/目录)不欠,以席位复审为记录。为什么改:三张卡量到同一个病:合同里的子句与回路实际跑的分层脱节,每次都靠现场的 dev 自行裁断。已量到的代价:一次升级轮加一次板上半写状态;两次事实层 PR 靠派发词手工豁免;一次云端卡上 dev 从零裁断先后关系。三位 dev 都做对了(声明冲突而不是静默选边),但「dev 推理出了正确答案」不是规则。
风险与代价(含回滚):纯文本改动,不发布、不动门禁、不动 frontmatter。风险在措辞:读者只读 os-dev.md 能否答出三个问题——正文 Reader tests 逐一作答。回滚 = revert 三个 commit 中任一或全部,每个 commit 各自净 0 行,互不依赖。
席位意见:(留空)
你要做的:审阅三条改写后的子句是否与你对分层落地的理解一致,一致即批准(需
GOVERNED_APPROVERS账户的 APPROVED)。Generated by Claude Code