Skip to content

Commit 733f42d

Browse files
docs(pm-dispatch): the dev queue is product-only — tooling cards close at first grading, broken gates are deleted, ≤1 tooling dev in flight, tooling is a first-touch label (ruling #202 B) (#19462)
Fixes #19457 Clause-②: no — charter text plus one label-vocabulary row. The diff adds no Zod key, no closed-set member, no exported symbol and no runtime registration. `node scripts/pm/check-widening-tells.mjs --declaration no --diff` was run over this branch's full three-dot diff and exits 0. ## The ruling this PR carries Batch #202 item 1, letter B. The maintainer's authorizing words, verbatim, in order, quoted unchanged from the card (chat, 2026-09-20 between 23:18Z and 23:45Z): 1. 「我随便看了几个任务,这些都是辅助类的吧,我感觉开发agent被大量的浪费在这种任务下。在北极星的标准下,这些应该开发吗?」 2. 「我们是创业项目,应该花精力处理类似的这些任务吗?」 3. 「B(荐)A + 清理存量」 4. 「p2 的 47 张转 pm:on-hold 带机器条件 有价值吗?卡片只要open就要一直被扫描。」 5. 「重点是分诊,分诊为什么没有关闭这些卡片」 6. 「你建议的规矩就三条,是否应该立卡派发」 / 「按照你的建议继续。」 7. 「对于工具卡,分诊是不是应该有一个单独的标签打上,比如 tooling」 8. 「立章程卡并把 90 张的关闭交分诊席,你会派发处理章程卡吧,然后合并之后通知分诊?」 And the ruling addendum recorded on the card as comment 5754225479, which edit 6 below executes, verbatim and untranslated: 9. 「受管合并审计 以后不需要了,浪费时间。」 And the ceiling ruling, recorded on the card as comment 5754521737, which round 4 executes (the first clause is a different card, the second is this one): 10. 「205 否,天花板抬到 819」 ## The five edits All five land in `.claude/skills/pm-dispatch/SKILL.md`. The one rule that also has a line in `references/core-rules.md` is changed there in the same PR, per the charter's own 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」. **1. The dev queue is product-only.** The tooling clause is deleted from the `pm:queue` definition in both files: - SKILL.md 〈分诊座位职责〉: 「`pm:queue` = 有具名落点或复现的具体缺陷,或范围明确的工具/门禁修复,无可问之事」 becomes 「`pm:queue` = 有具名落点或复现的具体缺陷,无可问之事;⛔ 工具/门禁修复不由此进」. - `references/core-rules.md` 〈分诊座位职责〉: 「有落点或可复现的缺陷、范围明确的工具修复与实现未被裁错的说明书脱节进 `pm:queue`」 becomes 「有落点或可复现的缺陷、实现未被裁错的说明书脱节进 `pm:queue`;工具卡另须带解锁行」. The condition a tooling card may sit in `pm:queue` under is added beside it: 「`tooling` 入 `pm:queue` 仅当首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面」. The execution seat's candidate query gains the exclusion in place, on the 候选 line in 〈候选与批次〉: 「⛔ 排除两行皆无的 `tooling` 卡」. **2. Triage closes at first grading.** In 〈分诊座位职责〉, on top of what #19459 landed on `main` while this branch was open: - The grading reference now reads North Star 「优先级」1–3 条 (main had 1、2). 「1–3」 rather than 「1、2、3」 is measured, not stylistic: the latter puts that line at 121 bytes against the ratchet's 120-byte cap. - 「「无则关」= 首触即关 not_planned,带理由与入队两条件,⛔ 不定 p3、不 hold;下行同此」 — it hangs off main's own 「无则关」 clause rather than restating it, and carries only what main lacks: `not_planned`, the reason, the two reopen conditions, and the prohibition. - North Star rule 3 restated as a **closing** rule: 「产品仓 P0/P1 开着时,无解锁对象的 p2/p3 `tooling` 卡同样关」, inheriting the prohibition through 「下行同此」. Class (b) is narrowed beside the three filing classes: 「门禁头注、self-test 文案与 `check-*` 处方句 ⛔ 非已声明契约;(b) 须用户或已发布包读得到」. **3. A broken gate is deleted, not repaired.** Seeded on the existing 「失效修法按序取:先删容许出错的构造…」 line in 〈平台读数纪律〉, two lines follow it: - 「门禁两次误报(假红、实测假绿、处方句点名不存在路径)⇒ 删肢或删门禁,PR 引两次测量」 - 「只有护产品落地或用户可见契约的门禁才立修复卡;门禁上「稳定 > 功能」= 更少零件」 **4. At most one tooling dev in flight, fleet-wide.** In 〈候选与批次〉, beside the 并行度 rule: 「舰队至多一张 `tooling` 卡带 `pm:dispatched`,第二张等;带 `Unblocks:` 者继承产品级不计数」. **5. `tooling` is a first-touch triage label with named readers.** The authoritative label glossary is the 〈状态模型〉 table in SKILL.md, whose bullet list carries the rule 「一个标签存在当且仅当有具名读者」. Definition, first-touch application and all four readers land in the one glossary row: `| tooling | 修复落在门禁/脚本/workflow/技能/席位协议/PM 工具面而非产品包;分诊首触打,与 domain:* 同笔;四具名读者 = 候选查询排除、首触即关、舰队一张在飞、普查半态行 |` A table row is exempt from the 120-byte cap and metered by the file's widest-row pin instead, so carrying the readers there costs one line fewer than a separate bullet: the row is 227 bytes against this file's 342-byte pin. Reader (iv) — the half-state row — is **named only**. `scripts/pm/check-half-states.mjs` builds every H row from a per-row predicate, a message builder and a registration, so it is not the one-line addition the card made that conditional on; per the card it stays named in the glossary and is left to the next patrol edit. ### The label OBJECT, which rides this PR Round 1 reported this as a finding; it is fixed here instead of filed. `scripts/pm/ensure-pm-labels.sh` — the file the charter names as the authority on a label's readers — did not name `tooling` at all. Measured in objectstack while writing this, with the label live on 44 queue cards, the object carries GitHub's default colour `ededed` and a **null** description. That is the exact drift the script's own header describes, and the header also says why it cannot heal by itself: `--reconcile` aligns only the labels that file names, so no rerun in either mode ever reaches it. The row is added in the five-repo loop, beside `finding`, on the rule stated next to `priority:p0`: a label belongs in that loop when the sweep that reads it is repo-parameterized and the duty that sets it is a five-repo triage duty. Both hold. Its description is 100 characters, at the hard cap — `pnpm check:pm-label-desc-cap` is green and names `tooling` as the longest of the 28. ## Edit 6 — the director's governed-merge audit is retired Item 9 above. It is a net **deletion**, and the only edit in this PR that removes a duty rather than adding a rule. - `references/lanes/director.md` loses 〈职责四:受管合并审计〉 entire — the heading and its six bullets, 9 lines with the blank — and the 四职 reference in its opening block becomes 三职. The file goes **72 to 63** lines. - SKILL.md loses the two lines that RAN the audit (the `--since` invocation and the lane-early-warning / director-window split), drops the audit list from the round-report contents line, and its two duty-roster mentions become 三职. The guard-index row keeps the SCRIPT and loses only 轮报载体, which the deletion makes false. - `references/core-rules.md` drops the audit from the round-report line and from the director's duty roster, both in place, net 0 lines. Kept deliberately, on the test that a line about the CI gate or the script's existence is not the retired seat duty: the `domain:skills` lane row naming the script as the governance-execution file; the guard-index row itself; `landing-operations.md`'s pre-ready `--pr N` run; `lanes/skills.md`'s `--test` run; `state-machine.md`'s generator-artifact `--test` rule; and both `platform-readings.md` behaviour readings. `scripts/pm/check-governed-merges.mjs` and its CI self-test are untouched — they are not the duty. Round 3 left one mention standing and reported it; **round 4 takes it**, on the seat's word and under the same directive: `references/lanes/skills.md` loses 「轮报的受管合并审计清单带 `--since` 四仓实跑,⛔ 不凭记忆汇总」, the same retired audit ordered for a different seat's round report. That file goes **33 to 32** lines. A residual scan for the duty across `.claude/skills/pm-dispatch/**` and `.claude/agents/**` — pattern 受管合并审计, governed 合并审计, 合并审计, 四职, 职责四 — now returns **zero hits**, and the surviving `check-governed-merges` references are only the CI-gate and script-behaviour ones listed above. ## Merged `main` `main` moved three charter commits under this branch after its merge base: be488ce (#19449), 287eb4c (#19214) and 22ca89f (#19459). The last rewrites exactly the grading line this card edits, so `git merge origin/main` produced one conflict, in `.claude/skills/pm-dispatch/SKILL.md`. It is a merge commit, not a rebase, and nothing was force-pushed. The resolution keeps **both** sides: main's four-segment `Path:` spelling and its two new lines (定义项 / 清单项) verbatim, and this card's three additions beside them as described under edit 2. The merge commit carries only the resolution; the fold and the label row are a separate commit on top, so a reviewer can read what main brought apart from what this change produces. ## Verification the card asks for ``` $ git grep -n '范围明确的工具' -- .claude/ $ echo "EXIT=$?" EXIT=1 # 0 hits on this branch $ git grep -cn 'pm:queue' -- .claude/skills/pm-dispatch/SKILL.md .claude/skills/pm-dispatch/SKILL.md:23 $ echo "EXIT=$?" EXIT=0 # the control is non-zero: the instrument reaches the file ``` ## Gates Derived on this head with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` — **41 families**: 21 at first, 36 once the label row brought the shell-script families in, and 41 now that round 4 edits the ratchet script itself. Every one was run with its exit code captured before any pipe, and the reconciliation reads `41 derived, 41 run, 0 NOT-MEASURED, 0 UNRUN`, a derived zero rather than a claimed one because every line carries its code. **All 41 are green.** `pnpm --filter @objectstack/lint run check:doc-formula-expressions` exits **0** once `@objectstack/formula` and `@objectstack/lint` are built; on a torn-down worktree it exits **3**, which that gate spells out as PREREQUISITE NOT MET with nothing measured — not a finding. Also run green, outside the derived set: `check:pm-widening-tells` (self-test and against this diff), `check:pm-settings-deny-roster`, `check:pm-clause2-carriers`, `check:pm-label-write`, `scripts/check-skills-token-ratchet.mjs`, `check:skill-identifier-liveness`, `check:skill-frame-freshness`, `check:skill-compatibility`. ### The ceiling, now ruled Rounds 1 to 3 left `check:pm-skill-ratchet` red at 819 against 813 and did not touch `CEILINGS`, because raising one is on the charter's own manual floor. The maintainer has now ruled it — item 10 above — so round 4 executes it and the gate is green: ``` ✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 819 lines (ceiling 819; headroom 0). ``` The `CEILINGS` entry for `.claude/skills/pm-dispatch/SKILL.md` goes 813 to 819, with the maintainer's sentence quoted above it in the shape of the two ORDINARY ruled raises already on that entry: what the six lines buy, why they could not be paid in place, and the note that SKILL.md is not a `CROSS_FILE_MOVES` destination so no `ruledRaises` record applies. ⛔ No other entry in that map moves. Measured, per file, against `origin/main`: | file | main | this branch | ceiling | verdict | |:--|--:|--:|--:|:--| | `.claude/skills/pm-dispatch/SKILL.md` | 813 | 819 | **819** (ruled) | green, headroom 0 | | `.claude/skills/pm-dispatch/references/core-rules.md` | 151 | 151 | 151 | green, headroom 0 | | `.claude/skills/pm-dispatch/references/lanes/director.md` | 72 | 63 | 72 | green, headroom 9 | | `.claude/skills/pm-dispatch/references/lanes/skills.md` | 33 | 32 | 33 | green, headroom 1 | | `scripts/pm/ensure-pm-labels.sh` | — | — | — | not ceilinged | The six lines the ruling buys are what is left after three rounds of paying in place — the cost went 9 at round 1, to 8 after the merge, to 6 after edit 6: folding the four readers into the length-exempt glossary row bought one line back, and edit 6 deleting the two lines that ran the audit bought two more. The widest-table-row pin is unaffected — SKILL.md's pin is 342 bytes and the new glossary row is 227. Every new prose line is at or under the 120-byte cap. **Neither shrunk file has its ceiling lowered, and that is a measurement, not an omission.** The gate prints `director.md is 63 lines (ceiling 72; headroom 9)` and `lanes/skills.md is 32 lines (ceiling 33; headroom 1)`, both with a **✓** — it asks for neither entry to be moved, exactly as it does not for `dogfood-verification/SKILL.md`, which stands at headroom 9 and is green. Lowering either is a legitimate ratchet-down whenever someone wants it; it is not owed here. Six lines is the measured cost of the six ruled edits after paying everything payable in place, and it is what item 10 rules. Most of the rule changes cost **no** line at all: the `pm:queue` definition, the 候选 candidate query, the grading reference, the core-rules mirror, the four readers now riding the glossary row, and every one of edit 6's in-place rewrites. The remaining six are one ruled rule each and there is nothing left to merge them into: **every ceilinged file in that map stands at headroom 0**, so no reference file can absorb them either, and a declared cross-file move is zero-sum by construction — the destination's raise may not exceed the source's net decrease — so it cannot fund new content. Raising a ceiling is on the charter's own manual floor — 「人工地板项(发版、天花板、契约扩大)仍需明确字句」 — which is why rounds 1 to 3 carried the red rather than clearing it. Item 10 is that explicit sentence, so the raise is now an execution rather than a judgement: `['.claude/skills/pm-dispatch/SKILL.md', 813]` becomes `819`, quoted above the entry, exactly as the two precedents already in that map were taken. A cross-file move funded by director.md's decrease was described to the seat and **refused**: the mechanism is a move, deletion at the source pays and restatement does not, and nothing here moves — it would have passed the gate's arithmetic while recording something that did not happen. ## Landing The register of record is the `GOVERNED_SURFACES` table in `scripts/pm/check-governed-merges.mjs`. Measured on this tree, `governedPathsIn` answers the single row `claude-tree` (`.claude/**`) and `governedTierFor` answers **`S`** for this diff — so by the register this is a **Tier S** landing, not Tier H as the card and the dispatch both describe it. `scripts/pm/**` is not on the register and does not change that. It changes nothing about what happens next: the maintainer's item 8 reserves this particular merge to his own hand (「你会派发处理章程卡吧,然后合并之后通知分诊?」), and the ratchet red above must be cleared first either way. No seat flips this ready, queues it or arms auto-merge. This diff publishes nothing from any released package — `.claude/**` and `scripts/pm/**` only, and `scripts/pm/**` is a PM-loop tool that ships in no tarball — so `Check Changeset` needs `skip-changeset`. The seat applies labels; this PR does not. Related: #19340 is the sibling filing/merging directive and is **not addressed here** (its items 1 2 3 4 5 8 landed separately as be488ce); #19458 carries the 90-card stock closure and is **not addressed here** either. ## 维护者速读(草稿) **改了什么** —— 开发队列从此只收产品卡。工具卡(门禁、脚本、技能、席位协议)要么点名它挡住的那张产品卡,要么点名它保护的已发布面,否则分诊第一次看到就关掉,不再降级成 p3 挂着。另外三条配套:坏门禁默认删不默认修;全舰队同时最多只有一个开发 agent 在做工具卡;`tooling` 成为分诊首触就打的标签,有四个具名读者,并且这次把这个标签本身也在标签词表脚本里声明了(它现在在 GitHub 上是灰色、没有说明的野标签)。第六条是你说的:总监席的「受管合并审计」整职删掉,章程里所有让席位去跑这个审计的行一并删(技能席那一行也删了),脚本和 CI 自检不动。 **为什么改** —— 现在队列里 215 张有 111 张是工具类(52%),而产品 P0 只有 3 张、P1 有 29 张。分诊没有关掉它们不是失职,是章程写着「范围明确的工具修复」就该进队列。规矩不改,下一批 90 张还会长出来。 **风险与代价(含回滚)** —— 风险是误伤:真正挡住产品的仪器卡如果忘了写 `Unblocks:` 行,会被当成工具卡关掉。对冲是两个重开条件都写在关单评论里,重开免费。回滚是一次 revert,这个 PR 只改两个 markdown 文件加一个 shell 脚本里的一行标签,没有产品代码、没有 workflow。 **席位意见** —— **你要做的** —— 一件:合并这个 PR(受管面,item 8 说了由你亲手合)。天花板的事已经按你那句「天花板抬到 819」执行完,棘轮现在是绿的(819/819),41 个门禁全绿。 Authored by the dispatched os-dev round of https://claude.ai/code/session_012GcsUbuqFGBibkEDMRC1eE — round 1 opened this PR; round 2 merged `main`, folded the readers into the glossary row and added the label row; round 3 landed edit 6; round 4 executed the ceiling ruling and removed the last audit line. The footer under this line is the platform own block: a REST body EDIT appends one, which is why this body carries none of its own. --- _Generated by [Claude Code](https://claude.ai/code)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2cac363 commit 733f42d

6 files changed

Lines changed: 65 additions & 24 deletions

File tree

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

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
5454
| `triage` | 以分诊座位身份运行(只扫/分类/路由,永不认领) | — |
5555
| `<domain>`(如 `spec`、`skills`) | 以该 `domain:*` 车道的执行座位身份运行 | — |
5656
| `epic:#<n>` | 以父单 #n 的 epic PM 身份运行(见 Epic 子树车道 节) | — |
57-
| `director` | 以项目总监席身份运行(人工召唤;四职见 升级与决策 节与 `references/lanes/director.md`) | — |
57+
| `director` | 以项目总监席身份运行(人工召唤;三职见 升级与决策 节与 `references/lanes/director.md`) | — |
5858
| `label:<name>` | backlog 过滤标签;`label:all` = 全部 open 未认领 | `pm:queue` |
5959
| `repo:<owner/name>` | 扫哪个仓的 backlog(单 issue 的落地仓看它自己的 `repo:*` 标签) | `objectstack-ai/objectstack` |
6060
| `batch:<n>` | 同时在飞的 dev 上限 | 默认 `3`;`n` 的维护者天花板 `5` |
@@ -114,6 +114,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
114114
| `pm:blocking` | 有 open 下游依赖者(自 `Blocked-by:` 索引推导的缓存,⛔ 不手工挂);进选择全序 |
115115
| `pm:retriage` | 向分诊提问(改判、跨域 PR 指定车道、改路由、拆卡、裁 dev 报告留下的分叉),定车道与改路由限未派发卡,异议评论写明所求;与现行 `pm:*` 并存、⛔ 不摘原标;带本标签的 `pm:queue` 卡跳过派发 |
116116
| `finding` | 立卡三类内待首次定级,定级即离标;三类外关 not planned;不占队列不进收件箱 |
117+
| `tooling` | 修复落在门禁/脚本/workflow/技能/席位协议/PM 工具面而非产品包;分诊首触打,与 `domain:*` 同笔;四具名读者 = 候选查询排除、首触即关、舰队一张在飞、普查半态行 |
117118
| `target:<major>` | 发版阻塞:每个 backlog 恰好一个生产者 |
118119
| `pm:epic`(父单或 sub-issue) | 已由 epic PM 保留;其它 PM 永不取;⛔ 永不与 `pm:queue` 同挂 |
119120
| `pm:seat` | 座位登记贴:协议载体,不是待分诊的工作 |
@@ -170,6 +171,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
170171
- 仓不可达 ⛔ 不当查过了干净:在 issue 上贴出给对应座位的现成命令,等读数回贴再派。
171172
- 读数与认领等座位文本恒带 UTC 取数时刻 `YYYY-MM-DDThh:mmZ`;树读数另带 ref/tip,无者按未取。
172173
- 失效修法按序取:先删容许出错的构造,再让正确形态成唯一拼写,最后才加检查。
174+
- 门禁两次误报(假红、实测假绿、处方句点名不存在路径)⇒ 删肢或删门禁,PR 引两次测量。
175+
- 只有护产品落地或用户可见契约的门禁才立修复卡;门禁上「稳定 > 功能」= 更少零件。
173176
- 自设定时器的文本以先重读状态开头,只写关键判据(若 X 则 Y),其余指针化。
174177
- 定时器文本 ⛔ 不写结论、不含未经重读即可执行的祈使句。
175178
- 放行认门禁 job 的结论(`completed: success`),⛔ 不认聚合读数。
@@ -337,7 +340,8 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
337340
- 分类动作每张三选一,外加一个修复通道。
338341
- ⛔ 不挂 `needs:contract-review`:随 draft PR 或 `Clause-②: yes` 认领;裁定写方向、给六态之一。
339342
- 方向在 ADR/本卡裁决/不可重裁规则:贴 `check-prior-rulings.mjs` 的 `Prior rulings read:` 行,或不点。
340-
- `pm:queue` = 有具名落点或复现的具体缺陷,或范围明确的工具/门禁修复,无可问之事。
343+
- `pm:queue` = 有具名落点或复现的具体缺陷,无可问之事;⛔ 工具/门禁修复不由此进。
344+
- `tooling` 入 `pm:queue` 仅当首行带 `Unblocks: #N`(open 产品卡)或点名所护的已发布面。
341345
- `pm:queue` 也收恢复不变量的 finding、test-only pin,与实现未被裁错的说明书脱节(修文档)。
342346
- `needs-user-decision` = 设计卡、feature/契约形状提案、需要 appetite 的多周程序。
343347
- 碰迁移形状或删已发布能力也进决策箱;说明书脱节不进:有裁定出处才是 (b),否则改文档。
@@ -346,6 +350,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
346350
- `finding` = 三类内待定级:(a) 可复现缺陷(复现或失败探针);(b) 违背已声明契约(引契约文);
347351
- (c) AI 写元数据会被运行时拒收或静默丢弃的陷阱;其余进 PR `## Acceptance notes`,⛔ 不立卡。
348352
- (a) 的分界是不完整 vs 错误,不是文档 vs 代码:示例照抄即失败是 (a),漏列成员不是。
353+
- 门禁头注、self-test 文案与 `check-*` 处方句 ⛔ 非已声明契约;(b) 须用户或已发布包读得到。
349354
- (c) 元数据 = 由写它的人以外的人存储并再作者化的键:React prop 不是,存储的视图配置是。
350355
- 把作者引向运行时会兑现却让事情更糟的元数据的警告不在 (c) 内;记为边界,⛔ 不扩类。
351356
- (a) 须今天可达,(c) 须具名生产者;观察、休眠、零拉动 ⛔ 不立卡、不进汇总卡、无配额。
@@ -360,9 +365,11 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
360365
- 判据:违背已声明契约 ⇒ `Bug`,扩大接受集/公开面越出已声明 ⇒ `Feature`,其余 ⇒ `Task`。
361366
- `Bug` 无具名落点或复现路径不入 `pm:queue`(标记补复现)。
362367
- ⛔ 不回填存量 backlog 的 type;新卡即时打、存量卡下次碰到补。
363-
- 定级按北极星「优先级」1、2 条;首行 `Path: <定义项> | <清单项 id/缺项> | P<路步> | none`。
368+
- 定级按北极星「优先级」1–3 条;首行 `Path: <定义项> | <清单项 id/缺项> | P<路步> | none`。
364369
- 定义项取北极星「做出来的是什么」或仪器卡的车队决定;无则关;`none` 非分诊缺口。
365370
- 清单项会 fail 才算断,继承其 `priority`;缺项先补账本;⛔「有人在等」不是定级判据。
371+
- 「无则关」= 首触即关 not_planned,带理由与入队两条件,⛔ 不定 p3、不 hold;下行同此。
372+
- 产品仓 P0/P1 开着时,无解锁对象的 p2/p3 `tooling` 卡同样关。
366373
- 路由是分诊的技术判断,⛔ 永不升级哪个仓的问题;父单是协调节点,永不派发。
367374
- 父单已有子结构的:父单队列标签即可,分诊逐个展开路由、补 `Blocked-by:` 排序。
368375
- 每张留一条英文审计评论(`Triage: lands in …; rationale: …`),可选带 `Size/model suggestion:` 行。
@@ -426,7 +433,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
426433
### 候选与批次
427434

428435
- 整车道一次读全,本地求交:`list_issues` 带 `labels: [domain:X]` + 最小字段拿回全车道 open 集。
429-
- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`。
436+
- 候选 = open、未 assign、无 `needs-user-decision`、无 `pm:retriage`;⛔ 排除两行皆无的 `tooling` 卡。
430437
- 已排队父单的 open sub-issue 自动是候选,`pm:epic` 父单的子树除外。
431438
- 每张候选读全文 + 全部评论,写派发词前做决策复读:评论读到最后一页。
432439
- 维护者裁决逐字引入派发词裁决分区作约束,无则写明无裁决。
@@ -438,6 +445,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
438445
- 工作项面:卡片与分诊评论列的每条工作项逐条对树核验是否仍未完成,⛔ 不对卡核验。
439446
- 每条工作项写进派发令时都是 dev 首先证伪的前提。
440447
- 并行度以 `batch` 封顶,等待不填槽;同批独立按文件面不相交判,⛔ 不按包、不按 check 名。
448+
- 舰队至多一张 `tooling` 卡带 `pm:dispatched`,第二张等;带 `Unblocks:` 者继承产品级不计数。
441449
- single-writer 路径 = `SINGLE_CLAIM_PATHS` 所枚举;共享其它路径是普通并发,后落地方解冲突。
442450
- 第 N 单派发前读 `scripts/pm/os-verify-lock.sh --status`:到达深度 ≥ `LOCK_DEPTH_HOLD`(= 2)即等。
443451
- 到达深度 = `queue N:` 行数 + 1(待派 dev 的运行算作到达);`state:` holder 与 `parked` 行不计。
@@ -671,9 +679,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
671679
### 轮次报告与节奏
672680

673681
- 每轮向维护者打中文轮次报告(chat 通道):issue → 判决 → PR 链接 → 备注的表。
674-
- 报告加升级项、代裁清单(分诊)、awaiting a human merge 项、governed 合并审计清单。
675-
- 审计清单实跑 `node scripts/pm/check-governed-merges.mjs --since <上轮>`,⛔ 不凭记忆汇总。
676-
- 车道审计是早警;权威合并窗口与认定/回滚处置归总监席,见 `references/lanes/director.md`。
682+
- 报告加升级项、代裁清单(分诊)、awaiting a human merge 项。
677683
- 报告含 `UNRECOGNISED` 行:对本轮门禁日志 grep `UNRECOGNISED` 逐行照录,`NOT APPLICABLE` 行也在内。
678684
- 健康指标五个:可派发库存(open `pm:queue` 未认领及趋势);决策箱(待维护者数)。
679685
- 决策箱指标还要点名带开放下游依赖的决策卡,从 `Blocked-by:` 反向索引现算。
@@ -764,7 +770,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
764770
- `AskUserQuestion` 只是在场加速器:仅当维护者在本会话 ~30 分钟内有过人类输入才可发。
765771
- 每问必带推荐项,被 Skip 或长挂即转卡通道,⛔ 不重弹。
766772
- 项目总监席:维护者在所在仓召唤 `/pm-dispatch director`;⛔ 无 Routine/cron;未回字 = 不在 = 停。
767-
- 四职 = `needs:contract-review` 事后审计、决裁勤务、维护者动作台账、governed 合并审计。
773+
- 三职 = `needs:contract-review` 事后审计、决裁勤务、维护者动作台账。
768774
- 每场召唤把带席内 ACCEPT 的受管草稿呈为一批 ≤5 行决裁;批准与合并仍是维护者的点击。
769775
- 总监席档位由维护者按项目人工定,每场记入摘要台账;⛔ 无档位硬门、无免档整理态。
770776
- 总监席是唯一裁决者:决策箱、代裁与一类自裁只出自本席,⛔ 无子代理无自述。
@@ -786,7 +792,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
786792
| `scripts/pm/check-skill-line-ratchet.mjs` | 本文件行数只降不升(`pnpm check:pm-skill-ratchet`);抬上限需维护者裁决引用在 PR 正文;⛔ re-wrap 不得用作筹行,新增以删减付账;不买内容的密度修复允许 |
787793
| `scripts/pm/check-skill-id-lint.mjs` | 本技能与 os-dev 定义的操作文本 ⛔ 不引用 issue 编号(`pnpm check:pm-skill-id-lint`) |
788794
| `scripts/pm/check-half-states.mjs` | label/assignee/PR 半状态的 report-only 巡查(含已复核就绪却无人落地的孤儿 PR 检测) |
789-
| `scripts/pm/check-governed-merges.mjs` | governed 面合并清单的 report-only 审计(事后防线;轮报载体,本地枚举零 API,仅归因走查询) |
795+
| `scripts/pm/check-governed-merges.mjs` | governed 面合并清单的 report-only 审计(事后防线;本地枚举零 API,仅归因走查询) |
790796
| `scripts/pm/dispatch-gates.mjs` | 文件面 → 该跑的门禁族(派发令取数) |
791797
| `scripts/pm/git-history.mjs` | 窗口化 commit 计数:回答或 REFUSE(浅 clone 对窗口化 `git log`/`rev-list` 以 exit 0 无警告答错);`historyHorizon()` 是只读谓词 |
792798
| `scripts/pm/os-regen-merge.sh` | 碰生成物 PR 的 merge 四步序(防静默吞并与锚点倒退) |

‎.claude/skills/pm-dispatch/references/core-rules.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
- sweep 扫全裸卡、队列卡缺域或缺定级、域卡缺 pm 状态,排除跟踪、停放与协议载体卡。
8383
- 首触定级跑到清空 ⛔ 无总量预算、未跑完断点续跑;清得空最新优先,否则最老优先。
8484
- 裸卡超过十五张则下一轮改域分批集中模式,每批不超过五张同族卡。
85-
- 有落点或可复现的缺陷、范围明确的工具修复与实现未被裁错的说明书脱节进 `pm:queue`。
85+
- 有落点或可复现的缺陷、实现未被裁错的说明书脱节进 `pm:queue`;工具卡另须带解锁行。
8686
- 设计卡、契约形状提案、碰迁移形状或删已发布能力的进决策箱;无出处说明书脱节不进。
8787
- 立卡限三类:今日可达可复现缺陷、契约违背、具名生产者陷阱;截断卡发修复指令不派。
8888
- 三类边界:缺陷问错不问缺、文档同判;元数据须他人再作者化;引向更糟的警告在类外。
@@ -125,7 +125,7 @@
125125
- 唯一例外:源码自述 pushed 上按设计而红、不跑 `merge_group`、评论记明门与因,三条全立。
126126
- 跟到合并为止并每轮读队列成员资格与 `origin/main`;踢出按签名台账四分支处置。
127127
- 合并即发布的仓无验证层不合并,落地判据是已发布且探测通过 ⛔ 不是 MERGED。
128-
- 每轮打中文轮次报告,含判决表、升级项、代裁清单、等人合项、受管合并审计与五指标。
128+
- 每轮打中文轮次报告,含判决表、升级项、代裁清单、等人合项与五指标。
129129
- 收工点是会话内在飞归零、存档后立即派下一波 ⛔ 不等人闸;清空转待命而不是退场。
130130
## 断粮与跨墙恢复
131131
- 权威的用量墙信号是失败本身,重置时刻只在撞墙那一刻可得,拿到就记下来。
@@ -144,7 +144,7 @@
144144
- 方案逐轴过升级与决策段的四轴:业务需求、长远合理性、防 AI 写错、创业阶段聚焦。
145145
- 推荐须逐轴给理由、长远权重不低于一半;有拉动荐长远终态一次付清,零拉动荐不扩散。
146146
- 每张决策卡落卡即带标准四棱块;卡先于弹窗,被阻塞的执行卡同笔转 `pm:blocked`。
147-
- 项目总监席由人工召唤,未回字 = 不在 = 停;四职:复核审计、决裁、动作台账、合并审计。
147+
- 项目总监席由人工召唤,未回字 = 不在 = 停;三职:复核审计、决裁、动作台账。
148148
## 报告契约
149149
- 终报 JSON 的权威形状住 `.claude/agents/os-dev.md`,⛔ 本协议不另存第二份。
150150
- 前提被证伪且无 PR 是合法终报,当再分诊输入复核,⛔ 永不当失败派发。

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

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
- 入口:维护者说处理决裁或处理 contract-review,或 `/pm-dispatch director`。
1515
- 未回字 = 不在 = 停:维护者不在则本席不运行,⛔ 无巡检、审计、快照、聊天、卡评论。
1616
- 回来后先补跑审计与重挂复位一次,再只发一行「批 #N 待字;箱内另有 K 张新到未呈」。
17-
- 开场读一次服役档记入会话审计行,读法见 `../platform-readings.md`;⛔ 不因档位拒裁停四职。
17+
- 开场读一次服役档记入会话审计行,读法见 `../platform-readings.md`;⛔ 不因档位拒裁停三职。
1818
- 双射 carve-out:一张 `pm:seat` 座位贴,四段照旧;状态块逐场一行,各记己锚,⛔ 无占席人。
1919
- 不占 `domain:*` 车道,范围按职责标签跨车道跨仓;永不认领 backlog、永不写码。
2020

@@ -58,15 +58,6 @@
5858
- 待您清单与待字索引随所属批只呈一次,⛔ 不逐轮重印;座位贴散文降为指针,标签即状态。
5959
- 出口执行:核验动作确已发生,再摘标加证据评论同笔;出口条款见 `../state-machine.md`。
6060

61-
## 职责四:受管合并审计
62-
63-
- 检测双层、处置单席:车道轮报 sweep 只作早警,权威合并窗口在本席。
64-
- 每场召唤实跑 check-governed-merges,`--since-ref` 锚上一场的 tips;403 归因逐条走 MCP 补齐。
65-
- 锚行住座位贴说明段;脚本零存储,自打印下一场参数,跑后新 tips 同笔记回。
66-
- INCOMPLETE(exit 2)照实报,⛔ 不作干净;清单并入决裁批次,一行一条认定 y 或 n。
67-
- 未认定条目 = 席位违规,同笔立 `needs-user-decision` 卡立案回滚,事后审计制。
68-
- ⛔ 不新增标签:枚举本地树推导零 API。⛔ 无 cron,节奏与停放同授权段。
69-
7061
## 与 skills 席的分界
7162

7263
- 改 skill、指令或治理文本归 skills 席;出裁决、清复审标、清点待人工清单归本席。

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
- 四维分析先于派发与复核。
1717
- 规则层受管 PR 恒 draft 等维护者的字;flip 或 arm 前跑 `check-governed-merges --test` 带路径。
18-
- 轮报的受管合并审计清单带 `--since` 四仓实跑,⛔ 不凭记忆汇总。
1918
- 档位从 `--tier` 推导引用;pm-dispatch 根恒契约复审档;条款②闸门照现行。
2019
- 额度耗尽豁免的地板是默认判断档,⛔ 不再往下。
2120
- 棘轮逐行付账,⛔ re-wrap 筹行;砍点逐条核幸存,被砍内容若在别处无家,砍掉就是丢规则。

‎scripts/pm/check-skill-line-ratchet.mjs‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,33 @@ export const CEILINGS = new Map([
332332
// clause is refused on the state-machine precedent. Ruled content is not
333333
// growth (the 811 → 812 entry above). Landed count, headroom 0, same
334334
// convention.
335-
['.claude/skills/pm-dispatch/SKILL.md', 813],
335+
// Raised 813 → 819 by the product-only-queue charter ruling — an ORDINARY
336+
// raise under this map's own maintainer exit, ⛔ not a cross-file move.
337+
// Maintainer, 2026-09-21, live PM chat with the director seat, verbatim and
338+
// untranslated: 「205 否,天花板抬到 819」 — the second clause is this ruling
339+
// (the first is batch #205 item 1, on a different card); recorded by the
340+
// director on #19457, comment 5754521737. The content is the six ruled edits
341+
// of #19457 (ruling batch #202, letter B, plus the audit-retirement directive
342+
// 「受管合并审计 以后不需要了,浪费时间。」 landed as its edit 6): the dev queue
343+
// becomes product-only and a `tooling` card enters `pm:queue` only with an
344+
// `Unblocks: #N` line or a named published surface; triage closes at first
345+
// grading; a gate that misfires twice is deleted rather than repaired; at most
346+
// one tooling card is dispatched fleet-wide; and `tooling` becomes a
347+
// first-touch label with four named readers.
348+
// It could not be paid in place — measured over three rounds, not assumed: the
349+
// cost went 9 → 8 → 6 as everything payable was paid (three rules folded into
350+
// existing lines, the four readers folded into the length-exempt glossary ROW,
351+
// the close rule folded onto the 「无则关」 clause a sibling PR had landed
352+
// meanwhile, and edit 6's deletions gave two lines back); every ceilinged file
353+
// in this map stands at headroom 0, so no reference file can absorb the rest;
354+
// the six that remain are one ruled rule each, 78–120 bytes, and no two of them
355+
// pair under the 120-byte cap; and a declared cross-file move is zero-sum by
356+
// construction — the destination's raise may not exceed the source's net
357+
// decrease — so it can fund a move but never new content. Ruled content is not
358+
// growth (the 811 → 812 entry above). SKILL.md is not a CROSS_FILE_MOVES
359+
// destination, so no `ruledRaises` record applies. Landed count, headroom 0,
360+
// same convention.
361+
['.claude/skills/pm-dispatch/SKILL.md', 819],
336362
// Raised 223 → 244 by the triage reading-cost card (maintainer ruling
337363
// 2026-08-20, quoted in the raising PR): three mandated conventions land in
338364
// the runbook's triage sections. Landed count, headroom 0, same convention.

0 commit comments

Comments
 (0)