Skip to content

docs(pm-dispatch): the director seat stops while the maintainer's reply is missing (未回字 = 不在 = 停) - #19416

Merged
os-steve merged 2 commits into
mainfrom
claude/issue-19274-director-absent-means-stop
Sep 20, 2026
Merged

os-steve merged 2 commits into
mainfrom
claude/issue-19274-director-absent-means-stop

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

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.
  3. The index is presented once, never reprinted; one line on return — director.md:58 and :16.
  4. 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 0check-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 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). 承接者:无.
  • 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

os-steve and others added 2 commits September 20, 2026 17:56
…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>
@os-steve os-steve added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 20, 2026 — with Claude
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 20, 2026

Copy link
Copy Markdown
Collaborator Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 33d8403a2dbe8e7acbaa7404c05cabcc8d073a0a

① Derived judgments

  • Published accept set / public surface: none moves — three governed prose files, seven in-place line rewrites, +7 / −7, net 0 at every ceiling (director.md 72 / 72 · SKILL.md 813 / 813 · core-rules.md 151 / 151), every touched line ≤ 120 B (seat-measured: 118 · 119 · 116 · 116 · 115 · 113 · 120). check-governed-merges --pr 19416: GOVERNED, Tier S; check-widening-tells --declaration no: 3 files NOT MEASURED — the no stands on the seat's reading. Judged correct.
  • The rule the maintainer gave in two sentences (card + comment 5748836212, verbatim there) lands as ONE definition and its consequences, where a fresh director summon reads them: director.md :15 「未回字 = 不在 = 停:维护者不在则本席不运行,⛔ 无巡检、审计、快照、聊天、卡评论。」 — the 3′ reading of 「维护者不在期间什么都不用做」, rendered as a rule (the card's own 措辞可并), with the stopped acts enumerated exactly as the comment lists them and self-wake deliberately NOT restated (its two homes, :7 and SKILL.md :766, already forbid it at every hour — a third, absent-scoped copy could be read as a presence-time allowance); :16 「回来后先补跑审计与重挂复位一次,再只发一行「批 #N 待字;箱内另有 K 张新到未呈」。」 (rule 4's return line + 3′'s one re-run); :43 「一次只开一批:维护者对批 N 回字(一字即可)后,新到才合成批 N+1;续批至清零才收工。」 (rules 1 and 5 — the line that used to read 「批间新到滚入下批」 and let summon chore(ci)(deps): bump github/codeql-action from 3 to 4 #24 open 13 batches into silence); :58 「待您清单与待字索引随所属批只呈一次,⛔ 不逐轮重印;…」 (rule 4); :41 receives the 「⛔ 不复活已退役的汇总 issue」 clause :43 dropped. SKILL.md :766 carries the pointer beside 「⛔ 无 Routine/cron」; core-rules.md :147 is its digest twin (the file carries the director line, so the twin was due; the four duty names abbreviate there with their full spellings at SKILL.md :767 and the charter headings). Judged correct — 语义不可少 holds for all five rules and the definition.
  • Payment on three zero-slack files, verified by the seat on this head: old :15 「召唤间隔里…停放是设计安全态;复核放行不在其内,常设归派发席席内」 → the new :15 defines 停 and :28 carries 「放行常设归派发席席内复核」 verbatim; old :16 「档位由维护者逐场按项目人工定,⛔ 无档位硬门、无免档整理态;本文不写模型名」 → SKILL.md :769 (the verbatim twin, the only other hit for 档位硬门 / 免档整理态) and AGENTS.md :442 (no model identifier in a PR, comment, changeset, doc or code comment); :43's 汇总-issue clause moved to :41 verbatim. The dev's grep proves nothing pins the retired phrases; 「到合并 = 推进到就绪并点名等待」 untouched as ordered. Judged correct.
  • Evidence, seat-run on this head in a detached worktree: check-skill-line-ratchet / check-skill-id-lint / check-governed-prose / check-skill-frame-sync exit 0; merge-tree vs origin/main 5a5e710: 0 conflicts; CI on 33d8403: 30 check runs, 1 still running, 0 red. The dev's 21-command derived union 21 / 21 exit 0 with --ran reconciled (a DERIVED zero), check:pm-dispatch-gates 1883 cases on the final head, and a ratchet positive control (one appended line → exit 1 → restore proven by blob hash).

② Semver level

None — nothing published; skip-changeset on the PR is the correct declaration. Judged correct.

③ Boundary flags

open_questions empty. Deviations read and accepted: the 不在 = 停 rule went into :15 in place (the old parking-is-safe line) rather than as a new line beside :7 — fewer lines move and two overlapping rules become one, exactly assumption 3's intent; two commits (the second removed 自唤醒 from :15's list, assumption 2); the first detached slow run was killed and re-run on the final head; SKILL.md :766 drops the word 入口 (the command stays) and spells 无 Routine/cron with a slash to fit 118 B. Seat reading: the maintainer's sentence is not carried verbatim in the charter — the charter is rules, not quotes, and the card's 措辞可并 permits it; the verbatim text stays on the card and in the PR body's 速读 with the 反例 (batches #179#191 opened during #168#178's silence), which the zero-slack charter cannot carry (and check-skill-id-lint would refuse the batch ids in prose). Three noted, not filed items with carriers (decision-analysis.md :12's 「呈完即停等回批」 could point at :43; a stale comment line number in check-prior-rulings.mjs's header; :68's pointer left as is to keep the diff at seven lines).

Implemented-by: claude/issue-19274-director-absent-means-stop
Reviewed-by: session_017ETYWqMQD4qMtZzAGovWNi

VERDICT: PASS


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant