Skip to content

Commit a0e62e6

Browse files
os-steveclaude
andauthored
docs(pm-dispatch): the director seat stops while the maintainer's reply is missing (未回字 = 不在 = 停) (#19416)
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): > 「你浪费了我很多token,上一批决裁没有回复说我我人不在,你不应该开启下一批决裁。立skills卡」 > 「项目总监由维护者召唤,维护者不在期间什么都不用做。」 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): | file:line | before | after | now carries | |---|---|---|---| | `references/lanes/director.md:15` | 118 B | 116 B | the definition 「未回字 = 不在 = 停」 and 3′: absent ⇒ the seat does not run — no patrol, no audit, no snapshot, no chat, no card comment | | `references/lanes/director.md:16` | 110 B | 116 B | the return: the audit and the rehang reset are re-run ONCE first, then exactly one line 「批 #N 待字;箱内另有 K 张新到未呈」 | | `references/lanes/director.md:41` | 77 B | 115 B | receives 「⛔ 不复活已退役的汇总 issue」 from :43 — same section, one line down is now the cadence rule | | `references/lanes/director.md:43` | 92 B | 113 B | 一次只开一批: batch N+1 is composed from the arrivals only after the maintainer has answered batch N (one character counts); keep batching until the inbox is empty | | `references/lanes/director.md:58` | 106 B | 120 B | the 待您清单 and the awaiting-reply index are presented ONCE, with the batch they belong to, ⛔ never reprinted per round | | `SKILL.md:766` | 104 B | 118 B | the director entry gains the pointer 未回字 = 不在 = 停 beside ⛔ 无 Routine/cron | | `references/core-rules.md:147` | 117 B | 119 B | the digest twin of `SKILL.md:766` | The landed lines, verbatim: - director.md:15 — 未回字 = 不在 = 停:维护者不在则本席不运行,⛔ 无巡检、审计、快照、聊天、卡评论。 - director.md:16 — 回来后先补跑审计与重挂复位一次,再只发一行「批 #N 待字;箱内另有 K 张新到未呈」。 - director.md:41 — 决策收件箱 `needs-user-decision` 跨仓勤务,按基本原则批呈;⛔ 不复活已退役的汇总 issue。 - director.md:43 — 一次只开一批:维护者对批 N 回字(一字即可)后,新到才合成批 N+1;续批至清零才收工。 - director.md:58 — 待您清单与待字索引随所属批只呈一次,⛔ 不逐轮重印;座位贴散文降为指针,标签即状态。 - SKILL.md:766 — 项目总监席:维护者在所在仓召唤 `/pm-dispatch director`;⛔ 无 Routine/cron;未回字 = 不在 = 停。 - core-rules.md:147 — 项目总监席由人工召唤,未回字 = 不在 = 停;四职:复核审计、决裁、动作台账、合并审计。 ### Where the card's five rules landed 1. 一次只开一批 — director.md:43 (批 N+1 只在维护者对批 N 回字后开, 一字即可). 2. 未回字 = 维护者不在 — director.md:15, the definition; the same literal is the pointer on SKILL.md:766 and core-rules.md:147. 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. 4. The index is presented once, never reprinted; one line on return — director.md:58 and :16. 5. The arrivals are composed into the next batch only after the maintainer answers — director.md:43 (新到才合成批 N+1); ≤5 per batch keeps its two existing homes at director.md:23 and :45. ### 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 -rn` over `.claude/` and `scripts/`; nothing pins the retired text — 0 hits for 停放是设计安全态, 滚入下批, 本文不写模型名 outside these files, and the two SKILL.md hits below are the homes themselves): | retired from | clause | surviving home | |---|---|---| | director.md:15 | 召唤间隔里决策卡与审计窗口停放是设计安全态 | the new :15 itself — 停 IS the parked state, now defined rather than described (PM assumption 3: one rule, not two overlapping ones) | | director.md:15 | 复核放行不在其内,常设归派发席席内 | director.md:28 「本职是审计位,非放行链:放行常设归派发席席内复核」 — verbatim twin | | director.md:16 | 档位由维护者逐场按项目人工定,⛔ 无档位硬门、无免档整理态 | SKILL.md:769 「总监席档位由维护者按项目人工定,每场记入摘要台账;⛔ 无档位硬门、无免档整理态」 — verbatim twin; SKILL.md is read in full by every seat session (the ratchet's own header), and director.md:17 still says the tier is read at session open | | director.md:16 | 本文不写模型名 | AGENTS.md attribution section: no model identifier lands in a PR title or body, a comment, a changeset, a doc or a code comment — and the pre-push hook refuses one in the trailer pair | | director.md:43 | ⛔ 不复活已退役的汇总 issue | moved verbatim to director.md:41, same section (职责二), beside the inbox it is about | | director.md:43 | 批间新到滚入下批,收件箱清零才收工 | the new :43 — 新到才合成批 N+1 (now conditioned on the reply) and 续批至清零才收工 | | SKILL.md:766 | the word 入口 | the entry command `/pm-dispatch director` stays on the line; director.md:14 spells 入口 in full | | core-rules.md:147 | the full duty names (决裁勤务 / 维护者动作台账 / 受管合并审计) | SKILL.md:767 and the four director.md section headings carry the full names; core-rules.md's own header says details live in SKILL.md | 「到合并 = 推进到就绪并点名等待,⛔ 不代维护者合并。」 (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 1. **Confirmed.** Branch base `8ddefbc`; the three files are byte-identical between `0862063` and 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. 2. **Confirmed, and it shaped the second commit.** The first commit listed 自唤醒 inside :15's stopped-seat list; the second commit removed it — a third spelling of the no-self-wake rule, and one an absent-scoped list could invert. The rule keeps its two homes and :766 now carries the 未回字 = 不在 = 停 pointer beside it. 3. **Confirmed and acted on**, see the payment table: old :15's 停放是设计安全态 became the definition line; :68's pointer is untouched. 4. **Confirmed.** `check:pm-skill-ratchet` prints 72 / 72, 813 / 813, 151 / 151 with `MAX_LINE_BYTES = 120`; `check:pm-skill-id-lint` matches a hash followed by three or more digits, so the 反例's batch numbers live only in this body; `check:pm-governed-prose` passes. ## 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 head `33d8403`. Run on `33d8403`, 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`. `--ran` reconciliation 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-expressions` first refused with exit 3 PREREQUISITE NOT MET (`@objectstack/formula` and `@objectstack/lint` not built) — recorded as NOT MEASURED, not red; the `@objectstack/lint` closure (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. - Extra, run on purpose: `check:pm-settings-deny-roster` exit 0 (the derivation marks its roster as living under `.claude/`, where silence is evidence in neither direction). - Ratchet positive control (taken on the first head `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-ratchet` exit 1 with its own verdict line 「is 73 lines; the ratchet ceiling is 72」; restored with `git checkout HEAD -- ` that path, proven by `git hash-object` equal to the HEAD blob, `git diff HEAD` empty and `git status --porcelain` empty; the gate exits 0 again after the restore. - Control-character self-scan (`grep -naP` over 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 on `33d8403` as this body is written; its exit lands in the `os-dev-report` comment on the card — this body is written once. - Governed tier, measured locally: ⛔ GOVERNED — Tier S(席内达档复核落地): every governed path here lies under a Tier S surface, so the OWNING (`check-governed-merges.mjs --test` on the three paths with the diff's 7 / 7 line counts). This PR stays DRAFT; the owning seat lands it on a `## Contract review` record for the current head. No changeset: `.claude/**` publishes nothing from any released package. Label `skip-changeset` applied. ## 维护者速读(草稿) **改了什么** — 总监席章程里改了七行,每个文件一行不增不减:① 定义句「未回字 = 不在 = 停」——您对上一批没回字就等于您不在,不在期间本席不运行:不巡检、不做合并审计、不给决策箱拍快照、不在聊天里发任何东西、不在任何卡上留评论;② 您回来时,本席先把合并审计与重挂复位补跑一次,然后只发一行「批 #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:12` already 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.mjs` header cites `references/lanes/director.md:45` for the grep step that has sat at :47 since PR #19303 inserted three lines above it — a comment's line number, not a pin (the script reads no line numbers). 承接者:无. - director.md:68 「⛔ 无 cron,节奏与停放同授权段」 now points at a section where 停 is defined while the batch cadence itself lives at :43; left untouched to keep this diff at seven lines. 承接者:无. --- _Generated by [Claude Code](https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent d9282a4 commit a0e62e6

3 files changed

Lines changed: 7 additions & 7 deletions

File tree

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
763763
- 决策卡带选项、推荐、证据与四棱块;被阻塞的执行卡同笔挂 `pm:blocked` + `Blocked-by:`。
764764
- `AskUserQuestion` 只是在场加速器:仅当维护者在本会话 ~30 分钟内有过人类输入才可发。
765765
- 每问必带推荐项,被 Skip 或长挂即转卡通道,⛔ 不重弹。
766-
- 项目总监席:维护者在所在仓召唤,入口 `/pm-dispatch director`;⛔ 无 Routine 无 cron。
766+
- 项目总监席:维护者在所在仓召唤 `/pm-dispatch director`;⛔ 无 Routine/cron;未回字 = 不在 = 停。
767767
- 四职 = `needs:contract-review` 事后审计、决裁勤务、维护者动作台账、governed 合并审计。
768768
- 每场召唤把带席内 ACCEPT 的受管草稿呈为一批 ≤5 行决裁;批准与合并仍是维护者的点击。
769769
- 总监席档位由维护者按项目人工定,每场记入摘要台账;⛔ 无档位硬门、无免档整理态。

‎.claude/skills/pm-dispatch/references/core-rules.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@
144144
- 方案逐轴过升级与决策段的四轴:业务需求、长远合理性、防 AI 写错、创业阶段聚焦。
145145
- 推荐须逐轴给理由、长远权重不低于一半;有拉动荐长远终态一次付清,零拉动荐不扩散。
146146
- 每张决策卡落卡即带标准四棱块;卡先于弹窗,被阻塞的执行卡同笔转 `pm:blocked`。
147-
- 项目总监席由人工召唤,四职是复核审计、决裁勤务、维护者动作台账、受管合并审计。
147+
- 项目总监席由人工召唤,未回字 = 不在 = 停;四职:复核审计、决裁、动作台账、合并审计。
148148
## 报告契约
149149
- 终报 JSON 的权威形状住 `.claude/agents/os-dev.md`,⛔ 本协议不另存第二份。
150150
- 前提被证伪且无 PR 是合法终报,当再分诊输入复核,⛔ 永不当失败派发。

‎.claude/skills/pm-dispatch/references/lanes/director.md‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
- 录裁同笔改正文:首行加 `Ruled: <评论 id> · letter <X> · <UTC>`;⛔ 不新增标签与状态。
1313
- 划掉原 ⛔ 不派断言,走 `post-stamped --body --ack-through`;漏此笔 ⇒ 接卡者先读正文退决策箱。
1414
- 入口:维护者说处理决裁或处理 contract-review,或 `/pm-dispatch director`。
15-
- 召唤间隔里决策卡与审计窗口停放是设计安全态;复核放行不在其内,常设归派发席席内。
16-
- 档位由维护者逐场按项目人工定,⛔ 无档位硬门、无免档整理态;本文不写模型名。
15+
- 未回字 = 不在 = 停:维护者不在则本席不运行,⛔ 无巡检、审计、快照、聊天、卡评论。
16+
- 回来后先补跑审计与重挂复位一次,再只发一行「批 #N 待字;箱内另有 K 张新到未呈」。
1717
- 开场读一次服役档记入会话审计行,读法见 `../platform-readings.md`;⛔ 不因档位拒裁停四职。
1818
- 双射 carve-out:一张 `pm:seat` 座位贴,四段照旧;状态块逐场一行,各记己锚,⛔ 无占席人。
1919
- 不占 `domain:*` 车道,范围按职责标签跨车道跨仓;永不认领 backlog、永不写码。
@@ -38,9 +38,9 @@
3838
## 职责二:决裁勤务
3939

4040
- 第一步:逐卡过一类自裁三判据;全立者录裁转工作态、只入收班追认表,⛔ 不呈批。
41-
- 决策收件箱 `needs-user-decision` 跨仓勤务,按基本原则批呈。
41+
- 决策收件箱 `needs-user-decision` 跨仓勤务,按基本原则批呈;⛔ 不复活已退役的汇总 issue。
4242
- 一行回批即全链执行,裁后四件原子执行不再请示。
43-
- 批间新到滚入下批,收件箱清零才收工;⛔ 不复活已退役的汇总 issue。
43+
- 一次只开一批:维护者对批 N 回字(一字即可)后,新到才合成批 N+1;续批至清零才收工。
4444
- 受管草稿批:两仓 `is:pr is:open is:draft label:needs-user-decision` 对照等人合清单,差集点名。
4545
- 有席内 ACCEPT 者呈一批 ≤5 行,写法见 `../decision-analysis.md`;四件缺一者列缺口不呈。
4646
- 回批原话逐 PR 记到 PR 上,缺的请审补上即止步;批准与合并恒是维护者的点击,⛔ 不代。
@@ -55,7 +55,7 @@
5555
- `pm:awaiting-maintainer` 跨仓标签是待人工动作的唯一机器载体。
5656
- 该态 = 决定已做、只剩一次 GitHub 之外的人工动作。
5757
- 车道席照旧只负责入态,台账与出口归本席。
58-
- 召唤时随决裁批次呈报一份合并的待您清单;座位贴散文降为指针,标签即状态。
58+
- 待您清单与待字索引随所属批只呈一次,⛔ 不逐轮重印;座位贴散文降为指针,标签即状态。
5959
- 出口执行:核验动作确已发生,再摘标加证据评论同笔;出口条款见 `../state-machine.md`。
6060

6161
## 职责四:受管合并审计

0 commit comments

Comments
 (0)