You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 0629071
Browse filesBrowse the repository at this point in the historyBrowse 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>
# repo:cloud to match while you are here: under --reconcile that rewrites a LIVE
385
385
# label object's colour, which is a deliberate PM action and not this row's.
386
386
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
388
388
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
389
389
390
390
# ⛔ There is no fourth `repo:*` row, and that absence is now DECLARED rather
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
472
472
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
473
473
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
# 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
0 commit comments