Repository navigation
docs(pm-skill): rules-only rewrite of the seven core pm-dispatch references - #15485
Merged
Merged
Conversation
…rences Rewrite `dispatch-runbook.md`, `review-checklist.md`, `contract-review.md`, `landing-operations.md`, `seat-post-protocol.md`, `state-machine.md` and `decision-analysis.md` in place under the rules-only house style: one rule per line, at most 120 bytes, plain Chinese with identifiers in backticks, grouped under each file's own sections. Provenance narratives, ruling dates, verbatim quotations, incident post-mortems and rationale tails leave the corpus; every rule already stated in the rewritten SKILL.md is cut, and each file opens with a single pointer to the SKILL.md section it details. 713 lines to 630 across the seven. The seven CEILINGS rows in scripts/pm/check-skill-line-ratchet.mjs are re-pinned down at the landed counts; the seven MAX_TABLE_ROW_BYTES rows stay at 0, which is what keeps these files table-free. No other row moves. Part of #15379 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Contributor
Author
Table 1 — every surviving rule line (part B)Continues the inventory in the PR body. Same columns;
🤖 Generated with Claude Code Generated by Claude Code |
This was referenced Sep 4, 2026
… dev The takeover section of `references/dispatch-runbook.md` gains the (a)-type check: before putting a second dev on a branch another session's dev owns, read the remote branch head, that branch's last push time and the newest `os-dev-report` on the card. Any of the three inside the cloud collection boundary means no second dev — wake the branch's own dev with a comment on its PR, and run the takeover protocol only after a full boundary of silence. A dead PM session is not evidence that the dev it created is dead; cross-account liveness is read from GitHub output only. Four lines paid inside the file's re-pinned ceiling by merging adjacent lines (the same-round execution rule, the first-touch grading note, the seat-post downgrade action, and the unlock-scan inversion). No prohibition dropped, the file stays 241 lines and the ratchet row stays 241. Part of #15379 Fixes #14986 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
os-zhuang
approved these changes
Sep 5, 2026
os-zhuang
marked this pull request as ready for review
September 5, 2026 01:29
os-zhuang
enabled auto-merge
September 5, 2026 01:29
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
Fixes #14986
Rules-only rewrite of the seven core
pm-dispatchreferences, under the house style the digest set: one rule per line, at most 120 bytes measured withwc -c, plain Chinese with identifiers in backticks, grouped under each file's own sections. Provenance narratives, ruling dates, verbatim quotations, incident post-mortems and rationale tails leave the corpus. Every rule already stated in the rewrittenSKILL.mdis cut rather than repeated, and each file now opens with a single pointer to the SKILL.md section it details. Precedence and the red lines are not restated anywhere here.713 to 630 lines across the seven. 57 of those lines are passages removed outright (Table 2); the rest of the shrink is multi-line bullets re-flowed into single rule lines, which is why the rule count barely moves while the file count does.
Angle-bracket placeholders are spelled as bare placeholder words in this body only, because the body sanitizer eats short angle-bracket fragments even inside backticks. The files keep the original spelling.
Patch round (head
6000e270d). The takeover section ofdispatch-runbook.mdgains the (a)-type check the skills-lane finding asks for: before putting a second dev on a branch another session's dev owns, read the remote branch head, that branch's last push time and the newestos-dev-reporton the card; any of the three inside the cloud collection boundary means no second dev — wake the branch's own dev with a comment on its PR, and run the takeover protocol only after a full boundary of silence. A fourth line closes the gap the finding is a counter-example to: a dead PM session is not evidence that the dev it created is dead. Four lines, paid inside the file's re-pinned ceiling by merging four adjacent line pairs — the same-round execution rule, the first-touch grading note, the seat-post downgrade action, and the unlock-scan inversion. No prohibition was dropped and the ratchet row stays 241.The seven files
dispatch-runbook.md— 280 to 241. The dispatch and collection runbook: per-section increments only. Every出处header line is gone; the eighteen sections keep their subjects and their order. The cloud-card applicability argument, the read-cost measurements and the seat-post patrol precedent are out; the four cloud lessons, the takeover protocol, the stall-reset gradient, the notification-replay identity triple and the whole dispatch-prompt construction section keep every operative clause, including the verbatim two-sentence forms (file surface, repo-wide pin sweep, same-day churn, the four overlap warnings). The takeover section now opens with the four-line inherited-branch check described above.review-checklist.md— 84 to 77. The per-item review criteria, now grouped under five headings (PR shape and card relations, scope and changeset, test and gate evidence, assertions and benefit, premise/stop-condition/deletion). The three-leg rebuild measurement and the stop-condition incident are out; the criteria they supported stay, including the two required job names this file is pinned on.contract-review.md— 68 to 60. In-seat contract review: carrier discipline, ownership and eligibility, the downgrade fuse. All ruling dates and the parenthetical ruling citations are gone. TheImplemented-by:/Reviewed-by:independence pair, the three landing pre-checks with the pair-checker's exit codes, and the transcript tier verification keep their spellings.landing-operations.md— 80 to 69. Sections A to D keep their letters, because SKILL.md points at them by letter. The regen trap, the queue-entry diagnosis order, thePart ofclose-out action, the post-merge reconciliation, the subscription lifecycle and the two main-red conventions all stay; their rationale tails do not.seat-post-protocol.md— 104 to 91. The four sections plus the ten-step handover checklist, which stays a numbered form. Thirteen lines that only restated SKILL.md's seat-post section are cut (read-side boundary, liveness-from-updated_at, race triad, epic delegation, job-description versioning).state-machine.md— 44 to 42. Per-state line contracts. The six-state set is now spelled out on its own line, andBlocked-by:,Restart-when:,Restart-touch:andUnlock-action: re-check PR #Mkeep their exact spellings and their line-anchored shape.decision-analysis.md— 53 to 50. Applicability, the standing adjudication-batch process, the filing template's six writing requirements, and the fixed facet-block shape. The facet tie-break order and the long-term weight floor are cut as duplicates of SKILL.md's escalation section. The frame is referred to by section name only; no fingerprint phrase appears.Ratchet. The seven
CEILINGSrows inscripts/pm/check-skill-line-ratchet.mjsare re-pinned down at the landed counts (241, 77, 60, 69, 91, 42, 50), each with a one-line note in the map's own convention. No other row moves and nothing is raised. The sevenMAX_TABLE_ROW_BYTESrows stay at 0 — a measurement, not a disabled row: none of these files carries a markdown table, so a new table row would redden the pin. That is the reading taken on the house style's "lookup data stays in tables" clause (Table 4).Table 1 — every surviving rule line (part A)
471 rule lines across the seven files.
strippednames what left that line:date,quotation,narrative,marker,merged,reworded(bold markup and prose compression),rewrapped to one line, orunchanged. Part B continues in the first comment.dispatch-runbook.mddispatch-runbook.mdpm:blocking的写入与摘除都在分诊轮 sweep,依赖者全关即摘。dispatch-runbook.mddispatch-runbook.mdscripts/pm/ensure-pm-labels.sh。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdfinding→pm:on-hold,域标签保留。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdlabel:pm:seat列表页上标题挂🟢 github-login的贴。dispatch-runbook.md🟢 Routine座位以调度器读数为准,⛔ 不入本巡查。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.md⏳ vacant+ 摘 assignee 同笔 + 证据评论(时间戳与链接)。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.md分诊轮收尾,逐字不动,互斥守卫靠 grep 它。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdpm:dispatched卡最新非本 sessionClaim:)出自车道盘点,不在座位贴线程。dispatch-runbook.mdissue_read get拿评论总数,按小perPage(~15)算末页页码只读尾页。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdRestart-when:行、确认 claim 或 report 在不在。dispatch-runbook.mddispatch-runbook.mdlist_issues+since。dispatch-runbook.mdupdated_at,半标注照样入窗。dispatch-runbook.mdstate=CLOSED+since与Blocked-by:反向索引求交,命中走双查。dispatch-runbook.mdperPage: 1只读totalCount。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdRestart-when:判据批扫、决策箱回填。dispatch-runbook.mddispatch-runbook.mdtotalCount;分页只治当次,一个谓词,⛔ 不加第二条代码路径。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdneeds-user-decision。dispatch-runbook.mdpm:blocked卡的Blocked-by:目标已关闭。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdcreate_session带source_url出生即持推送授权。dispatch-runbook.mdoutcome_branch(= 认领分支)、显式model(trigger 流不可指模型)、title。dispatch-runbook.mdtitle以车道名开头,⛔ 不叫 os-dev,形如⚡ 车道 #单号 短语。dispatch-runbook.mddispatch-runbook.mdopen_questions。dispatch-runbook.mddispatch-runbook.mdFixes #n,正文含验证记录)。dispatch-runbook.mdos-dev-report标记。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdsubscribe_pr_activity,这是硬步骤。dispatch-runbook.mdget_session读实时状态,IDLE 加分支未推送 = 停摆待 poke。dispatch-runbook.mdcreate_trigger带persistent_session_id加fire_trigger,用后删。dispatch-runbook.mddispatch-runbook.mdSendMessage同裁,ListAgents同列不到,⛔ 不复测。dispatch-runbook.mdnot found。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdorigin/main。dispatch-runbook.mdgit -C repo-root pull --ff-only origin main。dispatch-runbook.md--ff-only让脏或分叉的检出大声失败,⛔ 不静默合并。dispatch-runbook.mdgit ls-remote)、该分支最后推送时刻。dispatch-runbook.mdos-dev-report的时刻;任一落在云端收集边界内 ⇒ ⛔ 不派第二个 dev。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdgit ls-remote)、仅容器磁盘、真没了。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdcd进去接着做,第二个 worktree 会劈开工作。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdpackages/spec恒归 spec 座位,本条不豁免:唯一所有者规则更硬。dispatch-runbook.mdBlocked-by:点名的那一个阻塞项。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdorigin/main复核 PR 正文的前提声明与验证叙述,复核清单其余判据不减。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdnode_modules/@objectstack/spec/liveness/域.json;status: 'planned'= 有 carrier、零消费者。dispatch-runbook.mdauthorHint就是证词;不读账本的派发让 dev 交出渲染为零的元数据。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.md.claude/skills/pm-dispatch/SKILL.md升级与决策 节的四轴框架块。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdcheck:skill-frame-sync全树扫;os-dev 定义没带就停下索取。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdCo-Authored-By尾注(含 session 链接)。dispatch-runbook.md.claude/agents/*frontmatter 的model:,check:agent-model-declared要求。dispatch-runbook.mdgit log origin/main --oneline -20 -- paths见当天合并即加一行。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdfind()给出相同行集,或以INVALID_FILTER拒收。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdcompile-surfaces.md的编译面清单按复核串重验后逐面抄进派发令。dispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mddispatch-runbook.mdgit diff 基线ref origin/main -- '两插件/src/objects/*.object.ts'。dispatch-runbook.mdgrep -E '^[+-] [a-z_][a-z0-9_]*: Field\.';零命中 = 成员级同一,必记基线 ref。review-checklist.mdmain,正文首行引用卡片。review-checklist.mdFixes #n仅当合并应当关卡;只落地了可实施的一半 ⇒ 必须Part of #n。review-checklist.mdreview-checklist.mdPart of的正文最易再武装自动关闭:否定句、记账句、引号包裹,解析器一律照关。review-checklist.mdreview-checklist.mdreview-checklist.mdlanding-operations.md。review-checklist.mdPart of收口的卡不会自动关,pm:dispatched必须手工摘,动作要件见落地细则 B。review-checklist.mdreview-checklist.mdreview-checklist.mdcontent/docs/releases/改动、用户可见改动有 changeset、无与卡无关的文件。review-checklist.mdskip-changeset标签,⛔ 不走空 changeset。review-checklist.mdreview-checklist.mdreview-checklist.mdreview-checklist.mdreview-checklist.mdprivate: false即已发布 ⇒ 读package.json核 changeset 在不在。review-checklist.mdreview-checklist.mdreview-checklist.mdreview-checklist.md.d.ts逐字节相同的读数必须同块带阳性对照,它只判名字集。review-checklist.mdexport *与export type { X } from都不复述形状。review-checklist.mdreview-checklist.mdlist_issues/search_issues一类,或重跑去重读数。review-checklist.mdreview-checklist.mdin_progress是诚实读数。review-checklist.mdreview-checklist.mdconclusion都须为success,门禁族跑在其内;⛔ 不因报告写了本地绿跳过。review-checklist.mdtrue-green.md。review-checklist.mdreview-checklist.mdhead_sha与head.sha,不一致的双向都不入账。review-checklist.mdcancelled零动作、永不重跑:新推送自带全套 run。review-checklist.mdgit rev-parse --short HEAD抄进报告与正文。review-checklist.mdhead.sha比一次,对不上即死树读数、双向都不入账;没抄 ⇒ 按没有读数处理。Table 2 — passages left out, by class
dispatch-runbook.mdreview-checklist.mdcontract-review.mdlanding-operations.mdseat-post-protocol.mdstate-machine.mddecision-analysis.mdduplicate-of-SKILL.md= the rule is stated in the rewritten SKILL.md and is not repeated here (the rate-limit read, the sweep-INCOMPLETE rule, the six-state ONE-OF replace, the three-day queue horizon, the read-side boundary, the facet tie-break order, the long-term weight floor, epic delegation, the archive obligation as a principle).provenance= the出处header lines and per-section ruling citations.narrative= incident and measurement stories.rationale= "why this rule exists" tails whose rule survives on its own line.Nothing else was dropped: an identifier sweep over every backticked token in the old seven confirms each one is either present in the new text or present in the rewritten
SKILL.md. Two operative spellings that the first pass had lost were restored before the commit — the patrol's per-fire cadence indispatch-runbook.md, and the six-state set instate-machine.md.Table 3 — literal sentences and spellings kept because a gate pins them
Lint & Repo Gates,TypeScript Type Checkreview-checklist.mdscripts/check-required-contexts.mjs—INSTRUCTION_SURFACESmustNamefor this fileESLintreview-checklist.mdBlocked-by:state-machine.mdscripts/pm/check-half-states.mjsreverse indexRestart-when:state-machine.md,dispatch-runbook.mdscripts/pm/check-half-states.mjsunlock scanRestart-touch:state-machine.mdscripts/pm/check-half-states.mjsH17 trigger-file indexpm:{queue,dispatched,blocked,on-hold,awaiting-maintainer}state-machine.mdscripts/pm/check-half-states.mjsH29/H30/H31Unlock-action: re-check PR #M(line-anchored)state-machine.mdcheck-skill-line-ratchet.mjsanchoredexemption class names the spellingClaim:dispatch-runbook.mdscripts/pm/check-half-states.mjs,scripts/pm/check-clause2-carriers.mjsImplemented-by:/Reviewed-by:/ SELF-REVIEWcontract-review.mdscripts/pm/check-clause2-carriers.mjsAUTHORSHIP_KEYSnode scripts/pm/check-clause2-carriers.mjs --pair PR-NUMBERand its 0/4/3 exitscontract-review.mdneeds:contract-reviewcontract-review.md,state-machine.mdscripts/pm/check-clause2-carriers.mjs,check-label-desc-cap.mjsos-dev-reportdispatch-runbook.mdscripts/pm/check-half-states.mjsreport markerpm:seatseat-post-protocol.md,dispatch-runbook.mdscripts/pm/ensure-pm-labels.sh,check-half-states.mjsnode scripts/pm/check-governed-merges.mjs --testlanding-operations.md,state-machine.mdcheck:agent-model-declaredas the frontmatter-model:exemption's authoritydispatch-runbook.mdscripts/check-agent-model-declared.mjs#followed by three or more digits anywhere in the sevenscripts/pm/check-skill-id-lint.mjsscripts/check-skill-frame-sync.mjsFINGERPRINTScheck-skill-line-ratchet.mjsMAX_TABLE_ROW_BYTESpin 0Three protocol spellings are kept verbatim with no gate behind them, so they are rules held by reading alone: the shift-brief first-line marker in
dispatch-runbook.md,os-decision-facetsindecision-analysis.md, and theaccepted-for-GAcomment inseat-post-protocol.md.Table 4 — conflicts found, and the reading taken
dispatch-gatesand the corpus writes no model nameClause-②: nois an auditable false declaration.contract-review.md: a declaration overturned by tier review is the mechanism working as designedcontract-review.mdis narrowed to the provisional half (the declaration only sets the conservative dispatch tier) and no longer speaks to the auditneeds:contract-reviewdual-carrier discipline appeared in bothstate-machine.mdandcontract-review.mdcontract-review.mdowns the attach/clear discipline;state-machine.mdkeeps only the half-state judgement (card-side-first is a legal intermediate state), which is the halfcheck-half-states.mjscitesdispatch-runbook.mdcarried a shell command quoted with double quotes, against the no-straight-quote hygiene rulereferences/prefix; sibling files insidereferences/spell siblings barereferences/, which is what the old files already did for every siblingseat-post-protocol.mdand as rationale in the runbookseat-post-protocol.mdkeeps the handover step (who does it, when); the runbook's rationale block is cutGate verdicts
Every exit code captured by redirect before any pipe. Union run after the rewrite commit at
19c3714a2; the four named gates re-run after the patch commit at6000e270d.Two gates in the union needed a prerequisite before they measured anything, and both are recorded here rather than counted as passes on the first attempt:
check-required-contexts --verify-required-setansweredNOT VERIFIED(exit 2) until re-run with the session proxy enabled, then exit 0;check:doc-formula-expressionsansweredPREREQUISITE NOT MET(exit 3) until@objectstack/formulaand@objectstack/lintwere built, then exit 0. Neither is related to this change set.Landing regime: governed, so this stays a draft. No seat flips it ready, enqueues it, or arms auto-merge.
🤖 Generated with Claude Code
https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Generated by Claude Code