Repository navigation
charter: instrument discipline — hard gates answer definite questions only; C5 and the patrol anchor stop blocking; at-tier review is scoped to what ships and reads CI instead of re-running gates (ruling #208 on #19491) #19496
Description
Path: none | tooling | maintainer-directed (ruling #208 on #19491) — dispatched at filing, never queued
Filed and dispatched by the director seat, summon #25 (session_012GcsUbuqFGBibkEDMRC1eE), under the maintainer's verbatim direct-dispatch instruction: Ruling #208 on #19491 — maintainer 「19491 接受你的建议,并立刻派发处理相关任务。」 (2026-09-21, chat, on the director seat's 档 2 package R1–R7). Direct-dispatch channel (SKILL.md 〈多仓协调〉规则 4 「维护者直派通道」): the audit quote above is the authorization; ⛔ not a triage grading, ⛔ never queued. The full analysis and measured table are the ruling record on #19491.
What this card changes (text only, Tier H — .claude/skills/pm-dispatch/**; the maintainer merges by hand)
Five edits, one PR. Every edit is a charter sentence; ⛔ no script, workflow or product file is touched here (the C5 code demotion in scripts/pm/check-clause2-carriers.mjs is the spec seat's in-flight dev per its own report on the ruling thread; the patrol schedule and the CI self-test scoping are their own cards, filed with this one).
- R1 —
--pairblocks only on definite rows.SKILL.md:649today: 「开 PRPM_SWEEP_REPO=仓 check-clause2-carriers --pair N0 才请审」;references/contract-review.md:41「② 双载体已清,逐对机读 … --pair N」 and:55. Rewrite so that a non-zero--pairis a landing block only when a row answering a definite question is red (a review record exists /Served-tier:present / the two label carriers agree / claim shape) and never on C5 (the widening tell): C5 prints itsfile:linetells and the at-tier review rules on them. Wherever AGENTS.md Prime Directive feat: Comprehensive CRM example demonstrating all ObjectStack protocol features #14 or a reference makes--pairat 0 a conjunct of landing (the spec seat cites 「No seat judges this」), name C5 as excluded from that conjunct in the same PR —git grep -n -- '--pair'across.claude/andAGENTS.mdis the census; if AGENTS.md itself needs the word, it is Tier H in the same PR. - R2 — the rule line. Add, next to the tooling rule ruling 🔗 Broken links detected in documentation #202 B landed (PR 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 〈分诊座位职责〉 lines — read that branch,
claude/issue-19457-charter-product-only-queue, head36ab00aa, and place the line so both PRs merge clean): 「只报告的仪器,报错不配 dev:猜意图的仪器(放宽 tell、巡查行)只印读数,误报由席位一句话推翻,⛔ 不立卡、不派 dev、不开 PR。」 - R3 (charter half) — the patrol anchor stops being a precondition. Delete 〈执行座位职责〉 「每轮巡检第一判据:先读半状态巡查锚(
half-state-patrol.yml置顶 issue)」 and 「锚上点名本道卡/PR/座位贴的 H 行逐行处置,再做其余判据;锚行未处置 ⛔ 不开新派发」; replace with one line: 「半状态巡查只按需跑(分诊席每日全量对账可调用),其 H 行是读数不是前提;⛔ 不因锚行停派发。」 Mirror inreferences/core-rules.mdif the precondition is stated there (grep 巡查锚 / 锚行). - R5 — at-tier review: scope and shape. In
references/contract-review.md〈复核归属与资格〉: (a) scope — the at-tier review is owed on a PR when its diff touches what ships to users or agents:content/docs/**,apps/docs/**,CHANGELOG.md/.changeset/*prose, published schemas (packages/spec/src/**non-test exports), rules text (.claude/**,AGENTS.md,docs/NORTH-STAR.md,docs/adr/**); a PR touching none of these (internal code, tests,scripts/**tooling) lands on CI + the seat's own read, ⛔ no second agent; (b) shape — the reviewer reads the diff and the card, and takes ③ (PR checks) from the head's check-runs via REST, ⛔ never re-runs the derived gate families locally (measured: 37 families re-run on two heads was the largest share of a 243k-token / 29-minute review, 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 comment 5755178153);Served-tier:and the record shape are unchanged. Update--templateguidance text only ifcheck-clause2-carriers --templateprints a line that contradicts (b); ⛔ do not edit the script here — report it as an out-of-scope finding instead. - R6 — 〈仪器纪律〉. A short section in a references file (
references/landing-operations.mdor a newreferences/instrument-discipline.md— the dev picks the file where the reader already looks, and says why), with exactly one pointer line in SKILL.md: hard gates only for questions with a definite answer (the governed register, the queue guard, CI tests, 「a review record exists」); an instrument that judges intent (widening, half-state) is report-only; a report-only instrument earns no dev (rule 2 above); a new gate, patrol row or ratchet needs the maintainer's sentence quoted on its card; the single tooling dev slot (🔗 Broken links detected in documentation #202 B) is spent on removals first;dispatch-gates.mjsis kept frozen (touched only when a workflow it feeds breaks). Quote the ruling as provenance in the section.
Constraints
- Line ratchet: ⛔ no ceiling raise.
SKILL.mdis at 819 = the ceiling after PR 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 (and 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 lands it at exactly 819). Net SKILL.md lines must be ≤ 0: R3 deletes two lines and adds one, R2 adds one, R6 adds one pointer — pay the rest by tightening or merging existing lines (never by deleting a rule);references/*have their own ceilings (scripts/pm/check-skill-line-ratchet.mjsCEILINGS) — read them first and report exact counts. If a line cannot be paid, stop at that file and report the count; ⛔ do not raise a ceiling. - Collision: PR 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 (head
36ab00aa) and 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 (head420bd091) both edit SKILL.md / core-rules.md and wait for the maintainer's hand. Base onorigin/main; keep every line those two PRs touch untouched; prove it withgit merge-tree --write-treeagainst both heads (exit 0, no conflict markers) and say so in the PR body with the two shas. If an edit above must land on a line one of them moves, put yours on an adjacent line and note it. - 120-byte line cap on charter lines; table rows exempt. Chinese for charter text (the file's language); English PR body.
Acceptance (the PR body shows each)
git grep -n '0 才请审' .claude= 0 hits with controlgit grep -n -- '--pair' .claude> 0;git grep -n '锚行未处置' .claude= 0 with controlgit grep -n '半状态' .claude> 0;git grep -n 'C5' .claude/skills/pm-dispatch/references/contract-review.mdnames it report-only; the R5 scope list and the 「⛔ never re-runs」 sentence are quoted from the file.pnpm check:pm-skill-ratchetexit 0 with the per-file counts printed;check:pm-widening-tells(report-only after this PR, still run) and every familynode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives, exit codes captured before any pipe.- The at-tier review of this PR itself follows R5's shape (diff read + CI read; no gate re-run) — the director seat spawns it and says so on the PR.
Out of scope (report, do not do)
scripts/pm/check-clause2-carriers.mjs C5 code demotion (spec seat's dev); .github/workflows/half-state-patrol.yml (its own card); scripts/ci/select-gate-families.sh / lint.yml (its own card); any deletion of instrument code.
Generated by Claude Code
Activity
os-project-manager commentedon Sep 21, 2026
Claim: objectstack#19496 — director seat, summon #25,
session_012GcsUbuqFGBibkEDMRC1eE, 2026-09-21T04:12ZBranch:
claude/issue-19496-instrument-discipline-charterSeat: director
Mode: subagent
Clause-②: no
Direct dispatch under the maintainer's verbatim 「19491 接受你的建议,并立刻派发处理相关任务。」 (ruling #208 on #19491). File surface declared for the in-flight intersection check: the five charter edits R1 R2 R3(charter half) R5 R6 — .claude/skills/pm-dispatch/SKILL.md, references/contract-review.md, references/core-rules.md, one references file for 〈仪器纪律〉, AGENTS.md only if the --pair conjunct lives there. Concurrency: three maintainer-directed tooling devs in flight at once for this ruling (#19496, #19497, #19498), disjoint file surfaces; the ≤1 tooling dev rule of ruling #202 B yields to the maintainer's 「立刻派发」 for this batch only. Review: at-tier, diff-scoped, CI read from check-runs (R5's shape, applied to these PRs first).
Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
os-dev-report
{ "issue": 19496, "status": "done", "branch": "claude/issue-19496-instrument-discipline-charter", "pr": "https://github.com/objectstack-ai/objectstack/pull/19513", "head": "fec2177089b0628cb9692739b69aae4514f25ed0", "session": "session_012GcsUbuqFGBibkEDMRC1eE", "premise_still_valid": true, "summary": "All five charter edits landed on one draft PR, text only, nothing under scripts/ or .github/ or packages/. R1: a non-zero --pair blocks landing only on rows answering a definite question (review record on record, Served-tier present, the two carriers agreeing, claim shape) and never on C5 — written into SKILL.md 649-equivalent, contract-review.md's landing pre-checks, and AGENTS.md Prime Directive #14's Tier S conjunct ('reads 0 on its definite rows (never C5) and every check is green'). R2 adds the report-only-instrument rule beside the tooling filing rules; R3 deletes both patrol-anchor precondition lines and replaces them with one on-demand line, mirrored in core-rules.md; R5 writes the at-tier review's scope (what ships to users or agents) and shape (diff plus the head's check-runs, never a local gate re-run) into contract-review.md; R6 is a new references/instrument-discipline.md with exactly one pointer line in SKILL.md. No ceiling was raised: SKILL.md 819/819, contract-review.md 60/60, core-rules.md 151/151, AGENTS.md 1109/1109, all net 0, every added line paid by de-duplication with the surviving carrier named in the PR body.", "tests": "check:pm-skill-ratchet exit 0 with per-file counts (SKILL.md 819/819 headroom 0; contract-review.md 60/60; core-rules.md 151/151; AGENTS.md 1109/1109). dispatch-gates --commands --repo objectstack-ai/objectstack derived 23 commands on this diff; all 23 run with the exit code captured before any pipe, all exit 0, and reconciled with --ran: '23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN'. Four more run because the card names them: check:pm-widening-tells exit 0 (self-test only, 525 cases — checker health, not a verdict on this diff), check-widening-tells --declaration no --diff on this PR's own diff exit 0 (a real verdict: no tell), check:pm-label-desc-cap exit 0, check:pm-settings-deny-roster exit 0 (its roster lives under .claude, which this diff is in). Three gates first answered exit 3 PREREQUISITE NOT MET in a fresh worktree and were re-run green after pnpm install; check:doc-formula-expressions needed a build of @objectstack/formula and @objectstack/lint, run under the shared verify lock (VERDICT command-exit 0, held 388s). Acceptance greps: '0 才请审' 0 hits with control '--pair' 5 hits; '锚行未处置' 0 hits with control '半状态' 24 hits in 8 files; 'C5' in contract-review.md 1 hit naming it 只报告. Collision: PR #19462 (head 36ab00aa) merged into main mid-round — merge-tree was exit 0 with zero conflict markers before that and this branch then merged origin/main 48c39e00 clean, so its ratchet bump 813 to 819 and its tooling lines are on this head; PR #19488's tip is now 16418377 (the card named 420bd091) and git merge-tree --write-tree 16418377 fec2177089 is exit 0, tree 02a7323a2d779974bd035082ad954eaf4cd15a21, zero conflict markers. skip-changeset applies: the diff is .claude/** plus AGENTS.md, nothing under packages/**, no published files[] content moves.", "mcp_calls": "0 — no MCP GitHub tool was called; every read and both writes went through the REST proxy or git.", "api_writes": "2 — POST /repos/objectstack-ai/objectstack/pulls (the draft PR) and POST /repos/objectstack-ai/objectstack/issues/19496/comments (this report, via scripts/pm/post-stamped.mjs). No labels, no ready flip, no auto-merge, no assignee, no issues created. The three git pushes to the branch are git, not REST.", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: SKILL.md 〈状态模型〉 still makes dispatch and fold checks read the patrol anchor's H17 trigger-file index; with the patrol's schedule retired on its own card that index can go stale, and R3's scope here was the two 〈执行座位职责〉 lines only. Carrier: the patrol-schedule card (#19497) or a follow-up charter PR. Dedupe words: 半状态巡查锚, H17, 触发文件索引, 折叠检查.", "to file (3 classes, dedupe words): references/instrument-discipline.md carries no CEILINGS row in scripts/pm/check-skill-line-ratchet.mjs, so it is the one un-ratcheted file on the pm-dispatch surface — the ratchet's header calls a file's absence from that map a fact to check. Adding the row is an edit under scripts/**, out of scope for this card, 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, skill-line-ratchet.", "noted, not filed: check-clause2-carriers --template prints nothing that contradicts R5's shape — its ③ is the record's boundary-flag heading and it prescribes no local gate run. Checked, no script edit. Carrier: none.", "noted, not filed: references/lanes/director.md's pointer 「受管面两层落地见 ../contract-review.md 落地前检③」 would have dangled when the standalone Tier H/S line left contract-review.md; this PR kept it resolving by moving the tier outcome onto the 落地前检三条 line itself rather than by editing director.md. Carrier: none." ] }Report written 2026-09-21T04:57Z by the os-dev subagent of the director seat; draft PR #19513 at head
fec2177089.Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
os-dev-report
{ "issue": 19496, "round": 2, "status": "done", "branch": "claude/issue-19496-instrument-discipline-charter", "pr": "https://github.com/objectstack-ai/objectstack/pull/19513", "head": "96774e44efec6ac4cf9ba63e5cd2392d729bc12e", "session": "session_012GcsUbuqFGBibkEDMRC1eE", "premise_still_valid": true, "summary": "All three review items fixed in one push on the same branch, no rebase and no force-push. (1) The obligation now keys on the face, not the lane: contract-review.md:24 '- 欠不欠按面判 ⛔ 不按车道:diff 碰下列任一面即欠达档复核,交付后当轮完成。', :25 '- 复核面 = 出货给用户或 agent 的五处:`content/docs/**`、`apps/docs/**`、CHANGELOG/`.changeset` 散文。', :26 '- 加已发布 schema(`packages/spec/src/**` 非测试)与 governed 规则文本(统一定义见 SKILL.md)。', :27 '- 五面皆不碰 ⇒ CI 加席位自读 ⛔ 不起第二个 agent;谁跑 = 派发席,达档者席内审。', and the section heading is now 〈复核归属与资格(按面)〉. SKILL.md:647 '- 交付后复核按面欠 ⛔ 不按车道(五面见 `references/contract-review.md`);双肢命中即 spec 车道。' Two lane-keyed twins the review did not name were swept the same way: SKILL.md:533 now opens 条款②自审资格按车道 (eligibility, not obligation) and core-rules.md:113 now reads 契约复核按面欠不按车道. 三面 became 五面, 已发布 schema names `packages/spec/src/**` 非测试. (2) origin/main merged at ea64bbc6e8, the SKILL.md:180/181 conflict resolved keep-both (the pointer line plus #19502's rewritten 走接管(见认领节) line), nothing else taken from the merge. (3) instrument-discipline.md:12 adds the ruling record: '- 裁决记录:裁决 208,卡 19491,评论 5755284987(编号不带 # 前缀,id-lint 拒)。' — the # spelling is what check:pm-skill-id-lint refuses on this corpus (/#[0-9]{3,}/), so the ids are written bare and the line says why.", "tests": "check-skill-line-ratchet exit 0, per-file: SKILL.md 815/819 headroom 4 (main's own +4 from #19462 and #19506 came in with the merge); contract-review.md 60/60 headroom 0, paid in place; core-rules.md 151/151 headroom 0, paid in place; AGENTS.md 1109/1109 unchanged this round; instrument-discipline.md 12 lines, still no CEILINGS row. dispatch-gates --commands --repo objectstack-ai/objectstack derives the same 23 commands as round 1 (diff --name-status unchanged); all 23 re-run on this head with the exit code captured before any pipe, all exit 0, --ran reconciliation: '23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN'. Four extras again green: check:pm-widening-tells (self-test only, checker health), check-widening-tells --declaration no --diff on this head's diff (a real verdict: no tell), check:pm-label-desc-cap, check:pm-settings-deny-roster. check:doc-formula-expressions needed the @objectstack/formula + @objectstack/lint build, run under the shared verify lock (VERDICT command-exit 0, held 15s, cached). Merge proof: git merge-tree --write-tree origin/main 96774e44ef exit 0, tree 121a129536a286c0a81fe94f94888fd35355a8ad, zero conflict markers; git diff origin/main...96774e44ef --name-status is still exactly the five files (M SKILL.md, M contract-review.md, M core-rules.md, A instrument-discipline.md, M AGENTS.md). Acceptance greps: '0 才请审' 0 hits, '锚行未处置' 0 hits, '只 spec 与 skills 车道欠' 0 hits, '三面皆不碰' 0 hits; controls: '--pair' 5 hits in .claude, '半状态' in 8 files, 'C5' in contract-review.md 1 hit naming it 只报告.", "mcp_calls": "0 — no MCP GitHub tool was called in either round.", "api_writes": "1 this round — POST /repos/objectstack-ai/objectstack/issues/19496/comments (this report, via scripts/pm/post-stamped.mjs). No labels, no ready flip, no auto-merge, no assignee, no PR-body PATCH. Round 1 wrote 2 (the draft PR and its report). The git push to the branch is git, not REST.", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: PR #19488's tip is now 410c37f7 and git merge-tree --write-tree 410c37f7 96774e44ef is exit 1 on SKILL.md and core-rules.md — but the control says this is not this PR's doing: git merge-tree --write-tree origin/main 410c37f7 is ALSO exit 1 on the same two files, so #19488 is stale against main and owes a merge. Its diff against its own merge-base touches none of the lines this PR edits (grep for all nine anchors: 0 hits) and neither contract-review.md nor instrument-discipline.md. Carrier: the seat holding #19488, at its next push. Dedupe words: 19488, feature-axis-charter, stale merge-base, SKILL.md conflict.", "noted, not filed: the PR body still carries round 1's text; a dev writes the PR body once, at creation, so the CI line the coordinator asked for is not patched in here. Exact wording for the seat to add under the Gates section: '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.' Also worth the same edit: the round-2 head sha 96774e44ef, the face-keyed R5 rewrite, and the new merge-tree proof against origin/main. Carrier: the owning seat.", "noted, not filed: SKILL.md 〈状态模型〉 still makes dispatch and fold checks read the patrol anchor's H17 trigger-file index, which goes stale once the patrol schedule is retired. Carrier: the patrol-schedule card. Dedupe words: 半状态巡查锚, H17, 触发文件索引, 折叠检查.", "to file (3 classes, dedupe words): references/instrument-discipline.md carries no CEILINGS row in scripts/pm/check-skill-line-ratchet.mjs, 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, skill-line-ratchet." ] }Round-2 report written 2026-09-21T05:20Z; head
96774e44ef, review record 2026-09-21T05:08Z answered item by item above.Generated by Claude Code
os-project-manager commentedon Sep 21, 2026
Landing record — director seat, summon #25 (
session_012GcsUbuqFGBibkEDMRC1eE), 2026-09-21T08:46Z. PR #19513 merged by the maintainer's hand (approved, flipped ready, auto-merge armed and enqueued byos-zhuangat 2026-09-21T08:22Z; queue merge3e8e2b0d6d96af6426e83b49e1787e45fb283bdcat 2026-09-21T08:45Z), verified by content on fetchedorigin/main:references/instrument-discipline.mdpresent (six clauses, provenance line citing ruling 208 / card 19491 / comment 5755284987);锚行未处置0 hits in.claude;contract-review.mdnames C5 report-only and keys the at-tier review obligation on the five shipped faces (「五面皆不碰 ⇒ CI 加席位自读」); AGENTS.md Prime Directive #14's Tier S conjunct reads 「on its definite rows (⛔ never C5)」. Contract reviews of record 5755678024 (FAIL onfec2177089) and 5755815830 (PASS on96774e44), provenance 5755824912. With PR #19511 (cf464f6b, R4) and PR #19516 (d76facf2, R3's workflow half) the ruling #208 charter is now whole onmain: R1 R2 R3 R5 R6 here, R4 and the patrol schedule in the two sibling PRs; R7 unchanged. Standing carrier, not a card: the H1 ofcontract-review.mdstill reads 「(按车道)」 — flipped on the file's next touch. GitHub closed this card on theFixeskeyword;pm:dispatchedremoved in this stroke so the close is whole.Generated by Claude Code
ci(pm): retire the half-state patrol's schedule — on demand only (obj…
docs(pm-dispatch): instrument discipline — hard gates answer definite…