Repository navigation
Commit 5876b54
docs(pm-dispatch): a decision analysis recommends exactly one option (#24520)
Fixes #24444
Clause-②: no
## What
Two lines of
`.claude/skills/pm-dispatch/references/decision-analysis.md`, nothing
else (1 file, +2 / −2):
- **line 9** (the director's pre-batch increment): 「推荐/回退/口径」 → 「推荐/口径」,
the card's wording verbatim.
- **line 26** (the recommendation item of the card-face template): 「推荐 +
回退 + 置信缺口:荐一项、给回退项、明说看不见什么;⛔ 不沿用他席推荐。」 → 「推荐 + 置信缺口:只荐一,余各一句不取理由;盲区明说,⛔
不因此另荐;⛔ 不沿用他席推荐。」
The four facets, the 自检 line and the 裁后执行 paragraph are untouched;
`SKILL.md` is untouched.
## Why
The maintainer, 2026-10-19: 「你的决裁总是有一个回退合理吗?是完全不同的开发方向。最终结论应该只有一个吧?是
skills 的问题吗」, then 「同意」 on the card's change. Ruling of record: director
ledger comment `6259199455` (on #12708).
## Route A: compressed in place, line count unchanged
The card's line-26 text measures 150 bytes; the ratchet's
`MAX_LINE_BYTES` is 120 (`scripts/pm/check-skill-line-ratchet.mjs`), and
the file sits at 50 lines against its 50-line ceiling (headroom 0). So
the ruled wording cannot land verbatim on one line. Route A (compress
the wording, keep every clause, add no line) loses no clause, so route B
(fold the verbatim text into two lines and raise the ceiling 50 → 51
under the ruling) was not taken and the `CEILINGS` row is unchanged.
Clause survival, ruled text → landed fragment:
| Ruled clause (card text) | Landed fragment | Change |
|---|---|---|
| item name 推荐 + 置信缺口 | 推荐 + 置信缺口 | verbatim |
| ① 只荐一项 | 只荐一 | measure word 项 dropped |
| ② 其余选项各一句不取理由 | 余各一句不取理由 | 其余选项 → 余 (the remaining options, set
against 一) |
| ③ 看不见什么明说 | 盲区明说 | 看不见什么 → 盲区 (blind spots) |
| ④ ⛔ 不因此给第二推荐 | ⛔ 不因此另荐 | 给第二推荐 → 另荐 (recommend another); 因此 and ⛔ kept
|
| ⑤ ⛔ 不沿用他席推荐 | ⛔ 不沿用他席推荐 | verbatim, byte-identical to the old line's
tail |
Nothing is added: no new clause, no new term, each clause keeps its own
separator and its own ⛔. A shared-⛔ variant that kept 只荐一项 whole
(`…盲区明说,⛔ 不因此另荐,不沿用他席推荐。`, 119 B) was weighed and refused, because it
lets 因此 read across clause ⑤.
## Line budget
| | before | after | ceiling |
|---|---|---|---|
| file lines | 50 | 50 | 50 |
| line 9 bytes | 119 | 112 | 120 |
| line 26 bytes | 110 | 120 | 120 |
Control: with the card's verbatim text placed at line 26, the gate's own
`scanLineLengths` reports `[{"line":26,"bytes":150}]`; on the landed
tree it reports `[]`.
## Premise checks on `origin/main` `f4755a68a`
- The card's line numbers 13 and 30 are off: the two strings sit at
lines 9 and 26.
- `git grep -n "回退" f4755a6 -- .claude/skills/pm-dispatch/
.claude/agents/` gives 15 hits. Only these two are decision-analysis
uses; the rest (os-dev wording ×4, `SKILL.md` line 249's `??` fallback,
`dispatch-runbook.md`, `execution-duties.md`, `lanes/triage.md`,
`platform-readings.md` ×3, `reading-discipline.md`) are untouched.
- No script, test or doc pins the old wording: `git grep` for 回退/口径,
给回退项 and 推荐 + 回退 finds only the two lines themselves.
## Verification, all at head `ddf97945b`
The 17 families `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives for this diff, each exit code
captured before any pipe:
| Command | Exit |
|---|---|
| `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-harness-current.mjs --self-test` | 0 |
| `pnpm --filter @objectstack/lint run check:doc-formula-expressions` |
0 (first run 3, PREREQUISITE NOT MET: `@objectstack/formula` and
`@objectstack/lint` unbuilt in the fresh worktree; built under the
verify lock, rerun 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-governed-merges` | 0 |
| `pnpm check:pm-skill-id-lint` | 0 |
| `pnpm check:pm-skill-ratchet` | 0, `decision-analysis.md is 50 lines
(ceiling 50; headroom 0)`, no line-length offender |
| `pnpm check:refd-timer-probe` | 0 |
| `pnpm check:skill-frame-sync` | 0 |
| `pnpm check:watch-hint-literal` | 0 |
`dispatch-gates --ran` with the exit-coded record: `17 derived, 17 run,
0 NOT-MEASURED, 0 UNRUN` (a derived zero). Also run: `pnpm
check:pm-settings-deny-roster` exit 0 (its roster lives under
`.claude`). `node scripts/pm/check-governed-merges.mjs --branch` answers
GOVERNED, Tier S (exit 3, the governed code). Text-only change: no
tests, no ablation. The type-check lanes, `test:repo` and `pnpm lint`
belong to CI.
## Acceptance notes
- Tier S (`.claude/**` only). This PR stays a draft; ready and queue
belong to the owning seat after an isolated contract-tier review.
- No changeset: `.claude/**` publishes nothing; `skip-changeset` is
declared with this PR's creation.
## 维护者速读(草稿)
- **改了什么:** 决策分析写法删掉「回退项」。总监批前增量从「推荐/回退/口径」改为「推荐/口径」;卡面推荐条改为「推荐 +
置信缺口」:只荐一个方案,其余方案各用一句话说明为何不取,看不见的地方明说,但不因此再给第二个推荐。只动这两行,文件仍是 50 行。
- **为什么改:** 您指出「最终结论应该只有一个」。旧模板要求每次附一个回退项,实际常是另一条完全不同的开发方向,等于把决定又推回给您。
- **风险与代价(含回滚):** 纯文本,不发布,不影响产品运行。第 26 行为了压进每行 120
字节的上限做了措辞压缩(「其余选项」→「余」、「看不见什么」→「盲区」、「给第二推荐」→「另荐」、「只荐一项」→「只荐一」),五个分句全部保留,但不是卡上原文逐字。回滚
= revert 本 PR 的一个提交。
- **席位意见:**
- **你要做的:** 无。本 PR 属 Tier S,由席位隔离复核通过后入队落地。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent ec16dbe commit 5876b54
1 file changed
Lines changed: 2 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
| 9 | + | |
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
| 26 | + | |
27 | 27 | | |
28 | 28 | | |
29 | 29 | | |
| |||
0 commit comments