Repository navigation
Commit 7b27bd0
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
59 | | - | |
| 59 | + | |
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | | - | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
28 | | - | |
| 28 | + | |
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
| |||
0 commit comments