Repository navigation
Commit 2ba7a9d
docs(pm-dispatch): name triage's repos, land freezes as holds, give cloud an unlock probe (#31347)
<!-- claude-projects-attribution: {"github_login":"huangyiirene"} -->
_Requested by **Irene** · [project
thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67xAQaeBj4BUUmjMmr15N3ngj)_
Fixes #31332
Clause-②: no
Metadata-protocol: none
`dispatch-gates --tier` reads no path-derived model mandate for this
diff. Any mandate above the thread's would be waived by the maintainer's
standing order in this project (2026-11-03). The dispatching seat
(domain:skills#3) runs the contract review.
## 维护者速读
- 改了什么:pm-dispatch 三处文字缺口各补一行。① 分诊日对账写明两仓是 `objectstack-ai/objectstack`
与 `objectstack-ai/cloud`,cloud 卡的首触归 `repo:cloud` 席自巡;② 冻结裁决要同笔挂
`pm:on-hold` + `Restart-when:`,分诊入队前先读最新转换评论,是冻结就挂 `pm:retriage` 不入队;③
cloud 跨仓解锁的探针是 `git merge-base --is-ancestor`,没进 pin 就把 `Blocked-by:` 改指
pin-bump 卡。
- 为什么改:cloud 席 11-08 盘点测得三处卡点(#31332):cloud 仓 6 张新卡无人首触;5 张冻结卡被分诊放回
`pm:queue`;2 张卡上游已关但修复不在 cloud 的 pin 里。
-
风险与回滚:纯文字,不改脚本;三个文件行数不变(100/100、41/41、47/47,无上限上调),每加一行都删掉同文件一行复述,去处见下表;不发版(`skip-changeset`);回滚即
revert。
- 先看:`triage-duties.md` L8-L9 与 L40;`state-machine.md`
L16;`cross-repo-coordination.md` L28。
- 两分钟验证:`node scripts/pm/check-skill-line-ratchet.mjs`(三文件余量 0,新行都在 120
字节内);`pnpm check:pm-skill-id-lint`。
- 需要你做的:无。`check-governed-merges --test` 判为 Tier S(`.claude/**`),席位契约复审
PASS 后由席位落地。
## The three gaps (card numbering)
### Gap 1 — cloud cards get no first touch (seat ruling: shape (b))
`references/triage-duties.md` L8, split into L8-L9:
```diff
-- 每日一 fire 跑两仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器,简报写明层。
+- 每日一 fire 跑两仓全量对账(`objectstack-ai/objectstack`、`objectstack-ai/cloud`)并归集日频职责;
+- 选层按 fire 时刻 ⛔ 不用计数器,简报写明层;cloud 卡首触归 `repo:cloud` 席自巡,见多仓协调。
```
Bytes: 120 → 115 + 120. The repositories are named (objectui is
archived, so it is not listed). The cloud first-touch owner is stated as
a pointer: its home is `references/cross-repo-coordination.md` (title
「多仓协调」) L5-L7, which already says a single-lane repo's `repo:*` seat
does its own 机械三务, first touch included, and lists `cloud` as
single-lane. No SKILL.md line and no second reader (shape (a)) were
added.
### Gap 2 — a freeze recorded only in a comment is undone (seat ruling:
both (i) and (ii))
(i) `references/state-machine.md`, new L16 in § `pm:on-hold`:
```diff
- hold 评论写明日期、理由与出处(维护者裁或座位定级),⛔ 不设第二个标签区分两者。
+- 冻结(freeze)裁决与 `pm:on-hold`+`Restart-when:` 同笔落地;只写评论不挂标 = 半状态。
```
Bytes: new line 104.
(ii) `references/triage-duties.md`, new L40 after the `pm:queue` entry
criteria:
```diff
- `pm:queue` 也收恢复不变量的 finding、test-only pin,与实现未被裁错的说明书脱节(修文档)。
+- 入 `pm:queue` 前读最新转换评论(dispatch-runbook 状态提取):hold/冻结/裁决即改挂 `pm:retriage`。
```
Bytes: new line 117. It points to `references/dispatch-runbook.md` L59
(「状态提取 = 找最新转换评论…」) and does not restate it.
### Gap 3 — cross-repo unlock for cloud has no probe
Home: `references/cross-repo-coordination.md`, new L28 right after the
downstream `Blocked-by: <owner/repo>#<n>` rule (L27). This is the file
that holds the cloud lane's cross-repo rules. `SKILL.md` L137-L139 (the
rule and the published-package case) is untouched; cloud consumes
objectstack by a commit pin, not a published package, so this is the
pin-consumer case beside it.
```diff
- 下游带 `Blocked-by: <owner/repo>#<n>`;`Blocked-by` 未关闭/未合并的不派发,对 GitHub 现验。
+- cloud 探针 `git merge-base --is-ancestor <修复sha> <.objectstack-sha>`;不过 `Blocked-by:` 改指 pin-bump 卡。
```
Bytes: new line 120. "pin-bump 卡" is the existing term for a
wait-for-release target (`state-machine.md` L25, 「等发布的目标 = pin-bump
杂事卡」), so no new vocabulary.
The pin file's name was checked in this repo:
`packages/spec/CHANGELOG.md` L72113 ("cloud's hosted runtime … once the
`.objectstack-sha` pin moves past this release") and
`packages/services/service-automation/src/sys-automation-run.object.ts`
L133 ("the two cloud-side pins … follow at the next `.objectstack-sha`
bump").
## Line budget
| File | Lines before → after (ceiling) | Edited lines (bytes) |
|---|---|---|
| `references/triage-duties.md` | 100 → 100 (100) | L8 120 → 115; L9 new
120; L24 89 (rewritten from two lines of 116 and 117); L40 new 117 |
| `references/state-machine.md` | 41 → 41 (41) | L16 new 104 |
| `references/cross-repo-coordination.md` | 47 → 47 (47) | L28 new 120 |
| `SKILL.md`, `dispatch-runbook.md` | untouched (319, 245) | — |
No ceiling raised and the ratchet script is untouched. Every edited line
is ≤120 bytes, measured without the newline.
## Deletions and their homes
Each cut line's facts are listed, with where each one still lives.
1. `triage-duties.md` old L12 「分诊旧记录过期:delta 复审归车道或复审席,照
contract-review.md;⛔ 分诊不再审。」 (103 B). Facts: a triage review record on
an old head has expired; the delta review goes to the lane or the review
seat; triage does not re-review. Homes: `references/contract-review.md`
L23 (an owed PR head with no record goes to the review seat first, the
lane next, 「⛔ 非分诊」) and `references/lanes/review.md` L15 (delta review
goes to the original reviewer; a stood-down reviewer's old record goes
to the next review seat).
2. `triage-duties.md` old L24-L25, two lines replaced by one (new L24,
89 B). Facts in the two lines: on an anchor card's close, in the same
round, read the open PRs whose body starts with `Waits-on: main-red #n`;
knock each PR's seat once with `Notify: main-green`; the knock count
goes into the round record; with no triage seat, the director does it;
plus a worked example. Homes: `references/project-forms.md` L43
(「锚卡关闭:分诊(缺则总监)→正文带 `Waits-on: main-red #n` 的每张 open PR 之席 `Notify:
main-green`」) holds the trigger, the `Waits-on:` read, the per-PR
`Notify:` and the director fallback. The new L24 keeps 「同轮」, 「一 PR 一敲」
and the count into the round record. The example is dropped as
illustration only.
3. `state-machine.md` old L7 「六态 =
`pm:{queue,dispatched,blocked,on-hold,awaiting-maintainer}` 加
`needs-user-decision`,皆 issue 态。」 (113 B). Facts: the six states' names;
they are issue states. Homes: `SKILL.md` L123 (「五个 pm 状态标签加
`needs-user-decision` 共六态互斥」) and the 〈状态模型〉 table L104-L110, whose
column is 「issue 上的信号」 and which names each of the six labels, with L107
saying `needs-user-decision` only goes on issues, never PRs.
`state-machine.md` L3 points to that section.
4. `cross-repo-coordination.md` old L38 「代扫在分诊座位有主时立即停止。」 (47 B). Fact:
the stand-in triage sweep stops once the triage seat is filled. Home:
the line above it, L37 (now L38), grants the stand-in sweep only
「多车道仓分诊空缺时」, so the permission ends when the seat is filled.
## open_questions
1. Gap 3 probe spelling: the card writes `$(cat .objectstack-sha)` "in
the objectstack checkout", but `.objectstack-sha` sits in the cloud repo
(this repo has no such file), so `cat` from an objectstack checkout
would fail. The line uses the placeholder `<.objectstack-sha>` (the sha
that file holds) instead. Seat's call: keep the placeholder, or spell
the runnable form `git -C <objectstack checkout> merge-base
--is-ancestor <sha> $(cat .objectstack-sha)` from the cloud root, which
does not fit one 120-byte line.
2. Gap 2 (ii) follows the card and triage's comment 6716413688: triage
files `pm:retriage` on a hold/freeze/ruling. `state-machine.md` L39-L40
says the seat that files `pm:retriage` posts the objection comment in
the same write and triage answers it. With triage as the filer, the lane
that owns the freeze is the natural answerer. The line does not restate
that; say if you want it spelled.
## Gates
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives 19 commands (exit 0). All 19 exit 0
on `bf2784bb` (base `30e0bd16`) and again on the merged head `b0bc3c19`
(after merging `origin/main` `236af73f`; the derived list is identical).
Run under `NODE_OPTIONS=--max-old-space-size=8192`, after `turbo run
build` of `@objectstack/formula`, `@objectstack/lint` and
`@objectstack/objectql` (exit 0).
```
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/pm/check-harness-current.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-half-states :: exit 0
pnpm check:pm-label-write :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pm-skill-ratchet :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:watch-hint-literal :: exit 0
```
Also: `pnpm check:pm-dispatch-gates` exit 0 (not derived; run on
`bf2784bb`, 2205 fast-tier cases), `node
scripts/pm/check-governed-merges.mjs --test <the 3 paths> --additions 6
--deletions 6` exit 0 (Tier S, `.claude/**`), `node
scripts/check-commit-card-trailers.mjs --range origin/main..HEAD` exit
0. Changed lines: 12 (+6 / -6), 3 files. No changeset: `.claude/**`
publishes nothing (`skip-changeset`).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01J8VVAkshPHjkDucBpSLdam
Co-authored-by: Claude <noreply@anthropic.com>1 parent f6199a8 commit 2ba7a9d
3 files changed
Lines changed: 6 additions & 6 deletions
File tree
- .claude/skills/pm-dispatch/references
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| |||
35 | 36 | | |
36 | 37 | | |
37 | 38 | | |
38 | | - | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
8 | 7 | | |
9 | 8 | | |
10 | 9 | | |
| |||
14 | 13 | | |
15 | 14 | | |
16 | 15 | | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
| 8 | + | |
| 9 | + | |
9 | 10 | | |
10 | 11 | | |
11 | 12 | | |
12 | | - | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
25 | | - | |
| 24 | + | |
26 | 25 | | |
27 | 26 | | |
28 | 27 | | |
| |||
38 | 37 | | |
39 | 38 | | |
40 | 39 | | |
| 40 | + | |
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
| |||
0 commit comments