diff --git a/.claude/skills/pm-dispatch/SKILL.md b/.claude/skills/pm-dispatch/SKILL.md index 700d7439ef9..9bc92296f67 100644 --- a/.claude/skills/pm-dispatch/SKILL.md +++ b/.claude/skills/pm-dispatch/SKILL.md @@ -162,7 +162,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报 | `domain:skills` | governed 面全量(含本文件;统一定义见「governed 面统一定义」行);非门禁的 `scripts/pm/**`(PM 循环工具);governed 面的治理执行文件:`.github/CODEOWNERS` + SUBJECT 是 governed 面本身的门禁/审计(现为 `scripts/pm/check-governed-merges.mjs`) | | `domain:spec` | `packages/spec` 整包:schema 形状、`contracts/**`、退役行为半边、strictness 台账;describe/JSDoc/墓碑散文/错误 guidance 与 alias 表;`packages/spec/scripts/**`、`packages/spec/docs/**` 及按锚定规则的例外归本域的工具链(域边界枚举与席内分派见 `references/lanes/spec.md`) | | `domain:ui` | `ui/**` 全部代码:`@object-ui/*` 库与 `ui/apps/*`、`ui/packages/types` 与 schema 语料、`ui/scripts` 与门禁工具、文档随所记录的面走;`packages/console`(dist 由 `pnpm console:build` 生成 ⛔ 不手改);协议恒归 `domain:spec`,受管面归 `domain:skills`;详见 `references/lanes/ui.md` | -| `domain:cloud` | 凡涉 cloud 即归 cloud PM(非按落点):停放(加 `status:parked`,sweep 免扫),本仓不派 | +| `domain:cloud` | 涉 cloud 即整卡归 cloud PM(`repo:cloud` 席,同挂 `repo:cloud`):读或改 cloud 代码、生产方、事实或带 cloud 半边;本仓车道 ⛔ 不认领;cloud PM 跟到关卡,余下纯本仓活由它写明 cloud 事实后另立卡;判据见 `references/cross-repo-coordination.md` | | (无固定归属,按落点分诊) | `packages/apps/*`、`examples/*`(归它演练的子系统)、`docs/audits/**` | - 表未覆盖的包首次分诊时归类并走 PR 更新本表;新增或退役 `domain:*` 必须同批改本表。 diff --git a/.claude/skills/pm-dispatch/references/cross-repo-coordination.md b/.claude/skills/pm-dispatch/references/cross-repo-coordination.md index 74e09c7b7c0..78a5fc4a130 100644 --- a/.claude/skills/pm-dispatch/references/cross-repo-coordination.md +++ b/.claude/skills/pm-dispatch/references/cross-repo-coordination.md @@ -13,7 +13,7 @@ - 车道可分席(席号 `· seat N`,或域×仓):忙时一车道开多席,闲时收归一席;每席独立座位贴。 - 认领评论带 `Seat: domain:X#N` 行申报席号(缺省席 1);同席认领互斥,他席认领不触发自退。 - 拆分触发预登记:单轮逼近 fire 周期,或某仓在全序下持续断粮 ⇒ 按仓拆回多席。 -- seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导。 +- seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导;涉 cloud 者归 cloud PM(下文)。 - `scripts/pm/**` 等住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链。 - 工装只答被告知的仓,缺 `--repo`/`PM_SWEEP_REPO` 即答 objectstack;⛔ 不答手上那张卡的仓。 - 规则 1:issue 住在修复落地的仓,分诊时按判据严格执行。 @@ -41,7 +41,7 @@ - 转移落对方队列:目标仓立单带 `pm:queue`、出处行与一行可执行判据,依赖用 `Blocked-by:`。 - 跨座位请求骑在它所关的既有卡上:请求席在自卡写 `Blocked-by:`,并在目标卡留一条评论。 - 该评论点名席位与步骤;无既有卡承载且请求自身即立卡门 ①②④ 时才立新卡。 -- 跨不可达仓的卡立卡或首触按仓拆:该仓部分由可达席立卡,或挂 `domain:cloud`+`status:parked`。 -- 本卡只留本仓活,不读他仓;拆不开先立该仓前置卡;依赖即 `pm:blocked`+`Blocked-by: owner/repo#N`。 -- 开发中涉 cloud 车道者由席位同拆:报告 `open_questions`/`out_of_scope_findings`、复核/落地所见。 -- ⛔ 不记而弃、不并入本仓 PR、不留 `carrier: none`;停放卡加 `repo:cloud`,出处行与一行判据。 +- 涉 cloud 即整卡归 cloud PM(`repo:cloud` 席):要读改 cloud 代码、生产方、事实或带 cloud 半边。 +- 本仓卡挂 `domain:cloud`+`repo:cloud`+活态,摘车道 `domain:*`,⛔ 不挂 `status:parked`。 +- 他仓卡能转即转 cloud 仓,否则本仓立 `repo:cloud` 承接卡写全所求;⛔ 不拆半边等读数。 +- 在飞卡见涉 cloud 即 `Release:`+`pm:retriage` 交分诊转 cloud 车道,已测读点留卡。 diff --git a/.claude/skills/pm-dispatch/references/execution-duties.md b/.claude/skills/pm-dispatch/references/execution-duties.md index e70294af154..5f9a001c3cf 100644 --- a/.claude/skills/pm-dispatch/references/execution-duties.md +++ b/.claude/skills/pm-dispatch/references/execution-duties.md @@ -175,7 +175,7 @@ - 你是记录在案的复核人:对 GitHub 核验,⛔ 不对报告的自述核验。 - 逐项判据展开在 `references/review-checklist.md`,每份报告对着它过。 -- 报告 `open_questions`/`out_of_scope_findings` 涉 cloud 车道者,按 `cross-repo-coordination.md` 立 cloud 卡。 +- 报告或复核见涉 cloud ⇒ 整卡 `Release:`+`pm:retriage` 转 cloud 车道,读点留卡;⛔ 不拆半边。 - 改到已有 `.changeset/*.md` 的 PR ⛔ 不打 `skip-changeset`;确认取同 head 达档 PASS 或维护者原话。 - 报告在草稿 PR 时点到达,CI 收敛读数只属于复核侧:gate `in_progress` 是诚实读数。 - 绿色输出≠ 该绿证明了被测风险:拒收断言、全绿方向与时序、pin 翻转、边界后收益。 diff --git a/.claude/skills/pm-dispatch/references/triage-duties.md b/.claude/skills/pm-dispatch/references/triage-duties.md index 0a55f8af332..7350765a325 100644 --- a/.claude/skills/pm-dispatch/references/triage-duties.md +++ b/.claude/skills/pm-dispatch/references/triage-duties.md @@ -54,10 +54,9 @@ - 定义项取北极星「做出来的是什么」或仪器卡的车队决定;无则关;`none` 非分诊缺口。 - 「无则关」= 首触即关 not_planned,带理由与入队三门,⛔ 不定 p3、不 hold;下行同此。 - 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,三门皆无的 p2/p3 `tooling` 卡同样关。 -- 路由是分诊的技术判断,⛔ 永不升级哪个仓的问题;父单是协调节点,永不派发。 -- 涉 cloud 任一即算:修复/验收/必经步骤落 cloud 仓或托管面;cloud 卡半张或被其阻;因在 cloud。 -- 不算:只在 cloud 测得而修复与验收全在本仓;仅引 cloud 卡作历史;命中者归 cloud PM。 -- 已 `pm:dispatched` 到本仓车道的原地完工,评论注明涉 cloud 给 cloud PM,⛔ 认领中不迁。 +- 路由是分诊的技术判断,⛔ 不升级哪个仓的问题;涉 cloud 整卡归 cloud 车道;父单永不派发。 +- 算涉 cloud:亦含托管面(objectos-runtime)、`Blocked-by:` cloud 卡、病因在 cloud。 +- 不算涉 cloud:只在 cloud 测得而修复与验收全在本仓;仅引 cloud 卡作历史。 - 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。 - 跨层功能点(≥2 层)立父单带 `area:*`+`pm:epic`+清单项级,逐层子单按 `Blocked-by:` 排。 - 每张留一条英文审计评论(`Triage: lands in …; rationale: …`),可选带 `Size/model suggestion:` 行。 diff --git a/scripts/pm/check-skill-line-ratchet.mjs b/scripts/pm/check-skill-line-ratchet.mjs index e03377ffc08..61e79c6ec96 100644 --- a/scripts/pm/check-skill-line-ratchet.mjs +++ b/scripts/pm/check-skill-line-ratchet.mjs @@ -1307,7 +1307,9 @@ export const CEILINGS = new Map([ // lane patrol (dispatch-runbook.md, line-neutral there). The human-ruling // floor and the risk / workload tests stayed intact. Landed count, headroom 0, // same convention (lowering is always legitimate). - ['.claude/skills/pm-dispatch/references/triage-duties.md', 103], + // Lowered 103 → 102 when the whole-card cloud route (PR #26749) merged with + // main's cloud-involvement lines; landed count, headroom 0, same convention. + ['.claude/skills/pm-dispatch/references/triage-duties.md', 102], // execution-duties.md, raised 183 → 185 by the split-off-card ruling — an // ORDINARY raise, ⛔ not a cross-file move (card #23579). The text is two rule // lines beside the derived-sub-issue rules in 〈候选与批次〉: a queued card found diff --git a/scripts/pm/ensure-pm-labels.sh b/scripts/pm/ensure-pm-labels.sh index f8bb15f9739..f515e2694b0 100644 --- a/scripts/pm/ensure-pm-labels.sh +++ b/scripts/pm/ensure-pm-labels.sh @@ -384,7 +384,7 @@ gh label create needs:contract-review -R objectstack-ai/objectstack -c bfdadc -d # repo:cloud to match while you are here: under --reconcile that rewrites a LIVE # label object's colour, which is a deliberate PM action and not this row's. gh label create repo:objectui -R objectstack-ai/objectstack -c fbca04 -d "Seam card: cross-repo ordering with objectui is the substance (pure objectui fixes live in objectui)" 2>/dev/null || true -gh label create repo:cloud -R objectstack-ai/objectstack -c c5def5 -d "Seam card: cross-repo ordering with cloud is the substance (pure cloud fixes live in cloud)" 2>/dev/null || true +gh label create repo:cloud -R objectstack-ai/objectstack -c c5def5 -d "Card routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)" 2>/dev/null || true gh label create repo:hotcrm -R objectstack-ai/objectstack -c fbca04 -d "Seam card: cross-repo ordering with hotcrm is the substance (pure hotcrm fixes live in hotcrm)" 2>/dev/null || true # ⛔ There is no fourth `repo:*` row, and that absence is now DECLARED rather @@ -471,15 +471,18 @@ gh label create domain:engine -R objectstack-ai/objectstack -c bfd4f2 -d "Reti gh label create domain:services -R objectstack-ai/objectstack -c bfd4f2 -d "Retired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed" 2>/dev/null || true gh label create domain:cli -R objectstack-ai/objectstack -c bfd4f2 -d "Retired 2026-10-22, alias of domain:server (cli surface); in-flight cards keep it until they land" 2>/dev/null || true -# domain:cloud is a PARKING label, not a lane: no seat, never dispatched in this -# repo. Cloud-service journeys found in objectstack / objectui keep it until the -# cloud PM migrates them — maintainer ruling 2026-09-18, verbatim: 「云服务旅程 -# 混在 objectstack / objectui 里的 ⇒保留 domain:cloud 标签 等 cloud 项目经理迁移」. -# The object already exists in objectstack (auto-created, so `--reconcile` is -# what aligns it) and is absent in objectui; the roster makes both. SKILL.md's -# domain table carries the matching row (北极星「现在不做」). -gh label create domain:cloud -R objectstack-ai/objectstack -c bfd4f2 -d "Cloud-service journey parked for the cloud PM to migrate — not dispatched in this repo (云服务旅程,本仓不派)" 2>/dev/null || true -gh label create domain:cloud -R objectstack-ai/objectui -c bfd4f2 -d "Cloud-service journey parked for the cloud PM to migrate — not dispatched from objectui (云服务旅程,本仓不派)" 2>/dev/null || true +# domain:cloud routes a WHOLE card to the cloud PM (the `repo:cloud` seat): any +# card that needs cloud code, a cloud producer, a cloud fact or carries a cloud +# half. No objectstack lane claims it; it rides with `repo:cloud`, the label the +# cloud seat's scope reads. Maintainer ruling 2026-10-27, verbatim: 「一个issue只要 +# 涉及 cloud ,就归 cloud pm 处理」, superseding the 2026-09-18 parking ruling +# (「云服务旅程混在 objectstack / objectui 里的 ⇒保留 domain:cloud 标签 等 cloud 项目经理 +# 迁移」): parked journeys are the cloud PM's too. The object already exists in +# objectstack (auto-created, so `--reconcile` is what aligns it) and is absent in +# objectui; the roster makes both. SKILL.md's domain table carries the matching +# row, and references/cross-repo-coordination.md the routing rule. +gh label create domain:cloud -R objectstack-ai/objectstack -c bfd4f2 -d "Touches cloud: the whole card is the cloud PM's (repo:cloud seat); no objectstack lane claims it" 2>/dev/null || true +gh label create domain:cloud -R objectstack-ai/objectui -c bfd4f2 -d "Touches cloud: the whole card is the cloud PM's (repo:cloud seat); objectui lanes never claim it" 2>/dev/null || true # status:parked is the other half of parking: the backlog sweep's disjunct ③ # (有 domain:* 无 pm-state) and check-half-states.mjs's H13 read it as the # exemption (H13_EXEMPT_LABELS; SKILL.md 排除 `status:parked`), so a card that