Skip to content

Commit 87fd1ba

Browse files
os-zhuangclaude
andauthored
Unify three-repo triage under the dedicated seat; retire the queue-steward seat (#9148)
- 多仓协调 rule 4: the dedicated triage seat becomes the sole triage/grading/ routing/type producer for objectstack, objectui and cloud; sister repo:* seats narrow to execution seats (standard execution-seat discipline; the skills-lane finding self-grading exception stays). Split trigger pre-registered: round length approaching the fire period, or a repo starved by the priority order => split by repo. - 分诊座位职责 now executes across all three repos; auto-adjudication authority is exclusively the unified seat's; the cross-repo pin-chain window-level backstop moves into the triage sweep. - 队列管家职责 section removed. Red/kick handling (the four-branch signature triage, including the fixed-signature-recurrence block) is reassigned to the owning lane PM's landing window, with the merge-queue triage workflow's on-PR comment as the mechanical input and the signature ledger — preserved on its anchor issue as lookup data, human-upgradable only — as the sole authority. Steward references in references/ re-pointed line-neutrally. - scripts/pm/check-half-states.mjs gains H12, the orphan-landing detector (open + ready + auto-merge unarmed + stale => patrol finding), with self-tests; the guard-index row is refreshed. - SKILL.md ratchet ceiling lowered 686 -> 682 (net-negative edit). Fixes #9131 Fixes #9140 Claude-Session: https://claude.ai/code/session_017TNzEetykdh7ceZGwuAPLq Co-authored-by: Claude <noreply@anthropic.com>
1 parent 5090047 commit 87fd1ba

6 files changed

Lines changed: 127 additions & 41 deletions

File tree

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

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ metadata:
3232
| arg | 含义 | 默认 |
3333
|---|---|---|
3434
| `triage` |**分诊座位**身份运行(只扫/分类/路由,永不认领) ||
35-
| `steward` |**队列管家**身份运行(只守入队后的落地) ||
3635
| `<domain>`(如 `spec``skills`) | 以该 `domain:*` 车道的**执行座位**身份运行 ||
3736
| `epic:#<n>` | 以父单 #n 的 **epic PM** 身份运行(见「Epic 子树车道」) ||
3837
| `label:<name>` | backlog 过滤标签;`label:all` = 全部 open 未认领 | `pm:queue` |
@@ -156,13 +155,17 @@ UI 创建并勾 GitHub 连接器、UI 钉模型(会话内 create_trigger 的Rout
156155
正文留档分叉窗口,且 ⛔ pin bump 不做 rider(走专用 bump 脚本连带 override 与 lockfile)。
157156
3. **联动杂事立单,不靠记忆。** 已验收 PR 的产物流向另一仓时,由**接受那个 PR 的执行座位**立即
158157
在消费仓立后续单(带 `Blocked-by:`);`domain:*` 仍由分诊补。
159-
4. **纵向拆分:一个分诊 PM + N 个执行 PM,一人一车道双射**(维护者 2026-08-05 拍板)。分诊座位全
160-
仓唯一,只扫/分类/打标签/拆分/查重/转仓,⛔ 永不认领、永不派发、永不写代码;执行座位信任标签
161-
、只在本车道认领,误标**不自行改**、留言上报。⛔ 借调已删除:突发积压调频率或 `batch`,持续
162-
积压拆域走 PR。姊妹仓是整仓座位(`repo:*`),是本仓 backlog 的唯一分诊/定级生产者。**维护者
163-
直派通道** (2026-08-10 常设授权):维护者当面指挥的 PM 会话直接路由,审计评论逐字引用授权指
164-
令,只对明示指挥的卡成立。分诊空缺时会话型执行 PM 可**代扫**(只做分诊动作,不跨车道认领,座
165-
位贴注明),座位有主立即停止 —— 两个分类生产者并存,单一生产者的保障当场归零。
158+
4. **纵向拆分:一个分诊 PM + N 个执行 PM,一人一车道双射**(维护者 2026-08-05 拍板;2026-08-16 裁
159+
定分诊统一收归一座)。分诊座位**三仓唯一**:objectstack、objectui、cloud 全部 backlog 的分诊/
160+
定级/路由/type 由它一座生产,只扫/分类/打标签/拆分/查重/转仓,⛔ 永不认领、永不派发、永不写代
161+
码。执行座位信任标签、只在本车道认领,误标**不自行改**、留言上报;姊妹仓 `repo:*` 座位收窄为**
162+
执行座位**(在本仓认领/派发/复核/落地,同一套执行座位纪律,⛔ 不产 `domain:*`/type/定级;skills
163+
车道 finding 自分诊例外照旧)。**拆分触发条件预登记**:单轮时长逼近 fire 周期,或某仓在优先级
164+
全序下持续断粮 ⇒ 按仓拆回多席 —— 扩容是记录在案的出口,不是重设计。⛔ 借调已删除:突发积压调
165+
频率或 `batch`,持续积压拆域走 PR。**维护者直派通道**(2026-08-10 常设授权):维护者当面指挥
166+
的 PM 会话直接路由,审计评论逐字引用授权指令,只对明示指挥的卡成立。分诊空缺时会话型执行 PM 可
167+
**代扫**(只做分诊动作,不跨车道认领,座位贴注明),座位有主立即停止 —— 两个分类生产者并存,单
168+
一生产者的保障当场归零。
166169
5. **一块板,不设第二跟踪器(one board, no second tracker)。** pm 标签就是状态机;org Project 只是维护者的聚合视图,权威层坚持 issue 正文 + REST。
167170

168171
**跨座位转移**:工作跨座位线,PM 永不跨(唯一豁免:简单阻塞项直接接手,见「候选与批次」)—— 落到
@@ -242,7 +245,9 @@ UI 创建并勾 GitHub 连接器、UI 钉模型(会话内 create_trigger 的Rout
242245

243246
## 分诊座位职责
244247

245-
(执行座位 ⛔ 跳过本节动作 —— 读到标签当既成事实。)
248+
(执行座位 ⛔ 跳过本节动作 —— 读到标签当既成事实。)本节全部职责**对三仓统一执行**(维护者
249+
2026-08-16 裁定):sweep、首触定级、发版板、查重/shadow 检查与代裁通道逐仓各跑一遍;**代裁权限唯
250+
一归本座位**,任何执行座位(含姊妹仓 `repo:*`)⛔ 不代裁。
246251

247252
**Backlog sweep(常设职责,不等请求)。** 每轮扫任一析取命中的卡:① 全裸(无`pm:*`
248253
`needs-user-decision`、无 `domain:*`);② 有 `pm:queue``domain:*`(**仅限主仓** —— 姊妹
@@ -252,6 +257,9 @@ UI 创建并勾 GitHub 连接器、UI 钉模型(会话内 create_trigger 的Rout
252257
状恰是「带域标签无 pm-state」)、全部 `pm:seat` 贴;存量大时每轮限量、优先最新。**紧急卡直接分诊**
253258
(维护者 2026-08-13):维护者点名或 p0 嫌疑 ⇒ 立即起 `claude-fable-5` 分诊子代理,不等 Routine 班
254259
次;授权面 = 分诊本身(定级/路由/标签/既有评论格式),⛔ 不写码不认领;产出落卡,与 Routine 分诊同格式同效力(细则见 `references/dispatch-runbook.md`)。
260+
**跨仓 pin 链的窗口级兜底也在本 sweep**(联动单第一产者仍是接受座位;⛔ 只立单不执行 bump):
261+
objectui pin 落后且其队列已空 ⇒ 在本仓立/刷新 console bump 单;见新 tag 族发布 ⇒ 在 cloud 立
262+
`.objectstack-sha` bump 单;单张封顶(先查同题 open 单,已有就追评刷新),工具链新形态只提请不扩面。
255263

256264
**分类动作**(每张三选一 + 一个修复通道):**`pm:queue`** —— 有具名落点或复现的具体缺陷、范围明确
257265
的工具/门禁修复、恢复不变量的 finding、test-only pin,无可问之事;**`needs-user-decision`** —— 设
@@ -288,7 +296,7 @@ hold 评论纪律见状态模型,hold 重验只在 `Restart-when:` 命中时发
288296
做优先级渐变 —— 渐变没人维护):「不修它,当前 RC 能不能发?」判阻塞四类:① 用户今天就撞的已发布
289297
面缺陷;② 公开契约 declared≠enforced;③ 存量数据/迁移形状(发布后修不回);④ 发布说明里要为它道歉
290298
的。拆分/分票时 `target:*` 随工作走,对每一半重跑二元判据,默认继承,不继承按四类写明理由。**
291-
个 backlog 恰好一个生产者**,⛔ 谁都不扫别人的 backlog;「归零 = 可发版」指三张板都空。鲜度每
299+
张板同归本座位生产**(每板恰好一个生产者的不变量不变);「归零 = 可发版」指三张板都空。鲜度每
292300
~5 轮;**发版时刻 = 清板不是重扫**;清板三选一与 pin 前置细则见 references。
293301

294302
**高置信决策卡的分诊代裁(维护者 2026-08-12 裁定)。** 出处原话:「让他帮我从实际业务需求出发,
@@ -503,12 +511,18 @@ not-reachable 是设计非故障(维护者 2026-08-11 裁定)⛔ 不复测;**接
503511
merge 再重生成**,顺序防锚点静默倒退与`gen:openapi` 假红两个陷阱);重生成后断言兄弟单条目与
504512
上一单**实现体**仍在;清单当场读 `grep os-regen .gitattributes` ⛔ 不抄进派发令当常量;⛔ 禁
505513
止为凑相等手改锚点文件,⛔ 不得要求 `baseRev == merge-base`(允许滞后)。
506-
- **跟到 MERGED 为止;入队后的看护归队列管家** 车道 PM 管验收、首次入队(ACCEPT 后挂 6–9 分
507-
flip 定点核门禁 job 结论,绿即转 ready + 挂 auto-merge —— CI success webhook 不可靠,
508-
⛔ 不坐等不忙轮询)、确认 MERGED(两个读数);落地窗口给关键 PR 挂`subscribe_pr_activity`(
514+
- **跟到 MERGED 为止;入队后的看护同归车道 PM 的落地窗口** 车道 PM 管验收、首次入队(ACCEPT
515+
挂 6–9 分钟 flip 定点核门禁 job 结论,绿即转 ready + 挂 auto-merge —— CI success webhook 不可
516+
靠,⛔ 不坐等不忙轮询)、确认 MERGED(两个读数);落地窗口给关键 PR 挂`subscribe_pr_activity`(
509517
⛔ 不订阅 dev 交报告前的 PR —— 双驾驶员互踩;**MERGED/关闭即退订 + 云
510518
`archive_session`**,⛔ 合并前不归档,不留孤儿订阅);落地后再核一次落地判据仍是车道 PM 的
511519
活(队列合并同样走 os-regen 驱动)。
520+
- **红/踢出处置在同一落地窗口内做**:机器输入是 merge-queue triage workflow 落在被踢 PR 上的分诊
521+
评论(失败签名与计数,细节以该 workflow 头为权威);判据唯一来源是签名台账,优先于现场判断 ——
522+
台账留在其锚点 issue 上作查表数据,**只有人工能升级**(疑似新 flaky 只留提请,⛔ 不自行加表;纯
523+
计数不追记,只有改变修法作用域时才记)。四分支:已知 flaky ⇒ 原样重投;**已修签名再现 ⇒ ⛔ 不重
524+
**,判新问题重新诊断;基上缺已合修复 ⇒ merge main 推新提交(重跑无效);新签名 ⇒ ⛔ 不重投,
525+
在 PR 与其 `Fixes` 卡各留完整签名与初判;每次处置留审计评论(重投写签名与台账依据)。
512526
- **依赖前棒才能转绿的 PR:draft 停放 + 签名级预期红清单** + 解除条件(「几条测试会红」不够用
513527
);CI-failure 事件与清单比对,新签名才是真问题;依赖合入后同步 → 红清零→ 转 ready → 入队。**
514528
多个已实现 PR 全碰生成物 ⇒ 串行接力,一次只放行一个**:每一棒都是一整圈(每棒重走);相邻两棒交
@@ -538,23 +552,6 @@ not-reachable 是设计非故障(维护者 2026-08-11 裁定)⛔ 不复测;**接
538552
队前 ref 重验与扇出索引更新;hold 侧读 `Restart-when:`)、在飞/已入队 PR 跟到 MERGED、决策箱仅在报告中列出 ⛔ 不 nag、跨
539553
车道备忘跟进。退场只有两个入口:维护者交接令(走交接收尾清单),或被惰性回收。
540554

541-
## 队列管家职责
542-
543-
三仓一座,管**入队之后**的看护;授权面**只守落地**:⛔ 永不合并、永不 ready/draft 切换、永不把
544-
没入过队的 PR 入队、不碰代码不动认领。
545-
546-
- **红/踢出的签名分诊四分支**(判据唯一来源是管家座位贴的签名台账,优先于现场判断):已知 flaky
547-
⇒ 原样重投;已修签名再现 ⇒ ⛔ 不重投,判新问题通知车道重新诊断;基上缺已合修复 ⇒ 指引 merge
548-
main 推新提交(重跑无效);新签名 ⇒ ⛔ 不重投,在 PR 与其`Fixes` 卡各留完整签名与初判。**台账
549-
只有人工能升级**(疑似新 flaky 只在锚点单留提请,⛔ 不自行加表;纯计数不追记,只有改变修法作用
550-
域时才记)。
551-
- **双向让行**:处置任一 PR 前先读它最近 ~30 分钟评论,对方已在处置就让行留一行;双方每次动作都
552-
留审计评论(重投写签名与台账依据)—— 让行判据始终是 GitHub 上的读数。
553-
- **Pin 链观测的机械产出**(⛔ 只立单不执行 bump):objectui pin 落后且 objectui 队列已空(窗口
554-
收口)⇒ 在本仓立/刷新 console bump 单;观测到新 tag 族发布 ⇒ 在 cloud 立`.objectstack-sha`
555-
bump 单。三边界:单张封顶(先查同题 open 单,已有就追评刷新);联动单第一产者仍是接受座位,本条
556-
是窗口级兜底;工具链新形态只提请不扩面。
557-
558555
## 断粮与跨墙恢复(5 小时用量墙)
559556

560557
出处:维护者 2026-08-11 提问(「首先项目经理能不能查到相关的数据,其次是到达时间窗口工作就会停,
@@ -677,7 +674,7 @@ pull(今天谁撞上;零拉动默认 defer/ remove);③ AI-agent error-resistanc
677674
|:--|:--|
678675
| `scripts/pm/check-skill-line-ratchet.mjs` | 本文件行数只降不升(`pnpm check:pm-skill-ratchet`);抬上限需维护者裁决引用在 PR 正文 |
679676
| `scripts/pm/check-skill-id-lint.mjs` | 本技能与 os-dev 定义的操作文本 ⛔ 不引用 issue 编号(`pnpm check:pm-skill-id-lint`)—— 经验必须自含 |
680-
| `scripts/pm/check-half-states.mjs` | label/assignee 半状态的 report-only 巡查 |
677+
| `scripts/pm/check-half-states.mjs` | label/assignee/PR 半状态的 report-only 巡查(含已复核就绪却无人落地的孤儿 PR 检测) |
681678
| `scripts/pm/dispatch-gates.mjs` | 文件面 → 该跑的门禁族(派发令取数) |
682679
| `scripts/pm/os-regen-merge.sh` | 碰生成物 PR 的 merge 四步序(防静默吞并与锚点倒退) |
683680
| `scripts/pm/ensure-pm-labels.sh` | pm 标签词表的幂等创建 |

.claude/skills/pm-dispatch/references/landing-operations.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
允许滞后(一行提示,不是错误);⛔ 禁止为凑「相等」手改锚点文件,⛔ 不得要求
3030
`baseRev == merge-base` —— 那个等式不是任何门的判据。
3131

32-
## B. 跟到 MERGED 为止;入队后的看护归队列管家
32+
## B. 跟到 MERGED 为止;入队后的看护归车道 PM 落地窗口
3333

3434
车道 PM 的权责:验收(复核清单);**首次入队** —— ACCEPT 后挂 6–9 分钟 flip 定
3535
点,到点核门禁 job 结论(承载门禁族的 job `completed: success`),绿即转 ready +

.claude/skills/pm-dispatch/references/platform-readings.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
复合入后**同一签名再现就不再是那条 flaky**,是新问题,必须重新诊断,⛔ 禁止条件
3434
反射式重投。第三种签名:本 PR 名下**没有任何** `merge_group` run 且批次同伴的
3535
run 全部 `success` = 队列重建的连带取消,不是红 —— 带签名读数收据重投一次(收据
36-
留在 PR 上),⛔ 无收据不重投;同一 PR 第二次被踢移交队列管家
36+
留在 PR 上),⛔ 无收据不重投;同一 PR 第二次被踢 ⇒ 停止重投,按签名四分支重判
3737
- **实测吞吐参数两则**:合并队列落地延迟 ≈ 每 PR 15–30 分钟且串行(⛔ 不据「还没
3838
落」提前判异常);单容器重验证(build+test)并发甜点 ≈3,排批按它定并发上限。
3939

.claude/skills/pm-dispatch/references/seat-post-protocol.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@
4343
齐,几分钟内即可收班:① 每张在飞卡落**收单注记**(评审判据、落地步骤、当前状
4444
态);② 座位贴正文刷新到当下;③ 每件在飞物**点名接手看护者** —— 默认下任座位
4545
(在跑云会话用绑定会话 ID 的 poke 触发器投递,⛔ 非 `SendMessage` 直投,细则见
46-
`dispatch-runbook.md`),已入队 PR 归队列管家**评审判断不可外包**:管家授权只
47-
守落地,热移交把评审交给下任座位,⛔ 不是跳过评审;会话内 `create_trigger`
46+
`dispatch-runbook.md`),已入队 PR 的看护同样点名接手座位**评审判断不可外包**
47+
:看护只守落地,热移交把评审交给下任座位,⛔ 不是跳过评审;会话内 `create_trigger`
4848
Routine 拿不到 GitHub 工具(下方细则),⛔ 不是逃生舱。
4949
- **交接收尾清单(退场序列,漏一步就是留残缺现场)**:① 立即停止新派发;② 在手工
5050
件逐件处置 —— 能收则收,收不完走上一条热移交(⛔ 不为清零而等);③ 全量枚举本车

0 commit comments

Comments
 (0)