Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/pm-dispatch/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
| `<domain>`(如 `spec`、`skills`) | 以该 `domain:*` 车道的执行座位身份运行 | — |
| `epic:#<n>` | 以父单 #n 的 epic PM 身份运行(见 `references/seat-lifecycle.md` 〈Epic 子树车道〉) | — |
| `director` | 以项目总监席身份运行(人工召唤;三职与章程见 `references/lanes/director.md`) | — |
| `coordinator` | 以项目协调者身份运行(项目会话:开席位线程与卡线程、跨车道调度;接口见 `references/coordinator.md`) | — |
| `label:<name>` | backlog 过滤标签;`label:all` = 全部 open 未认领 | `pm:queue` |
| `repo:<owner/name>` | 扫哪个仓的 backlog(单 issue 的落地仓看它自己的 `repo:*` 标签) | `objectstack-ai/objectstack` |
| `batch:<n>` | 席位同时在飞的子代理总上限,按 `Agent` 调用、`create_session` 与卡线程计:dev、复核、普查皆计,⛔ 只读不豁免 | 默认 `3`;`n` 的维护者天花板 `5` |
Expand Down Expand Up @@ -272,7 +273,6 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
- 每问必带推荐项,被 Skip 或长挂即转卡通道,⛔ 不重弹。
- 推送维护者:受管 PR 待批合、决策卡待字、发版、仅其可解之阻 ⇒ 另发 `PushNotification`。
- 一行 ≤200 字,先写动作与编号;每项恰一次,例行进展、刚问刚答与在场即见的不推。
- 项目总监席:维护者在所在仓召唤 `/pm-dispatch director`;⛔ 无 Routine/cron;未回字 = 不在 = 停。
- 总监席档位由维护者按项目人工定,每场记入摘要台账;⛔ 无档位硬门、无免档整理态。
- 总监席是唯一呈裁席:决策箱只经本席呈维护者人工裁;⛔ 无代裁无自裁无子代理。

Expand Down
49 changes: 49 additions & 0 deletions .claude/skills/pm-dispatch/references/coordinator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# 项目协调者(Project Coordinator)

项目会话里开席位线程与卡线程、跨车道调度的那一席读本文。
它不是 `domain:*` 席:不坐座位贴、不认领卡;席位线程照 SKILL.md 与 `execution-duties.md` 跑循环。
项目指令只写「按仓库规则执行;管 X、Y 车道」;规则住本仓,⛔ 不在项目指令里转贴。
本文只写 coordinator 与席位线程之间的接口,七节各注明读者。

## 一、车道归属登记在座位贴(coordinator 开席位线程前读;席位线程坐席时读)

- 项目管哪些车道只由项目指令声明;每条车道开一个席位线程,坐该车道空着的座位贴。
- 席位线程在贴的说明段写「由 X 账户的项目负责」;贴协议与互斥照 `seat-lifecycle.md`。
- 一条车道恒归一个项目:车道任一座位贴 🟢 标着另一项目 ⇒ 车道已有主,⛔ 不坐别席。
- 仲裁者是座位贴,⛔ 不是项目记忆;另一项目在飞卡由其席跟完,其收班简报在即可坐。

## 二、跨车道取卡(coordinator 每次唤醒读)

- 取卡面 = 本项目各车道 open 的 `priority:p1`/`priority:p2` 卡;候选判据照 `execution-duties.md`。
- 每张卡交其车道的席位线程;车道无席位线程而座位贴空着 ⇒ 先开席位线程再交卡。
- 维护者 ⛔ 不逐卡点名车道:车道读卡的 `domain:*`;S/M 分流见 `dispatch-runbook.md` 卡线程节。

## 三、全项目一个上限,p1 先(coordinator 调度读;席位交候选时读)

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

## 四、effort 与档位按难度(coordinator 开线程时读;席位请线程时读)

- 档位与 effort 的定法住 `execution-duties.md` 派发节:档位引 `dispatch-gates --tier`,effort 按卡难度。
- 改技能(协议语义面)的卡恒契约复审档 `CONTRACT_REVIEW_TIER`;⛔ 不抄模型名。
- 席位请线程附维护者原话,coordinator 开线程那一笔同设 model 与 effort(`dispatch-runbook.md`)。

## 五、卡线程的 `needs_decision`(coordinator 收到时读;席位写分析时读)

- 规则一处:`lanes/director.md` 与 `dispatch-runbook.md` 卡线程节;本文只指不抄。
- 席位写四维分析加推荐,卡并入决裁批次由维护者人工裁;⛔ 无裁决线程、无代裁。
- 等裁的卡线程不占槽(见第三节);裁决记录 = 卡上裁决评论,⛔ 不落项目文件或记忆。

## 六、额度压力(coordinator 每次开线程前读)

- 账号用量墙将近(墙信号与重置读法见 `seat-lifecycle.md`)⇒ 停开新卡线程,在飞的跑完。
- 向维护者说一次即可,⛔ 不逐线程重复;墙过后照常。

## 七、语言与汇报(coordinator 与席位线程皆读)

- 项目内对维护者用维护者的语言;GitHub 内容英文,照 SKILL.md 全体座位不变量。
- 只在结果、阻塞或待裁决时向维护者汇报,与席位同规;例行进展进线程清单。
2 changes: 1 addition & 1 deletion .claude/skills/pm-dispatch/references/dispatch-runbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@
- 披露纪律卡(私密细节不得离开席位会话)也留席内,认领写明;卡线程照计 `batch`。
- 项目的 coordinator 跨席位统一调度卡线程;每席一个线程跑 PM 循环,卡线程即 dev。
- 席位随时把候选卡交 coordinator,附优先级、派发令文件与建议 effort,⛔ 不等自己的槽位。
- coordinator 按优先级开线程,p1 先;全项目上限 = 各席 `batch` 之和,满即排队。
- coordinator 按优先级开线程,p1 先;全项目上限由维护者按项目定(`coordinator.md`),满即排队。
- 卡线程交回或其 PR 合入,席位当即告知 coordinator 释放槽位。
- 请 coordinator 开线程附维护者原话消息:它只凭维护者明言设线程的 model 与 effort。
- 席位留认领文本、派发令、契约复核、ACCEPT 与落地;线程实施、开 draft PR、驱动 CI。
Expand Down
12 changes: 12 additions & 0 deletions scripts/pm/check-skill-line-ratchet.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -1238,6 +1238,17 @@ export const CEILINGS = new Map([
// own counts (headroom 0, same convention as every entry above); added rows,
// paid for by the SKILL.md decrease — the map's total goes down.
['.claude/skills/pm-dispatch/references/seat-lifecycle.md', 96],
// The project coordinator's interface with the seat threads (maintainer's
// word, 2026-10-22, verbatim and untranslated: 「刚才你让我转帖的项目指令规则,为
// 什么不定义在仓库中呢,我只要穿到具体的车道就行。」): lane ownership on the seat
// post, cross-lane p1-first intake, one project-wide card-thread cap with
// waiting threads not counting, effort and tier by difficulty, ruling
// threads, quota pause, language and reporting — each section naming its
// reader and pointing at the rule's single source instead of restating it.
// It is beside seat-lifecycle.md because the coordinator is not a
// `domain:*` seat. A NEW file, so this is not a raise and funds nothing —
// set at the landed line count, headroom 0, same convention as above.
['.claude/skills/pm-dispatch/references/coordinator.md', 49],
['.claude/skills/pm-dispatch/references/reading-discipline.md', 37],
['.claude/skills/pm-dispatch/references/cross-repo-coordination.md', 51],
// Unchanged at 120 through the maintainer's revocation of every autonomous-
Expand Down Expand Up @@ -2103,6 +2114,7 @@ export const MAX_TABLE_ROW_BYTES = new Map([
// The five per-phase references of the principle-only cut carry no table
// row (their tables stayed in SKILL.md), so each pin is the measurement 0.
['.claude/skills/pm-dispatch/references/seat-lifecycle.md', 0],
['.claude/skills/pm-dispatch/references/coordinator.md', 0],
['.claude/skills/pm-dispatch/references/reading-discipline.md', 0],
['.claude/skills/pm-dispatch/references/cross-repo-coordination.md', 0],
['.claude/skills/pm-dispatch/references/triage-duties.md', 0],
Expand Down
Loading