From 6a8b11b37f7797f5cbddea1ecb84dea2912860eb Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 18 Aug 2026 10:07:03 +0000 Subject: [PATCH] pm-dispatch: fold objectos into the protocol as the fourth triaged repository (Option B) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Triage extends to four repositories (objectstack, objectui, cloud, objectos); objectos execution folds into domain:devx (the repo is entirely docs and site code, and devx already owns content/docs/** + apps/docs); no repo:objectos seat is minted now. The A-upgrade path is written down where the fold-in is stated: either registered scale-out trigger (round duration approaching the fire cycle, or the objectos queue persistently starving) escalates it to a full repo:objectos seat. The governed-surface unified definition now names the cross-repo extension: agent-instruction files in objectui, cloud and objectos are governed alike — objectos instruction-file PRs stay draft/human-merge even though execution routes to devx. A dispatch-expectations notice records that objectos has no changeset flow, no packages/, no merge queue and a different CI shape. ensure-pm-labels.sh: objectos joins the pm state-machine vocabulary loop; deliberately excluded from the domain-lane and target: loops (comments say why). Retired-lane exclusions untouched. Maintainer ruling 2026-08-18, verbatim: 「就按 B,带你补的两条,落地吧」 Line-ratchet payment (682/682, headroom 0): the +7 added lines are paid by deleting Guardrails text that survives verbatim elsewhere (the PM-writes-no-files exception in the seat invariants; the release-act list and the governed ban trio in AGENTS.md / the ACCEPT path fork; the duplicated AGENTS.md-wins line). Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01WswfK2yNYT9hNnMH6TzAwL --- .claude/skills/pm-dispatch/SKILL.md | 38 ++++++++++++++--------------- scripts/pm/ensure-pm-labels.sh | 9 ++++++- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 7118225928..dbd9d591dd 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -141,7 +141,11 @@ references);② 创建后手动 fire 一轮烟测,判据取**GitHub 上的产出 ## 多仓协调(五条规则) 产品横跨三仓,依赖方向固定:`objectstack`(后端;`packages/spec` 是唯一契约)→ `objectui`(前端,构 -建产物经 `pnpm objectui:refresh` 回流)与 `cloud`。 +建产物经 `pnpm objectui:refresh` 回流)与 `cloud`。第四仓 `objectos`(纯文档与站点,不入上述依赖链): +分诊照扫,执行折入 `domain:devx`(已辖 `content/docs/**` + `apps/docs`),⛔ 现在不铸 `repo:objectos` +座位;规则 4 预登记的拆分触发任一命中(单轮逼近 fire 周期 / objectos 队列持续断粮)⇒ 升格完整座位, +是记录在案的转换(维护者 2026-08-18:「就按 B,带你补的两条,落地吧」)。该仓无 changeset 流、无 +`packages/`、无合并队列(落地 = 人工合并),CI 形状与三仓不同 —— 派发预期照实设,⛔ 不要求不存在的机制。 1. **Issue 住在修复落地的仓,分诊时按判据严格执行**(维护者 2026-08-10 裁决;2026-08-16 重申收紧)。判 据:正文抽掉 objectstack 还成立 ⇒ file-at-destination,分诊当场转仓 —— console/UI 缺陷即转 objectui @@ -156,7 +160,7 @@ references);② 创建后手动 fire 一轮烟测,判据取**GitHub 上的产出 3. **联动杂事立单,不靠记忆。** 已验收 PR 的产物流向另一仓时,由**接受那个 PR 的执行座位**立即 在消费仓立后续单(带 `Blocked-by:`);`domain:*` 仍由分诊补。 4. **纵向拆分:一个分诊 PM + N 个执行 PM,一人一车道双射**(维护者 2026-08-05 拍板;2026-08-16 裁 - 定分诊统一收归一座)。分诊座位**三仓唯一**:objectstack、objectui、cloud 全部 backlog 的分诊/ + 定分诊统一收归一座)。分诊座位**四仓唯一**:objectstack、objectui、cloud、objectos 全部 backlog 的分诊/ 定级/路由/type 由它一座生产,只扫/分类/打标签/拆分/查重/转仓,⛔ 永不认领、永不派发、永不写代 码。执行座位信任标签、只在本车道认领,误标**不自行改**、留言上报;姊妹仓 `repo:*` 座位收窄为** 执行座位**(在本仓认领/派发/复核/落地,同一套执行座位纪律,⛔ 不产 `domain:*`/type/定级;skills @@ -245,8 +249,8 @@ of record)。**读侧闭环(维护者 2026-08-12 批准):接管与巡检只读 ## 分诊座位职责 -(执行座位 ⛔ 跳过本节动作 —— 读到标签当既成事实。)本节全部职责**对三仓统一执行**(维护者 -2026-08-16 裁定):sweep、首触定级、发版板、查重/shadow 检查与代裁通道逐仓各跑一遍;**代裁权限唯 +(执行座位 ⛔ 跳过本节动作 —— 读到标签当既成事实。)本节全部职责**对四仓统一执行**(三仓归一维护者 +2026-08-16 裁定,objectos 并入 2026-08-18 裁定):sweep、首触定级、发版板(objectos 无发版板,跳过)、查重/shadow 检查与代裁通道逐仓各跑一遍;**代裁权限唯 一归本座位**,任何执行座位(含姊妹仓 `repo:*`)⛔ 不代裁。 **Backlog sweep(常设职责,不等请求)。** 每轮扫任一析取命中的卡:① 全裸(无`pm:*`、 @@ -275,11 +279,11 @@ objectui pin 落后且其队列已空 ⇒ 在本仓立/刷新 console bump 单; 扫必烂),新卡即时打、存量卡下次碰到补。读者三个:代裁路由(`Feature` 机械落人工地板,`Bug`/ `Task` 才是代裁候选)、发版板缺陷扫描(`type:Bug is:open`)、普通队列 Bug 优先平手判据。 -**路由即分诊的技术判断,永不升级「哪个仓?」。** 读三仓代码定落点;跨仓的按contract-first 拆分; +**路由即分诊的技术判断,永不升级「哪个仓?」。** 读四仓代码定落点;跨仓的按contract-first 拆分; 父单已有子结构的,父单队列标签即可(sub-issue 自动成为候选),分诊逐个展开路由、补 `Blocked-by:` 排序,父单是协调节点**永不派发**。每张留一条英文审计评论(「Triage: lands in …; rationale: …」) ,可选带 `Size/model suggestion:` 行供执行席参考。跨仓查重(shadow 检查):跟跨仓引用 + 关键词搜 -两姊妹仓 —— 在飞 ⇒ `Blocked-by:` 不派;open 未认领 ⇒ 先收敛成一个派发入口;已完成 ⇒ 卡可能过期 +各姊妹仓 —— 在飞 ⇒ `Blocked-by:` 不派;open 未认领 ⇒ 先收敛成一个派发入口;已完成 ⇒ 卡可能过期 。**「生产者在哪?」是常设分诊问题**:declared ≠ enforced 形状的卡先问谁在写这个字段 —— 答案通 常就是根因,并在派发前改变卡的范围与域标签。 @@ -495,7 +499,9 @@ not-reachable 是设计非故障(维护者 2026-08-11 裁定)⛔ 不复测;**接 **ACCEPT 之后的路径分叉(动手之前先分,不是事后对照)。** 翻 ready / 挂 auto-merge / 入队前,先 取一次 PR 的路径面(`get_files`,⛔ 不看报告自述)。governed 面统一定义(维护者 2026-08-18 「同意」):`docs/adr/**` + `.claude/**`(全量,含 agents/hooks/settings)+ `skills/**` + -`AGENTS.md` + `CLAUDE.md`。路径面**一条命中** ⇒ ACCEPT 换终局三件套:① 复核结论照常写在 +`AGENTS.md` + `CLAUDE.md`;agent 指令文件按此跨仓同判 —— objectui、cloud、objectos 一并在内(维护者 +2026-08-18:「任何对 agents.md 等文件的修改…包括 objectui cloud仓库」→「同意」;objectos 执行虽折 +入 devx,其指令面 PR 照样 draft/人工合并)。路径面**一条命中** ⇒ ACCEPT 换终局三件套:① 复核结论照常写在 issue 上(不能合 ≠ 不复核;技能面 PR 的复核席须跑在契约复审档位,档位单源见条款②闸门); ② PR 留给维护者,**看得见地悬着** —— **人工合并即审核记录,本条座位纪律是唯一的 merge 前防线** (per-PR 事前门已退役,没有机器会替你挡):⛔ 永不翻 ready、永不入队、永不挂 auto-merge;③ 轮次报 @@ -621,20 +627,15 @@ pull(今天谁撞上;零拉动默认 defer/ remove);③ AI-agent error-resistanc ## 护栏(Guardrails,有约束力) -- PM **不写任何文件**;合并只对**已复核全绿的 dev-agent PR 经合并队列**发生 —— 永不合自己 - 的 PR、永不合红的或未复核的、永不绕过队列。唯一例外(维护者 2026-08-06 批准):维护者逐 PR 明 - 示授权的 `.claude/` 内部工具 PR,授权原话引用在 PR 正文,复核需另一座位或维护者 walkthrough,⛔ 不得自审自合。 -- **版本发布必须人工**(维护者 2026-08-07 拍板)。任何 AI 座位 ⛔ 不得执行或触发发布动作 - :`changeset publish` / release 脚本、推版本 tag、`workflow_dispatch` 触发发布类 workflow、 - **合并 Version Packages PR**。围绕发布的工作(发版板、pin bump、对账、状态核验)照旧归座位; - 「发布」本身不归任何座位。发现未经人工的发布痕迹按事故立案,⛔ 不代跑补救性发布 —— 机械通道 - 的存在不构成授权,遇到那类通道当缺陷上报。 +- PM **不写任何文件**(唯一例外及其全部条件见全体座位不变量,⛔ 不另抄第二份);合并只对**已复核 + 全绿的 dev-agent PR 经合并队列**发生 —— 永不合自己的 PR、永不合红的或未复核的、永不绕过队列。 +- **版本发布必须人工**(维护者 2026-08-07 拍板;发布动作的完整清单与「围绕发布的工作照旧归座位」 + 细则以 AGENTS.md「release act」段为权威,含**合并 Version Packages PR**)。发现未经人工的发布痕 + 迹按事故立案,⛔ 不代跑补救性发布 —— 机械通道的存在不构成授权,遇到那类通道当缺陷上报。 - **Governed 面由维护者人工合并,合并即审核记录**(三裁一脉:2026-08-08「adr 只能由维护者自己确 认,人工合并,ai 不得擅自合并」;2026-08-11「所有 skills 的更新和adr 类似,需要人工审核」; 2026-08-18 对「人工合并即人工审核,事后审计代替事前门」整包:「同意。」)。面 = ACCEPT 路径分叉 - 的统一定义;任何 AI 座位对 governed PR ⛔ 不得合并、入队、挂 auto-merge —— 唯一的 merge 前防线 - (per-PR 门已退役);起草、推分支、开 PR 都可以,「已复核 + 已批准 + 全绿」不构成例外;已入队 - 只有转 draft 才真的离队。事后防线 = 审计清单,维护者不认识的条目 = 席位违规,立案回滚。 + 的统一定义,禁令三条与离队出口同见该节;事后防线 = 审计清单,维护者不认识的条目 = 席位违规,立案回滚。 - **决定属于维护者:永不代维护者回答产品/架构问题**(唯一例外:分诊职责里已裁的代裁车道,边界恰 与其置信门重合,不得更宽);**永不派发 assignee 是别人的 issue;永不派发带 `needs-user-decision` 的 issue**。 - 每个 dev agent 都在**每仓专属的自有 worktree** 里干活(hook 强制;os-dev 定义重申);并行度 @@ -642,7 +643,6 @@ pull(今天谁撞上;零拉动默认 defer/ remove);③ AI-agent error-resistanc 报降到区域级,不是取消不相交)。**分诊座位永不认领、永不派发、永不写代码;执行座位只在自己那 一个车道认领**(例外两条:分诊指定的跨域例外单、简单阻塞项直接接手);**`domain:*` 只有一个生 产者**,执行座位不改标签只上报误标。 -- 与 AGENTS.md 冲突时,**AGENTS.md 胜**。 ## 报告契约(Report contract,os-dev 返回什么) diff --git a/scripts/pm/ensure-pm-labels.sh b/scripts/pm/ensure-pm-labels.sh index 01ff6cfc90..7978c77424 100644 --- a/scripts/pm/ensure-pm-labels.sh +++ b/scripts/pm/ensure-pm-labels.sh @@ -28,7 +28,14 @@ set -uo pipefail -for R in objectstack-ai/objectstack objectstack-ai/objectui objectstack-ai/cloud; do +# objectos joined the triage sweep under Option B (maintainer ruling 2026-08-18, +# 「就按 B,带你补的两条,落地吧」): it gets the full pm state-machine vocabulary +# below, but stays OUT of the domain-lane loop (lanes are main-repo-only — its +# execution folds into domain:devx) and OUT of the target: loop (docs/site +# repo, no changeset/release flow, no release board). Those absences are +# deliberate, not oversights. Actually RUNNING this against objectos is a PM +# landing step (needs label-write credentials on that repo). +for R in objectstack-ai/objectstack objectstack-ai/objectui objectstack-ai/cloud objectstack-ai/objectos; do gh label create pm:queue -R "$R" -c 0e8a16 -d "Ready for the PM dispatch loop" 2>/dev/null || true gh label create pm:dispatched -R "$R" -c 1d76db -d "Dispatched to a dev agent by /pm-dispatch" 2>/dev/null || true gh label create needs-user-decision -R "$R" -c d93f0b -d "Blocked on a maintainer decision — do not dispatch" 2>/dev/null || true