Repository navigation
Commit 5e231a0
docs(pm-dispatch): decision cards and director presentations state each option's development workload (#22654)
Fixes #22597
Clause-②: no
Maintainer-directed (triage seat session, 2026-10-10):
「以后总监决裁的时候还应该适当评估开发工作量。」 Every decision card and every director
presentation now states each option's development workload, and the
weighing rule is proposed here for the maintainer's approval (card item
3).
## What changed — three governed files, all Tier S, the four-axis block
byte-identical
**`.claude/skills/pm-dispatch/references/decision-analysis.md`** (50 →
50)
- The options × cost table line becomes 「选项 × 真实代价 × 工作量表」 with the four
columns in the order the newest decision cards already render (做什么 ·
客户可感知后果 · 工作量), so the next card copies the shape of #22621's table.
- A new line defines the column: 工作量 = 车道 · 阶段/PR 数 · 实测先例 (a named
landed PR with its +/− line counts) or 「无先例」; ⛔ 不猜.
- The staging rule 「②③④ 只调时序分期 ⛔ 不翻字母」 now reads 「②③④ 与工作量只调时序分期 ⛔
不翻字母」; unchanged in substance for ②③④.
- A new weighing line, the proposal: 「工作量恒逐选项列;①读数相近而工作量差 ≥3×
推荐须点名;翻字母只凭维护者卡上另裁。」
- Paid line for line with two deleted restatements, not re-wraps: the
pointer line 「语言例外见 SKILL.md 〈全体座位的不变量〉」 (what it points at — new
records only, legacy blocks untouched — is already the file's own scope
line 「只适用新记录,存量 ⛔ 不回改」 and SKILL.md's invariant 「四维中文只管新记录,存量英文块 ⛔
不迁移」), and the facet-section tail line 「末尾推荐行 + 字母选项带自检…,再一行置信缺口」 (the
template's own items already require 推荐 + 回退 + 置信缺口 and the 自检行, in that
order).
**`.claude/skills/pm-dispatch/references/lanes/director.md`** (63 → 65
of 72)
- Under 授权与形态, after the `Ruled:` body-line rule:
「裁决记录同笔写明所选字母的工作量,读数取自卡面工作量列。」
- Under 基本原则, after 三要素: 「呈报的代价列旁恒带工作量列(车道 · 阶段/PR 数 ·
实测先例或「无先例」),与卡面同列。」
**`.claude/skills/pm-dispatch/SKILL.md`** (319 → 319)
- One line re-spelled in place under the 120-byte cap:
「决策卡带选项、推荐、证据、四棱块与工作量列;受阻执行卡同笔挂 `pm:blocked`+`Blocked-by:`。」 (was
「决策卡带选项、推荐、证据与四棱块;被阻塞的执行卡同笔挂 `pm:blocked` + `Blocked-by:`。」).
- The four-axis block (lines 241–261) is byte-identical: md5
`abff5f852c8fd09b79ec0623439aa4f0` before and after. Workload is a
column in the table and a line in the recommendation, not a fifth axis;
the 基本裁决原则 paragraph is untouched.
## The weighing rule, and how it sits beside the two standing rules
The proposal (approving it is the one action the 速读 below asks for):
1. Workload is always shown, per option, in the table — never summarised
away.
2. When two options' long-term (axis ①) readings sit near one another
and their workloads differ by ≥3×, the recommendation names that gap.
3. Workload adjusts staging and sequencing only; it never flips the
letter — unless the maintainer rules otherwise on the card.
Beside 「长远合理性权重恒 ≥50%:推荐以长远的读数领起,四轴冲突时其余各轴合起来投不翻它。」 (SKILL.md,
untouched): workload is not an axis and casts no vote, so the long-term
reading's ≥50% weight stays whole; the gap-naming rule applies only
where ① does not separate the options.
Beside 「②③④ 只调时序分期 ⛔ 不翻字母;契约迁就实现、分期半量 ⛔ 不作推荐。」 (decision-analysis.md):
workload joins ②③④ on exactly that side of the line — staging, never the
letter — and the half-measure prohibition is unchanged.
## Card item 4 — the dev-side copy: reading found, no edit needed
`dispatch-runbook.md` 205–206 and `os-dev.md` 354–356 point at the block
by name (「内部 PM 副本 = SKILL.md 升级与决策 节的四轴框架块」, 「该块自黑体句起、至推荐约束句止」,
「框架唯一副本在 pm-dispatch SKILL.md 〈升级与决策〉」), not by line number, and
`check:skill-frame-sync` anchors on the declaring and binding sentences.
The block did not move and its bytes did not change, so neither pointer
breaks and neither file is edited.
Residual, for the seat: the dev's `needs_decision` instruction at
`os-dev.md:353` asks for 「选项、成本与你的推荐」 — the unqualified 成本 — so the
column's precise definition reaches a dev only through the PM's dispatch
prompt. A one-line in-place rewording carrying the triple measures 145
bytes against the 120-byte cap, so it would cost a deletion in a 402/402
file; that is outside this card's surface and is not a pointer break.
## Line budget (`pnpm check:pm-skill-ratchet`; 120-byte line cap)
| file | before | after | ceiling |
|---|---|---|---|
| `.claude/skills/pm-dispatch/SKILL.md` | 319 | 319 | 319 |
| `.claude/skills/pm-dispatch/references/decision-analysis.md` | 50 | 50
| 50 |
| `.claude/skills/pm-dispatch/references/lanes/director.md` | 63 | 65 |
72 |
| `.claude/skills/pm-dispatch/references/dispatch-runbook.md` | 241 |
241 (untouched) | 241 |
| `.claude/agents/os-dev.md` | 402 | 402 (untouched) | 402 |
Every added or changed line measures ≤120 bytes (seven lines: 120, 118,
119, 113, 120, 84, 119).
## Gates (run at `1e39518d6`; exit codes captured before any pipe)
| command | exit | note |
|---|---|---|
| `node scripts/check-closing-keyword-parity.mjs` | 0 | |
| `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | |
| `node scripts/check-comment-mask-corpus.mjs` | 0 | |
| `node scripts/pm/check-governed-queue-guard.mjs --self-test` | 0 | |
| `node scripts/pm/check-harness-current.mjs --self-test` | 0 | |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
0 | first run exit 3 = PREREQUISITE NOT MET (workspace packages
`@objectstack/formula`/`@objectstack/lint` unbuilt; nothing measured);
built them under the verify lock and re-ran: exit 0 |
| `pnpm check:agent-test-spelling` | 0 | |
| `pnpm check:cross-package-test-inputs` | 0 | |
| `pnpm check:doc-authoring` | 0 | |
| `pnpm check:driver-memory-census` | 0 | |
| `pnpm check:gitlink-declared` | 0 | |
| `pnpm check:nul-bytes` | 0 | |
| `pnpm check:pm-expected-skips` | 0 | |
| `pnpm check:pm-governed-merges` | 0 | |
| `pnpm check:pm-governed-prose` | 0 | |
| `pnpm check:pm-skill-id-lint` | 0 | |
| `pnpm check:pm-skill-ratchet` | 0 | |
| `pnpm check:refd-timer-probe` | 0 | |
| `pnpm check:skill-frame-sync` | 0 | |
| `pnpm check:watch-hint-literal` | 0 | |
| `pnpm check:agent-model-declared` | 0 | |
| `pnpm check:skill-frame-freshness` | 0 | |
| `pnpm check:pm-settings-deny-roster` | 0 | |
Derivation: `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` with no paths (change set read from the
merge base, 3 files, +7/−5) → 20 commands. `--ran` reconciliation: exit
0 — 20 derived families accounted for, 20 run with exit codes recorded,
0 NOT MEASURED (the 3 runs beyond the derivation recorded beside them).
Three runs beyond the derivation: `check:agent-model-declared` and
`check:skill-frame-freshness` (named by the dispatch) and
`check:pm-settings-deny-roster` (the derivation marks its roster as
living under `.claude`, where it is not evidence either way until read).
## Changeset
`.claude/**` ships in no package's `files[]` → `skip-changeset`.
## Acceptance notes
- #22621, filed before this rule, already renders the four-column table
and its ruling record already states the chosen option's workload; this
PR codifies that shape rather than inventing one.
- No gate added, none weakened, no script touched; `dispatch-runbook.md`
and `os-dev.md` untouched.
## 维护者速读(草稿)
### 改了什么
决策卡的「选项 × 真实代价」表加一列「工作量」:每个选项写清触及哪些车道、分几个阶段/几个 PR、一个实测先例(具名已落地的 PR 及其
+/− 行数),没有先例就写「无先例」,不许估猜。总监呈报带同一列,裁决记录写明所选字母的工作量。
### 为什么改
您 2026-10-10 的指示:「以后总监决裁的时候还应该适当评估开发工作量。」起因是 ADR-0131 C2 做到 17 个 PR、约
+16k/−1.3k 行、四个阶段未完,而当初裁决时没有人说过这个选项要花多少。
### 风险与代价(含回滚)
只改三份内部规则文件共 7 行文字,不改任何门禁与代码;四轴框架块一字未动。新增两行以删掉两行重复表述付账,行数上限不动。回滚 = revert
本 PR,无数据与发布面影响。代价:立卡席从此每张决策卡要多量一个先例 PR 的行数。
### 席位意见
### 你要做的
一个动作:批准「工作量怎么称量」的提案 —— 工作量恒逐选项列出;①读数相近而工作量差 ≥3× 须在推荐里点名;工作量与 ②③④
一样只调分期、不翻字母,除非您在卡上另裁。若您希望工作量在某些情形下可以翻字母,请在本 PR 回一句,席位按您的话改那一行。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01RdnZdPZH9ByduzPRWuH9tN)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 36ac4b4 commit 5e231a0
3 files changed
Lines changed: 7 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
266 | 266 | | |
267 | 267 | | |
268 | 268 | | |
269 | | - | |
| 269 | + | |
270 | 270 | | |
271 | 271 | | |
272 | 272 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
25 | | - | |
| 25 | + | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
31 | | - | |
| 32 | + | |
| 33 | + | |
32 | 34 | | |
33 | 35 | | |
34 | 36 | | |
35 | 37 | | |
36 | 38 | | |
37 | 39 | | |
38 | | - | |
39 | 40 | | |
40 | 41 | | |
41 | 42 | | |
42 | 43 | | |
43 | 44 | | |
44 | 45 | | |
45 | 46 | | |
46 | | - | |
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
21 | 22 | | |
22 | 23 | | |
23 | 24 | | |
| 25 | + | |
24 | 26 | | |
25 | 27 | | |
26 | 28 | | |
| |||
0 commit comments