Repository navigation
docs(pm-dispatch): a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so its instructions name only its lanes - #25255
Conversation
…threads, as a reference beside seat-lifecycle.md A project's instructions name only the lanes it manages; the coordinator's rules (lane ownership on the seat post, cross-lane p1-first intake, one project-wide card-thread cap, effort and tier by difficulty, ruling threads, quota pause, language and reporting) live in the repository as references/coordinator.md, each section naming its reader and pointing at the rule's single source. SKILL.md gains one coordinator row in the entry table, paid by deleting the director summons line that lanes/director.md already carries; the runbook's project-wide cap line now points at the maintainer-set number instead of a sum. Claude-Session: https://claude.ai/code/session_01QbWZBrA43um6tADsbopAAA Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs: card #25219 body and all five comments (6342275807, 6343008130, 6343601899 handover, 6345361030 claim, 6345900548 dev report); PR #25255 body, file list and net diff against ① Derived judgments
② Semver level
Check-runs on the head (gate verdicts, read from the API at 2026-10-22, after the last one completed): every non-skipped run is ③ Boundary flags
Implemented-by: VERDICT: PASS |
…ed decision batch, not a ruling thread The in-project delegated-ruling channel is revoked; a card thread's needs_decision now carries the seat's four-axis analysis and recommendation into the ruling batch the maintainer rules by hand, with no ruling thread. Section five is re-pointed accordingly; waiting threads still hold no slot and the ruling comment on the card stays the record. Claude-Session: https://claude.ai/code/session_01QbWZBrA43um6tADsbopAAA Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs: card #25219 body and all five comments (6342275807, 6343008130 unlock, 6343601899 handover, 6345361030 claim, 6345900548 dev report); PR #25255 body, file list and the net diff of head ① Derived judgments
② Semver level
Check-runs on the head at 2026-10-23T07:11Z: 47 runs, all completed; every non-skipped run is ③ Boundary flags
Implemented-by: VERDICT: PASS |
席位核对ACCEPT · Landing authority: the maintainer's own words in this seat's thread of the Claude Code project "Objectstack" (
Generated by Claude Code |
Requested by Elon · project thread
Fixes #25219
Clause-②: no
Metadata-protocol: none
What changed
Four files, all under
.claude/skills/pm-dispatch/**plus one ceiling row; no code, no package.references/coordinator.md(49 lines, every line ≤ 120 bytes, no table row, no issue number). It is the project coordinator's interface with the seat threads — the role that opens seat threads and card threads and schedules across lanes — besideseat-lifecycle.md, because the coordinator is not adomain:*seat and so not underlanes/. Seven sections in the card's order, each naming its reader, each pointing at the rule's single source instead of restating it:priority:p1/priority:p2cards underexecution-duties.md's candidate rule; each card goes to its lane's seat thread; a lane with no seat thread and a vacant post gets a seat thread first; the maintainer names no lane per card.batchterms only when none is stated); seats hand candidates over at any time; p1 ahead of p2; a thread waiting on a human or on the seat's review holds no slot; in-seat S subagents count only against the seat'sbatch. ⛔ No number is written as the rule.execution-duties.md〈派发〉 anddispatch-gates --tier; skill (protocol-semantics) cards atCONTRACT_REVIEW_TIER; the coordinator sets model and effort at thread creation on the seat's request carrying the maintainer's word (dispatch-runbook.md).needs_decision— re-pointed after docs(pm-dispatch): revoke every autonomous-adjudication channel — a seat analyses and recommends, every needs_decision goes to the maintainer's ruling batch #25348 revoked every delegated-ruling channel: the rule lives inlanes/director.mdand the 〈卡线程〉 section ofdispatch-runbook.md, ⛔ not restated; the seat writes the four-axis analysis and a recommendation and the card joins the ruling batch the maintainer rules by hand, ⛔ no ruling thread, no delegated ruling; a thread waiting on a ruling holds no slot; the ruling record is the ruling comment on the card, ⛔ never a project file or memory.seat-lifecycle.md〈断粮与跨墙恢复〉) the coordinator opens no new card thread, lets in-flight ones finish, and tells the maintainer once.SKILL.md, one row in 〈入口与角色〉:coordinator— 以项目协调者身份运行(项目会话:开席位线程与卡线程、跨车道调度;接口见references/coordinator.md), 154 bytes against the file's 342-byte widest-row pin. Paid by one deletion in 〈升级与决策〉: 「项目总监席:维护者在所在仓召唤/pm-dispatch director;⛔ 无 Routine/cron;未回字 = 不在 = 停。」 — every clause of it survives inreferences/lanes/director.md(授权面 = 人工定期召唤,⛔ 无 Routine、无 cron; 入口 …/pm-dispatch director; 未回字 = 不在 = 停), which thedirectorrow of the same entry table already points at. SKILL.md stays line-neutral (319/319 after mergingmainwith docs(pm-dispatch): revoke every autonomous-adjudication channel — a seat analyses and recommends, every needs_decision goes to the maintainer's ruling batch #25348); no ceiling moved. PR docs(pm-dispatch): fold the engine, services and cli lanes into domain:server #25247 lowers the ceiling to 318 at its own landed count; this PR changes no count, so either landing order holds.references/dispatch-runbook.md, one line edited in place (241/241, line-neutral): the 〈卡线程〉 cap line read 「全项目上限 = 各席batch之和」, which contradicts the card's item 3 (the maintainer sets one number per project — the two values set so far differ). It now reads 「全项目上限由维护者按项目定(coordinator.md)」 and the sum is the new file's stated default when no number is given. This is the one SKILL/reference line that would otherwise contradict the new file (the handover's allowance).scripts/pm/check-skill-line-ratchet.mjs: aCEILINGSrow for the new file at its landed count (49) and aMAX_TABLE_ROW_BYTESpin of 0 (it carries no table row). A new file is not a raise and funds nothing. No other script is touched.The maintainer's word, verbatim and untranslated, as the card quotes it: 「刚才你让我转帖的项目指令规则,为什么不定义在仓库中呢,我只要穿到具体的车道就行。」
The PM's mechanism assumptions, measured
03de83bfe) wrote themode:threadbackend, the effort field, the S/M split and 「项目的 coordinator 跨席位统一调度」; docs(pm-dispatch): a card thread's needs_decision fork goes to a coordinator-opened ruling thread under the director's delegated channel #25242 (e58bd0e) wrote a ruling-thread rule that docs(pm-dispatch): revoke every autonomous-adjudication channel — a seat analyses and recommends, every needs_decision goes to the maintainer's ruling batch #25348 (merged 2026-10-23) then revoked; item 5 now points at the rule docs(pm-dispatch): revoke every autonomous-adjudication channel — a seat analyses and recommends, every needs_decision goes to the maintainer's ruling batch #25348 left inlanes/director.mdand the runbook's 「终报needs_decision⇒ 四维分析与推荐并入决裁批次呈维护者裁」 line. Items 2–5 of the new file point at those lines and restate none.coordinatorrow is paid by the director-summons deletion above; the file lands at 318 either way. PR docs(pm-dispatch): fold the engine, services and cli lanes into domain:server #25247's diff is the 〈域车道〉 table,lanes/*.md,check-half-states.mjs,ensure-pm-labels.shand the ratchet's SKILL.md /lanes/server.mdrows — disjoint from every hunk here (the ratchet rows this PR adds sit besideseat-lifecycle.md, not beside the lane rows). Whichever lands second mergesmainand re-runscheck:pm-skill-ratchet. Open PRs touching.claude/skills/pm-dispatch/**at claim time: docs(pm-dispatch): fold the engine, services and cli lanes into domain:server #25247 only (MCPsearch_pull_requests,is:open pm-dispatch, 7 hits, one on the skill).check:pm-skill-id-lintis green (88 files clean); the new file names rules by file and section only.needs_decision.seat-lifecycle.md〈开轮互斥〉 is per seat number (读数三 「同席号」) and says nothing about projects;seat-post-protocol.mdL9 admits several seat posts per lane. Item 1 adds a constraint one level up — one lane, one project — which several posts per lane can satisfy (one project may run several seats of its lane). What item 1 does contradict is today's board state: seat 1 ([PM seat] domain:skills — ⏳ vacant #7623,os-bill's project) and seat 2 ([PM seat] domain:skills · seat 2 — 🟢 os-elon-musk #19287, this project) both sitdomain:skills. Seat 1's handover (comment 6343601899) already declares that project leaves the lane once its in-flight cards land, so the double occupancy is the transition the rule converges to, not a second rule. The file spells the arbiter at lane level — a 🟢 post of another project on ANY seat of the lane means the lane is taken — and the release as seat-lifecycle already defines it (the sign-off brief). Read strictly, the rule would have told this project to wait for that brief before sitting seat 2; the contract review should read that sentence and say whether it stands as written.Gates
Re-merge 2026-10-23: head
72bc519amergesmain5e772c79(carrying #25348) into the item-5 re-point3e6e35eb; on it the same 42 families all exit 0 (--ran42/42), SKILL.md 319/319 (its row paid by the 项目总监席 deletion), dispatch-runbook.md 241/241, coordinator.md 49/49.First run, head
3788440:node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackover the four changed paths derived 42 families (23 pnpm, 19 direct node). Every one was run with its exit code captured before any pipe and recorded asCOMMAND :: exit CODE;--ranreconciles 42/42, 0 NOT-MEASURED, 0 UNRUN. All 42 exit 0. One needed a second run:pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst exited 3 (PREREQUISITE —@objectstack/lintunbuilt in a fresh worktree, the same reading PR #25214 recorded); afterpnpm --filter '@objectstack/lint...' buildit exits 0.check:pm-skill-ratchet: SKILL.md 318/319, dispatch-runbook.md 241/241, coordinator.md 49/49 (widest table row 0/0).check:pm-skill-id-lint: 88 files clean.check:skill-frame-syncgreen (the four-axis frame is untouched). CI's remaining families are the PR's check-runs. No published package moved (.claude/**and onescripts/pmledger row), soskip-changesetrides this PR's create.维护者速读(草稿)
改了什么: pm-dispatch 技能新增
references/coordinator.md:项目协调者(在项目会话里开席位线程、开卡线程、跨车道调度的那一席)与席位线程之间的接口,按卡上七条写成七节,每节注明读者,只指向规则所在的文件、不复述。SKILL.md 入口表加一行coordinator,用删掉一条已在lanes/director.md写明的总监召唤行抵账,行数不变;runbook 里「全项目上限 = 各席 batch 之和」改为「由维护者按项目定」。棘轮为新文件加封顶行,无上限抬高。为什么改: 你 10-22 的话:「刚才你让我转帖的项目指令规则,为什么不定义在仓库中呢,我只要穿到具体的车道就行。」——规则进仓库,项目指令只写管哪几条车道。
风险与代价(含回滚): 纯规则文本,不碰代码与门禁;回滚即 revert 本 PR。一处值得你看:新文件写「一条车道恒归一个项目」(卡上第 1 条原话),而今天 skills 车道两个项目各坐一席(seat 1 的交接已说它收完在飞卡就退出)。按这条严格读,本项目本应等 seat 1 收班再坐席;契约复核会读这句并给意见。
席位意见:
你要做的: 席位复核 PASS 后,在席位线程点名回一句「#25255 可以落地」。
Acceptance notes
os-dev.md〈干净收尾〉 forbids HTML comments in GitHub text. Measured on PR docs(pm-dispatch): card-thread backend (mode:thread), coordinator scheduling and per-card dispatch effort #25214 (the same shape), the relay read-back keeps it byte for byte. Reported as a deviation, not hidden.Worktree:line says 「the card thread's own checkout」; the repo's PreToolUse guards block edits in the primary checkout, so the work was done in a linked worktree (../objectstack-issue-25219) on the designated branch, the primary checkout left detached ate58bd0e. No deviation from the branch rule: the branch is the one the claim names.check:commit-card-trailers) requires; the harness's own trailer spelling was refused once and reworded before the first push — the session trailer is the attribution.Generated by Claude Code