Skip to content

Commit 2ba7a9d

Browse files
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/cross-repo-coordination.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
- 规则 2:跨层功能点或 `ui/` 消费的 `Seam:` 卡恒由分诊立父单 + 逐层子单,spec/后端先行。
2626
- `main` 有 `ui/` 起,新 spec 键不再先行、取代上句次序:与首个读者同 PR,hotcrm 读者同合并批。
2727
- 下游带 `Blocked-by: <owner/repo>#<n>`;`Blocked-by` 未关闭/未合并的不派发,对 GitHub 现验。
28+
- cloud 探针 `git merge-base --is-ancestor <修复sha> <.objectstack-sha>`;不过 `Blocked-by:` 改指 pin-bump 卡。
2829
- 被链接或同父的两单永不同批;`ui/` 起的新键与首个读者除外,⛔ `planned` 行不单独进 main。
2930
- 规则 3:联动杂事立单,不靠记忆。
3031
- 已验收 PR 的产物流向另一仓,接受该 PR 的执行席立即在消费仓立后续单,带 `Blocked-by:`。
@@ -35,7 +36,6 @@
3536
- 维护者直派通道:当面指挥的 PM 会话直接路由,只对明示指挥的卡成立。
3637
- 直派的审计评论逐字引用授权指令。
3738
- 多车道仓分诊空缺时,会话型执行 PM 可代扫:只做分诊动作,不跨车道认领,贴上注明。
38-
- 代扫在分诊座位有主时立即停止。
3939
- 规则 5:一块板不设第二跟踪器:pm 标签就是状态机,看板(org Project)只是维护者的聚合视图。
4040
- 认领即跟到 MERGED:派发后发现跨车道面(含 spec)不移卡,复核按面定档,未达档借隔离复核。
4141
- 复核记录带 `Implemented-by:`/`Reviewed-by:`;改路由(`pm:retriage` 或席改标)只对未派发卡。

‎.claude/skills/pm-dispatch/references/state-machine.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
## 跨状态通则
66

7-
- 六态 = `pm:{queue,dispatched,blocked,on-hold,awaiting-maintainer}` 加 `needs-user-decision`,皆 issue 态。
87
- 六态 ONE-OF 的成因恒是半写的转换;判定以 `check-half-states.mjs` 的 H29/H30 为权威。
98
- 生成物不分叉:`skills/**` 生成器产物跑 `check-governed-merges.mjs --test`,⛔ 不按路径手判。
109
- 交接即标签:只写交接评论而不同笔挂标 = 空交接,收件箱只认标签。
@@ -14,6 +13,7 @@
1413
- 合法性:正文或评论带 `Restart-when: closed <owner/repo>#N`,由 `Blocked-by:` 同遍解锁扫描点火。
1514
- 或带 `Restart-when: <一行可执行判据>`;两种拼写之外的 hold ⛔ 不合法。
1615
- hold 评论写明日期、理由与出处(维护者裁或座位定级),⛔ 不设第二个标签区分两者。
16+
- 冻结(freeze)裁决与 `pm:on-hold`+`Restart-when:` 同笔落地;只写评论不挂标 = 半状态。
1717
- 机会主义重启的触发文件走 `Restart-touch: <仓内相对路径>`,一行一路径,值须为 tracked 文件。
1818
- 该行大小写敏感、行锚定,与另两行同双通道,喂 H17 触发文件索引;存量 hold ⛔ 不迁移。
1919
- 放行双查皆机械:只放最近一次 hold/blocked 转换评论的条件;其后卡上有新 merged PR 即拒。

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
- ⛔ 分诊 fresh session 开局不做泛关键词 ToolSearch;可验判据:空转轮 ~4 万 token 以内。
66
- 两级盘点:小时轮以 `since` 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。
77
- 查重缓存住席内:新会话全量拉,其后 `since` 增量;⛔ 不建分支、不共享、不依赖备份。
8-
- 每日一 fire 跑两仓全量对账并归集日频职责;选层按 fire 时刻 ⛔ 不用计数器,简报写明层。
8+
- 每日一 fire 跑两仓全量对账(`objectstack-ai/objectstack`、`objectstack-ai/cloud`)并归集日频职责;
9+
- 选层按 fire 时刻 ⛔ 不用计数器,简报写明层;cloud 卡首触归 `repo:cloud` 席自巡,见多仓协调。
910
- 每条枚举比对返回数与 `totalCount`,不等 ⇒ 报 `sweep INCOMPLETE` 点名缺口,⛔ 永不报干净。
1011
- 轮次记录按车道计欠审逾一轮的 head 数并点名车道(`check-owed-reviews.mjs`),只报 ⛔ 不接审。
1112
- 轮次记录分写「决策卡 N」与「待您审合 PR M」,不合计;后者 = open `pm:awaiting-merge` PR。
12-
- 分诊旧记录过期:delta 复审归车道或复审席,照 contract-review.md;⛔ 分诊不再审。
1313
- 析取 ①全裸(无 `pm:*`/`needs-user-decision`/`domain:*`);② `pm:queue` 无 `domain:*`(仅多车道仓);
1414
- ③ `domain:*` 无 pm-state;④ `pm:queue`+`domain:*` 无 `priority:*`;②③④ 只取 `updated_at` 早于 ~2min。
1515
- 排除 `tracking`、`status:parked`、全部 `pm:seat` 贴、`qa-run` 记录。
@@ -21,8 +21,7 @@
2121
- 每轮读上份轮次记录 fire 以来全部 main push、schedule 与队列结论,⛔ 不只读最新一跑。
2222
- 窗内无锚红当轮立锚卡、照首触定级,转绿照立并点名承修卡;逾 90 分钟无记录记明断档。
2323
- main-red 锚卡由席位先立先派,首触事后补作记录级:可改域,⛔ 不改动作,在飞照补。
24-
- 锚卡关闭同轮:读正文行首 `Waits-on: main-red #n` 的 open PR,一 PR 一敲其席 `Notify: main-green`。
25-
- 例:锚 #N 关 ⇒ 带 `Waits-on: main-red #N` 的 PR #a、#b 各一敲;计数进轮次记录;缺分诊归总监。
24+
- 锚卡关闭同轮照 project-forms.md 敲门,一 PR 一敲;敲门数进轮次记录。
2625
- 主干全量红与确定性队列红首触定 p0(锚卡、根因卡、full-run 卡);flake 锚卡判确定性才升。
2726
- 车道席自分诊:本车道卡挡自有在飞(认领卡/PR/落地/拆分链)且证据清楚,方可首触定 p1/p2。
2827
- 证据 = 卡上引具名失败 check/run、复现读数或 pin 测试;记录照分诊格式贴卡,请分诊复审。
@@ -38,6 +37,7 @@
3837
- `tooling` 入 `pm:queue` 仅凭三门之一:首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面;
3938
- 或实测拖慢车队开发:正确源上假红/假绿、反复重跑、同因丢复核轮;卡须具名实例。
4039
- `pm:queue` 也收恢复不变量的 finding、test-only pin,与实现未被裁错的说明书脱节(修文档)。
40+
- 入 `pm:queue` 前读最新转换评论(dispatch-runbook 状态提取):hold/冻结/裁决即改挂 `pm:retriage`。
4141
- `needs-user-decision` = 设计卡、feature/契约形状提案、需要 appetite 的多周程序;只挂 issue。
4242
- 先例已定新键/值/导出名非契约形状提案;分诊审计 ⛔ 不自加门,唯语义/形状真分歧呈人。
4343
- 碰迁移形状或删已发布能力也进决策箱;说明书脱节不进:有裁定出处才是 (b),否则改文档。

0 commit comments

Comments
 (0)