Skip to content

Commit e58bd0e

Browse files
docs(pm-dispatch): a card thread's needs_decision fork goes to a coordinator-opened ruling thread under the director's delegated channel (#25242)
<!-- claude-projects-attribution: {"github_login":"os-bill"} --> _Requested by **Bill** · [project thread](https://claude.ai/code/project/chan_016iMXWSZDzqWRWvWzdNo8wgHWDjSD5SM4wDKfh36BCP2T)_ Fixes #25216 Clause-②: no Metadata-protocol: none ## What changes The maintainer's standing word of 2026-10-22 is written into the pm-dispatch skill once, in the director charter, and the `mode:thread` runbook names its mechanics in one line. Verbatim, untranslated: > 对于这种类似的问题,能否你自己开一个单独的 fable thread 做评审,对于自己有把握决定的问题,自己决定,不能决定的开决策卡? First use: ruling record `6336640643` (letter A, confirmed by the maintainer in that thread at 08:53Z). The word itself is not re-decided here; this PR decides only where and how it is written. **`references/lanes/director.md`** (〈授权与形态〉, four lines added, one edited in place): - `项目内代裁通道:卡线程报 needs_decision ⇒ coordinator 开裁决线程代本席裁,⛔ 非子代理。` — inside a Claude Code project the ruling thread is the director seat's delegated channel: it rules on the seat's behalf, it is a session the coordinator opens, not a subagent of any seat. - a blockquote carrying the word above, with the first-use ruling record as provenance. - `「有把握」= ../triage-duties.md 置信门四条全立,⛔ 不宽于它;余者一张决策卡呈维护者。` — "confident" is exactly the 置信门 (four prongs: 四棱同向, 不在人工地板, 不推翻既有维护者裁决, 执行是否决窗口), nothing wider; everything else goes to the maintainer as one decision card. - `录裁同上形:批次位写 needs_decision fork,maintainer 位引常设令;逐裁一行进 coordinator 追认表。` — the record is the charter's own `Ruling:` first line (the batch slot names the fork, the maintainer slot quotes the standing word, as the first-use ruling did), posted on the card; every ruling is one row of the 追认表 the coordinator keeps, which the maintainer overturns with one letter (triage-duties: 「被推翻的行按新裁决执行」). - edited: `未回字 = 不在 = 停,⛔ 无巡检、审计、快照、聊天、卡评论;唯一例外是项目内代裁通道。` — the summoned seat still stops without the maintainer's letter; the project-mode channel is the one carve-out, which is the point of the word (the maintainer is away for hours). **`references/dispatch-runbook.md`** (〈卡线程(`mode:thread`)〉, one line added): `终报 needs_decision ⇒ 席位交 coordinator 开 CONTRACT_REVIEW_TIER 裁决线程(lanes/director.md)。` — the mechanics: the seat hands the fork to the coordinator, who opens the ruling thread at the contract-review tier; the ruling rules live in the charter. **`SKILL.md`**: untouched. Measured: no SKILL.md line contradicts the rule once the channel is the director seat's own (see the three reconciliations below), and the file sits at headroom 0. ## The three reconciliations the card requires | Text read (on `origin/main` f2ade4a) | What this PR writes, and why they agree | |:--|:--| | SKILL.md 〈升级与决策〉 ruler line: 「总监席是唯一裁决者:决策箱、代裁与一类自裁只出自本席,⛔ 无子代理无自述。」 | director.md 「项目内代裁通道:…coordinator 开裁决线程**代本席裁**,⛔ 非子代理」. The ruling still comes from the director seat, through its channel; the thread is a coordinator-opened session, not a subagent of a seat (SKILL.md's `batch:` row counts dev threads as 子代理 because a seat spawns them; this one no seat spawns, and it holds no card). The record lands on the card in the charter's `Ruling:` form, so nothing is 自述. No second ruler, no exception added to the ruler line. | | 红线: 「⛔ 永不代维护者答产品或架构问题;唯一例外是已裁的代裁通道,不得宽于其置信门。」 | The channel is a 代裁通道 the maintainer ruled into existence by the word quoted above, so it is 「已裁」; director.md 「「有把握」= `../triage-duties.md` 置信门四条全立,⛔ 不宽于它」 makes its gate exactly the 置信门 — the contract review's objection to the earlier text (「有把握」 read as a wider gate than the channel's) is answered by definition, not by a second exception. `triage-duties.md` is cited, not redefined. | | director charter: L7 授权面 = 人工定期召唤; L16 「未回字 = 不在 = 停:维护者不在则本席不运行…」; L9 「裁决只存在于本卡」; L11 the `Ruling:` first-line form; L13/L40 the 摘要台账. | L16 gains 「唯一例外是项目内代裁通道」 (the one line that would otherwise contradict a thread ruling while the maintainer is away). The new lines bind the channel to L9 (record on the card), L11 (「录裁同上形」, with the two slots spelled for a fork) and to the 追认表 (one row per ruling, overturnable). The seat's other two duties (audit, maintainer-action ledger) are not delegated: the channel rules one fork. | `git grep -n "唯一裁决者\|置信门\|代裁通道"` over the skill at the head: ten lines (SKILL.md 30, 106, 264, 267, 276; director.md 16, 21, 23; triage-duties.md 5, 103); no two disagree — every use of 代裁通道 is a channel under the 置信门, and the ruler line stays the only statement of who rules. ## Line budget (`check:pm-skill-ratchet`, no ceiling moved) | File | Before | After | Ceiling | How paid | |:--|--:|--:|--:|:--| | `references/lanes/director.md` | 69 | 72 | 72 | +4 lines (rule, blockquote, confidence, record), −1 line: the charter's copy of a four-axis frame sentence (「创业阶段不渐进:废弃别名与能力退役默认立即退休,无窗口、无双拼写宽限。」), carried verbatim by SKILL.md's frame block (「过渡也从紧 —— 创业阶段不渐进:…」) and excluded by the charter's own line 3 (「⛔ 不复制框架本体」). One line edited in place (116 → 119 B). | | `references/dispatch-runbook.md` | 240 | 241 | 241 | +1 line, the file's one line of headroom. | | `SKILL.md` | 319 | 319 | 319 | untouched. | Longest added bullet: 120 bytes (the record line, at the cap). The blockquote is 239 bytes and structurally exempt (a blockquote line is a verbatim maintainer ruling, per the ratchet's own exemption set). Headroom after this PR: 0 on all three files; the next edit to any of them pays by compression. ## Gates Run on the head `0bfe659ad6afb4c69c3bb7481867c49f0c2a0410` from the derived list (`dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, 17 commands) plus the three the order pins; exit codes captured before any pipe: | command (worktree at the head, after `pnpm install --frozen-lockfile`) | exit | |:--|--:| | `node scripts/check-closing-keyword-parity.mjs` | 0 | | `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | | `node scripts/check-comment-mask-corpus.mjs` | 0 | | `node scripts/pm/check-harness-current.mjs --self-test` | 0 | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` | 0 | | `pnpm check:agent-test-spelling` | 0 | | `pnpm check:cross-package-test-inputs` | 0 | | `pnpm check:doc-authoring` | 0 | | `pnpm check:driver-memory-census` | 0 | | `pnpm check:gitlink-declared` | 0 | | `pnpm check:nul-bytes` | 0 | | `pnpm check:pm-governed-merges` | 0 | | `pnpm check:pm-skill-id-lint` | 0 | | `pnpm check:pm-skill-ratchet` | 0 | | `pnpm check:refd-timer-probe` | 0 | | `pnpm check:skill-frame-sync` | 0 | | `pnpm check:watch-hint-literal` | 0 | All 17 exit 0. The lint-package gate first answered 3 (PREREQUISITE NOT MET: `@objectstack/formula` not built) and was re-run after `pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under the verify lock (VERDICT command-exit 0, 90 s). `dispatch-gates.mjs --ran`: 17 derived, 17 run, 0 NOT-MEASURED, 0 UNRUN. Also run direct on the head, each exit 0: `check-skill-line-ratchet.mjs` (director.md 72/72, dispatch-runbook.md 241/241, SKILL.md 319/319), `check-skill-id-lint.mjs`, `check-governed-prose.mjs`, `check-skill-frame-sync.mjs`, `check-nul-bytes.mjs`, every one with its `--self-test`. CI's check-runs on the head are the record for every family; the local subset above is reconciled with `--ran`. ## Judgment calls, for the contract review 1. **Home = the charter, not SKILL.md.** The card allows either 「the ruling thread acts as the director's delegated channel」 or 「the line names this exception」; the first keeps the ruler line byte-identical and needs no SKILL.md line (headroom 0). If the review wants the exception named in SKILL.md too, one line must be bought there by compression. 2. **The word is quoted in full, in a blockquote.** It contains a model word; AGENTS.md exempts a verbatim maintainer ruling preserved as a quotation block, and the ratchet exempts blockquote lines from the byte cap. The operative rules spell the tier as `CONTRACT_REVIEW_TIER`. 3. **The gate is the 置信门 only.** The charter's 一类自裁门 (triage-duties 107–113) is the summoned seat's; the order fixes the 置信门 as the measure of 「有把握」 and the 红线 says 「不得宽于其置信门」, so the channel is not given the second door. A later word can widen it. 4. **The ledger is named by its keeper, not its path.** 「进 coordinator 追认表」 says who keeps the list the maintainer overturns from; the coordinator reference that spells the file is a serial card after this one and is not written here. ## Acceptance notes - The first-use ruling (`6336640643`) spelled its first line as `Ruling: needs_decision fork review (project review thread 「…」) · letter A · maintainer 「…」`; the form fixed here (`needs_decision fork` in the batch slot) is the compressed version of that. History is not rewritten. noted, not filed. - SKILL.md's director line 「未回字 = 不在 = 停」 (〈升级与决策〉) keeps describing the summoned seat; the project-mode carve-out lives in the charter only, which SKILL.md points to from the `director` argument row. noted, not filed. - The harness writes an HTML comment as line 1 of this PR body (the project attribution marker the session context requires); os-dev.md 〈干净收尾〉 forbids HTML comments in GitHub text. Reported as a deviation, as the previous card thread did; the skills seat has the card for the exemption. carrier: the skills seat. ## 维护者速读(草稿) **改了什么**:把您 10-22 的那句话写进 pm-dispatch 技能的总监章程:项目里卡线程报 `needs_decision` 时,coordinator 开一个契约复核档的裁决线程,代总监席裁;「有把握」就是分诊置信门四条全立,不宽于它;其余攒成一张决策卡给您;每条裁决按章程的 `Ruling:` 格式落卡,并进 coordinator 的追认表,您一个字就能翻。runbook 的卡线程节加一行写机制。 **为什么改**:这条规则之前只在 PR 正文里引过您的话,与技能里「总监席是唯一裁决者」和红线「代裁通道不得宽于置信门」相抵,被契约复核退回、拆成本卡。现在写成总监席自己的项目内代裁通道,置信门就是它的门,三处文本不再打架。 **风险与代价(含回滚)**:只改技能文本,不动代码与门禁。行数棘轮:director.md 用掉 3 行余量并删掉 1 句与 SKILL.md 四轴框架重复的话,runbook 用掉最后 1 行余量;这两个文件与 SKILL.md 现在都顶着上限,下次改动须先压缩。回滚 = revert 本 PR。 **席位意见**:(席位填写) **你要做的**:无须您动手。`.claude/**` 是 Tier S:技能席做达档契约复核 PASS 后入队落地。只有一件可选:若您希望裁决线程也能走章程里的「一类自裁门」(不只是置信门),回一个字,席位补一行。 --- _Generated by [Claude Code](https://claude.ai/code/session_01SVj49h8n8BTnB8doxiqcHL)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent cc5645c commit e58bd0e

2 files changed

Lines changed: 6 additions & 2 deletions

File tree

‎.claude/skills/pm-dispatch/references/dispatch-runbook.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
- 分支约定仍是 `claude/issue-<n>-<slug>`;线程只能推指定分支是实测平台例外,认领如实写。
144144
- worktree 照建;仓 `.claude/agents` 类型未加载(实测),线程照读 `os-dev.md`。
145145
- 交回:PR 与报告落地后给席位线程发一条消息(PR、head、报告要点);审核期线程不关,接 FAIL。
146+
- 终报 `needs_decision` ⇒ 席位交 coordinator 开 `CONTRACT_REVIEW_TIER` 裁决线程(`lanes/director.md`)。
146147
- 容器重启杀本地后台循环:席位等服务端信号(PR 订阅事件、座位 Routine),本地 watcher 可选。
147148

148149
## subagent 批派发前置:先把本地检出钉到 main

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,20 @@
1313
- 裁决记录同笔写明所选字母的工作量,读数取自卡面工作量列。
1414
- 划掉原 ⛔ 不派断言,走 `post-stamped --body --ack-through`;漏此笔 ⇒ 接卡者先读正文退决策箱。
1515
- 入口:维护者说处理决裁或处理 contract-review,或 `/pm-dispatch director`。
16-
- 未回字 = 不在 = 停:维护者不在则本席不运行,⛔ 无巡检、审计、快照、聊天、卡评论。
16+
- 未回字 = 不在 = 停,⛔ 无巡检、审计、快照、聊天、卡评论;唯一例外是项目内代裁通道。
1717
- 回来后先补跑审计与重挂复位一次,再只发一行「批 #N 待字;箱内另有 K 张新到未呈」。
1818
- 开场读一次服役档记入会话审计行,读法见 `../platform-readings.md`;⛔ 不因档位拒裁停三职。
1919
- 双射 carve-out:一张 `pm:seat` 座位贴,四段照旧;状态块逐场一行,各记己锚,⛔ 无占席人。
2020
- 不占 `domain:*` 车道,范围按职责标签跨车道跨仓;永不认领 backlog、永不写码。
21+
- 项目内代裁通道:卡线程报 `needs_decision` ⇒ coordinator 开裁决线程代本席裁,⛔ 非子代理。
22+
> 维护者常设令(首用:裁决记录 6336640643),逐字不译:对于这种类似的问题,能否你自己开一个单独的 fable thread 做评审,对于自己有把握决定的问题,自己决定,不能决定的开决策卡?
23+
- 「有把握」= `../triage-duties.md` 置信门四条全立,⛔ 不宽于它;余者一张决策卡呈维护者。
24+
- 录裁同上形:批次位写 `needs_decision fork`,maintainer 位引常设令;逐裁一行进 coordinator 追认表。
2125

2226
## 基本原则
2327

2428
- 三要素:每批 5 张;每卡从业务角度讲清问题、选项与代价;每卡带四维分析加一个推荐。
2529
- 聊天呈批逐卡六项,取材 = 卡面分析 + 本席增量;增量点名复核了什么,⛔ 不复述所同意的。
26-
- 创业阶段不渐进:废弃别名与能力退役默认立即退休,无窗口、无双拼写宽限。
2730
- 一次裁清:子问题、分叉与执行参数(字母、车道、级别)同笔裁定,⛔ 不留 dev 另立决策卡。
2831

2932
## 职责一:契约复核记录事后审计与抽查(可选)

0 commit comments

Comments
 (0)