Skip to content

docs(pm-dispatch): instrument discipline — hard gates answer definite questions only; C5 and the patrol anchor stop blocking; at-tier review scoped to what ships and read from CI (#19496) - #19513

Merged
os-zhuang merged 6 commits into
mainfrom
claude/issue-19496-instrument-discipline-charter
Sep 21, 2026
Merged

os-zhuang merged 6 commits into
mainfrom
claude/issue-19496-instrument-discipline-charter

Conversation

@os-project-manager

@os-project-manager os-project-manager commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

Fixes #19496

Clause-②: no

Tier H — the maintainer merges this by hand. The diff touches AGENTS.md and .claude/**, so one Tier H path makes the whole PR Tier H: no seat flips it ready, queues it, or arms auto-merge, and no agent account approves it.

Authorization, verbatim and untranslated — maintainer, 2026-09-21 (ruling #208 on #19491):

「19491 接受你的建议,并立刻派发处理相关任务。」

What lands — five charter edits, text only

Nothing under scripts/, .github/ or packages/ is touched. The C5 code demotion, the patrol schedule and the CI self-test scoping are their own cards.

R1 — a non-zero --pair blocks landing only on rows that answer a definite question. SKILL.md 〈入队与落地〉 and references/contract-review.md 落地前检三条:

- `Clause-②: yes` 认领同笔卡上挂标;开 PR 跑 `--pair N`:只确定性行红才挡请审,C5 只印读数。
- 0 = 确定性行全清;4 = 任一不成立,只确定性行红才挡落地;3 = 环境答不了 ⛔ 不作干净。
- 确定性行 = 记录在案、`Served-tier:`、双载体一致、认领形;C5 放宽 tell 只报告,归复核裁。

AGENTS.md Prime Directive #14 is where the conjunct lives — git grep -n -- '--pair' AGENTS.md .claude is the census (1 hit in AGENTS.md, 5 in .claude). Tier S now reads reads 0 on its definite rows (⛔ never C5) and every check is green; the paragraph was re-wrapped from that sentence onward and AGENTS.md stays at 1109 lines.

R2 — the rule line, next to the tooling rules ruling #202 B landed, in 〈分诊座位职责〉's filing classes:

- 只报告的仪器,报错不配 dev:猜意图的只印读数,误报席位一句推翻,⛔ 不立卡不派 dev。

R3 (charter half) — the patrol anchor stops being a precondition. The two 〈执行座位职责〉 lines are deleted; one line replaces them, mirrored in references/core-rules.md:

SKILL.md      - 半状态巡查按需跑(分诊席每日对账可调),H 行是读数不是前提;⛔ 不因锚行停派发。
core-rules.md - 半状态巡查按需跑,其 H 行是读数不是前提,⛔ 不因锚行停派发。

R5 — at-tier review: scope and shape, in references/contract-review.md 〈复核归属与资格〉:

- 复核面 = 出货给用户或 agent 的:`content/docs/**`、`apps/docs/**`、CHANGELOG/`.changeset` 散文。
- 同含已发布 schema 与 governed 规则文本;三面皆不碰 ⇒ CI 加席位自读,⛔ 不起第二个 agent。
- 复核形状:只读 diff 与卡片,check 结论取 head 的 check-runs,⛔ 永不本地重跑派生门禁族。

Served-tier: and the record shape are unchanged. check-clause2-carriers --template prints nothing that contradicts the shape: its ③ is the record's boundary-flag heading and it prescribes no local gate run, so no script edit was needed (checked; reported below as a reading, not a finding).

R6 — 〈仪器纪律〉 is a new reference, references/instrument-discipline.md (11 lines), with exactly one pointer line in SKILL.md 〈平台读数纪律〉, placed one line below the advisory-red rule:

- 仪器纪律(硬门禁面、只报告面、新增授权、工具位)见 `references/instrument-discipline.md`。

The section itself:

- 硬门禁只答有确定答案的问题:受管登记表、队列守卫、CI 测试、复核记录在不在。
- 判意图的仪器(放宽 tell、半状态巡查)只印读数 ⛔ 不挡落地,误报由席位一句话推翻。
- 放宽 tell(C5)由 `scripts/pm/check-widening-tells.mjs` 印 file:line,归达档复核裁。
- 只报告的仪器不配 dev:⛔ 不立卡、不派 dev、不开 PR;它的在途工作只有删除。
- 新增门禁、巡查行或棘轮须在卡上引维护者原话,⛔ 无原话不新增;首行四件恒硬。
- 工具位只有一个,先花在删除上;`dispatch-gates.mjs` 冻结,只在它喂的 workflow 坏了时碰。
- 出处:维护者 2026-09-21 逐字「19491 接受你的建议,并立刻派发处理相关任务。」

Why a new file rather than landing-operations.md. Every file an at-tier reader already opens for landing or gates stands at its ceiling with zero headroom — landing-operations.md 69/69, true-green.md 32/32, review-checklist.md 77/77 — and the section costs 11 lines, so hosting it in one of them means deleting live rules, which this card forbids. The pointer instead sits where the reader deciding what a gate reading means already is: 〈平台读数纪律〉, right after the two lines on a gate job's conclusion and an advisory red. The new file carries no CEILINGS row, because that row is an edit under scripts/** (out of scope here) and R6's own rule says a new ratchet needs the maintainer's sentence on its own card — reported below.

The line ratchet — no ceiling raised, every added line paid in place

pnpm check:pm-skill-ratchet exit 0. Per-file counts on head fec2177089, after merging origin/main:

file lines ceiling headroom net this PR
.claude/skills/pm-dispatch/SKILL.md 819 819 0 0
.claude/skills/pm-dispatch/references/contract-review.md 60 60 0 0
.claude/skills/pm-dispatch/references/core-rules.md 151 151 0 0
AGENTS.md 1109 1109 0 0
.claude/skills/pm-dispatch/references/instrument-discipline.md 11 none new file

What paid for the added lines — de-duplication only, no rule deleted, each surviving carrier named:

  • SKILL.md 〈复核〉's two 受管面两层 lines became one. The Tier H enumeration it dropped is the 〈复核〉 line three above it (governed 面统一定义), and 四件套 is stated at 路径面命中规则层 ⇒ ACCEPT 换终局四件套.
  • contract-review.md's 双载体同笔挂 line is stated in SKILL.md 〈入队与落地〉 (needs:contract-review(恒英文)由席位同笔挂:PR 一现即挂 PR;报告先到则先挂卡); its unique tail, ACCEPT 补齐 PR 侧, rides the next line.
  • contract-review.md's two Implemented-by: / Reviewed-by: spelling lines became one pointer at --template, which prints both fields verbatim — and the record-shape line three above already cites that template.
  • contract-review.md's standalone Tier H/S landing line left; the tier outcome now rides the 落地前检三条 line itself, so references/lanes/director.md's pointer at this block still resolves, and SKILL.md 〈复核〉 carries the full two-tier rule.
  • AGENTS.md: 43 added bytes absorbed into the paragraph's own slack by re-wrapping from the edited sentence onward; no line was bought.

Collision — both charter PRs merge clean

Acceptance

grep result
git grep -n '0 才请审' .claude 0 hits (exit 1)
control git grep -n -- '--pair' .claude 5 hits (os-dev.md 1, SKILL.md 1, contract-review.md 2, platform-readings.md 1)
git grep -n '锚行未处置' .claude 0 hits (exit 1)
control git grep -n '半状态' .claude 24 hits across 8 files
git grep -n 'C5' …/references/contract-review.md 1 hit, naming it 只报告

Gates

Derived on this diff with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack — 23 commands; the derivation also names 11 wide-population, 53 artifact-roster, 14 pending-changeset and 2 CI-valued families as outside that list, so this is not a complete account of CI. Every exit code was captured before any pipe (cmd > log 2>&1; e=$?). Reconciled with --ran: 23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN.

node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0
node scripts/pm/check-harness-current.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:docs-audit-scope :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-expected-skips :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-governed-prose :: exit 0
pnpm check:pm-half-states :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pm-skill-ratchet :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:required-contexts :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:watch-hint-literal :: exit 0

Three more, run because this card names them:

pnpm check:pm-widening-tells :: exit 0      (self-test only — 525 cases; checker health, not a verdict on this diff)
node scripts/pm/check-widening-tells.mjs --declaration no --diff pr.diff :: exit 0   (a real verdict: no tell)
pnpm check:pm-label-desc-cap :: exit 0
pnpm check:pm-settings-deny-roster :: exit 0   (its roster lives under .claude, which this diff is in)

Two gates first answered exit 3 (PREREQUISITE NOT MET) in a fresh worktree and were re-run after pnpm install, and check:doc-formula-expressions after pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint under the shared verify lock (VERDICT command-exit 0). Those 3s are recorded as what they are — nothing measured, not a finding.

skip-changeset applies: the diff is .claude/** plus AGENTS.md, nothing under packages/**, and no published files[] content moves.

Acceptance notes — out of scope, not filed by the dev

  • SKILL.md 〈状态模型〉 still says 派发与折叠检查时读半状态巡查锚的 H17 触发文件索引. With the patrol's schedule retired on its own card, that index can go stale; this card's R3 scope was the two 〈执行座位职责〉 lines only. Dedupe words: 半状态巡查锚, H17, 触发文件索引, 折叠检查.
  • references/instrument-discipline.md carries no CEILINGS row, so it is the one un-ratcheted file on the pm-dispatch surface. Adding the row is an edit under scripts/**, and by R6's own rule a new ratchet needs the maintainer's sentence on its card. Dedupe words: CEILINGS, instrument-discipline, ratchet row, un-ratcheted reference.
  • check-clause2-carriers --template prints no line contradicting R5's shape (checked; no script edit).

维护者速读(草稿)

改了什么 — 把「仪器」这件事写成纪律:--pair 这类硬门禁只在能给出确定答案的行上挡落地(复核记录在不在、档位行在不在、两个标签载体一不一致、认领形对不对);猜意图的那一行(C5 放宽 tell)从此只印读数,由达档复核的人判。半状态巡查从「每轮派发的前置条件」降为「按需跑的读数」。达档复核的范围收到「会出货给用户或 agent 的东西」,形状收到「读 diff 加读 CI 的 check-runs」,不再本地重跑门禁。新增一页〈仪器纪律〉,把这几条连同「只报告的仪器不配 dev」「新增门禁要维护者一句话」「工具位先花在删除上」写在一起。

为什么改 — 裁决 #208 的实测:工具链自己占了三到四成的合并量、每个 PR 三分之二的 CI 关键路径;把 #19314 挡住的那道门,本体只是两句章程话,不是 CI 门禁。一次达档复核 24 万 token、29 分钟,其中最大一块是在本地重跑 CI 已经跑过的 37 个门禁族。这三件都不是删代码能解决的,是纪律写错了地方。

风险与代价(含回滚) — 代价是硬门变软:C5 不再挡人,漏网要靠复核的人看见。回滚是一次 revert,因为全是文本。棘轮一行没抬,新增的行全部用去重付账,幸存载体逐条点名在上面;唯一的新面是那一页新文件,它暂时没有棘轮行。

席位意见

你要做的 — 读这五处改动,同意就人工合并(Tier H,队列与 auto-merge 都不适用)。

Round 2 (seat's note)

Head 96774e44ef. The at-tier review (5755678024, FAIL) named three items; all fixed in one push: R5's obligation now keys on the face, not the lane (references/contract-review.md 〈复核归属与资格(按面)〉 lines 24–27, SKILL.md line 647, plus the two lane-keyed twins at SKILL.md 533 and core-rules.md 113 — 「三面」 is now 「五面」 and the published schema names its path packages/spec/src/** non-test); origin/main (ea64bbc6e8) merged with the SKILL.md 180/181 conflict resolved keep-both; instrument-discipline.md cites ruling 208 / card 19491 / comment 5755284987 with bare ids (the # spelling is what check:pm-skill-id-lint refuses). Ratchet: SKILL.md 815/819, contract-review.md 60/60, core-rules.md 151/151, AGENTS.md 1109/1109.

CI: this head has zero GitHub-Actions runs — a .claude/** plus AGENTS.md diff matches no PR-level workflow paths; the merge queue's merge_group run supplies the required contexts, so the empty check list is the known shape and not a stall.


Generated by Claude Code


Generated by Claude Code

… questions only

R1: a non-zero `--pair` blocks landing only on the rows that answer a definite
question; C5, the widening tell, is report-only and the at-tier review rules on
its tells. R2: a report-only instrument earns no card and no dev. R3 (charter
half): the half-state patrol runs on demand and its H rows are a reading, never
a dispatch precondition. R5: the at-tier review is owed on what ships to users
or agents, and its shape is a diff read plus the head's check-runs — never a
local re-run of the derived gate families. R6: the 仪器纪律 reference, with one
pointer line in SKILL.md.

Every added line is paid in place; no ratchet ceiling moves.

Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE
Co-Authored-By: Claude <noreply@anthropic.com>
The definite-row line names C5 as 只报告 rather than leaving it to inference,
and the 仪器纪律 reference binds the name C5 to the widening tell it is.

Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE
Co-Authored-By: Claude <noreply@anthropic.com>
The tier outcome rides the 落地前检三条 line itself, so the director lane's
pointer at this block still resolves after the standalone tier line left.

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

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: fec2177089b0628cb9692739b69aae4514f25ed0

Tier H (.claude/** + AGENTS.md): this is the at-tier contract review, not the landing record — the maintainer merges by hand. Shape = ruling #208 R5 applied to the PR that writes it: the diff and card #19496 read in a fresh worktree at origin/main, ③ taken from the head's check-runs via REST, no derived gate family re-run; the only local commands were check-skill-line-ratchet.mjs, git grep probes and git merge-tree. Inputs: card #19496, the ruling record on #19491 (comment 5755284987, 2026-09-21T04:12Z), the dev report on #19496 (comment 5755602587, 2026-09-21T04:57Z), the PR body.

① Derived judgments

  1. Scope — RIGHT. git diff origin/main...fec2177089 --name-status = M SKILL.md, M references/contract-review.md, M references/core-rules.md, A references/instrument-discipline.md, M AGENTS.md; nothing under scripts/, .github/, packages/. The mid-round merge commit 28f852b7a9 (parents f706aca132, 48c39e0023) has tree 5271eefc04, identical to git merge-tree --write-tree f706aca132 48c39e0023 — a clean merge carrying only main's own content, no hand edits; the three-dot diff against merge-base 48c39e00 is the PR's own change only.

  2. R1 — RIGHT. The new sentences: SKILL.md:657 「Clause-②: yes 认领同笔卡上挂标;开 PR 跑 --pair N:只确定性行红才挡请审,C5 只印读数。」; contract-review.md:43 「0 = 确定性行全清;4 = 任一不成立,只确定性行红才挡落地;3 = 环境答不了 ⛔ 不作干净。」; :44 「确定性行 = 记录在案、Served-tier:、双载体一致、认领形;C5 放宽 tell 只报告,归复核裁。」; AGENTS.md:274-275 (Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14, Tier S conjunct) 「check-clause2-carriers.mjs --pair N reads 0 on its definite rows (⛔ never C5) and every check is green」 — the word-diff of AGENTS.md is that one insertion; the rest is re-wrap. A seat can tell C5 from the definite rows: the four definite rows are enumerated and C5 is named report-only, so 「只确定性行红才挡」 can only be evaluated by reading which rows are red; no sentence says in words 「read the ✗ rows」, but the exit code alone is not offered as the verdict anywhere. git grep -n -- '--pair' AGENTS.md .claude at the head = 6 hits: os-dev.md:303 (exit code 「作读数」), SKILL.md:657, contract-review.md:42 (the invocation) and :55 (Served-tier: ≠ constant ⇒ exit 4 — a definite row), platform-readings.md:120 (the 403 note), AGENTS.md:274. No remaining sentence makes a bare exit≠0 a block. Acceptance: git grep -n '0 才请审' .claude = 0 with control --pair 5 hits in .claude.

  3. R2 — RIGHT, one note. Present once, SKILL.md:359 「只报告的仪器,报错不配 dev:猜意图的只印读数,误报席位一句推翻,⛔ 不立卡不派 dev。」, inside 〈分诊座位职责〉's finding-class block, seven lines below docs(pm-dispatch): the dev queue is product-only — tooling cards close at first grading, broken gates are deleted, ≤1 tooling dev in flight, tooling is a first-touch label (ruling #202 B) #19462's 「门禁头注、self-test 文案与 check-* 处方句 ⛔ 非已声明契约」 (:352) and fourteen below its toolingpm:queue line (:345) — beside the filing rules, where a triage seat decides whether to file. Reads as a rule. Note: the card's sentence is 166 bytes; the line is 119, dropping the parenthetical (放宽 tell、巡查行) and 「不开 PR」 — both survive in instrument-discipline.md:6 and :8.

  4. R3 — RIGHT. git grep -n '锚行未处置' .claude = 0 with control 半状态 = 24 hits; the two 〈执行座位职责〉 lines are gone; SKILL.md:432 「半状态巡查按需跑(分诊席每日对账可调),H 行是读数不是前提;⛔ 不因锚行停派发。」 replaces them; mirrored at core-rules.md:102 「半状态巡查按需跑,其 H 行是读数不是前提,⛔ 不因锚行停派发。」. The dev's flag, 〈状态模型〉 SKILL.md:134 「派发与折叠检查时读半状态巡查锚的 H17 触发文件索引,与本次派发文件面求交。」: it prescribes a read-and-intersect and the next line a per-hold handling; neither says stop dispatching, so it does not contradict the on-demand line — it goes stale once ci(pm): retire the half-state patrol's schedule — on demand only; every scheduled invocation of the patrol action stops (ruling #208 on #19491) #19497 retires the schedule and the index stops refreshing. Reported, not failed; carrier ci(pm): retire the half-state patrol's schedule — on demand only; every scheduled invocation of the patrol action stops (ruling #208 on #19491) #19497.

  5. R5 — WRONG. The scope and shape sentences are in contract-review.md 〈复核归属与资格〉 and match the card: :26 「复核面 = 出货给用户或 agent 的:content/docs/**apps/docs/**、CHANGELOG/.changeset 散文。」, :27 「同含已发布 schema 与 governed 规则文本;三面皆不碰 ⇒ CI 加席位自读,⛔ 不起第二个 agent。」, :33 「复核形状:只读 diff 与卡片,check 结论取 head 的 check-runs,⛔ 永不本地重跑派生门禁族。」; Served-tier: (:30) and the record shape (:28-:32) are unchanged. Two defects:

    • The older sentences were not replaced and now contradict the scope. :24 「归属派发席,交付后收集复核当轮完成;只 spec 与 skills 车道欠,新 spec 工作恒归 spec 席。」, :25 「按车道:spec 与 skills 席审契约增量;达档席内审,未达档 ⛔ 不自审,起达档子代理。」 and SKILL.md:651 「交付后复核只 spec 与 skills 车道欠,每轮达档:席内审或起子代理;双肢命中即 spec 车道。」 all stand. SKILL.md:254 assigns content/docs/** and apps/docs to domain:devx. So a devx-lane docs PR is owed the review by :26 (the card's R5(a): owed on a PR when its diff touches what ships) and not owed by :24 and SKILL.md:651; no line says which wins, and the ruling's evidence for R5 (six catches, all in docs / CHANGELOG / rules text) is exactly the class :24 excludes. Fix: rewrite :24-:25 and SKILL.md:651 so the obligation keys on the face (:26-:27) and the lane only names who runs it.
    • 「三面皆不碰」 miscounts. :26-:27 enumerate five faces (content/docs, apps/docs, CHANGELOG/.changeset prose, published schema, governed rules text). A reader who takes 三面 as :26's three items lands a schema-only or rules-text-only PR with no second agent — the opposite of the ruling. Fix: 「以上皆不碰」 or 「五面」. Minor, same fix: 「已发布 schema」 names no path (card: packages/spec/src/** non-test exports); it resolves only through SKILL.md:649's 路径肢, not in this file.
  6. R6 — RIGHT. references/instrument-discipline.md (11 lines) carries the six clauses: :5 hard gates only for definite questions (受管登记表、队列守卫、CI 测试、复核记录), :6 guessing instruments report-only, :8 report-only earns no dev (不立卡、不派 dev、不开 PR), :9 a new gate / patrol row / ratchet needs the maintainer's sentence on the card, :10 the single tooling slot goes to removals first and dispatch-gates.mjs stays frozen; :7 carries the widening tell's script and file:line (the sentence R1 removed from contract-review.md); :11 quotes the maintainer's sentence as provenance (the ruling number 🔗 Broken links detected in documentation #208 and the comment id are not cited — the reader greps 19491). Exactly one pointer: SKILL.md:180 「仪器纪律(硬门禁面、只报告面、新增授权、工具位)见 references/instrument-discipline.md。」. 120-byte cap: no added non-table line exceeds 120 bytes in any of the five files; the one non-table line over 120 in SKILL.md (:172) is pre-existing on main inside a template code block. The new file has no CEILINGS row (dev reported; scripts/** is out of scope and R6 :9 applies).

  7. Ratchet — RIGHT. node scripts/pm/check-skill-line-ratchet.mjs at the head: exit 0; SKILL.md 819/819, contract-review.md 60/60, core-rules.md 151/151, AGENTS.md 1109/1109, all headroom 0. Every deleted line read: SKILL.md 〈复核〉's two 受管面两层 lines → one (the Tier H enumeration survives at :617-:618 governed 面统一定义 + AGENTS.md/CLAUDE.md; 四件套 at :619; 等人批 kept); SKILL.md:649's invocation spelling survives at contract-review.md:42; contract-review.md's 双载体同笔挂 line survives at SKILL.md:656 with its ACCEPT tail on :15; the Implemented-by:/Reviewed-by: semantics survive verbatim in --template (checked: 「a mode:subagent dev's BRANCH, a mode:remote dev's session id」, 「the session that RENDERS or ADOPTS the verdict」); 「(spec、skills 每轮)」 survives at :24; the standalone Tier H/S line folds into :41 with 「one Tier H path makes the whole PR Tier H」 kept canonical at AGENTS.md:268. The two substantive deletions — the patrol precondition and C5's 「no 撞新键/成员/导出/登记即拒」 — are the ruling's own R3 and R1, not payment. No rule was deleted to pay for a line.

  8. Collision — RIGHT against docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「路」 section as an ordered list of feature points, cross-layer features as parent + per-layer sub-issues, domain:* retreats to file ownership (#19483) #19488, WRONG against main. git merge-tree --write-tree 410c37f7 fec2177089 (PR docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「路」 section as an ordered list of feature points, cross-layer features as parent + per-layer sub-issues, domain:* retreats to file ownership (#19483) #19488's current head) exit 0, tree 06229ec980, zero conflict markers; merged SKILL.md 819 lines against ceiling 819, core-rules.md 151, contract-review.md 60, AGENTS.md 1109. But origin/main moved again after the PR's mid-round merge of 48c39e00: fix(pm): the claim HANDOVER protocol — one comment, four items, provenance instead of a liveness test; the reader accepts it and C9 keeps one red #19502 landed at 9dd93190b6 and git merge-tree --write-tree origin/main fec2177089 exits 1 — CONFLICT (content) in SKILL.md at :180-:181, where the PR's pointer line is inserted directly above the line fix(pm): the claim HANDOVER protocol — one comment, four items, provenance instead of a liveness test; the reader accepts it and C9 keeps one red #19502 rewrote (「走死认领回收」→「走接管(见认领节)」); core-rules.md auto-merges. GitHub reports the PR mergeable_state: dirty. The resolution is keep-both and the merged SKILL.md would be 815 lines under the unchanged ceiling 819, but the maintainer cannot merge by hand until the branch merges main again, which moves the head this record names.

② Semver level

Not applicable: charter text only, no package content; skip-changeset is on the PR and is correct (nothing under packages/**, no published files[] content moves).

③ Boundary flags

  • dev flag 〈状态模型〉 H17 index: answered in ①4 — stale after ci(pm): retire the half-state patrol's schedule — on demand only; every scheduled invocation of the patrol action stops (ruling #208 on #19491) #19497, not contradicting; carrier ci(pm): retire the half-state patrol's schedule — on demand only; every scheduled invocation of the patrol action stops (ruling #208 on #19491) #19497.
  • dev flag no CEILINGS row for the new reference: acknowledged; out of scope here (scripts/**); by R6 :9 the row needs the maintainer's sentence on its own card.
  • dev reading --template contradicts nothing in R5's shape: confirmed — the template's ③ is the boundary-flag heading and it prescribes no local gate run.
  • dev reading lanes/director.md:32 still resolves: confirmed — 「落地前检③」 is contract-review.md:45.
  • open_questions: none.
  • PR checks on head fec2177089: NOT MEASURED — absent, not in progress. The head has zero GitHub Actions check-runs and the branch has zero workflow runs on any of its four commits; the only check-suites are vercel / fly-io / claude / cloudflare-workers-and-pages (queued, 0 runs) and the commit status is Vercel success. All seven required contexts are absent: TypeScript Type Check, Test Core, Dogfood Regression Gate, Build Core, Temporal Conformance (live PG + MySQL), Lint & Repo Gates, Governed Surface Queue Guard. Non-blocking for the content verdict under R5's shape, but the hand merge needs them; the four commits were pushed by the claude app, whose pushes do not fire pull_request workflows, so the next push should be checked for a run. skip-changeset is present, so Check Changeset needs nothing further.

Implemented-by: claude/issue-19496-instrument-discipline-charter
Reviewed-by: session_012GcsUbuqFGBibkEDMRC1eE

VERDICT: FAIL

Fails on ①5: R5's scope sentence landed but the lane-restriction sentences (contract-review.md:24-25, SKILL.md:651) were left standing and contradict it on the docs faces domain:devx owns, and 「三面皆不碰」 names three faces where five are enumerated. The patch is three lines plus a merge of origin/main for the SKILL.md:180 conflict (①8), which the head needs anyway; R1, R2, R3, R6, the ratchet and the #19488 collision proof all hold and need no change. The next head needs a fresh record.

Isolated at-tier reviewer (mode:subagent of the director seat), reading time 2026-09-21T05:08Z; worktree at origin/main 9dd93190b6, head checked out fec2177089.


Generated by Claude Code

…strument-discipline-charter

# Conflicts:
#	.claude/skills/pm-dispatch/SKILL.md
…hes, not by lane

The lane sentences that survived beside the new scope now say who runs the
review, not who owes it: a diff touching any of the five shipping faces owes it,
and 五面皆不碰 is the exemption. The published-schema face names its path, the
miscount 三面 is gone, and the ruling record joins the provenance line.

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

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 96774e44efec6ac4cf9ba63e5cd2392d729bc12e

Tier H (.claude/** + AGENTS.md): the at-tier contract review of round 2, not the landing record — the maintainer merges by hand. Head fec2177089 was reviewed in full at comment 5755678024 (2026-09-21T05:08Z; FAIL on ①5 R5, the origin/main conflict and absent CI); this record judges the round-2 delta git diff fec2177089 96774e44ef under the same R5 shape: diff and card read in a fresh worktree at the head, ③ from the head's check-runs via REST, no derived gate family re-run; local commands were check-skill-line-ratchet.mjs, git grep probes and git merge-tree. Fresh fetch: origin/main = ea64bbc6e8; PR #19488's remote tip is still 410c37f7.

① Derived judgments

  1. Delta scope — RIGHT. Two commits: the merge 4651c28c13 (parents fec2177089, ea64bbc6e8) and the fix 96774e44ef. The three-dot diff against origin/main is still exactly the five files (SKILL.md, references/contract-review.md, references/core-rules.md, new references/instrument-discipline.md, AGENTS.md); nothing under scripts/, .github/, packages/. The merge brings only main's content: the added/removed line set of the merge against its second parent ea64bbc6e8, restricted to the PR's files, is identical to the PR's round-1 diff (diff-of-diffs empty), so the merge carries nothing but the PR's own hunks re-based; against its first parent it touches only what main gained (SKILL.md 24 lines and core-rules.md 8 from fix(pm): the claim HANDOVER protocol — one comment, four items, provenance instead of a liveness test; the reader accepts it and C9 keeps one red #19502 + docs(pm-dispatch): enter the maintainer's 插队 and 契约面卡 tiers into the 取卡全序 (SKILL.md + core-rules twin) #19506, os-dev.md 2). The one keep-both resolution is context, not content — SKILL.md:180-181 now read 「- 仪器纪律(硬门禁面、只报告面、新增授权、工具位)见 references/instrument-discipline.md。」 directly above main's 「- dev 自己死了不等于维护者中止:子代理消失是正常死法,走接管(见认领节)。」 (fix(pm): the claim HANDOVER protocol — one comment, four items, provenance instead of a liveness test; the reader accepts it and C9 keeps one red #19502's rewrite kept, the pointer kept). The fix commit touches exactly the named lines: SKILL.md:533 and :647, contract-review.md:22-27, core-rules.md:113, instrument-discipline.md:+12.

  2. R5 re-judged — RIGHT. contract-review.md:22 「## 复核归属与资格(按面)」; :24 「欠不欠按面判 ⛔ 不按车道:diff 碰下列任一面即欠达档复核,交付后当轮完成。」; :25 「复核面 = 出货给用户或 agent 的五处:content/docs/**apps/docs/**、CHANGELOG/.changeset 散文。」; :26 「加已发布 schema(packages/spec/src/** 非测试)与 governed 规则文本(统一定义见 SKILL.md)。」; :27 「五面皆不碰 ⇒ CI 加席位自读 ⛔ 不起第二个 agent;谁跑 = 派发席,达档者席内审。」; SKILL.md:647 「交付后复核按面欠 ⛔ 不按车道(五面见 references/contract-review.md);双肢命中即 spec 车道。」; SKILL.md:533 「条款②自审资格按车道:spec 与 skills 席达档席内审;未达档 ⛔ 不自审,起隔离达档子代理。」; core-rules.md:113 「…语义面卡恒契约复审档施工,契约复核按面欠不按车道。」. A devx-lane docs PR (SKILL.md:254 assigns content/docs/** and apps/docs to domain:devx) now reads as owed, unambiguously: :24 keys the obligation on the face, :25 names those paths, and 「不按车道」 is stated three times (:24, SKILL.md:647, core-rules.md:113). The lane sentence that survives (SKILL.md:533) is eligibility only — which seats sit at tier and may self-review, in the 席位档策略 block next to :532 — and :27 says who runs (the dispatching seat, in-seat if at tier); 「双肢命中即 spec 车道」 on :647 assigns ownership of the path/declaration limb, not the obligation. All five faces carry paths or a resolving pointer: 「governed 规则文本(统一定义见 SKILL.md)」 resolves to SKILL.md:613-614 (docs/adr/** + .claude/** + skills/** + docs/NORTH-STAR.md + AGENTS.md + CLAUDE.md), a superset of the card's four rules-text paths and consistent with the ruling's 「rules text」. Greps at the head: 「只 spec 与 skills 车道欠」 0, 「三面皆不碰」 0, 「spec、skills 欠」 0, 「只 spec 与 skills」 0; 「按车道」 remains only on :533 (eligibility), the three 「不按车道」 sentences, and the file's H1. No sentence still contradicts. Residual, not a contradiction: the H1 at contract-review.md:1 still reads 「# 契约复核细则(按车道)」 — a stale title, not a rule; the section heading and :24 override it; worth flipping to (按面) on the next touch at zero ratchet cost.

  3. R6 provenance addition — RIGHT. instrument-discipline.md:12 「裁决记录:裁决 208,卡 19491,评论 5755284987(编号不带 # 前缀,id-lint 拒)。」 cites the ruling, the card and the comment id with bare ids, closing round 1's note. The literal # in 「# 前缀」 is hash-space; check-skill-id-lint.mjs:57 refuses ID_PATTERN = /#[0-9]{3,}/, which this line does not match (read, not run). Still exactly one pointer (SKILL.md:180); the file is 12 lines and still has no CEILINGS row (unchanged, out of scope here). No added non-table line in the round-2 delta or the full three-dot diff exceeds 120 bytes. AGENTS.md's word-diff against origin/main is still the single insertion on its definite rows (⛔ never C5).

  4. Ratchet — RIGHT. node scripts/pm/check-skill-line-ratchet.mjs at the head: exit 0; SKILL.md 815/819 (headroom 4 comes from main's fix(pm): the claim HANDOVER protocol — one comment, four items, provenance instead of a liveness test; the reader accepts it and C9 keeps one red #19502, not from this PR — main is 815 and the PR is net 0 against it), contract-review.md 60/60, core-rules.md 151/151, AGENTS.md 1109/1109. Lines deleted this round, read: contract-review.md's four lines :24-:27 became four; the content dropped is 「归属派发席,交付后收集复核当轮完成」 (survives as :24 「交付后当轮完成」 + :27 「谁跑 = 派发席」), 「新 spec 工作恒归 spec 席」 (survives as SKILL.md:647 「双肢命中即 spec 车道」) and 「达档席内审,未达档 ⛔ 不自审,起达档子代理」 (survives at :27 and in full at SKILL.md:533); SKILL.md:533, :647 and core-rules.md:113 are one-for-one rewrites. The only rule content removed is the lane restriction itself, which is the correction this round exists to make. No rule was deleted to pay for a line.

  5. Collision — RIGHT against main; the docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「路」 section as an ordered list of feature points, cross-layer features as parent + per-layer sub-issues, domain:* retreats to file ownership (#19483) #19488 conflict is not this PR's. git merge-tree --write-tree origin/main 96774e44ef (ea64bbc6e8): exit 0, tree 121a129536, zero markers, merged SKILL.md 815 under ceiling 819; GitHub's mergeable was still being recomputed at read time. Against PR docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「路」 section as an ordered list of feature points, cross-layer features as parent + per-layer sub-issues, domain:* retreats to file ownership (#19483) #19488's tip 410c37f7 (unchanged on the remote): exit 1, one conflict block at SKILL.md's 取卡全序 (merged file :473-478) — 410c37f's 「取卡全序:priority:p0 > pm:blocking > 功能点位次 > 板上项 > p1 > p2 > p3 > 无级。」 against main's two docs(pm-dispatch): enter the maintainer's 插队 and 契约面卡 tiers into the 取卡全序 (SKILL.md + core-rules twin) #19506 lines 「取卡全序:维护者直派插队卡(出处三件)> 契约面卡(判据见 references/lanes/spec.md)> 标签序。」 / 「标签序:…」. Control: git merge-tree --write-tree 410c37f7 origin/main with no PR content exits 1 with the byte-identical block, so this is docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「路」 section as an ordered list of feature points, cross-layer features as parent + per-layer sub-issues, domain:* retreats to file ownership (#19483) #19488 × main (docs(pm-dispatch): enter the maintainer's 插队 and 契约面卡 tiers into the 取卡全序 (SKILL.md + core-rules twin) #19506), carried into this head by the merge of main. This PR's own hunks never touch 取卡全序 (0 hits on the three-dot diff), and docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「路」 section as an ordered list of feature points, cross-layer features as parent + per-layer sub-issues, domain:* retreats to file ownership (#19483) #19488's SKILL.md hunks (:118-133, :211-307, :365, :461) touch none of the lines the fix commit edited (:533, :647) nor the 复核 sections; the round-1 PR-only proof (exit 0 at fec2177089) stands. Merged SKILL.md count with the conflict left in: 819 including the three marker lines, i.e. 815 or 816 once docs(north-star,pm-dispatch): the feature axis — area:* labels, the 「路」 section as an ordered list of feature points, cross-layer features as parent + per-layer sub-issues, domain:* retreats to file ownership (#19483) #19488 resolves against main — under 819 either way.

② Semver level

Not applicable: charter text only; skip-changeset is on the PR and Check Changeset reports skipped accordingly.

③ Boundary flags

  • dev flags from round 1 (〈状态模型〉 H17 index; no CEILINGS row; --template contradicts nothing; lanes/director.md:32 resolves): unchanged and answered at 5755678024; no new flags; open_questions: none.
  • PR checks on head 96774e44ef — measured this time. The expectation that a .claude/** + AGENTS.md diff yields zero PR-level runs did not hold on this head: 20 workflow runs and 40 check-runs fired on pull_request, so round 1's zero was the push-trigger artefact, not the diff shape. Required contexts: TypeScript Type Check success; Test Core success (the aggregate, if: always(); its Test Core (…/6) shards skipped — the rostered expected skip for a diff outside packages/** and scripts/**, check-expected-skips.mjs:292); Dogfood Regression Gate success (aggregate; shards skipped, rostered :278); Build Core skipped (rostered expected skip, :264); Temporal Conformance (live PG + MySQL) skipped (rostered, :271); Governed Surface Queue Guard success; Lint & Repo Gates in_progress = NOT MEASURED (started 2026-09-21T05:16Z, still running at posting time); Check Changeset skipped under skip-changeset. The roster was read, not run. Non-blocking for the content verdict; the maintainer's hand merge sees the final Lint & Repo Gates result on the PR.

Implemented-by: claude/issue-19496-instrument-discipline-charter
Reviewed-by: session_012GcsUbuqFGBibkEDMRC1eE

VERDICT: PASS

Round 1's three FAIL items are closed on this head: R5 keys the obligation on the face and every lane-keyed twin is swept; the branch merges origin/main clean with the one keep-both at SKILL.md:180-181; the ruling is cited on instrument-discipline.md:12. R1, R2, R3, R6, the ratchet and the collision proofs hold. One cosmetic residual (the stale 「(按车道)」 H1 at contract-review.md:1) needs no patch round. Lint & Repo Gates is the one required context not yet measured on this head.

Isolated at-tier reviewer (mode:subagent of the director seat), reading time 2026-09-21T05:26Z; fresh worktree at head 96774e44ef, origin/main ea64bbc6e8.


Generated by Claude Code

Copy link
Copy Markdown
Collaborator Author

Provenance — director seat, summon #25 (session_012GcsUbuqFGBibkEDMRC1eE), 2026-09-21T05:28Z


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 21, 2026 08:21
@os-zhuang
os-zhuang enabled auto-merge September 21, 2026 08:21
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 21, 2026
Merged via the queue into main with commit 3e8e2b0 Sep 21, 2026
42 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-19496-instrument-discipline-charter branch September 21, 2026 08:45
os-project-manager pushed a commit that referenced this pull request Sep 21, 2026
Resolves the SKILL.md conflict in the triage-seat filing rules: #19513's
report-only-instrument line is kept verbatim, and this branch's compressed
Acceptance-notes reader question sits beside it. The filing gate's
instrument clause now points at `references/instrument-discipline.md`
instead of restating the no-dev half #19513 landed.

Claude-Session: https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE
Co-authored-by: Claude <noreply@anthropic.com>
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