Skip to content

Commit 7b27bd0

Browse files
objectstack-fleet[bot]os-devclaude
authored
docs(pm-dispatch): one batch cap for every subagent in flight, triage clean-up prepared one group at a time (#20108)
Fixes #20084 Clause-②: no Tier S (every path under `.claude/**`): this PR stays DRAFT — no ready flip, no enqueue, no auto-merge; it lands on the owning seat's contract-tier review of record. ## What changed (three lines, three files, net 0 lines everywhere) Maintainer ruling implemented as written (director seat chat, 2026-09-25, verbatim and untranslated): 「不要同时派发这么多」 · 「小心封号」 · 「同意,让 skills 车道立卡补上这条规则」. 1. `.claude/skills/pm-dispatch/SKILL.md` — the `batch` row of the 入口与角色 table (L59), rewritten in place. The 含义 cell now defines `batch` as the seat's cap on EVERY subagent in flight, counted per `Agent` call and per `create_session` — dev, reviewer, census alike — with read-only explicitly not exempt. The 默认 cell (default `3`, maintainer ceiling `5`) is unchanged, and the `priority:p0` row (L117, 「插队:可超 `batch`」) is untouched and not contradicted. 2. `.claude/skills/pm-dispatch/references/execution-duties.md` L21, rewritten in place: the same cap in one line — 「`batch` 封顶全部子代理」 (the dev / 复核 / 普查 / 只读 enumeration lives in the `SKILL.md` `batch` row every seat reads first) — keeping 「等待不填槽;同批独立按文件面不相交判」 and the tail 「⛔ 不按包、不按 check 名」 verbatim (it has no other home on `origin/main`); 120 bytes, at the inclusive cap. Corrected by the seat after the patch round (head `c66d03d`): the first head `cb2d8c4` had dropped that tail, and the seat's REWORK put it back. 3. `.claude/skills/pm-dispatch/references/filing-gate.md` — one new line directly beside the groups-of-ten line (L27): the clean-up prepares only the NEXT group; while the current group is not maintainer-confirmed, the one after is not prepared and the batches are not fanned out in advance. ## Ratchet accounting (headroom 0 on all three files; no ceiling touched) | file | lines before → after | note | |---|---|---| | `SKILL.md` | 319 → 319 (ceiling 319) | in-place row rewrite; `batch` row width 87 B → 191 B, widest-row pin 342 B untouched (widest row is another row, still 342 B) | | `references/execution-duties.md` | 183 → 183 (ceiling 183) | in-place rewrite, 118 B → 120 B (cap 120, inclusive) | | `references/filing-gate.md` | 58 → 58 (ceiling 58) | +1 rule line (119 B) paid by DELETING L28 「写节奏 ⛔ 非可选:REST 写(评论/标签/关单/立卡)间隔 ≥3 秒,每账号每小时 ≤40 笔。」 | Payment rationale for filing-gate.md: the deleted line is a verbatim duplicate of `SKILL.md` L94 「写侧恒为 `objectstack-fleet[bot]`(AGENTS.md);节奏 ≥3 秒/笔、每账号每小时 ≤40 笔,429 即停写。」, which every seat reads in full before any reference file; the references convention is one rule per line and no rule already stated in `SKILL.md`, so it was the lowest-value line in the section. Real deletion, not a re-wrap: no two lines were folded. The write pace stays enforced mechanically by `write-pace.mjs` and stated at its single source. L29 (429 ⇒ 停写并记座位贴) keeps its unique half and stays. ## Gates at `cb2d8c4` (derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, no paths; each exit captured before any pipe) All 21 families exit 0: `check-closing-keyword-parity` (+ `--self-test`) · `check-comment-mask-corpus` · `check-governed-queue-guard --self-test` · `check-harness-current --self-test` · `check:agent-test-spelling` · `check:cross-package-test-inputs` · `check:doc-authoring` · `check:driver-memory-census` · `check:gitlink-declared` · `check:nul-bytes` · `check:pm-expected-skips` · `check:pm-governed-merges` · `check:pm-governed-prose` · `check:pm-skill-id-lint` · `check:pm-skill-ratchet` · `check:refd-timer-probe` · `check:skill-frame-sync` · `check:watch-hint-literal` · `check:skill-frame-freshness` (outside the derivation, cheap) · `@objectstack/lint check:doc-formula-expressions` (self-test + gate, after the closure build). Ratchet verdict lines quoted from the gate: `SKILL.md is 319 lines (ceiling 319; headroom 0)` · `widest table row is 342 bytes (pin 342; headroom 0)` · `execution-duties.md is 183 lines (ceiling 183; headroom 0)` · `filing-gate.md is 58 lines (ceiling 58; headroom 0)`. Patch head `c66d03d` (one line, `execution-duties.md` L21): the same set re-run, every family exit 0 except `check:doc-formula-expressions` NOT MEASURED there (the gate does not scan `.claude/**`; exit 0 at `cb2d8c4`; CI runs it). The seat's ACCEPT (card comment 5827273568) and `## Contract review` PASS record (PR comment 5827276360) are recorded for `c66d03d`. ## 维护者速读(草稿) ### 改了什么 把「同时在飞的上限」从「只数 dev」改成「数席位起的每一个子代理」:dev、复核、普查、只读全算,默认 3、天花板 5 不变;另加一条:分诊存量清理十张一组时只准备下一组,当前组你没确认之前不准备再下一组、不提前把所有批次都铺开。三处各改一行,文件行数一行没涨。 ### 为什么改 今天总监席一次起了 8 个只读复核子代理加 1 个 dev,9 个同时用一个身份读 GitHub,被你叫停(「不要同时派发这么多」「小心封号」)。原规则写的是「dev 上限」,席位读成「复核不算」;封号警告都围绕写,席位读成「只读安全」。上一次封号之前的负载正是同一身份下的大量读。这三行把口子堵上,并按你的话「让 skills 车道立卡补上这条规则」落地。 ### 风险与代价(含回滚) 纯文本、Tier S,不改任何脚本或门禁,不发布任何包(`skip-changeset`)。代价是 filing-gate.md 删了一行写节奏(≥3 秒/笔、每小时 ≤40 笔)——它与 SKILL.md L94 逐字重复,规则仍在 SKILL.md 且由 `write-pace.mjs` 机械执行,所以删的是重复不是规则。回滚 = revert 这一个 commit,三文件回到原样。 ### 席位意见 (留空) ### 你要做的 读三行改动是否符合你的意思;若同意,由 skills 席按 Tier S 复核记录落地,不需要你点合并。 ## Follow-up note (card item ④ — a mechanical guard; NOT built here, and not recommended) A live count of a seat's in-flight subagents is visible only to the harness (the `Agent` tool and `create_session`), not to any repo script: a `pm:dispatched` census would count devs and miss every reviewer/census subagent, which is exactly the class this card closes. No cheap guard exists; the decision frame's default for a new gate is 「不加」, and nothing here recommends one. ## Acceptance notes / deviations - Commit trailer: the harness attribution reminder proposed a model-named co-author trailer; the repo's pre-push hook (`check:commit-card-trailers`) refused it and the repo rule wins, so the unpushed tip was amended to the model-free pair before its first push (no published history rewritten; remote was still at the empty branch). - `check:doc-formula-expressions` prerequisite: the `@objectstack/lint` closure (spec, sdui-parser, formula, lint) was built under the shared verify lock with `OS_SKIP_DTS=1` (the gate is a node script reading built JS, not `.d.ts`); held the lock 43 s. - Sibling coordination (parallel by REGION per the maintainer's word): #20088 owns `SKILL.md` 报告契约 L278–L285, `triage-duties.md` L48/L71, `filing-gate.md` L12 and its precedent lines, `os-dev.md` rule 3; #20103 owns `SKILL.md` L305–L319 and `execution-duties.md` L53–L82. Neither region is touched here; #20088 and #20103 remain open and are not addressed by this PR. Whichever PR lands later merges `origin/main` first and re-runs `check:pm-skill-ratchet`. - Line numbers after this change: none shift — every edit is in place, and the filing-gate.md insertion at L28 replaces the deleted L28. --- _Generated by [Claude Code](https://claude.ai/code/session_0148fenvVvyQV9HYxgVDQ33q)_ --------- Co-authored-by: os-dev <yinlianghui@steedos.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent fa00ebf commit 7b27bd0

3 files changed

Lines changed: 3 additions & 3 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
5656
| `director` | 以项目总监席身份运行(人工召唤;三职见 升级与决策 节与 `references/lanes/director.md`) | — |
5757
| `label:<name>` | backlog 过滤标签;`label:all` = 全部 open 未认领 | `pm:queue` |
5858
| `repo:<owner/name>` | 扫哪个仓的 backlog(单 issue 的落地仓看它自己的 `repo:*` 标签) | `objectstack-ai/objectstack` |
59-
| `batch:<n>` | 同时在飞的 dev 上限 | 默认 `3`;`n` 的维护者天花板 `5` |
59+
| `batch:<n>` | 席位同时在飞的子代理总上限,按 `Agent` 调用与 `create_session` 计:dev、复核、普查皆计,⛔ 只读不豁免 | 默认 `3`;`n` 的维护者天花板 `5` |
6060
| `rounds:<n>` | 跑 N 轮后停 | 队列清空为止 |
6161
| `mode:subagent` \| `mode:cloud` | 派发后端 | 按卡分流:S+M ⇒ `subagent`,`cloud` 只留 L/XL 等保留面 |
6262
| `#12 #34 …` | 显式 issue 清单,整体覆盖标签查询 | — |

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
- 引用读到的现状,⛔ 不引用裁决写作时的描述。
1919
- 工作项面:卡片与分诊评论列的每条工作项逐条对树核验是否仍未完成,⛔ 不对卡核验。
2020
- 每条工作项写进派发令时都是 dev 首先证伪的前提。
21-
- 并行度以 `batch` 封顶,等待不填槽;同批独立按文件面不相交判,⛔ 不按包、不按 check 名。
21+
- `batch` 封顶全部子代理,等待不填槽;同批独立按文件面不相交判,⛔ 不按包、不按 check 名。
2222
- 舰队至多一张 `tooling` 卡带 `pm:dispatched`,第二张等;带 `Unblocks:` 者继承产品级不计数。
2323
- single-writer 路径 = `SINGLE_CLAIM_PATHS` 所枚举;共享其它路径是普通并发,后落地方解冲突。
2424
- 第 N 单派发前读 `scripts/pm/os-verify-lock.sh --status`:到达深度 ≥ `LOCK_DEPTH_HOLD`(= 2)即等。

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
- 说不出的形态:`.changeset/*`、无人在改的文档页、生成物、已扫完的批次,兜底不成立。
2626
- 配额:一席每 fire 至多立三张;sweep 超出的折进一张带清单的卡,或折进座位贴。
2727
- 分诊席的存量清理仍走维护者确认的十张一组,⛔ 不因本门改批量。
28-
- 写节奏 ⛔ 非可选:REST 写(评论/标签/关单/立卡)间隔 ≥3 秒,每账号每小时 ≤40 笔。
28+
- 十张一组只备下一组:当前组未经维护者确认 ⛔ 不预备再下一组、不提前展开全部批次。
2929
- 收到 429 或次级限流 ⇒ 该席本 fire 停写,并把停写记在座位贴上。
3030
- 关单 ⛔ 永不由脚本循环连发:须维护者确认的分组,且逐笔之间留间隔。
3131
- 立卡、开 PR 与评论恒经 `scripts/pm/` 为 `objectstack-fleet[bot]`(AGENTS.md),⛔ 不走席位用户令牌。

0 commit comments

Comments
 (0)