docs(pm): a plain-language digest of the PM corpus's binding rules - #15402
Merged
Conversation
One new reference file, `.claude/skills/pm-dispatch/references/core-rules.md`: every binding rule of the PM corpus as one plain-Chinese sentence per line, grouped under the corpus's own section order, 150 lines, every line within the 120-byte cap. Rules only — no provenance narrative, no incident story, no date, no quotation, no issue number. The escalation decision frame is referred to by section and its axes named in short words; the frame block itself stays in exactly its two watched copies. Adds the ceiling row and the max-table-row pin for the new file, both at the landed measurement; no other row moves. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
…write rule The label-write rule folded to one line lost the clause that gate-semantics labels follow the same four steps in both directions. Restored inside the 120-byte cap. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
…the digest Two seat-review fixes to the digest: - the mutual-exclusion rule counted seven states; the corpus has five `pm:*` state labels plus `needs-user-decision`, six in total. Rewritten to say five plus one, keeping the one-replace-write rule and the three-day queue-rot clause. - the handover rule used a first-person seat voice; replaced with a role-neutral form. The file stays at exactly 150 lines with every line inside the 120-byte cap. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
…next wake-up Two rules added under the entry section: a round runs from the fire that wakes the seat until the queue is empty or the usage window is exhausted, and the round report is the end-of-round account rather than a stop signal; the self-timer sets only the next wake-up, so an unfinished round is continued on the next fire, never restarted or re-ordered. The triage seat's timer line is reworded to the same reading. Paid for inside the 150-line ceiling by folding two pairs that state adjacent rules: the round-report contents with the health-indicator list, and the claim atomic pair with the claim-comment field list. No prohibition was dropped; both folded-out halves are enumerations already declared as lookup data in the PR body's second table. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
os-zhuang
approved these changes
Sep 4, 2026
os-zhuang
marked this pull request as ready for review
September 4, 2026 14:50
os-zhuang
enabled auto-merge
September 4, 2026 14:50
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #15379 (family carrier — stays open for members 1b–5)
Part of #15412
A plain-language digest of the PM corpus's binding rules, so the maintainer reviews the
rules instead of the corpus. One new reference file,
.claude/skills/pm-dispatch/references/core-rules.md,plus the ceiling row and max-table-row pin the ratchet map owes any new covered file.
What this is
order: entry and roles, the all-seat invariants, the state model, platform-reading
discipline, multi-repo coordination, domain lanes, the seat post, the triage seat, the
execution seat, quota-wall recovery, escalation and decisions, guardrails, the report
contract.
quotation, no issue or PR number, no marker other than the prohibition sign. Each line
states what to do or what never to do, plus the threshold or the name it depends on.
Identifiers stay in English (label names, body-line keys, commands, paths).
in three separate places and nowhere in one: a round runs to empty, there is no
per-round total budget, and a round may span fires. Two digest lines now collect it —
a round runs from the fire that wakes the seat until the queue is empty or the usage
window is exhausted, the round report is the end-of-round account and not a stop
signal, and the self-timer sets only the next wake-up, so an unfinished round is
continued on the next fire rather than restarted or re-ordered. The triage seat's
timer line is reworded to the same reading, so it can no longer be read as a
round-length cap.
short words. The frame block itself is not reproduced: it stays in exactly its two
watched copies, and
check:skill-frame-syncstill reports two.How to review it
Read the digest file. The first table below is the instrument: one row per digest line,
with the corpus section it comes from and what the corpus wrapped around it that this
digest drops. Sample any rule you remember from the corpus and look for it in the table.
The second table lists what was deliberately left out, by class, so the omissions are
reviewable too. The third table lists the conflicts found while reading the corpus; they
are reported, not resolved here.
Table 1 — rule inventory (one row per digest line)
/pm-dispatch参数认定;无角色参数按执行姿态跑,车道由座位贴认定。pm:seat座位贴,⛔ 本地不留跟踪状态。.claude/内部工具 PR。pm:retriage,已设 assignee 即 ⛔ 永不碰。pm:dispatched与摘pm:queue恒在同一次标签写入里成对落地。needs-user-decision是决定待做:⛔ 永不派发,除代裁通道外 ⛔ 永不代答。pm:on-hold仅当带机器可读Restart-when:行才合法,触发文件走Restart-touch:行。pm:blocked配正文行Blocked-by:,工已完而卡在门禁的同用此态并写Unlock-action:行。pm:awaiting-maintainer只剩站外人工动作;pm:blocking是反向索引推导的缓存 ⛔ 不手工挂。pm:retriage并存 ⛔ 不摘原标且跳过派发;finding恒等于待首次定级、定级即离标。batch立即派发,⛔ 不豁免同文件串行与认领协议。needs-user-decision共六态互斥,转换恒一笔 replace,队列卡逾三天欠转换。origin/main,⛔ 不用共享检出的工作树。Blocked-by:,上游未关闭 ⛔ 不派发。pm:blocked。packages/spec一律转domain:spec座位,不论谁需要它。references/lanes/下,贴内只放指针,升级走技能 PR。pm:queue。finding待首次定级;正文被截断的卡先发修复指令再跳过,不可派发。Claim:开头的评论并重读全线程。origin/main;踢出按签名台账四分支处置。pm:blocked。batch封顶,同批按构造文件面不相交。.claude/agents/os-dev.md,⛔ 本协议不另存第二份。Table 2 — left out, and why
A digest of 150 lines cannot carry the corpus's roughly 3,100 lines. What is missing is
listed here by class. The classification test used throughout: does the passage change a
decision a PM makes on this turn, and is it a rule rather than the data a rule consults?
references/platform-readings.mdin full,references/rest-channel.md's per-operation channel table,references/true-green.md's per-repo run recipes/pm-dispatchargument defaults, the domain-to-package table, the compile-surface list, the required-check names, the per-lane package inventoriesreferences/lanes/*.mdstanding commitments and in-seat judgement (roughly 355 lines).claude/agents/os-dev.mdThe two round-boundary rules added in the second patch round were paid for inside the
150-line ceiling by folding two pairs that state adjacent rules, never by dropping a
prohibition: the round-report contents merged with the health-indicator list (the five
indicators are still reported as a count; their definitions stay in SKILL.md), and the
claim atomic pair merged with the claim-comment field list (the field list is a form,
already in the templates class above). Both folded-out halves are enumerations, and
both merged rows are marked MERGED in Table 1.
Two rule-level details were folded out for space and are named here rather than left
silent: the roughly two-minute freshness window on the sweep's half-labelled disjuncts
(the disjuncts and the exclusion list are in the digest), and the per-level rationale of
the lane total order (the order itself is in the digest).
Table 3 — conflicts found (reported, not resolved)
Two corpus passages state the same rule with different names. Per the card's stop
condition the digest line is written from the stricter reading and the conflict is listed
here for the seat to raise.
repo:*seat self-serves the three mechanical duties (its own sweep, its own type, first grading of its findings);references/lanes/hotcrm.mdsays at three sites that this seat produces neither type nor gradingreferences/contract-review.mdput the release in the dispatching seat's own review;references/lanes/director.mdstill describes the director seat's contract-review duty as an audit position with the release moved awayGates
The 28-family union below was re-run in full on
3345687band every exit code wascaptured by redirect before any pipe. Two seat-review patch rounds then landed
fb5fecb9and23ddfa99(two prose lines inside the digest, no other file), and the four gates that read those
lines were re-run on that head: the ratchet, frame sync, the id lint and the NUL-byte
scan, all exit 0 — verdict lines below.
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran RANFILE—dispatch-gates --ran: 28 derived famil(ies) accounted for — 28 run, 0 NOT-MEASURED.(exit 0). Nine further families were run beyond the derivation: the ratchet self-test,
the two published-list-mirror legs, the two skills-token-ratchet legs, the governed
queue guard self-test, the governed-prose and label-desc-cap gates, and the whole-repo
lint.
check-skill-line-ratchet: .claude/skills/pm-dispatch/references/core-rules.md is 150 lines (ceiling 150; headroom 0).and
widest table row is 0 bytes (pin 0; headroom 0).Total ceilings grow by 150 —the one growth this card authorises. Self-test:
check-skill-line-ratchet self-test: 155 cases pass.(exit 0)pnpm check:skill-frame-syncexit 0 — the digestcarries none of the block's sentences and none of its fingerprint phrases; the two
declared copies are untouched by this diff.
pnpm check:pm-skill-id-lintexit 0 — no issue number in the new file.check-nul-bytes: OK (scanned 7460 text file(s) -- 7460 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/references/core-rules.md scripts/pm/check-skill-line-ratchet.mjsexits 3 with
governed-surface predicate: 1 of 2 path(s) hit the registerandGOVERNED — a human merge is the review record for this PR. This PR stays a draft.OS_VERIFY_LOCK_SLOT=issue-15379-heavy bash scripts/pm/os-verify-lock.sh -c 'pnpm lint'→
os-verify-lock: VERDICT command-exit 0 · held the lock 77s (1m17s) · waited 0s · SHARED-BOX SECONDS(the lock excludes other locked runs, not unlocked sibling work, so the seconds are not
idle-box figures).
check:doc-formula-expressionsfirst returned exit 3,PREREQUISITE NOT MET—nothing measured. Two workspace builds through the same lock (
@objectstack/formula,then
@objectstack/lint; build verdictcommand-exit 0 · held the lock 155s) made itrunnable, and it then passed:
check:doc-formula-expressions: 22 record-scoped formula example(s) across 428 files / 1371 TS blocks judged clean(exit 0).
reconciliation above consumed.
fb5fecb9:check-skill-line-ratchet: .claude/skills/pm-dispatch/references/core-rules.md is 150 lines (ceiling 150; headroom 0).and
widest table row is 0 bytes (pin 0; headroom 0).;check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files;check-skill-id-lint: 24 file(s) clean;check-nul-bytes: OK (scanned 7460 text file(s) ... no raw ASCII control bytes).The state-set rule now reads five pm state labels plus the decision label as six
mutually exclusive states, and the handover rule no longer uses a first-person seat
voice. The file stays at exactly 150 lines, headroom 0.
What this PR does not do
It is a draft and stays one:
.claude/**is a governed surface, so no seat flips itready, enqueues it, arms auto-merge, or approves it. Review is requested from the two
authorised approver accounts, and the merge is the maintainer's.
skip-changesetapplies: nothing here is published from a package.23ddfa99(two rules added under the entry section, twopairs folded to pay for them), same four gates re-run on that head, all exit 0:
check-skill-line-ratchet: .claude/skills/pm-dispatch/references/core-rules.md is 150 lines (ceiling 150; headroom 0).and
widest table row is 0 bytes (pin 0; headroom 0).;check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files;check-skill-id-lint: 24 file(s) clean (pattern /#[0-9]{3,}/g).;check-nul-bytes: OK (scanned 7460 text file(s) ... no raw ASCII control bytes).The ceiling did not move.
Generated by Claude Code
Generated by Claude Code