Skip to content

Commit 6c2699b

Browse files
docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 (#25385)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} --> _Requested by **Elon** · [project thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9D4DhDnco8yuU89yAoN1Eq5n)_ Fixes #25379 Clause-②: no Metadata-protocol: none ## 维护者速读(草稿) - **改了什么**:pm-dispatch 技能里加一种「项目席」形态,与 Routine 席并列:席位会话是车道项目的线程时,座位贴降为存根(只留别的账号要读的四项:在座账号与项目、上任时刻、热文件串行队、指针行,外加可选撞墙注记),姿态、台账、班次叙事与轮报住项目;派发令由协调者写进卡线程开场消息,不再落共享目录;唤醒 = 每张卡 PR 的订阅事件 + 每项目一个 2–4 小时巡查 routine,不再有自绑 cron、`send_later` 链与跨墙定时器链;轮报 = 卡线程清单,五项健康指标进总监项目的每日摘要;「项目总监」改称「总监席」、「项目协调者」改称「协调者」,GitHub 的 org Project 改称「看板」,并在入口表定义「车道项目」与「总监项目」。第五个提交是卡上预告的跟进:coordinator.md 落地后补指针与改名,两处「派发令文件」改「派发令全文」,巡查行点名前提过时检查,cross-repo 规则 5 的 org Project 也改「看板」。 - **为什么改**:您 2026-10-23 在「车队机制迁往 Projects」线程的原话:「同意,你现在就立卡派发处理。」(对调研备忘推荐字母 1B 2A 3B 4B 5B 与第 9 节命名的同意)。 - **风险与代价(含回滚)**:纯规则文本,八个文件行数全部净零、每行 ≤120 字节,无上限抬高;一次 revert 可回。两处要您知道:① 卡上第 3 项「线程开起前先命名分支」实测做不到——分支由平台在线程建立那一刻指定,协调者只能在线程建起之后读到它;您 2026-10-23 11:29 在决裁批 #4 裁了 1A(协调者开线程即读分支交席位、席位认领、线程核对),第三个提交已照裁写进 runbook 〈卡线程〉与 os-dev.md 规则 1(卡线程不推空分支)。② 为付行数删掉了三条 Routine 席专用规则(自绑 cron、`send_later` 加速器、跨墙每小时 cron 链),正是卡上点名的付账行;维护者在 UI 建的 Routine 席不受影响;同批 2A 补上直连会话的唤醒规则(按召唤跑,⛔ 无自醒不常驻),写在 SKILL.md 分诊席那一行。 - **席位意见**:(席位复核后填) - **你要做的(一个动作)**:等席位对新 head 的契约复核 PASS、CI 全绿后说一句「可以落地」。 ## What changed Nine files under `.claude/skills/pm-dispatch/**` (`references/coordinator.md` joins once PR #25255 landed, and `references/cross-repo-coordination.md` by the seat's one-line widening) plus, after the maintainer's batch-4 ruling, `.claude/agents/os-dev.md` (the seat widened the claim's file surface by that one file, same Tier S); rule text only; every file lands at the same line count it had, every edited line is at or under 120 bytes, no ratchet ceiling moves (so `scripts/pm/check-skill-line-ratchet.mjs` is untouched). | File | Before | After | |:--|:--|:--| | `SKILL.md` 红线 | `org Project 只是视图` | `看板(org Project)只是视图` — the vocabulary line for GitHub's board; 「任何」 dropped to stay under the byte cap, meaning unchanged | | `SKILL.md` 入口与角色 (the `domain` row, the `director` row) | lane seat / 「项目总监席」 | the lane row defines 「车道项目」 (the project running that lane); the `director` row reads 「总监席」 and defines 「总监项目」 (the project the director seat sits in). Table rows, under the 342-byte row pin | | `SKILL.md` 入口与角色 bullets | 「入座即建唯一自绑 cron Routine…」 and 「轮末 `send_later` 是可选加速器…」 | 「席位两形:Routine 席与项目席(会话是车道项目的线程);细则见 `references/seat-lifecycle.md`」 and 「项目席唤醒 = PR 订阅事件 + 每项目一个巡查 routine;⛔ 无自绑 cron、无 `send_later` 链」 — the two Routine-seat-only mechanisms the card names as payment are the two lines replaced | | `SKILL.md` 升级与决策 | 「项目总监席:维护者在所在仓召唤…」 | 「总监席:…」 (rename only; PR #25255 deletes this line, so its landing takes the deletion) | | `references/seat-lifecycle.md` 〈座位贴协议〉 | — | +2: the project seat's post is a stub holding only what another account reads (template in `seat-post-protocol.md`); posture, ledger and round reports live in the project; title, assignee, the seating audit comment and the cross-account hand-over brief stay | | `references/seat-lifecycle.md` 〈轮次报告与节奏〉 | — | +1: a project seat's round report is the card-thread checklist, ⛔ no per-round chat table; the five health figures go to the 总监项目's daily digest | | `references/seat-lifecycle.md` 〈断粮与跨墙恢复〉 | the cross-wall timer chain (fixed-point timer; hourly cron Routine when no reset time; delete the cron after the first good fire) and 「随后重挂常规巡检 → 照常跑轮」 | −3: the three timer-chain lines leave (they are the self-bound-cron / `send_later` chain the card names as payment); the recovery line keeps its steps and ends in 「照常跑轮」 (the 「重挂常规巡检」 clause referred to the deleted chain); +1: the project patrol routine runs the lanes' standby items every 2–4 hours, a wall leaves only a stub note, ⛔ no cross-wall timer chain | | `references/seat-post-protocol.md` 〈贴的四段与派生视图〉 | — | +2: the stub's four items (seated account and project · seating time · hot-file serial queue · the pointer line) and the optional fifth line (wall note with the expected reset time); the stub is refreshed only on seating, a serial-queue change, a wall and hand-over | | `references/seat-post-protocol.md` 〈交接收尾清单〉 | step 8 「`list_triggers` 清点本会话定时器:删入座 Routine,一次性的逐个清理或随移交物转交」 | −1: the step inventoried the self-bound seat Routine and one-off timers that no longer exist in the protocol; steps 9–10 renumbered 8–9. The no-orphan-timer rule itself stays in `platform-readings.md` 〈断粮检测与跨墙恢复〉 | | `references/seat-post-protocol.md` 〈座位 Routine 创建〉 | 「会话内 `create_trigger` 的 fresh-session Routine 不挂 repo sources,拿不到 GitHub 工具」 + 「表现为静默零产出;⛔ 不要在会话里 `create_trigger` 出一个座位 Routine 就当它在跑」 | −1: one line — the fact (no GitHub tools, zero output) and the rule (do not treat an in-session `create_trigger` Routine as a running seat); the 「不挂 repo sources」 mechanism is already the reading in `platform-readings.md` | | `references/dispatch-runbook.md` 〈卡线程〉 | 「派发令落项目共享目录 `/mnt/project-files/…/dispatch-….md`:线程读不到席位 scratchpad」 | 「派发令由 coordinator 写进卡线程开场消息,⛔ 不落共享目录;卡上派发评论留一行指针」 (item 2) | | `references/execution-duties.md` 〈收集〉 ①② | 「巡检首动作 `list_triggers` 确认 Routine 启用,在飞重挂加速器;唤醒归 Routine,漏挂不断链」 / 「在飞期间主巡检间隔 ≤45 分钟…」 | ① scoped to the Routine seat, the accelerator clause gone, and 「项目席由事件与巡查 routine 唤醒」; ② scoped to the Routine seat (its cadence is unchanged) | | `references/dispatch-runbook.md` 〈卡线程〉 handshake (ruling 1A, third commit) | 「线程开起后第一动作:向席位报告指定推送分支并等待;⛔ 线程不贴认领、不写 assignee」 / 「席位按 AGENTS.md 的顺序写 assignee+`pm:dispatched`,再贴带该 `Branch:` 的认领;之后线程才开工」 | 「coordinator 开线程即读线程分支交席位(读不到则线程自报);⛔ 线程不认领、不写 assignee」 / 「席位写 assignee+`pm:dispatched`+带该 `Branch:` 的认领;线程核对最新认领指向本分支方开工」 — the ruled shape: the coordinator reads the branch from the child's session record at spawn, the seat claims it, the thread starts once the newest claim names its branch; the thread's own report is the fallback | | `.claude/agents/os-dev.md` 基本规则 1 (ruling 1A, third commit) | 「建好分支后的第一个动作是推空分支:任何编辑之前 `git push -u origin <branch>`」 + 「它既是认领评论所指分支的落地标记,又是写路由探针(容器凭据不对称)」 | the two probe lines merge into 「建好分支后先推空分支(任何编辑前 `git push -u origin <branch>`):落地标记兼写路由探针」 and the freed line reads 「卡线程分支由平台指定、harness 推送,⛔ 不推空分支;探针规则只对自建分支」 — the file sits at its 404-line ceiling, so the new rule is paid inside rule 1 | | `SKILL.md` 入口与角色 triage-seat line (ruling 2A, third commit) | 「分诊席跑普通直连会话、默认判断档;裁决不在本席,归维护者召唤的总监席」 | 「分诊席跑直连会话、默认判断档;直连会话按召唤跑,⛔ 无自醒不常驻;裁决归总监席」 — the direct-session wake rule the contract review flagged (③-2): summoned only, no self-wake, not resident; 「维护者召唤」 is already the 总监席 line's own text | | `references/lanes/director.md` L1 | `# 席位章程:项目总监(Project Director)` | `# 席位章程:总监席(Director Seat)` | | `references/coordinator.md` title and `SKILL.md` `coordinator` row (follow-up commit, after PR #25255) | `# 项目协调者(Project Coordinator)` / 「以项目协调者身份运行…」 | `# 协调者(Coordinator)` / 「以协调者身份运行…」 — the card's naming item for the coordinator | | `references/coordinator.md` L3 (follow-up) | 「…跨车道调度的那一席读本文。」 | 「…跨车道调度的那一席读本文;项目席见 `seat-lifecycle.md`。」 — the pointer to the project-seat form, folded into the opening line because the file sits at its 49-line ceiling | | `references/coordinator.md` 三 and `references/dispatch-runbook.md` 〈卡线程〉 candidate lines (follow-up) | 「派发令文件」 | 「派发令全文」 — the word item 2 made stale (the seat hands the coordinator the order's full text, no file) | | `references/seat-lifecycle.md` 〈断粮与跨墙恢复〉 patrol line (follow-up; contract review ③-4) | 「…跑各车道待命项;撞墙只留存根注记,⛔ 无跨墙定时器链」 | 「…跑各车道待命项(含前提过时);撞墙记入存根,⛔ 无 cron 链」 — names the stale-premise check the card's item 4 lists; 「cron 链」 is SKILL.md L72's word for the deleted chain; 119 bytes | | `references/cross-repo-coordination.md` 规则 5 (follow-up; contract review ③-6, surface widened by the seat) | 「org Project 只是维护者的聚合视图」 | 「看板(org Project)只是维护者的聚合视图」 | | `references/lanes/skills.md` | 「决裁勤务归项目总监席」 | 「决裁勤务归总监席」 | | `references/rest-channel.md` 不可迁移 ② | 「Projects field_values:GraphQL-only —— 舰队并不需要它;MCP 服务器端…」 | 「看板(org Project)field_values:GraphQL-only,舰队不需要它;MCP 服务端…」 — the org-Project naming line the card points at (its L78 citation is this line at L62 on `main`) | The rule after the change, as the card states it: GitHub keeps what another account reads (six-state labels, assignee, `Claim:`/`Release:`, the seat stub, the PR and its ACCEPT, the ruling record); the project keeps the working layer (posture, ledger, orders, round reports, memory). It is written as the two 〈座位贴协议〉 lines, not restated elsewhere. Acceptance checks on this head: `git grep -n '项目总监' -- .claude/skills` → no hit; `git grep -n '总监席' -- .claude/skills/pm-dispatch/SKILL.md` → L56 (the `director` row), L75 (ruling 2A), L237 (main's, from #25348) and L275–L276 (the old summons line is gone by #25255). ## Item 3 — filed as `needs_decision`, ruled 1A in batch #4, written in the third commit Ruling record: card comment 6363872862 (maintainer 「同意」 2026-10-23T11:29Z = 1A 2A). The text below is the analysis as filed; the ruled shape is option A, now on `dispatch-runbook.md` 〈卡线程〉 L141–L142 and `os-dev.md` rule 1 (see the table above). Item 2 of that batch (2A, the direct-session wake rule) is on SKILL.md L75 (L74 before the merge added the `coordinator` row). The card's item 3 (「branch named before the thread opens」: the seat claims first with the `Claim:` naming the branch the coordinator will give the thread, then asks for the thread) rests on the coordinator being able to name a project thread's branch. Measured on this very thread (A2 below): it cannot. The branch is platform-assigned at thread creation (`claude/project-thread-` + a random suffix; 27 such heads on `origin`), the coordinator's opening message carried none, and the thread may push only that branch. So the 〈卡线程〉 handshake lines were left as they were until the ruling; the options as filed, ⛔ none picked by this thread (A was ruled by the maintainer): - **A. Coordinator reads, seat claims, thread verifies.** The coordinator reads the new thread's branch from its session record the moment it is spawned (`get_session` on the child lists `outcomes[].git_info.branches` before any push — measured) and hands it to the seat in the same stroke; the seat claims; the thread's first act stays 「verify the newest `Claim:` names my branch」 and it starts as soon as the claim is up. Cost: one read per thread; the thread still waits for the seat, usually less than today because the read beats the thread's own report. - **B. Today's handshake minus the probe push.** The thread reports its branch and waits; the seat claims; the thread starts. The empty-branch push (`os-dev.md` rule 1) is dropped for card threads because the branch is platform-designated and the push route is the harness's. Cost: zero protocol change on the seat side; the 5–10 minute wait the card measured stays. (The probe-push drop touches `.claude/agents/os-dev.md`, outside this card's file surface either way.) - **C. Claim first with the branch line filled later.** The seat claims with `Branch: pending` and the thread's first report fills it by a body edit of the claim comment. Cost: a claim comment that is edited after it is written, which the claim protocol (「认领评论时间戳是唯一仲裁」) does not foresee. ## The PM's mechanism assumptions, measured - **A1 (hot files; three seat PRs unmerged)** — held at the first push (all three open: `#25348` at `2bf0113`, `#25255` at `3e6e35e`, `#25247` at `d062675`); `#25348` landed 06:19Z and was merged in (`7198a099`, one adjacent-line conflict in `seat-lifecycle.md` resolved by keeping both lines; SKILL.md now 319/319, `lanes/director.md` 70/70). This PR started from `main` at `448374d` and touches none of their hunks: `#25348`'s SKILL.md L30/L106/L212–L222/L234/L264/L267/L276, `seat-lifecycle.md` L69, `dispatch-runbook.md` L57/L77/L115/L146, `execution-duties.md` L103, `contract-review.md`, `triage-duties.md`, `lanes/director.md` L13–L24 and L45–L60 — not touched; `#25255`'s SKILL.md L57 insertion (the `coordinator` row) and `dispatch-runbook.md` L136 — not touched; `#25247`'s 〈域车道〉 table and `lanes/*` other than the two one-line renames — not touched. Two known overlaps, both trivial: `#25255` deletes SKILL.md L274, which this PR only renames (the merge takes the deletion); `#25247` and `#25348` move SKILL.md's count (317 and 319) while this PR leaves it at 318 under the 319 ceiling, so whichever lands last re-measures. `#25255`, `#25247` and `#25393` landed 13:14Z and were merged in (`bd78f67d`): two SKILL.md conflicts, both resolved as foreseen — the `director` row keeps this PR's rename and `#25255`'s `coordinator` row is added beneath it; `#25255`'s deletion of the 总监席 summons line wins over this PR's rename of it. The follow-up commit then wrote the deferred items (coordinator.md pointer and rename, 「派发令全文」 in both candidate lines) plus the two review flags (patrol line, cross-repo rule 5). - **A2 (can the coordinator name the branch?)** — disproved. `get_session` on this thread shows the branch `claude/project-thread-hxtlri` in `session_context.outcomes[].git_repository.git_info.branches` at creation (04:51:59Z); the coordinator's opening note named no branch; `git ls-remote` had no such head until this thread pushed it; the suffix appears in neither the thread id nor the session id. So the branch is readable after spawn, not nameable before it — item 3 goes to the ruling batch as above. - **A3 (SKILL.md 319/319 once `#25348` lands)** — holds and is respected: SKILL.md stayed at 318 lines until `#25348` landed and sat at 319/319 after the first merge and 318/318 after the second (the ruling-2A clause is in place on L75, net zero). No re-wrap used as payment; the two lines removed are the two mechanisms the card names. - **A4 (`check:pm-skill-id-lint`)** — holds; the operating text names rules by file and section only; 87 files clean. ## Line budget | File | Lines | Ceiling | Net | |:--|--:|--:|--:| | `SKILL.md` | 318 (319 before `#25255`/`#25247` merged in) | 318 | 0 (2 replaced, 6 edited in place) | | `references/seat-lifecycle.md` | 95 (96 before `main` shrank it) | 96 | 0 (+4 −3 −1, 1 edited) | | `references/seat-post-protocol.md` | 91 | 91 | 0 (+2 −1 −1) | | `references/dispatch-runbook.md` | 241 | 241 | 0 (4 edited) | | `references/execution-duties.md` | 187 | 188 | 0 (2 edited) | | `references/lanes/director.md` | 70 (72 before `#25348`) | 70 | 0 (1 edited) | | `references/lanes/skills.md` | 32 | 33 | 0 (1 edited) | | `references/rest-channel.md` | 82 | 82 | 0 (1 edited) | | `references/coordinator.md` | 49 | 49 | 0 (3 edited in place) | | `references/cross-repo-coordination.md` | 51 | 51 | 0 (1 edited) | | `.claude/agents/os-dev.md` | 404 | 404 | 0 (2 edited in place; ruling 1A) | Widest edited prose line 119 bytes; the two edited SKILL.md table rows are 143 and 145 bytes against the 342-byte row pin. ## Gates Head `f08bab5c` (the follow-up commit, on top of the `origin/main` merge `bd78f67d` that brought in `#25255`, `#25247` and `#25393`): `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derives 22 commands (the 20 of the first head plus `pnpm check:agent-model-declared` and `pnpm check:commit-card-trailers`, which `.claude/agents/os-dev.md` in the change set adds). Every one was run in this worktree with its exit code captured before any pipe and recorded as `COMMAND :: exit CODE`, then reconciled with `--ran`: 22 derived, 22 run, 22 × `exit 0`, 0 NOT-MEASURED, 0 UNRUN (`✓ dispatch-gates --ran`). Earlier heads, each reconciled the same way: `f81aab8a` 20/20, the merge head `7198a099` 20/20, the ruling head `9700ab9d` 22/22; the first pass on `2b1450c` had one `exit 3` (`pnpm --filter @objectstack/lint run check:doc-formula-expressions`, a PREREQUISITE — the `@objectstack/formula` and `@objectstack/lint` builds absent in a fresh worktree — cleared by building those two packages under `scripts/pm/os-verify-lock.sh`). The four the dispatch order names on this head: `pnpm check:pm-skill-ratchet` ✓ (declared cross-file moves 2; SKILL.md 318/318, `coordinator.md` 49/49, `cross-repo-coordination.md` 51/51, `os-dev.md` 404/404, no row moved), `pnpm check:pm-skill-id-lint` ✓ (87 files clean), `pnpm check:skill-frame-sync` ✓, `pnpm check:skill-frame-freshness` ✓. CI on `f81aab8a`, `7198a099` and `9700ab9d` was all green (40, 35 and 42 check runs, none failed); this head has its own check runs. No published package moves (`.claude/**` only), so `skip-changeset` rides the create. ## Acceptance notes - The body's first line is the HTML-comment attribution block the project session requires; `os-dev.md` 〈干净收尾〉 forbids HTML comments in GitHub text. Measured on the sibling PRs of this project, the relay read-back keeps it byte for byte. Reported as a deviation, not hidden. - `references/cross-repo-coordination.md` 规则 5 was outside the claim's file surface at the first push; the seat widened the surface by that one line and the follow-up commit carries the review's exact 119-byte rewrite. - The card's item 4 names the patrol's work as 「the collection step of `execution-duties.md` (unlock scan, hold release, stale premise, awaiting-landing list, wall note)」; the standby items `seat-lifecycle.md` 〈停止条件与待命〉 enumerates cover all but the stale-premise check, which the follow-up commit names on the line (「含前提过时」, the term of `execution-duties.md` 派发节). - The vocabulary 「车道项目 / 总监项目 / 项目席」 this PR introduces is left as written; card #25412 (PR #25427) re-words it after this PR lands, per the seat. - Work was done in a linked worktree (`../objectstack-issue-25379`) on the designated branch; the primary checkout was left detached at `d12e650`. The empty-branch push was made before the first edit, as `os-dev.md` rule 1 asked then; the third commit exempts card threads from it per ruling 1A. - The commit trailer pair is the model-free pair the pre-push hook requires. Governed surface `.claude/**` (Tier S): draft, awaiting the seat's `CONTRACT_REVIEW_TIER` review and the maintainer's word; ⛔ not to be flipped ready, queued or armed by this thread. --- _Generated by [Claude Code](https://claude.ai/code/session_0178pvZcJjqXL36QzPi1jbSX)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 01fd980 commit 6c2699b

11 files changed

Lines changed: 32 additions & 32 deletions

File tree

‎.claude/agents/os-dev.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ model: opus
2727
- 认领带 `Resume-from: BRANCH@SHA` ⇒ 从 `origin/BRANCH` 建同名分支续写,先合 `origin/main`。
2828
- ⛔ 永不编辑共享检出(PreToolUse 钩子会拦);修复横跨姊妹仓时一仓一 worktree。
2929
- 动笔前记下基点 `BASE=$(git rev-parse HEAD)`,它是标准条款节里家族规则的锚。
30-
- 建好分支后的第一个动作是推空分支:任何编辑之前 `git push -u origin <branch>`。
31-
- 它既是认领评论所指分支的落地标记,又是写路由探针(容器凭据不对称)。
30+
- 建好分支后先推空分支(任何编辑前 `git push -u origin <branch>`):落地标记兼写路由探针。
31+
- 卡线程分支由平台指定、harness 推送,⛔ 不推空分支;探针规则只对自建分支。
3232
- 探针遇 403 ⇒ 停下报 `blocked`,⛔ 不进重试循环;只有网络错误才退避重试。
3333
- Scratchpad 按 issue 隔离:在 scratchpad 目录下建 `issue-<n>/` 子目录,临时文件全写进去。
3434
- 同批 agents 共用一个 scratchpad 目录,自然命名的文件会被彼此静默覆盖。

‎.claude/skills/pm-dispatch/SKILL.md‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
3030
- ⛔ 永不代维护者答产品或架构问题,⛔ 无代裁通道:席位只分析与推荐,裁决恒出自人工。
3131
- ⛔ 永不编辑共享检出,一任务一 worktree;⛔ 永不 `git stash`。
3232
- ⛔ 永不在代码 PR 里改 `content/docs/releases/`。
33-
- ⛔ GitHub 之外永不维护任何跟踪状态;org Project 只是视图,权威层是 issue 正文 + REST。
33+
- ⛔ GitHub 之外永不维护跟踪状态;看板(org Project)只是视图,权威层是 issue 正文 + REST。
3434
- ⛔ 永不跑版本发布、不合并 Version Packages PR;发布动作的完整清单以 AGENTS.md 为权威。
3535
- ⛔ 未经人工的发布痕迹按事故立案,不代跑补救性发布;机械通道存在不构成授权。
3636
- ⛔ 分诊席永不认领卡、派发 dev 飞或写代码;执行席只在本车道认领,永不改 `domain:*`。
@@ -51,10 +51,10 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
5151
| arg | 含义 | 默认 |
5252
|---|---|---|
5353
| `triage` | 以分诊座位身份运行(只扫/分类/路由,永不认领) | — |
54-
| `<domain>`(如 `spec`、`skills`) | 以该 `domain:*` 车道的执行座位身份运行 | — |
54+
| `<domain>`(如 `spec`、`skills`) | 以该 `domain:*` 车道的执行座位身份运行;承办该车道的项目即「车道项目」 | — |
5555
| `epic:#<n>` | 以父单 #n 的 epic PM 身份运行(见 `references/seat-lifecycle.md` 〈Epic 子树车道〉) | — |
56-
| `director` | 以项目总监席身份运行(人工召唤;三职与章程见 `references/lanes/director.md`) | — |
57-
| `coordinator` | 以项目协调者身份运行(项目会话:开席位线程与卡线程、跨车道调度;接口见 `references/coordinator.md`) | — |
56+
| `director` | 以总监席身份运行(人工召唤;所在项目即「总监项目」;三职与章程见 `references/lanes/director.md`) | — |
57+
| `coordinator` | 以协调者身份运行(项目会话:开席位线程与卡线程、跨车道调度;接口见 `references/coordinator.md`) | — |
5858
| `label:<name>` | backlog 过滤标签;`label:all` = 全部 open 未认领 | `pm:queue` |
5959
| `repo:<owner/name>` | 扫哪个仓的 backlog(单 issue 的落地仓看它自己的 `repo:*` 标签) | `objectstack-ai/objectstack` |
6060
| `batch:<n>` | 席位同时在飞的子代理总上限,按 `Agent` 调用、`create_session` 与卡线程计:dev、复核、普查皆计,⛔ 只读不豁免 | 默认 `3`;`n` 的维护者天花板 `5` |
@@ -68,11 +68,11 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
6868
- fire = 一次唤醒;fire 到达时上一轮未清空的接续处理,⛔ 不重开、不重排。
6969
- 批 = 一个上下文里读完的 ≤5 张同族卡,是质量单位,⛔ 不是预算。
7070
- 班 = 一个会话的任期,只以交接或惰性回收结束。
71-
- 入座即建唯一自绑 cron Routine(`create_trigger`,`own_followup`)作默认唤醒;id 记座位贴说明段。
72-
- 轮末 `send_later` 是可选加速器:在飞 ≤55 分钟,⛔ 不作唯一唤醒;只定下次唤醒,不定轮长。
71+
- 席位两形:Routine 席与项目席(会话是车道项目的线程);细则见 `references/seat-lifecycle.md`。
72+
- 项目席唤醒 = PR 订阅事件 + 每项目一个巡查 routine;⛔ 无自绑 cron、无 `send_later` 链。
7373
- 探针先行:fire 的第一动作是一次最便宜的车道盘点查询,⛔ 在它之前不读任何长文本。
7474
- 队列空 + 无在飞 + 无待复核 + 决策箱无新答复 ⇒ 自退。
75-
- 分诊席跑普通直连会话、默认判断档;裁决不在本席,归维护者召唤的总监席。
75+
- 分诊席跑直连会话、默认判断档;直连会话按召唤跑,⛔ 无自醒不常驻;裁决归总监席。
7676
- 子代理裁决逐份过转录核验采信。
7777

7878
## 阶段细则索引

‎.claude/skills/pm-dispatch/references/coordinator.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# 项目协调者(Project Coordinator)
1+
# 协调者(Coordinator)
22

3-
项目会话里开席位线程与卡线程、跨车道调度的那一席读本文。
3+
项目会话里开席位线程与卡线程、跨车道调度的那一席读本文;项目席见 `seat-lifecycle.md`。
44
它不是 `domain:*` 席:不坐座位贴、不认领卡;席位线程照 SKILL.md 与 `execution-duties.md` 跑循环。
55
项目指令只写「按仓库规则执行;管 X、Y 车道」;规则住本仓,⛔ 不在项目指令里转贴。
66
本文只写 coordinator 与席位线程之间的接口,七节各注明读者。
@@ -21,7 +21,7 @@
2121
## 三、全项目一个上限,p1 先(coordinator 调度读;席位交候选时读)
2222

2323
- 卡线程上限全项目一个数,由维护者按项目言明;未言明取各席 `batch` 之和。
24-
- 席位随时交候选:卡号、优先级、派发令文件、建议 effort;⛔ 不等自己的槽位。
24+
- 席位随时交候选:卡号、优先级、派发令全文、建议 effort;⛔ 不等自己的槽位。
2525
- coordinator 排队开线程:p1 先于 p2,同级先到先开;满即排队,线程交回或 PR 合入即释放。
2626
- 槽位只算在建的线程:等人(授权批准、决策卡)或等席位复核的卡线程不占槽。
2727
- S 卡的席内子代理只计该席 `batch`,不计本上限。

‎.claude/skills/pm-dispatch/references/cross-repo-coordination.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
- 直派的审计评论逐字引用授权指令。
4242
- 多车道仓分诊空缺时,会话型执行 PM 可代扫:只做分诊动作,不跨车道认领,贴上注明。
4343
- 代扫在分诊座位有主时立即停止。
44-
- 规则 5:一块板不设第二跟踪器:pm 标签就是状态机,org Project 只是维护者的聚合视图。
44+
- 规则 5:一块板不设第二跟踪器:pm 标签就是状态机,看板(org Project)只是维护者的聚合视图。
4545
- 认领即跟到 MERGED:派发后发现跨车道面(含 spec)不移卡,复核按面定档,未达档借隔离复核。
4646
- 复核记录带 `Implemented-by:`/`Reviewed-by:`;`pm:retriage` 改路由只对未派发卡。
4747
- 转移落对方队列:目标仓立单带 `pm:queue`、出处行与一行可执行判据,依赖用 `Blocked-by:`。

‎.claude/skills/pm-dispatch/references/dispatch-runbook.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@
132132
- S 级机械卡留席内 `mode:subagent`:开线程要重新克隆、重读技能与 `os-dev.md`,起步成本不值。
133133
- 披露纪律卡(私密细节不得离开席位会话)也留席内,认领写明;卡线程照计 `batch`。
134134
- 项目的 coordinator 跨席位统一调度卡线程;每席一个线程跑 PM 循环,卡线程即 dev。
135-
- 席位随时把候选卡交 coordinator,附优先级、派发令文件与建议 effort,⛔ 不等自己的槽位。
135+
- 席位随时把候选卡交 coordinator,附优先级、派发令全文与建议 effort,⛔ 不等自己的槽位。
136136
- coordinator 按优先级开线程,p1 先;全项目上限由维护者按项目定(`coordinator.md`),满即排队。
137137
- 卡线程交回或其 PR 合入,席位当即告知 coordinator 释放槽位。
138138
- 请 coordinator 开线程附维护者原话消息:它只凭维护者明言设线程的 model 与 effort。
139139
- 席位留认领文本、派发令、契约复核、ACCEPT 与落地;线程实施、开 draft PR、驱动 CI。
140-
- 派发令落项目共享目录 `/mnt/project-files/<席位>/dispatch-<N>.md`:线程读不到席位 scratchpad。
141-
- 线程开起后第一动作:向席位报告指定推送分支并等待;⛔ 线程不贴认领、不写 assignee。
142-
- 席位按 AGENTS.md 的顺序写 assignee+`pm:dispatched`,再贴带该 `Branch:` 的认领;之后线程才开工。
140+
- 派发令由 coordinator 写进卡线程开场消息,⛔ 不落共享目录;卡上派发评论留一行指针。
141+
- coordinator 开线程即读线程分支交席位(读不到则线程自报);⛔ 线程不认领、不写 assignee。
142+
- 席位写 assignee+`pm:dispatched`+带该 `Branch:` 的认领;线程核对最新认领指向本分支方开工。
143143
- 分支约定仍是 `claude/issue-<n>-<slug>`;线程只能推指定分支是实测平台例外,认领如实写。
144144
- worktree 照建;仓 `.claude/agents` 类型未加载(实测),线程照读 `os-dev.md`。
145145
- 交回:PR 与报告落地后给席位线程发一条消息(PR、head、报告要点);审核期线程不关,接 FAIL。

‎.claude/skills/pm-dispatch/references/execution-duties.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@
154154
- 收集先扫 GitHub(各模式),标记评论在 = 报告完整;评论与返回消息皆无才进探活/判死。
155155
- 标记两种拼写等效(HTML 注释形、首行 `os-dev-report`);⛔ 永不把没收到失败通知读作还在跑。
156156
- 报告点名 PR ⇒ 会话席当即 `subscribe_pr_activity` 并记座位贴;中继开的 PR 永不自动挂会话。
157-
- ① 巡检首动作 `list_triggers` 确认 Routine 启用,在飞重挂加速器;唤醒归 Routine,漏挂不断链。
158-
- ② 在飞期间主巡检间隔 ≤45 分钟,待命期 60–70;节奏维护者明示可改。
157+
- ① Routine 席巡检首动作 `list_triggers` 确认 Routine 启用;项目席由事件与巡查 routine 唤醒。
158+
- ② Routine 席在飞期间主巡检间隔 ≤45 分钟,待命期 60–70;节奏维护者明示可改。
159159
- ③ 已派发未回报的 dev 逐个发状态询问;派发后 ~45 分钟无远程产出即到门槛。
160160
- 已有远程分支/PR 不豁免探针。
161161
- ④ 活着 ⇒ 进度与阻塞点;回 no active task; resumed from transcript ⇒ 生前已死,询问即复活。

‎.claude/skills/pm-dispatch/references/lanes/director.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 席位章程:项目总监(Project Director)
1+
# 席位章程:总监席(Director Seat)
22

33
见 SKILL.md 〈升级与决策〉,⛔ 不复制框架本体;本文是岗位说明,现值状态恒在座位贴。
44

‎.claude/skills/pm-dispatch/references/lanes/skills.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
- 受管面治理执行文件:`.github/CODEOWNERS` 路由半边 + SUBJECT 是受管面本身的门禁/审计脚本。
1010
- 全量判据在 SKILL.md 域车道表;受管面定义与两层分档见 SKILL.md 〈路径分叉〉,⛔ 不另抄。
1111
- QA 管理循环执行归本席;qa-run 记录是协议载体不是工作。
12-
- 契约复核归派发席席内、决裁勤务归项目总监席(`director.md`);本席保留 skill 与治理文本。
12+
- 契约复核归派发席席内、决裁勤务归总监席(`director.md`);本席保留 skill 与治理文本。
1313

1414
## 常设承诺
1515

‎.claude/skills/pm-dispatch/references/rest-channel.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
## 不可迁移 —— 只有这三件,围着它们排计划;红窗守候规则住 `platform-readings.md` 配额段
6060

6161
1. 语义搜索:`/search/*` 被出口代理按设计拒绝。退路 = REST 列表端点加本地 grep。
62-
2. Projects field_values:GraphQL-only —— 舰队并不需要它;MCP 服务器端无条件抓它才是漏点。
62+
2. 看板(org Project)field_values:GraphQL-only,舰队不需要它;MCP 服务端无条件抓它才是漏点。
6363
3. `issue transfer`:issues 端点表无此路由(未实调)⇒ 同为 GraphQL-only;配方住 `platform-readings.md`。
6464

6565
## 第三桶 —— git 零配额等价物

‎.claude/skills/pm-dispatch/references/seat-lifecycle.md‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
## 座位贴协议
2424

2525
- 贴 = 座位(标签 `pm:seat`),正文固定四段现值:当前 PM / 继承台账 / 热文件串行队 / 说明。
26+
- 项目席的贴是存根,只留他账号要读的;模板见 `seat-post-protocol.md`。
27+
- 存根外的姿态、台账与轮报住项目;标题、assignee、坐席审计评论与跨账号移交简报照旧。
2628
- 正文只由在任座位 PM 编辑且为权威;标题与 assignee 是派生视图,三者同笔更新。
2729
- 标题只放慢状态,快状态留在说明段。
2830
- 维护者强制接管令取席位、队列、未起工卡与待落地 PR;⛔ 不取在飞卡,由原认领者跟完。
@@ -65,6 +67,7 @@
6567
## 轮次报告与节奏
6668

6769
- 每轮向维护者打中文轮次报告(chat 通道):issue → 判决 → PR 链接 → 备注的表。
70+
- 项目席轮报 = 卡线程清单,⛔ 不逐轮发聊天表;五项健康指标进总监项目的每日摘要。
6871
- 报告加升级项、呈裁清单、awaiting a human merge 项、逐 PR 熔断命中项(无则 none)。
6972
- 报告含 `UNRECOGNISED` 行:对本轮门禁日志 grep `UNRECOGNISED` 逐行照录,`NOT APPLICABLE` 行也在内。
7073
- 健康指标五个:可派发库存(open `pm:queue` 未认领及趋势);决策箱(待维护者数)。
@@ -88,8 +91,5 @@
8891
## 断粮与跨墙恢复(5 小时用量墙)
8992

9093
- 权威的墙信号是失败本身:撞墙报文里的重置时刻在那一刻可得、事前查不到,记下来。
91-
- 跨墙定时器:拿到重置时刻 ⇒ 一发定点(reset + 缓冲)优先。
92-
- 没有重置时刻 ⇒ 挂每小时 cron Routine,⛔ 不用 send_later 链。
93-
- 第一枪成功的 fire 跑恢复后删除 cron;fired 文本照定时器写法纪律。
94-
- 恢复 playbook 链的是既有规则:逐个探在飞云卡 → 直接验收兜底或 transcript 复活。
95-
- 随后重挂常规巡检 → 照常跑轮。
94+
- 恢复 playbook 链既有规则:逐个探在飞云卡 → 直接验收兜底或 transcript 复活 → 照常跑轮。
95+
- 项目席巡查 routine 每 2–4 小时跑各车道待命项(含前提过时);撞墙记入存根,⛔ 无 cron 链。

0 commit comments

Comments
 (0)