diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 07553435fb..c8e8f8de70 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -54,6 +54,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 | ``(如 `spec`、`skills`) | 以该 `domain:*` 车道的执行座位身份运行 | — | | `epic:#` | 以父单 #n 的 epic PM 身份运行(见 `references/seat-lifecycle.md` 〈Epic 子树车道〉) | — | | `director` | 以项目总监席身份运行(人工召唤;三职与章程见 `references/lanes/director.md`) | — | +| `coordinator` | 以项目协调者身份运行(项目会话:开席位线程与卡线程、跨车道调度;接口见 `references/coordinator.md`) | — | | `label:` | backlog 过滤标签;`label:all` = 全部 open 未认领 | `pm:queue` | | `repo:` | 扫哪个仓的 backlog(单 issue 的落地仓看它自己的 `repo:*` 标签) | `objectstack-ai/objectstack` | | `batch:` | 席位同时在飞的子代理总上限,按 `Agent` 调用、`create_session` 与卡线程计:dev、复核、普查皆计,⛔ 只读不豁免 | 默认 `3`;`n` 的维护者天花板 `5` | @@ -272,7 +273,6 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 - 每问必带推荐项,被 Skip 或长挂即转卡通道,⛔ 不重弹。 - 推送维护者:受管 PR 待批合、决策卡待字、发版、仅其可解之阻 ⇒ 另发 `PushNotification`。 - 一行 ≤200 字,先写动作与编号;每项恰一次,例行进展、刚问刚答与在场即见的不推。 -- 项目总监席:维护者在所在仓召唤 `/pm-dispatch director`;⛔ 无 Routine/cron;未回字 = 不在 = 停。 - 总监席档位由维护者按项目人工定,每场记入摘要台账;⛔ 无档位硬门、无免档整理态。 - 总监席是唯一呈裁席:决策箱只经本席呈维护者人工裁;⛔ 无代裁无自裁无子代理。 diff --git a/.claude/skills/pm-dispatch/references/coordinator.md b/.claude/skills/pm-dispatch/references/coordinator.md new file mode 100644 index 0000000000..5d76a8fffd --- /dev/null +++ b/.claude/skills/pm-dispatch/references/coordinator.md @@ -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 全体座位不变量。 +- 只在结果、阻塞或待裁决时向维护者汇报,与席位同规;例行进展进线程清单。 diff --git a/.claude/skills/pm-dispatch/references/dispatch-runbook.md b/.claude/skills/pm-dispatch/references/dispatch-runbook.md index 1342bc39f4..d6060af4ff 100644 --- a/.claude/skills/pm-dispatch/references/dispatch-runbook.md +++ b/.claude/skills/pm-dispatch/references/dispatch-runbook.md @@ -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。 diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index 73b21e631c..1fcb6c456e 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -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- @@ -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],