Skip to content

docs(pm-dispatch): a card thread's needs_decision fork goes to a coordinator-opened ruling thread under the director's delegated channel - #25242

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-f6phkz
Oct 22, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-f6phkz

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

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: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

…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>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 22, 2026
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Oct 22, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 0bfe659ad6afb4c69c3bb7481867c49f0c2a0410
Local-runs: none
Scope: .claude/skills/pm-dispatch/references/lanes/director.md, .claude/skills/pm-dispatch/references/dispatch-runbook.md + .claude/skills/pm-dispatch/SKILL.md (L30, L106, L253, L276), .claude/skills/pm-dispatch/references/triage-duties.md (L103–L104), scripts/pm/check-skill-line-ratchet.mjs (the blockquote exemption)

Face: rules (both paths are governed .claude/**; Clause-②: no, Metadata-protocol: none at line start). The diff is +6/−2 over two files, read line by line against the base and against the three texts the card names.

① Derived judgments

  • The word is written once and not re-decided. The charter carries the maintainer's 2026-10-22 sentence verbatim in a blockquote with its first-use record (ruling 6336640643, letter A) as provenance; the operative lines around it say only where the fork goes (coordinator-opened ruling thread at CONTRACT_REVIEW_TIER), what "confident" means, and how the ruling is recorded. The runbook's one line in 〈卡线程(mode:thread)〉 points at the charter rather than restating it. One home, as the card's acceptance asks.
  • Ruler line reconciled without an exception. SKILL.md L276 「总监席是唯一裁决者…⛔ 无子代理无自述」 stays byte-identical; director.md's new line makes the ruling thread the director seat's own channel (「代本席裁,⛔ 非子代理」) — the thread is a session the coordinator opens, holds no card and is spawned by no seat, so it is neither 子代理 nor 自述; the record lands on the card in the charter's Ruling: form (L11). The ruling still issues from the director seat, through its channel.
  • 红线 gate reconciled by definition. SKILL.md L30 「唯一例外是已裁的代裁通道,不得宽于其置信门」: the channel is 已裁 by the quoted word, and 「有把握」= triage-duties.md 置信门四条全立 (①–③ at L103 and ④ at L104: 执行是否决窗口不是许可门), ⛔ 不宽于它. triage-duties.md is cited, not redefined. SKILL.md L106 (「除代裁通道外永不代答」) already admits exactly this channel. The thread's open question — whether the channel also gets the 一类自裁门 (triage-duties L107–L113) — is answered no here: the word covers needs_decision forks, the order fixed the 置信门 as the measure, and widening is a later maintainer word, not this card's.
  • Charter reconciled at the one line that would contradict. L16 「未回字 = 不在 = 停」 gains 「唯一例外是项目内代裁通道」, which is the point of the word (the maintainer is away for hours). L7 (授权面 = 人工定期召唤) still describes the summoned seat itself; the channel acts 代本席 under the standing word quoted in the same section, so L7 needs no edit. The new 「录裁同上形」 line binds the fork ruling to L11's first-line form (batch slot = needs_decision fork, maintainer slot = the standing word, as the first-use record did) and to the coordinator's 追认表 (one row per ruling; overturn by one letter per triage-duties), satisfying the card's "listed for the maintainer" ask without naming a file — the coordinator reference is pm-dispatch: a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so a project's instructions name only its lanes (maintainer's word 2026-10-22) #25219, serial after this card.
  • The deleted line has a live carrier. 「创业阶段不渐进:…」 is the four-axis frame sentence (SKILL.md L253, inside the frame block) and the charter's own L3 forbids copying the frame; removing it is a correction, not a loss.
  • Line budget. director.md 69 → 72 (ceiling 72), runbook 240 → 241 (241), SKILL.md untouched at 319 — no ceiling moved; the blockquote line (239 B) is exempt from the byte cap by the ratchet's own blockquote rule (a continuation must repeat >); the longest bullet is at the 120 B cap. check:pm-skill-ratchet, check:pm-skill-id-lint, check:pm-governed-prose, check:skill-frame-sync exit 0 in the dev's 17/17 set and sit in CI's Lint · PM dispatch-gates lane, read at landing. Both files now sit at headroom 0: the next edit to either pays by compression (pm-dispatch: a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so a project's instructions name only its lanes (maintainer's word 2026-10-22) #25219 touches director.md — recorded on that card).
  • The model word inside the quote is the maintainer's verbatim sentence, preserved as a quotation block, which AGENTS.md exempts; the operative lines spell the tier as CONTRACT_REVIEW_TIER. No model identifier is Claude's own.

② Semver level

skip-changeset is right: .claude/** only, nothing published. Metadata-protocol: none matches the diff.

③ Boundary flags

Implemented-by: claude/project-thread-f6phkz
Reviewed-by: session_0165fj9zYfUrt6ckcUgYBD5a

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:skills seat 1 (seat post #7623) · session_0165fj9zYfUrt6ckcUgYBD5a · head 0bfe659ad6afb4c69c3bb7481867c49f0c2a0410 · 2026-10-22T14:59Z

  1. Form. Draft against main; body opens with the attribution block, then Fixes #25216, Clause-②: no and Metadata-protocol: none at line start, the maintainer's word quoted verbatim, the three reconciliations as a table, and the 维护者速读 draft. Assignee os-bill equals the card's. Files, read with the PR's file list: references/lanes/director.md (+5/−2 incl. one edit in place), references/dispatch-runbook.md (+1). check-governed-merges.mjs --pr 25242: Tier S, 2 of 2 paths under .claude/**, 8 changed lines, under the 3000-line ceiling. skip-changeset is right: nothing published. Claim 6343168340 posted by the seat with the thread's branch, per the runbook.
  2. Premises measured. Contract review 6343778021 (PASS, this seat at CONTRACT_REVIEW_TIER): the word is written once in the charter with its first-use record; the ruler line (SKILL.md L276) stays byte-identical and is reconciled by making the ruling thread the director seat's own channel; the 红线 gate is met by definition (「有把握」= 置信门四条全立, cited from triage-duties.md L103–L104); the charter's L16 carve-out is the one line that would otherwise contradict; the deleted frame sentence lives in SKILL.md L253 and the charter's L3 forbids the copy. The thread's open question (a 一类自裁门 for the channel) is answered no in the record. Ratchet: director.md 72/72, runbook 241/241, SKILL.md 319/319 untouched (dev's reading; check:pm-skill-ratchet exit 0 locally, confirmed by the Lint · PM dispatch-gates check-run at landing).
  3. Gate check-runs, pinned to this head at this write: 40 runs, 25 success, 14 skipped, 0 failures, 1 in progress. The landing pre-check re-reads them; ⛔ no ready / enqueue before every run is success or an expected skip. The dev's 17 derived gates all exited 0 with --ran reconciled 17/17 (dev's reading).
  4. Accepted deviations. Claim by the seat (above); the harness attribution comment on body line 1 (carried by os-dev.md: a project-thread session's harness writes an HTML-comment attribution line as PR body line 1, against 〈干净收尾〉's ban on HTML comments — name the exemption #25220); pnpm install --frozen-lockfile and a formula+lint build to measure one derived gate. None touches the diff.
  5. Out-of-scope findings. (a) The first-use ruling's longer first-line spelling: history, noted, not filed. (b) SKILL.md's 「未回字 = 不在 = 停」 director line keeps describing the summoned seat; the carve-out lives in the charter the director row points to: noted, not filed. (c) Both edited files now sit at headroom 0: pm-dispatch: a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so a project's instructions name only its lanes (maintainer's word 2026-10-22) #25219 (director.md) must buy its lines by compression — recorded on pm-dispatch: a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so a project's instructions name only its lanes (maintainer's word 2026-10-22) #25219 (comment 6343601899).
  6. Landing clause. Tier S: this seat lands it through the relay (pr_ready + automerge_enable) once the head's check-runs are all green or expected skips, and follows it to MERGED.

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/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants