Skip to content

Commit 0629071

Browse files
docs(pm-dispatch): a card that touches cloud goes whole to the cloud PM (#26749)
<!-- claude-projects-attribution: {"github_login":"zhuangjianguo"} --> _Requested by **Steedos** · [project thread](https://claude.ai/code/project/chan_018ETKaNwMZCNRYD7D8Q9Ubb?thread=cmsg_018ETKaNwMZCNRYD7D8Q9Ubb94MgYgf4gGRdZ3D5n9Qak9)_ No card: this implements the maintainer's direct instruction in a project thread (2026-10-27T14:12Z), verbatim: 「应该更新分诊和 skills,一个issue只要涉及 cloud ,就归 cloud pm 处理」. It follows the same maintainer's rule of 14:08Z the same day: 「cloud 相关的任务,转 cloud 车道处理」. ## What changes Triage and the pm-dispatch skill now route any card that touches cloud to the cloud PM as ONE card, instead of splitting it by repository: - **What "touches cloud" means:** the card needs cloud code read or changed, a cloud producer, a cloud fact (a reading only the cloud repo answers), or it carries a cloud half. - **Who "the cloud PM" is:** the `repo:cloud` seat, posts #6026 (seat 1) and #24145 (seat 2). That seat's own scope already reads "the cloud repo's queue plus the cards on objectstack that carry `repo:cloud`", so the routing label is `repo:cloud`, with `domain:cloud` beside it. - `SKILL.md` domain table: the `domain:cloud` row changes from "parked for the cloud PM to migrate" to this: - The whole card is the cloud PM's, and no objectstack lane claims it. - The cloud PM follows the card to closure. - Leftover objectstack-only work goes on a new card that states the cloud facts. - The row is 308 bytes, under its 341-byte pin. - `references/cross-repo-coordination.md`: - The seam rule now says a seam that touches cloud goes to the cloud PM. - The four lines that split a cloud card by repository are replaced. The old lines kept the objectstack half in its lane and parked the cloud half with `domain:cloud` + `status:parked`. The new lines say: - An objectstack card gets `domain:cloud` + `repo:cloud` and a live pm state. Its lane `domain:*` comes off, and it never gets `status:parked`. - A card in another repo is transferred to cloud when it can be. Otherwise a `repo:cloud` carrier card here carries the whole ask. - The card is never split, and no lane waits on a cloud reading. - An in-flight card found to touch cloud is released (`Release:` + `pm:retriage`) so triage can re-route it. Measured read points stay on the card. - `references/triage-duties.md`: the routing line says a cloud card is routed whole to the cloud lane. - `references/execution-duties.md`: a report or review that finds cloud releases the card to triage. It is not split. A routed card carries no lane `domain:*`, so a lane's candidate query no longer returns it. - `scripts/pm/ensure-pm-labels.sh`: the `domain:cloud` comment quotes the new ruling and says it supersedes the 2026-09-18 parking ruling. Both label descriptions say what the label now means and stay within the 100-character cap. `--reconcile` realigns the existing label objects; this PR writes no labels. Every edited `.claude/` file stays at its line ceiling. Every prose line stays within the ratchet's 120-byte line budget. The text is replaced in place, so no line was added and no ceiling moves. **One rule is dropped:** the split-by-repository rule for "any unreachable repository". Cloud is the only private repository the fleet cannot read. The general cross-repo rules in the same file still cover dependencies: a transfer lands in the target's queue with `Blocked-by:`, and a cross-seat request rides on an existing card. ## Why Under the split rule, the objectstack half of a cloud card waits in a lane whose seats cannot read `objectstack-ai/cloud`. Two cards stalled that way on 2026-10-27: - #25908 (ui): the card thread stopped twice because the `visualize_data` result shape after cloud#3292 could not be read from the ui lane. Its cloud half was then split to #26744 and parked. - docs.objectos.ai#344 (docs, built from cloud code): it could not be dispatched from a seat without cloud access. The cloud PM can read both repositories, so the card goes to it whole. ## Verification Run in a fresh worktree after `pnpm install --frozen-lockfile`, on head 4199852. Exit codes were captured without pipes, and each gate exited 0: - `check:pm-skill-ratchet` (the first head 9958e02 went red here on the 120-byte line budget; fixed in 4199852) - `check:pm-skill-id-lint` - `check:pm-label-desc-cap` - `check:doc-authoring` - `check:pm-governed-prose` - `check:skill-frame-sync` - `check:skill-frame-freshness` - `check:skill-identifier-liveness` - `bash -n scripts/pm/ensure-pm-labels.sh` No script reads `domain:cloud` (grep over `scripts/pm/`), so no reader changes behaviour. `status:parked` keeps its H13 exemption for any other parked card. Clause-②: no Metadata-protocol: none ## 维护者速读 - **改了什么:** 分诊与 pm-dispatch 技能:一张卡只要涉及 cloud(要读或改 cloud 代码、cloud 生产方、cloud 事实,或带 cloud 半边),就整卡交给 cloud PM(`repo:cloud` 席),挂 `domain:cloud`+`repo:cloud`,本仓各车道不认领,也不再拆半边停放。 - **为什么改:** 按您 10-27 的指示;旧规则把 cloud 卡按仓拆开,本仓那一半留在读不到 cloud 的车道里干等,#25908 和 docs#344 今天就这样卡住。 - **风险与回滚:** 只改 PM 规则文字和标签说明,不动产品代码;回滚即 revert 本 PR。cloud 席的工作量会变大,存量停放卡也归它。 - **先看:** `references/cross-repo-coordination.md` 末四行(新的路由规则)和 SKILL.md 的 `domain:cloud` 行。 - **两分钟验证:** 读 diff;四个技能文件行数都不变,每行都在 120 字节内。 - **需要你做的:** `.claude/**` 是 Tier S,需要一份合约档复核记录(PASS)才能落地,按项目规则等总监席;或者您直接批准合并。 ## Not done here, on purpose - **No `references/lanes/cloud.md`.** The cloud seat post notes that this charter is missing. A new file needs a new ceiling row, and that needs a ruling record id, so the cloud seat's scope stays in its post. A follow-up can add the charter. - **No relabelling of existing cards** (#25908, #26744, other `domain:cloud` + `status:parked` cards). That is triage's work under the new rule once this lands. ## Human Minimum - [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic. (not touched) - [x] 2. Every name I added uses the casing for its kind. (no names added) - [x] 3. No formatter ran; `pnpm lint` passes. (no linted file touched) - [x] 4. One issue, one branch off an up-to-date `main`, one pull request. - [x] 5. A change that publishes carries a changeset: nothing publishes, so `skip-changeset` applies. - [x] 6. `packages/spec` touched: not touched. - [x] 7. No hand edits to `content/docs/references/`, `packages/*/CHANGELOG.md` or `content/docs/releases/`. - [x] 8. Title, body and comments are in English (the 维护者速读 section is the sanctioned Chinese channel). - [x] The *Before Submitting* list in CONTRIBUTING.md is done. --- _Generated by [Claude Code](https://claude.ai/code/session_01QsR2jTTwA6zymWJpVN94wd)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 857cd3c commit 0629071

6 files changed

Lines changed: 26 additions & 22 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
162162
| `domain:skills` | governed 面全量(含本文件;统一定义见「governed 面统一定义」行);非门禁的 `scripts/pm/**`(PM 循环工具);governed 面的治理执行文件:`.github/CODEOWNERS` + SUBJECT 是 governed 面本身的门禁/审计(现为 `scripts/pm/check-governed-merges.mjs`) |
163163
| `domain:spec` | `packages/spec` 整包:schema 形状、`contracts/**`、退役行为半边、strictness 台账;describe/JSDoc/墓碑散文/错误 guidance 与 alias 表;`packages/spec/scripts/**`、`packages/spec/docs/**` 及按锚定规则的例外归本域的工具链(域边界枚举与席内分派见 `references/lanes/spec.md`) |
164164
| `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` |
165-
| `domain:cloud` | 凡涉 cloud 即归 cloud PM(非按落点):停放(加 `status:parked`,sweep 免扫),本仓不派 |
165+
| `domain:cloud` | 涉 cloud 即整卡归 cloud PM(`repo:cloud` 席,同挂 `repo:cloud`):读或改 cloud 代码、生产方、事实或带 cloud 半边;本仓车道 ⛔ 不认领;cloud PM 跟到关卡,余下纯本仓活由它写明 cloud 事实后另立卡;判据见 `references/cross-repo-coordination.md` |
166166
| (无固定归属,按落点分诊) | `packages/apps/*`、`examples/*`(归它演练的子系统)、`docs/audits/**` |
167167

168168
- 表未覆盖的包首次分诊时归类并走 PR 更新本表;新增或退役 `domain:*` 必须同批改本表。

‎.claude/skills/pm-dispatch/references/cross-repo-coordination.md‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
- 车道可分席(席号 `· seat N`,或域×仓):忙时一车道开多席,闲时收归一席;每席独立座位贴。
1414
- 认领评论带 `Seat: domain:X#N` 行申报席号(缺省席 1);同席认领互斥,他席认领不触发自退。
1515
- 拆分触发预登记:单轮逼近 fire 周期,或某仓在全序下持续断粮 ⇒ 按仓拆回多席。
16-
- seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导。
16+
- seam 卡单一归属:归修复落地仓的席,双仓皆动 objectstack 侧主导;涉 cloud 者归 cloud PM(下文)。
1717
- `scripts/pm/**` 等住 objectstack 的全板工具链单写手恒为 objectstack 侧席,他侧上游立卡回链。
1818
- 工装只答被告知的仓,缺 `--repo`/`PM_SWEEP_REPO` 即答 objectstack;⛔ 不答手上那张卡的仓。
1919
- 规则 1:issue 住在修复落地的仓,分诊时按判据严格执行。
@@ -41,7 +41,7 @@
4141
- 转移落对方队列:目标仓立单带 `pm:queue`、出处行与一行可执行判据,依赖用 `Blocked-by:`。
4242
- 跨座位请求骑在它所关的既有卡上:请求席在自卡写 `Blocked-by:`,并在目标卡留一条评论。
4343
- 该评论点名席位与步骤;无既有卡承载且请求自身即立卡门 ①②④ 时才立新卡。
44-
- 跨不可达仓的卡立卡或首触按仓拆:该仓部分由可达席立卡,或挂 `domain:cloud`+`status:parked`。
45-
- 本卡只留本仓活,不读他仓;拆不开先立该仓前置卡;依赖即 `pm:blocked`+`Blocked-by: owner/repo#N`。
46-
- 开发中涉 cloud 车道者由席位同拆:报告 `open_questions`/`out_of_scope_findings`、复核/落地所见。
47-
- ⛔ 不记而弃、不并入本仓 PR、不留 `carrier: none`;停放卡加 `repo:cloud`,出处行与一行判据。
44+
- 涉 cloud 即整卡归 cloud PM(`repo:cloud` 席):要读改 cloud 代码、生产方、事实或带 cloud 半边。
45+
- 本仓卡挂 `domain:cloud`+`repo:cloud`+活态,摘车道 `domain:*`,⛔ 不挂 `status:parked`。
46+
- 他仓卡能转即转 cloud 仓,否则本仓立 `repo:cloud` 承接卡写全所求;⛔ 不拆半边等读数。
47+
- 在飞卡见涉 cloud 即 `Release:`+`pm:retriage` 交分诊转 cloud 车道,已测读点留卡。

‎.claude/skills/pm-dispatch/references/execution-duties.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@
175175

176176
- 你是记录在案的复核人:对 GitHub 核验,⛔ 不对报告的自述核验。
177177
- 逐项判据展开在 `references/review-checklist.md`,每份报告对着它过。
178-
- 报告 `open_questions`/`out_of_scope_findings` 涉 cloud 车道者,按 `cross-repo-coordination.md` 立 cloud 卡。
178+
- 报告或复核见涉 cloud ⇒ 整卡 `Release:`+`pm:retriage` 转 cloud 车道,读点留卡;⛔ 不拆半边。
179179
- 改到已有 `.changeset/*.md` 的 PR ⛔ 不打 `skip-changeset`;确认取同 head 达档 PASS 或维护者原话。
180180
- 报告在草稿 PR 时点到达,CI 收敛读数只属于复核侧:gate `in_progress` 是诚实读数。
181181
- 绿色输出≠ 该绿证明了被测风险:拒收断言、全绿方向与时序、pin 翻转、边界后收益。

‎.claude/skills/pm-dispatch/references/triage-duties.md‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,9 @@
5454
- 定义项取北极星「做出来的是什么」或仪器卡的车队决定;无则关;`none` 非分诊缺口。
5555
- 「无则关」= 首触即关 not_planned,带理由与入队三门,⛔ 不定 p3、不 hold;下行同此。
5656
- 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,三门皆无的 p2/p3 `tooling` 卡同样关。
57-
- 路由是分诊的技术判断,⛔ 永不升级哪个仓的问题;父单是协调节点,永不派发。
58-
- 涉 cloud 任一即算:修复/验收/必经步骤落 cloud 仓或托管面;cloud 卡半张或被其阻;因在 cloud。
59-
- 不算:只在 cloud 测得而修复与验收全在本仓;仅引 cloud 卡作历史;命中者归 cloud PM。
60-
- 已 `pm:dispatched` 到本仓车道的原地完工,评论注明涉 cloud 给 cloud PM,⛔ 认领中不迁。
57+
- 路由是分诊的技术判断,⛔ 不升级哪个仓的问题;涉 cloud 整卡归 cloud 车道;父单永不派发。
58+
- 算涉 cloud:亦含托管面(objectos-runtime)、`Blocked-by:` cloud 卡、病因在 cloud。
59+
- 不算涉 cloud:只在 cloud 测得而修复与验收全在本仓;仅引 cloud 卡作历史。
6160
- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。
6261
- 跨层功能点(≥2 层)立父单带 `area:*`+`pm:epic`+清单项级,逐层子单按 `Blocked-by:` 排。
6362
- 每张留一条英文审计评论(`Triage: lands in …; rationale: …`),可选带 `Size/model suggestion:` 行。

‎scripts/pm/check-skill-line-ratchet.mjs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,9 @@ export const CEILINGS = new Map([
13071307
// lane patrol (dispatch-runbook.md, line-neutral there). The human-ruling
13081308
// floor and the risk / workload tests stayed intact. Landed count, headroom 0,
13091309
// same convention (lowering is always legitimate).
1310-
['.claude/skills/pm-dispatch/references/triage-duties.md', 103],
1310+
// Lowered 103 → 102 when the whole-card cloud route (PR #26749) merged with
1311+
// main's cloud-involvement lines; landed count, headroom 0, same convention.
1312+
['.claude/skills/pm-dispatch/references/triage-duties.md', 102],
13111313
// execution-duties.md, raised 183 → 185 by the split-off-card ruling — an
13121314
// ORDINARY raise, ⛔ not a cross-file move (card #23579). The text is two rule
13131315
// lines beside the derived-sub-issue rules in 〈候选与批次〉: a queued card found

‎scripts/pm/ensure-pm-labels.sh‎

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ gh label create needs:contract-review -R objectstack-ai/objectstack -c bfdadc -d
384384
# repo:cloud to match while you are here: under --reconcile that rewrites a LIVE
385385
# label object's colour, which is a deliberate PM action and not this row's.
386386
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
387-
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
387+
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
388388
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
389389

390390
# ⛔ 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
471471
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
472472
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
473473

474-
# domain:cloud is a PARKING label, not a lane: no seat, never dispatched in this
475-
# repo. Cloud-service journeys found in objectstack / objectui keep it until the
476-
# cloud PM migrates them — maintainer ruling 2026-09-18, verbatim: 「云服务旅程
477-
# 混在 objectstack / objectui 里的 ⇒保留 domain:cloud 标签 等 cloud 项目经理迁移」.
478-
# The object already exists in objectstack (auto-created, so `--reconcile` is
479-
# what aligns it) and is absent in objectui; the roster makes both. SKILL.md's
480-
# domain table carries the matching row (北极星「现在不做」).
481-
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
482-
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
474+
# domain:cloud routes a WHOLE card to the cloud PM (the `repo:cloud` seat): any
475+
# card that needs cloud code, a cloud producer, a cloud fact or carries a cloud
476+
# half. No objectstack lane claims it; it rides with `repo:cloud`, the label the
477+
# cloud seat's scope reads. Maintainer ruling 2026-10-27, verbatim: 「一个issue只要
478+
# 涉及 cloud ,就归 cloud pm 处理」, superseding the 2026-09-18 parking ruling
479+
# (「云服务旅程混在 objectstack / objectui 里的 ⇒保留 domain:cloud 标签 等 cloud 项目经理
480+
# 迁移」): parked journeys are the cloud PM's too. The object already exists in
481+
# objectstack (auto-created, so `--reconcile` is what aligns it) and is absent in
482+
# objectui; the roster makes both. SKILL.md's domain table carries the matching
483+
# row, and references/cross-repo-coordination.md the routing rule.
484+
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
485+
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
483486
# status:parked is the other half of parking: the backlog sweep's disjunct ③
484487
# (有 domain:* 无 pm-state) and check-half-states.mjs's H13 read it as the
485488
# exemption (H13_EXEMPT_LABELS; SKILL.md 排除 `status:parked`), so a card that

0 commit comments

Comments
 (0)