Repository navigation
docs(pm-dispatch): a card thread's needs_decision fork goes to a coordinator-opened ruling thread under the director's delegated channel - #25242
Conversation
…dinator-opened ruling thread under the director's delegated channel Writes the maintainer's standing word into the director charter once: inside a Claude Code project, a card thread that reports `needs_decision` gets a separate ruling thread at `CONTRACT_REVIEW_TIER`, opened by the coordinator, which rules on the director seat's behalf only where the 置信门 of `triage-duties.md` holds in full, sends the maintainer one decision card for the rest, records each ruling on the card in the charter's `Ruling:` form and lists it for the maintainer to overturn. The `mode:thread` runbook names the mechanics in one line. Paid under the line ratchet by retiring the charter's copy of a four-axis frame sentence the charter itself says not to copy; no ceiling moved. Claude-Session: https://claude.ai/code/session_01SVj49h8n8BTnB8doxiqcHL Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Face: rules (both paths are governed ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对ACCEPT ·
Generated by Claude Code |
Requested by Bill · project thread
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:threadrunbook names its mechanics in one line. Verbatim, untranslated: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.「有把握」= ../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 ownRuling: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: 「被推翻的行按新裁决执行」).未回字 = 不在 = 停,⛔ 无巡检、审计、快照、聊天、卡评论;唯一例外是项目内代裁通道。— 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
origin/mainf2ade4a)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'sRuling:form, so nothing is 自述. No second ruler, no exception added to the ruler line.../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.mdis cited, not redefined.Ruling:first-line form; L13/L40 the 摘要台账.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)references/lanes/director.mdreferences/dispatch-runbook.mdSKILL.mdLongest 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
0bfe659ad6afb4c69c3bb7481867c49f0c2a0410from 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:pnpm install --frozen-lockfile)node scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-harness-current.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:agent-test-spellingpnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:gitlink-declaredpnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:pm-skill-id-lintpnpm check:pm-skill-ratchetpnpm check:refd-timer-probepnpm check:skill-frame-syncpnpm check:watch-hint-literalAll 17 exit 0. The lint-package gate first answered 3 (PREREQUISITE NOT MET:
@objectstack/formulanot built) and was re-run afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder 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
CONTRACT_REVIEW_TIER.Acceptance notes
6336640643) spelled its first line asRuling: needs_decision fork review (project review thread 「…」) · letter A · maintainer 「…」; the form fixed here (needs_decision forkin the batch slot) is the compressed version of that. History is not rewritten. noted, not filed.directorargument row. noted, not filed.维护者速读(草稿)
改了什么:把您 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