docs(pm,agents,checklist-test): four rules-layer lines catch up with lock 1, the two-tier landing and ruling C (#18119) - #18182
Conversation
…lock 1, the two-tier landing and ruling C Equal-line edits, ratchets unchanged (SKILL.md 812/812, AGENTS.md 1075/1075, checklist-test 234/238), every rewritten line within the 120-byte cap. - pm-dispatch SKILL.md :378 — the dead MCP `issue_write` caveat becomes the landed channel: label/assignee writes go through scripts/pm/label-write.mjs (four steps, read-back); MCP `issue_write` is denied by lock 1. - pm-dispatch SKILL.md :615 / :626 — 等人合 (await a human merge) becomes 等人批 (await the authorized approval); the label leaves on approval or withdrawal. - AGENTS.md Prime Directive 14 :273–:274 — the unapproved ending is the authorized approval, then the owning seat lands it; :284 — a spent approval, not a human merge, is the review record. - checklist-test SKILL.md :123 — the run record is filed through the REST proxy (POST .../issues, Content-Type: application/json), never MCP `issue_write`. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: 7/7 In-seat record on the GOVERNED rules layer ( ① Derived judgments
② Semver levelNone. ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读改了什么:三个规则层文件里的四行(连带同段两句)追上已经落地的机制 —— 为什么改:规则层和它自己的 references(rest-channel、lanes/ui、landing-operations)说的不一样,会把席位训练回退役的机制;文档以实际实现为准。 风险与代价(含回滚):零机制变化,纯文案;回滚即 revert。 席位意见:dev 顺手列出了六处同形残留(SKILL.md :610 仍写「人工直合即审核记录」两条终局、:622/:672 与 core-rules :128 的轮报项、AGENTS.md :255 标题句与 :799、队列守卫的拒收文案),都在本卡围栏外,本席另立一卡跟进,不扩这个 PR。 你要做的:os-zhuang 或 hotlong 一次 approve;之后由本席落地。是 / 否? Generated by Claude Code |
|
Landing under ruling C — Generated by Claude Code |
Fixes #18119
Governed rules layer —
.claude/skills/pm-dispatch/SKILL.md+AGENTS.md+.claude/skills/checklist-test/SKILL.md. This PR opens as DRAFT and draft is its finished state: it waits for an authorized APPROVED review by an account inGOVERNED_APPROVERS, after which the claiming seat lands it (Prime Directive 14; ruling C, maintainer verbatim, untranslated: 「C. approve 后不管后续改动都由席位落地:」, recorded on #17971). Never ready, never queued, never auto-merge, and no seat approves it under any account.Base
origin/mainfffe3e5e7f(fetched 2026-09-14T11:14Z); this branchclaude/issue-18119-rules-layer-four-linesat6dc9ac3e52, one commit, three files, net 0 lines in each (git diff --numstat: 1/1 · 3/3 · 3/3).What changed — seven equal-line edits, no other line moves
Every rewritten line stays within the enforced 120-byte cap (
MAX_LINE_BYTES = 120inscripts/pm/check-skill-line-ratchet.mjs); byte widths after each row.SKILL.md- ⛔ `issue_write` 会替换标签集并清空未传字段:写入时必须回传 `assignees`。(96 B)- 标签/assignee 写恒经 `scripts/pm/label-write.mjs`(四步、回读);⛔ 永不 MCP `issue_write`(锁 1 已拒)。(119 B)SKILL.md- PR 上的标签 = 待维护者审阅,不入六态;与请审同为等人合清单,随合并或撤回判决离开。(116 B)- PR 上的标签 = 待维护者审阅,不入六态;与请审同为等人批清单,随获批或撤回判决离开。(116 B)SKILL.md- 规则层四件套等人合;事实层 PR(受管路径全在该目录)经席内达档复核后 ready → 入队。(115 B)- 规则层四件套等人批;事实层 PR(受管路径全在该目录)经席内达档复核后 ready → 入队。(115 B)AGENTS.md(PD 14)uncertified recompute, drift or a hand-authored sibling keeps it governed. Unapproved, the bypass direct merge(114 B)uncertified recompute, drift or a hand-authored sibling keeps it governed. Unapproved, no seat lands it: the(112 B)AGENTS.md(PD 14)(人工直合) is the only landing. **Landing is tiered**: a PR whose governed paths all lie under(102 B)ending is that approval, then the owning seat. **Landing is tiered**: a PR whose governed paths all lie under(113 B)AGENTS.md(PD 14)human merge IS the review record, ⛔ not a relaxation. Behind it: the queue guard refuses an unpinned governed(115 B)spent approval IS the review record, ⛔ not a relaxation. Behind it: the queue guard refuses an unpinned governed(118 B)SKILL.md用 `issue_write`(github MCP)立单:(36 B)经 REST 代理 `POST .../issues` 立单(`Content-Type: application/json`;⛔ 永不 MCP `issue_write`,锁 1 已拒):(117 B)Notes on the wording, each taken from the facts layer rather than invented:
rest-channel.md:38–:39's words (scripts/pm/label-write.mjs, 四步、回读, ⛔ 永不 MCPissue_write, 锁 1 已拒); the full four-step rule already lives at SKILL.md :148, so the parenthetical is a pointer, not a restatement.landing-operations.md:28 (「四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地」). The 获授权批准后认领席落地 half already stands at SKILL.md :616–:617 (「席位落地 = 过落地前检、清标、ready、auto-merge」), and no spelling that carries both halves fits the 120-byte cap with the 事实层 half unchanged (the shortest measured 131 B), so the line carries the token and :617 carries the mechanism.lanes/ui.md:25 states (「⛔ 未获授权批准不 ready 不入队不自合、永不批准,获批后认领席落地」): unapproved, no seat lands it; the ending is that approval (the authorized APPROVED review by aGOVERNED_APPROVERSaccount named four lines above), then the owning seat. The sentence says nothing about what the maintainer may do by hand, so it does not contradict the queue guard's own refusal text (see Consistency, item 5).check-governed-queue-guard.mjs:2436, "never … calls that merge the record"); under ruling C the maintainer's word is spent once, as the approval, so "a spent approval IS the review record" — same sentence, same line count.rest-channel.md's own spelling (POST .../issues, request body as JSON). The field list that follows (标题 · 标签 · 正文, :125–:150) is already the shape of a REST issue body — title, labels, body — so no line below :123 needed to move.Premise readings (all against
origin/mainfffe3e5e7f)pnpm check:pm-skill-ratchetexit 0 on the tip: SKILL.md 812/812 (widest row 342/342), AGENTS.md 1075/1075 (widest row 768/768), checklist-test 234/238 (widest row 221/221), core-rules 151/151. Frame block :733–:754 md53327d02c56f8a0eca88569dad2270f32before and after — identical.issue_write|等人合|人工直合reads 1 hit, NOT 0: :128 「…代裁清单、等人合项、受管合并审计与五指标。」 — the round-report rule, which mirrors SKILL.md :672 (「awaiting a human merge 项」), not any of the four lines. The controlgrep -c 'label-write\|四件套'reads 0 in that file as well (neither control word is in core-rules today; stated as read). Per the dispatch's branch, core-rules.md is untouched; the mirrored pair is listed under Consistency item 2.rest-channel.md:37 「✓ 标签加法POST .../issues/{n}/labels,定向删DELETE .../issues/{n}/labels/{name};加法优先。」 :38 「标签/assignee 写恒经scripts/pm/label-write.mjs:四步内建、回读、回退整组 PATCH 回传 assignees。」 :39 「⛔ 永不 MCPissue_write(锁 1 已拒);会话分类器拒改动 ⇒ 无通道,交有通道席位立卡。」;lanes/ui.md:25 「⇒ 命中即停 draft;⛔ 未获授权批准不 ready 不入队不自合、永不批准,获批后认领席落地。」;landing-operations.md:27 「受管路径全在本技能references/者事实层:席内达档复核过落地前检三条即转正式入队。」 :28 「其余为规则层:四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地。」 :29 「⛔ 两层不由席位批准;清标即落地同受此闸,漏判会被队列守卫在 merge group 里拒收。」GET /pulls?state=openreturns exactly the six the dispatch named (18176, 18175, 18173, 18131, 18096, 17076); each/fileslist read via REST; zero hits on the three files.permissions.denyon the tip carries 14 entries, not 15, withmcp__github__issue_writefirst among them; the same 14 at lock 1's own commit7ef05f997. The 15 was a miscount; the substance (the tool is denied) holds.Consistency — sentences of the same retired shape this PR does NOT move (the card's fence: no other line)
SKILL.md:610 「② PR 留给维护者看得见地悬着;终局两条:人工直合即审核记录;授权批准 ⇒ 席位落地。」 — still two endings, with the human direct merge as the review record (the exact phrase retired at AGENTS.md :284 here and in the queue guard). Not named by the card; left as is. An equal-line candidate within the cap, for the seat to accept or reject: 「- ② PR 留给维护者看得见地悬着;终局一条:授权批准即审核记录 ⇒ 席位落地。」SKILL.md:622 「④ 轮次报告单列 awaiting a human merge。」 and :672 「…awaiting a human merge 项…」 with its core-rules mirror :128 「等人合项」 — the round-report item still named after the human merge; per 〈优先级〉 :44 the :672 ↔ :128 pair moves together, in one PR.AGENTS.md:255 (the PD 14 headline) — "confirmed and merged by the maintainer, by hand — or confirmed by an authorized approval and then landed by the owning seat" still names the hand merge as ending one. NOT changed on purpose:scripts/pm/check-governed-prose.mjs:148 anchors its AGENTS.md region on that exact sentence (start: 'A governed surface is confirmed and merged by the maintainer, by hand'), so the sentence and the anchor must move in the same PR — outside this card.AGENTS.md:799 (Skills section) — "human-merge only, or queued under Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14's pinned-approval path" — outside PD 14, outside the card.scripts/pm/check-governed-queue-guard.mjs:1197 and :1273 print "Unapproved, the maintainer's own direct merge (人工直合) is the only landing this pull request has", and its self-test :2441 pins that word present;landing-operations.md:49 keeps 人工直合 as the main-red one-line exception;lanes/director.md:44 says 「等人合清单」. The :274 wording chosen here is compatible with all of them (it constrains seats, not the maintainer).scripts/pm/check-governed-merges.mjs:140 andscripts/check-required-contexts.mjs:288 ("human merge IS the review record") — comments, not rules.Gates (foreground, exit captured before any pipe, all on
6dc9ac3e52)Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(18 families; the seat's derivation named the same set). Each ran with stdout and stderr redirected into its own log file and the exit status captured immediately after, before any pipe:node scripts/check-closing-keyword-parity.mjs… --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-governed-queue-guard.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressions@objectstack/formula,@objectstack/lintunbuilt); built underscripts/pm/os-verify-lock.sh(VERDICT command-exit 0 · held the lock 5s · waited 0s), re-run exit 0: 58 self-test cases, 22 record-scoped examples / 438 files cleanpnpm check:agent-test-spellingpnpm check:doc-authoringpnpm check:docs-audit-scopepnpm check:driver-memory-censuspnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:pm-governed-prosepnpm check:pm-skill-id-lintpnpm check:pm-skill-ratchetpnpm check:refd-timer-probepnpm check:required-contextspnpm check:skill-frame-syncpnpm check:watch-hint-literalReconciliation (
--ran, exit codes recorded per command):Run reconciliation — 18 derived, 18 run, 0 NOT-MEASURED, 0 UNRUN.…✓ dispatch-gates --ran: 18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3).Also outside the derivation: the pre-push hookcheck:commit-card-trailerson the push (1 commit, no card relation, no model identifier in the trailer pair); the control-byte self-scangrep -naPover the three files reads none.Changeset: none owed. The three paths are
.claude/**andAGENTS.md— nothing any package'sfiles[]ships. Thechangeset-checkjob inpr-automation.ymlhas two exemptions (theskip-changesetlabel and the release PR) and no path exemption, so the label is applied through the additive endpointPOST /issues/{n}/labelsright after this PR opens and read back; the read-back is recorded in the os-dev-report comment on the card (this body is not re-sent).维护者速读(草稿)
issue_write已被拒、规则层等的是批准而不是人合、批准后由认领席落地。Acceptance notes
domain:skillsseat (owner of SKILL.md,references/**andscripts/pm/**); items 3 and 5 need a gate/anchor edit in the same PR as the prose..claude/agents/os-dev.mdfixes five segments, and that file wins on conflict — five compact bullets above.platform-readings.md:338); the body was read back after creation.Clause-②: no
Generated by Claude Code