Repository navigation
Commit 4e606ce
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)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} -->
_Requested by **Elon** · [project
thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9DKyk33tmijDaSFzML54k2pQ)_
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.
1. **New reference `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 — beside
`seat-lifecycle.md`, because the coordinator is not a `domain:*` seat
and so not under `lanes/`. Seven sections in the card's order, each
naming its reader, each pointing at the rule's single source instead of
restating it:
1. 车道归属登记在座位贴 — a project's instructions name only the lanes it manages;
each seat thread sits the lane's vacant seat post and writes 「由 X
账户的项目负责」 in the post's 说明 section; one lane, one project; the seat post
(not project memory) is the arbiter; another project's in-flight cards
are finished by its own seat, and its sign-off brief is the release
(seat-lifecycle's own rule).
2. 跨车道取卡 — the intake face is the project's lanes' open
`priority:p1`/`priority:p2` cards under `execution-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.
3. 全项目一个上限,p1 先 — one project-wide card-thread cap, the number the
maintainer states for the project (the sum of the seats' `batch` terms
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's `batch`. ⛔ No
number is written as the rule.
4. effort 与档位按难度 — points at `execution-duties.md` 〈派发〉 and
`dispatch-gates --tier`; skill (protocol-semantics) cards at
`CONTRACT_REVIEW_TIER`; the coordinator sets model and effort at thread
creation on the seat's request carrying the maintainer's word
(`dispatch-runbook.md`).
5. 卡线程的 `needs_decision` — re-pointed after #25348 revoked every
delegated-ruling channel: the rule lives in `lanes/director.md` and the
〈卡线程〉 section of `dispatch-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.
6. 额度压力 — near the usage wall (the reading of `seat-lifecycle.md`
〈断粮与跨墙恢复〉) the coordinator opens no new card thread, lets in-flight ones
finish, and tells the maintainer once.
7. 语言与汇报 — the maintainer's language in the project, English on GitHub
(SKILL.md's invariant); the coordinator reports on a result, a blocker
or a decision, as the seats do.
2. **`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 in
`references/lanes/director.md` (授权面 = 人工定期召唤,⛔ 无 Routine、无 cron; 入口 …
`/pm-dispatch director`; 未回字 = 不在 = 停), which the `director` row of the
same entry table already points at. SKILL.md stays line-neutral (319/319
after merging `main` with #25348); no ceiling moved. PR #25247 lowers
the ceiling to 318 at its own landed count; this PR changes no count, so
either landing order holds.
3. **`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).
4. **`scripts/pm/check-skill-line-ratchet.mjs`**: a `CEILINGS` row for
the new file at its landed count (49) and a `MAX_TABLE_ROW_BYTES` pin 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
- **A1 (both blockers landed)** — holds. #25214 (`03de83bfe`) wrote the
`mode:thread` backend, the effort field, the S/M split and 「项目的
coordinator 跨席位统一调度」; #25242 (`e58bd0e`) wrote a ruling-thread rule that
#25348 (merged 2026-10-23) then revoked; item 5 now points at the rule
#25348 left in `lanes/director.md` and the runbook's 「终报
`needs_decision` ⇒ 四维分析与推荐并入决裁批次呈维护者裁」 line. Items 2–5 of the new file
point at those lines and restate none.
- **A2 (SKILL.md 318/319; PR #25247 lowers to 317)** — holds. The
`coordinator` row is paid by the director-summons deletion above; the
file lands at 318 either way. PR #25247's diff is the 〈域车道〉 table,
`lanes/*.md`, `check-half-states.mjs`, `ensure-pm-labels.sh` and the
ratchet's SKILL.md / `lanes/server.md` rows — disjoint from every hunk
here (the ratchet rows this PR adds sit beside `seat-lifecycle.md`, not
beside the lane rows). Whichever lands second merges `main` and re-runs
`check:pm-skill-ratchet`. Open PRs touching
`.claude/skills/pm-dispatch/**` at claim time: #25247 only (MCP
`search_pull_requests`, `is:open pm-dispatch`, 7 hits, one on the
skill).
- **A3 (new file needs its own ceiling row; id-lint)** — holds, done.
`check:pm-skill-id-lint` is green (88 files clean); the new file names
rules by file and section only.
- **A4 (item 1 vs multiple seats per lane)** — **no contradiction, so no
`needs_decision`.** `seat-lifecycle.md` 〈开轮互斥〉 is per seat number (读数三
「同席号」) and says nothing about projects; `seat-post-protocol.md` L9
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 (#7623, `os-bill`'s
project) and seat 2 (#19287, this project) both sit `domain: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 `72bc519a` merges `main` `5e772c79` (carrying
#25348) into the item-5 re-point `3e6e35eb`; on it the same 42 families
all exit 0 (`--ran` 42/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/objectstack` over 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 as `COMMAND ::
exit CODE`; `--ran` reconciles 42/42, 0 NOT-MEASURED, 0 UNRUN. All 42
exit 0. One needed a second run: `pnpm --filter @objectstack/lint run
check:doc-formula-expressions` first exited 3 (PREREQUISITE —
`@objectstack/lint` unbuilt in a fresh worktree, the same reading PR
#25214 recorded); after `pnpm --filter '@objectstack/lint...' build` it
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-sync` green
(the four-axis frame is untouched). CI's remaining families are the PR's
check-runs. No published package moved (`.claude/**` and one
`scripts/pm` ledger row), so `skip-changeset` rides 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
- The attribution block's first line is an HTML comment the session
requires as the body's first line; `os-dev.md` 〈干净收尾〉 forbids HTML
comments in GitHub text. Measured on PR #25214 (the same shape), the
relay read-back keeps it byte for byte. Reported as a deviation, not
hidden.
- The claim's `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 at `e58bd0e`. No
deviation from the branch rule: the branch is the one the claim names.
- The commit's co-author trailer is the model-free pair the pre-push
hook (`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](https://claude.ai/code/session_01QbWZBrA43um6tADsbopAAA)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent b62ca78 commit 4e606ce
4 files changed
Lines changed: 63 additions & 2 deletions
File tree
- .claude/skills/pm-dispatch
- references
- scripts/pm
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
54 | 54 | | |
55 | 55 | | |
56 | 56 | | |
| 57 | + | |
57 | 58 | | |
58 | 59 | | |
59 | 60 | | |
| |||
271 | 272 | | |
272 | 273 | | |
273 | 274 | | |
274 | | - | |
275 | 275 | | |
276 | 276 | | |
277 | 277 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
136 | | - | |
| 136 | + | |
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1250 | 1250 | | |
1251 | 1251 | | |
1252 | 1252 | | |
| 1253 | + | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
| 1257 | + | |
| 1258 | + | |
| 1259 | + | |
| 1260 | + | |
| 1261 | + | |
| 1262 | + | |
| 1263 | + | |
1253 | 1264 | | |
1254 | 1265 | | |
1255 | 1266 | | |
| |||
2116 | 2127 | | |
2117 | 2128 | | |
2118 | 2129 | | |
| 2130 | + | |
2119 | 2131 | | |
2120 | 2132 | | |
2121 | 2133 | | |
| |||
0 commit comments