Skip to content

Commit 5f5f0b4

Browse files
chore(pm-dispatch): tooling cap per dispatch round, pm-rule cards on the maintainer's naming, two round-report readings, spec key lands with its first reader (D3 = A, D5 = A) (#25795)
<!-- claude-projects-attribution: {"github_login":"os-project-manager"} --> _Requested by **Leehom** · [project thread](https://claude.ai/code/project/chan_01TenzsRopZj4jMbvjX8uz1X?thread=cmsg_01TenzsRopZj4jMbvjX8uz1XDHT9sSVf8qP2xerGBcJSAC)_ Fixes #25768 Clause-②: no Metadata-protocol: none Writes the maintainer's rulings D3 = A and D5 = A into the pm-dispatch rule text. `.claude/**` only (Tier S); no package, no changeset (`skip-changeset`), no gate and no script. ## The ruling (verbatim, untranslated) Tesla, 2026-10-25T09:23Z, director thread, answering the assessment's option lists: > 「D4 · 固定发版日 没必要;其他同意 ,npm dist-tag 手工清理 应该立一张管理者维护的卡」 "其他同意" = D3 A and D5 A as the card spells them. Triage record 6396195056: the cap is reported, not enforced (「不做门禁」). D4 and the npm dist-tag card are out of scope here. ## What changed, rule by rule (each rule has one home) | Ruling part | Home | Text | |---|---|---| | D3 ≤10% `tooling` per dispatch round, overflow stays in backlog, no gate | `references/execution-duties.md` 〈候选与批次〉, right under the candidate line | new line; ⛔ no gate, no script | | D3 the `tooling` label gains a reader | `SKILL.md` label glossary row | 三具名读者 → 四具名读者 (adds 每轮派发 ≤10%); this is the row the retired fleet one-slot reader used to sit in, so the cap folds there instead of a parallel rule | | D3 a pm-rule card is filed only when the maintainer names it, quoting the naming | `references/filing-gate.md` 〈立卡门〉, under ③ | new line: files as ③, body quotes the naming; ⛔ a seat's own proposal is not filed | | D3 consequence for handover reports | `references/seat-lifecycle.md` 〈座位贴协议〉 | 「原则错/缺 → skills 席专题」 becomes 「只进简报,维护者点名才立卡」; 「三类以 finding 入」 becomes 「后两类」 (in place) | | D3 two round-report readings | `references/seat-lifecycle.md` 〈轮次报告与节奏〉 | follow-up PRs opened within 48h of a landed PR; product-commit share = merged commits touching none of `.claude/`, `AGENTS.md`, `scripts/pm`, gate scripts, `.github/workflows` | | D5 a new spec key lands with its first reader; no `planned` row alone; hotcrm readers use the same merge batch; effective once `ui/` exists on `main` | `references/cross-repo-coordination.md` rule 2 | new line right under rule 2; it carries the cutover condition in words a seat can check (`ui/` on `main` — absent on `0790d0a4`), and until then rule 2's spec/后端先行 stands | ## Line budget (ratchet: paid by deletion, no ceiling raised) | File | Before / ceiling | After | Paid by | |---|---|---|---| | `SKILL.md` | 319 / 319 | 319 | in-place row edit (table row, length-exempt; widest row 341 = pin) | | `execution-duties.md` | 188 / 188 | 188 | deleted 「dev `pr_create` 带 `assignees: [LOGIN]`,同笔指派;席位自有 PR 指派自己」: the dev half is `os-dev.md` rule 2 verbatim (and this file's own 「无条件条款只住角色文件」), the seat half follows from the line above it (「PR assignee = 卡的」; a seat's card names the seat as assignee) | | `filing-gate.md` | 68 / 68 | 67 | deleted the back-pointer 「见 triage-duties.md 与 reading-discipline.md 的指针行」 and its blank line: both files already point here, and the line carried no rule. Headroom 1: lowering the row in `check-skill-line-ratchet.mjs` is outside this card's file surface | | `seat-lifecycle.md` | 95 / 96 | 96 | used the 1 line of headroom, and deleted 「awaiting a human merge 项」 from the round-report line, which `SKILL.md` already carries (「④ 轮次报告单列 awaiting a human merge」); the freed bytes carry the follow-up-PR reading | | `cross-repo-coordination.md` | 51 / 51 | 51 | deleted 「objectui 构建产物经 `pnpm objectui:refresh` 回流」, which AGENTS.md (Frontend section) carries; `lanes/ui.md`'s pointer moves from this file to AGENTS.md in place | | `lanes/ui.md` | 38 / 38 | 38 | pointer edit only | Corpus total over the six files: 759 → 759. No re-wrap: every freed line or byte comes from deleted text, named above. ## Gates (local, at `da43591c`) Re-derived on the rework head `da43591c` (cross-repo-coordination.md L28/L30 only): same 20 families, all 20 exit 0, `--ran` reconcile 20 run, 0 NOT-MEASURED. The first round below ran at `51664dd2`. Derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`; each run with its exit captured before any pipe; reconciled with `--ran`: `✓ dispatch-gates --ran: 20 derived famil(ies) accounted for — 20 run, 0 NOT-MEASURED`. All 20 exit 0, among them `pnpm check:pm-skill-ratchet`, `pnpm check:pm-skill-id-lint` (`87 file(s) clean`), `pnpm check:skill-frame-sync`, `pnpm check:pm-governed-merges`, `pnpm check:pm-governed-prose`, `pnpm check:nul-bytes`, `pnpm check:doc-authoring`. A first pass before `pnpm install` answered exit 3 (PREREQUISITE NOT MET) on eight families and exit 1 with `ERR_MODULE_NOT_FOUND` on `check:pm-expected-skips` (nothing measured); after install only `check:doc-formula-expressions` still answered 3, until `@objectstack/formula` and `@objectstack/lint` were built. Every family was re-run and recorded 0. CI runs the full set on the PR. ## Acceptance notes - `references/lanes/skills.md` points 「fold-or-serial 必答与家族派发五门」 at 「SKILL.md 批次独立性段」, but both live in `references/execution-duties.md` 〈候选与批次〉. A stale pointer; carrier: none; not filed. - The cap is worded as the ruling gives it (「一轮派发的 10%」). At this fleet's round sizes (batch 1 to 3) a literal per-round 10% rounds to zero tooling cards; see the open question in the report on the card. - D5's "same merge batch" for hotcrm readers meets `lanes/hotcrm.md` (a hotcrm reader unlocks on PUBLISHED, not merged) and rule 2's `Blocked-by:` / never-same-batch lines. The new line is inert until `ui/` exists on `main`, so nothing conflicts today; the reading to adopt at cutover is an open question in the report. ## 维护者速读(草稿) **改了什么**:把 D3、D5 两条裁决写进 pm-dispatch 技能。D3:每轮派发里工具类卡最多占一成,超出的留在积压;改动 pm 规则的卡只有你点名才立;每轮报告多报两个数(产品提交占比、落地后 48 小时内的跟进 PR 数)。D5:objectui 并入本仓(`main` 上出现 `ui/`)之后,新的 spec 键必须和它的第一个读者同一个 PR 落地,hotcrm 的读者走同一合并批,不再出现只声明没人读的 `planned` 行。 **为什么改**:过去 14 天 17% 的合入提交在服务流程本身,新卡里三成多是工具/技能/流程;一个 spec 键曾拖成四个 PR、三次落地。这两条把精力拉回产品。 **风险与代价(含回滚)**:不加门禁、不加脚本,只改规则文字,六个文件行数都不超上限。风险在解读:一成上限在一轮只派 1–3 张卡时按字面会变成零;hotcrm 依赖已发布的包,「同合并批」要在并仓时再定义。回滚 = revert 本 PR。 **席位意见**: **你要做的**:无需操作;小轮次的一成怎么算、hotcrm 同合并批的含义,席位会在需要时单独请你裁。 --- _Generated by [Claude Code](https://claude.ai/code/session_01Fx58tcuqmi5bveQGdRYq8r)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 0790d0a commit 5f5f0b4

6 files changed

Lines changed: 10 additions & 10 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
111111
| `pm:blocking` | 有 open 下游依赖者(自 `Blocked-by:` 索引推导的缓存,⛔ 不手工挂);进选择全序 |
112112
| `pm:retriage` | 向分诊提问(改判、跨域 PR 指定车道、改路由、拆卡、裁 dev 报告留下的分叉),定车道与改路由限未派发卡,异议评论写明所求;与现行 `pm:*` 并存、⛔ 不摘原标;带本标签的 `pm:queue` 卡跳过派发 |
113113
| `finding` | 立卡三类内待首次定级,定级即离标;三类外关 not planned;不占队列不进收件箱 |
114-
| `tooling` | 修复落在门禁/脚本/workflow/技能/席位协议/PM 工具面而非产品包;分诊首触打,与 `domain:*` 同笔;三具名读者 = 候选查询排除、首触即关、普查半态行 |
114+
| `tooling` | 修复落在门禁/脚本/workflow/技能/席位协议/PM 工具面而非产品包;分诊首触打,与 `domain:*` 同笔;四具名读者 = 候选查询排除、每轮派发 ≤10%、首触即关、普查半态行 |
115115
| `target:<major>` | 发版阻塞:每个 backlog 恰好一个生产者 |
116116
| `pm:epic`(父单或 sub-issue) | 已由 epic PM 保留;其它 PM 永不取;⛔ 永不与 `pm:queue` 同挂 |
117117
| `pm:seat` | 座位登记贴:协议载体,不是待分诊的工作 |

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
分诊席每次 fire 路由与查重前读本文;执行席跨仓认领、派发或转移时读本文。
44

55
- 产品依赖方向固定:`objectstack`(后端,`packages/spec` 是唯一契约)→ `objectui`(前端)与 `cloud`。
6-
- objectui 构建产物经 `pnpm objectui:refresh` 回流。
76
- 多车道仓 `objectstack`、`objectui`:中央分诊是 `domain:*`/type/定级的唯一生产者。
87
- 单车道仓 `cloud`、`objectos`、`hotcrm`、`www.objectos.ai`;未来新仓默认此类。
98
- 单车道仓 `repo:*` 席自理机械三务,⛔ 不产 `domain:*`;决策卡入本仓收件箱,不落 objectstack。
@@ -26,8 +25,9 @@
2625
- 缝卡收窄为真协调卡:留 objectstack 带 `repo:*`,正文点名读者(哪个座位、哪一步)。
2726
- 决策卡留在立卡仓,总监席扫全部仓 `needs-user-decision` 呈批;在飞卡 ⛔ 不中途转仓。
2827
- 规则 2:跨层功能点或 objectui 消费的 `Seam:` 卡恒由分诊立父单 + 逐层子单,spec/后端先行。
28+
- `main` 有 `ui/` 起,新 spec 键不再先行、取代上句次序:与首个读者同 PR,hotcrm 读者同合并批。
2929
- 下游带 `Blocked-by: <owner/repo>#<n>`;`Blocked-by` 未关闭/未合并的不派发,对 GitHub 现验。
30-
- 被链接或同父的两单永不同批。
30+
- 被链接或同父的两单永不同批;`ui/` 起的新键与首个读者除外,⛔ `planned` 行不单独进 main。
3131
- pin 滞后是盲区:本仓 pin 是否已覆盖该 commit 是第二读数,派发前用 REST `compare` 核祖先。
3232
- 本地 `merge-base` 在浅检出上给假非祖先;未覆盖 ⇒ 派发令要求 PR 正文留档分叉窗口。
3333
- ⛔ pin bump 不做 rider:走专用 bump 脚本连带 override 与 lockfile。

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

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

77
- 整车道一次读全,本地求交:`list_issues` 带 `labels: [domain:X]` + 最小字段拿回全车道 open 集。
88
- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`;⛔ 排除三门皆无的 `tooling` 卡。
9+
- `tooling` 卡至多占一轮派发的 10%,溢出留积压、⛔ 不入 `pm:queue`;⛔ 无门禁无脚本强制。
910
- 无分诊审计评论的卡不是候选,预贴 `pm:queue` 视同无;例外一的 sub-issue 承父卡首触。
1011
- 已排队父单的 open sub-issue 自动是候选,`pm:epic` 父单的子树除外。
1112
- 每张候选读全文 + 全部评论,写派发词前做决策复读:评论读到最后一页。
@@ -56,7 +57,6 @@
5657

5758
- 归属 = session ID,⛔ 不认作者字段;`Account:` 派生自 assignee,不等即半态、持卡席下笔补正。
5859
- 卡 assignee 归 PM,dev 恒不写;PR assignee = 卡的,接管 ② 同笔换;读者 `is:pr is:open assignee:LOGIN`。
59-
- dev `pr_create` 带 `assignees: [LOGIN]`,同笔指派;席位自有 PR 指派自己。
6060
- 部分落地(PR 带 `Refs #N (item k)`,⛔ 不 `Fixes`)即释放:合入同笔回 `pm:queue` + 清 assignee。
6161
- 同笔 `Release:` 行点名已落项与余项去向;余项需换道/拆分加 `pm:retriage`,自队列重新认领。
6262
- 派发前按序执行原子对:① Assign @me,并把 `pm:dispatched` 与摘 `pm:queue` 放进同一次标签写入。

‎.claude/skills/pm-dispatch/references/filing-gate.md‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
# 立卡门与定级判据
22

3-
见 triage-duties.md 与 reading-discipline.md 的指针行。
4-
53
## 立卡门
64

75
> 出处,维护者 2026-09-21 逐字不译:刚才 os-sam 又被封号了,也是因为分诊批量处理issue的时候,所以现在 issue 太多对于车队是负担。 19546 我希望在创建issue 的环节就卡死,没必要的issue就不要创建。
@@ -16,6 +14,7 @@
1614
- 三种例外照立,要点首条「先测可达性」:可能泄露数据;发版固化的错误文字;维护者直派。
1715
- ② 只有维护者能做的决定,落卡即带「维护者速读」与四棱块。
1816
- ③ 维护者直派的任务,正文引其原话;④ 协调节点:跨仓/跨层父单与它的逐层子单。
17+
- 增改 pm 规则的卡只在维护者点名时立(归 ③,正文引点名原话);⛔ 席位自提不立。
1918
- ⛔ 不是卡:席位自己的失误、协议观察与「记住这条」,它们进座位贴或收班简报。
2019
- 「搭下个碰 X 的 PR」不算 `carrier:`;已落地工作欠的后续照立卡,⛔ 不按「不是卡」压下。
2120
- ⛔ 不是卡:丢卡重建(除非自身即 ①–④)、sweep 每 fire 重导的 pin/bump/卫生提醒。

‎.claude/skills/pm-dispatch/references/lanes/ui.md‎

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

1818
## 常设承诺
1919

20-
- 构建产物经 `pnpm objectui:refresh` 回流,见 cross-repo-coordination.md。
20+
- 构建产物经 `pnpm objectui:refresh` 回流,见 AGENTS.md。
2121
- 回流后的 console pin bump 是 objectstack 的单张卡,⛔ 永不做本仓 PR 的 rider。
2222
- `scripts/pm/**` 单写手恒在 objectstack 侧 ⇒ 本席的工具需求走上游卡带 `Blocked-by:` 回链。
2323
- 本仓标签/assignee 写走 objectstack `label-write.mjs --repo`,⛔ 不 MCP `issue_write`;被拒转有通道席。

‎.claude/skills/pm-dispatch/references/seat-lifecycle.md‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@
4242
- 收班 = 状态 flush + 在飞显式安置,不是在飞归零;派发口径失效,简报 ⛔ 不列作继承裁决。
4343
- 离任留守只写简报点名的项,⛔ 不读队列、不新派发、不碰未点名卡。
4444
- 换班报告默认零建议,只收三类:原则错/缺、可机械化项、平台事实变化。
45-
- 原则错/缺 → skills 席专题;可机械化项 → 门禁/脚本卡,⛔ 不是散文。
45+
- 原则错/缺 → 只进简报,维护者点名才立卡;可机械化项 → 门禁/脚本卡,⛔ 不是散文。
4646
- 平台事实变化 → references 事实表改一行。
47-
- 三类以 `finding` 入 skills 车道,首触归分诊席;三类之外默认关 not planned。
47+
- 后两类以 `finding` 入 skills 车道,首触归分诊席;三类之外默认关 not planned。
4848
- 接管/移交 = 改正文 + 审计评论(只作审计);收尾清单等细则见 `references/seat-post-protocol.md`。
4949
- epic 委托不入座位贴体系;新 `packages/spec` 工作恒归 spec 座位。
5050

@@ -68,7 +68,8 @@
6868

6969
- 每轮向维护者打中文轮次报告(chat 通道):issue → 判决 → PR 链接 → 备注的表。
7070
- 项目席轮报 = 卡线程清单,⛔ 不逐轮发聊天表;五项健康指标进总监席的每日摘要。
71-
- 报告加升级项、呈裁清单、awaiting a human merge 项、逐 PR 熔断命中项(无则 none)。
71+
- 报告加升级项、呈裁清单、逐 PR 熔断命中项(无则 none),与已落 PR 48h 内开出的跟进 PR 数。
72+
- 与产品提交占比:已合提交不触 `.claude/` `AGENTS.md` `scripts/pm` 门禁脚本 `.github/workflows` 者。
7273
- 报告含 `UNRECOGNISED` 行:对本轮门禁日志 grep `UNRECOGNISED` 逐行照录,`NOT APPLICABLE` 行也在内。
7374
- 健康指标五个:可派发库存(open `pm:queue` 未认领及趋势);决策箱(待维护者数)。
7475
- 决策箱指标还要点名带开放下游依赖的决策卡,从 `Blocked-by:` 反向索引现算。

0 commit comments

Comments
 (0)