docs(pm-dispatch): the director seat stops while the maintainer's reply is missing (未回字 = 不在 = 停) - #19416
Conversation
…ly is missing Seven in-place line rewrites across the director charter, the SKILL.md director entry and the core-rules digest; net 0 lines in every file, every touched line at or under the 120-byte cap. Claude-Session: https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi Co-authored-by: Claude <noreply@anthropic.com>
…mes only what the absence stops The no-Routine/no-cron rule already lives at the charter's 授权面 line and at the SKILL.md director entry; listing 自唤醒 again inside the absent-period list would be a third copy and could read as a presence-time allowance. Claude-Session: https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver levelNone — nothing published; ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #19274
Clause-②: no
The director seat burned the maintainer's tokens while he was away. Batches 168–178 had drawn no reply since 2026-09-18T15:10Z; the seat went on presenting batches 179–191 — thirteen batches, sixteen cards, each with a full four-axis analysis and a reprinted cumulative awaiting-reply index — and sent an hourly status paragraph besides. The charter had no sentence saying WHEN the next batch may open, no definition of "absent", and no word that the pending list is presented once, so the seat read 「批间新到滚入下批」 as "open the next batch now".
The maintainer ruled twice, verbatim (2026-09-20, the director seat's chat, quoted untranslated):
The second sentence supersedes the card's rule 3 (a silent patrol still doing three mechanical things) with 3′: while the maintainer is absent the director seat does not run at all.
What changed
Seven in-place line rewrites; net 0 lines in every file — no line added, deleted or re-wrapped — and every touched line at or under the 120-byte cap (
wc -c, newline excluded):references/lanes/director.md:15references/lanes/director.md:16references/lanes/director.md:41references/lanes/director.md:43references/lanes/director.md:58SKILL.md:766references/core-rules.md:147SKILL.md:766The landed lines, verbatim:
needs-user-decision跨仓勤务,按基本原则批呈;⛔ 不复活已退役的汇总 issue。/pm-dispatch director;⛔ 无 Routine/cron;未回字 = 不在 = 停。Where the card's five rules landed
3′. The seat does not run while absent — director.md:15 (不运行, the list of what stops); the re-run-once-after-return half is director.md:16. Self-wake is NOT restated: the standing ⛔ 无 Routine、无 cron at director.md:7 and SKILL.md:766 already forbids it at every hour, and a second spelling scoped to the absence could be read as a presence-time allowance.
The payment: every retired clause and its surviving home
Nothing was added, so nothing was retired whole; four clauses left their lines, each with a home named and grepped (
grep -rnover.claude/andscripts/; nothing pins the retired text — 0 hits for 停放是设计安全态, 滚入下批, 本文不写模型名 outside these files, and the two SKILL.md hits below are the homes themselves):/pm-dispatch directorstays on the line; director.md:14 spells 入口 in full「到合并 = 推进到就绪并点名等待,⛔ 不代维护者合并。」 (director.md:33) was not touched, per the dispatch.
Why :15 in place rather than a line beside :7
The dispatch suggested the 不在 = 停 rule beside :7. It went into :15 in place instead: :15 is the line PM assumption 3 names as the existing parking rule, in the same 授权与形态 section, and rewriting it is what turns two overlapping rules into one; :7 stays byte-identical, and :68's 「节奏与停放同授权段」 still points at the section where 停 is now defined. Fewer lines move, and the no-self-wake rule keeps exactly two homes (:7 here, :766 in SKILL.md).
PM mechanism assumptions — measured on this branch
8ddefbc; the three files are byte-identical between0862063and it (git diff --stat 0862063 8ddefbc --the three paths: empty).grep -E '未回字|不在 = 停|一次只开一批|只呈一次'over each of the three files at the base: 0 hits, exit 1, three times. Positive control:grep -n 'Ruling:'hits director.md:11, exit 0.check:pm-skill-ratchetprints 72 / 72, 813 / 813, 151 / 151 withMAX_LINE_BYTES = 120;check:pm-skill-id-lintmatches a hash followed by three or more digits, so the 反例's batch numbers live only in this body;check:pm-governed-prosepasses.Verification
Gate union derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; the tool takes the change set from the merge base) — 21 commands, byte-identical between the first head and the final head33d8403. Run on33d8403, every exit captured before any pipe (redirect first, then the status): 21 of 21 exit 0 —check-closing-keyword-parity(and--self-test),check-comment-mask-corpus,check-governed-queue-guard --self-test,check-harness-current --self-test,@objectstack/lint check:doc-formula-expressions,check:agent-test-spelling,check:cross-package-test-inputs,check:doc-authoring,check:driver-memory-census,check:gitlink-declared,check:nul-bytes,check:pm-expected-skips,check:pm-governed-merges,check:pm-governed-prose,check:pm-half-states,check:pm-skill-id-lint,check:pm-skill-ratchet,check:refd-timer-probe,check:skill-frame-sync,check:watch-hint-literal.--ranreconciliation with the exit codes recorded: 21 derived, 21 run, 0 NOT-MEASURED — a DERIVED zero, none of the 21 is exit 3.check:doc-formula-expressionsfirst refused with exit 3 PREREQUISITE NOT MET (@objectstack/formulaand@objectstack/lintnot built) — recorded as NOT MEASURED, not red; the@objectstack/lintclosure (spec, formula, sdui-parser, lint) was then built under the shared verify lock (VERDICT command-exit 0, 195 s held) and the gate re-run green.check:pm-settings-deny-rosterexit 0 (the derivation marks its roster as living under.claude/, where silence is evidence in neither direction).5b04dc7; the file is 72 lines and the ceiling row untouched on both heads): one bullet appended to director.md → 73 lines →check-skill-line-ratchetexit 1 with its own verdict line 「is 73 lines; the ratchet ceiling is 72」; restored withgit checkout HEAD --that path, proven bygit hash-objectequal to the HEAD blob,git diff HEADempty andgit status --porcelainempty; the gate exits 0 again after the restore.grep -naPover the C0 set plus DEL) on the three files: no match. Bare card ids on the added lines: none.check:pm-dispatch-gates(the slow whole-tree family the dispatch named) is running detached on33d8403as this body is written; its exit lands in theos-dev-reportcomment on the card — this body is written once.check-governed-merges.mjs --teston the three paths with the diff's 7 / 7 line counts). This PR stays DRAFT; the owning seat lands it on a## Contract reviewrecord for the current head.No changeset:
.claude/**publishes nothing from any released package. Labelskip-changesetapplied.维护者速读(草稿)
改了什么 — 总监席章程里改了七行,每个文件一行不增不减:① 定义句「未回字 = 不在 = 停」——您对上一批没回字就等于您不在,不在期间本席不运行:不巡检、不做合并审计、不给决策箱拍快照、不在聊天里发任何东西、不在任何卡上留评论;② 您回来时,本席先把合并审计与重挂复位补跑一次,然后只发一行「批 #N 待字;箱内另有 K 张新到未呈」;③ 一次只开一批:批 N+1 只在您对批 N 回字(一个字也算)之后才由新到的卡合成;④ 待您清单与待字索引跟着所属批只呈一次,不逐轮重印;⑤ SKILL.md 总监席条目和核心条款摘要各带上「未回字 = 不在 = 停」这一句指针。自唤醒不再重复写:章程原有的「⛔ 无 Routine、无 cron」已经禁了它。
为什么改 — 您的两句原话:「你浪费了我很多token,上一批决裁没有回复说我我人不在,你不应该开启下一批决裁。立skills卡」与「项目总监由维护者召唤,维护者不在期间什么都不用做。」反例:批 168–178 自 2026-09-18 起无一回字,总监席照样开了批 179–191(13 批 16 张),每批带完整四轴与逐批重印的累计索引,外加每小时一段状态散文,还用 send_later 自唤醒 68 次——这些 token 全烧在您不在的时候。旧章程只写「批间新到滚入下批」,没写下一批何时可开、没定义「不在」、没说清单只呈一次。
风险与代价(含回滚) — 行数零增长,每行 ≤120 字节,四条被挤出的旧句各有出处可查(上表)。代价:总监席不在场时完全静默,受管合并审计推迟到您回来后补跑一次;这是您第二句话的直接后果。回滚:
git revert这两个提交即可,不涉及任何脚本或门禁。席位意见 — (留空,席位复核时填)
你要做的 — 无。
.claude/**是 Tier S,由席位在复核记录后落地;这份 PR 是草稿,不需要您点击。Acceptance notes
Noted, not filed — none is a reproducible defect, a declared-contract violation, or a metadata-authoring trap:
references/decision-analysis.md:12already says 「呈完即停等回批」 for the standing batch flow; the director seat did not obey it and the charter now spells the rule for that seat. Whether decision-analysis.md should point at director.md:43 is a question for its next editor. 承接者:无.scripts/pm/check-prior-rulings.mjsheader citesreferences/lanes/director.md:45for the grep step that has sat at :47 since PR docs(pm-dispatch): the ruling procedure writes a banner onto the card body #19303 inserted three lines above it — a comment's line number, not a pin (the script reads no line numbers). 承接者:无.Generated by Claude Code