Repository navigation
Commit e58bd0e
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
| 146 | + | |
146 | 147 | | |
147 | 148 | | |
148 | 149 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
21 | 25 | | |
22 | 26 | | |
23 | 27 | | |
24 | 28 | | |
25 | 29 | | |
26 | | - | |
27 | 30 | | |
28 | 31 | | |
29 | 32 | | |
| |||
0 commit comments