Repository navigation
Commit 9bc4dde
docs(pm-dispatch): retire rule A — the spec floor follows the commit pin since objectstack-ai/objectui#12958 (#24742)
Fixes #24730
Clause-②: no
Retires rule A of the dispatch runbook: the three lines under 〈派发词构造细则〉
that told a dispatching seat to make the first consumer of a new
`@objectstack/spec` release raise that package's manifest floor in the
same PR. The rule's subject ended with objectstack-ai/objectui#12958,
which made objectui compute its `@objectstack/*` floors from the commit
pin at publish. Triage shape (comment 6282324835): one Tier S text PR
that deletes the three lines.
## The change
One file, `.claude/skills/pm-dispatch/references/dispatch-runbook.md`,
three whole lines deleted, nothing added. The deleted lines, verbatim:
```text
- 卡的代码首读 spec 发布 R 首发的键、类型成员或运行时行为,即 R 的首个消费者:
- 同 PR 把消费包 `@objectstack/spec` 下限抬到 R,认领文件面点名 manifest 与 lockfile specifier。
- 「不动 pin」只禁 lockfile 解析版本与 `.objectui-sha`/console pin 的移动,⛔ 永不禁下限。
```
- Line budget: 241 → 238 lines against the file's ceiling of 241. The
deleted lines are 106 / 113 / 110 bytes, newline excluded. Nothing is
added, so the 120-byte line cap is not engaged.
- The CEILINGS row in `scripts/pm/check-skill-line-ratchet.mjs` stays at
241. That is the card's default: the 3 lines of headroom are left for
later ordinary edits to this file.
- Rule B (`triage-duties.md` lines 30–31, the bump card's wait list read
from the hold index) is not in the diff.
- What the edit leaves next to each other: the new line 210 「跨包常等于跨车道,PM
事后补跨座位声明。」 ends the file-surface block (lines 208–210). The new line 211
「模型标识只禁内容工件:…」 starts the model-identifier pair. Neither line depends on
the other, so no separator line is added.
## Why: the premise and its ruling source
- Ruling source: the maintainer's letter B on
objectstack-ai/objectui#12955 (objectui comment 6248859734). Under it,
objectui consumes `@objectstack/*` by commit pin (`.objectstack-sha`).
- Execution: objectstack-ai/objectui#12958, through
objectstack-ai/objectui#13024, merge commit `4484a1104`, merged
2026-10-19T06:37Z. objectui's `changeset:publish` now runs
`scripts/objectstack-floor.mjs` first. That script computes each
`@objectstack/*` floor from `.objectstack-sha` and, at publish, rewrites
any range below the floor.
- Parent: #24276. Rule A landed there through #24315 (`83048c686`). The
objectui `domain:ui` seat's note `6248946273` on that card had already
named this re-read as due once objectstack-ai/objectui#12958 shipped.
- No consumer is left for rule A to govern:
- objectstack depends on `@objectstack/spec` only through `workspace:`
ranges.
- hotcrm pins exact published versions.
- cloud moves by `.objectstack-sha` bump cards.
## Premise re-checks (the card's 〈Premises〉, each run before the edit)
1. **objectui computes floors at publish: HOLDS.** Read on objectui
`origin/main` `4b6774649`, fetched in this run, with `git show
origin/main:package.json | grep changeset:publish`. The line reads
`"changeset:publish": "node scripts/objectstack-floor.mjs && node
scripts/check-published-dist-tooling.mjs && node
scripts/check-spec-range-floors.mjs && changeset publish",` and so
starts with `node scripts/objectstack-floor.mjs &&`. Ancestry: `git
merge-base --is-ancestor 4484a1104 origin/main` exits 0, which proves
itself even on a shallow checkout.
2. **The objectui card has a merged PR: HOLDS.** `GET
/repos/objectstack-ai/objectui/pulls/13024` returns `merged: true`,
`merge_commit_sha` `4484a11041f336b96e545e73277ac61a425c7c74` and
`merged_at` `2026-10-19T06:37:07Z`. The issue read of
objectstack-ai/objectui#12958 returns `state_reason` `completed`.
3. **The three lines exist only at 211–213: HOLDS.** Read on objectstack
`origin/main` `7e7e605de`, this branch's base; the dispatch had read
`9b2953d62`. `grep -rnE '永不禁下限|首个消费者|下限抬到' --exclude-dir=node_modules
--exclude-dir=.git .` gives 3 hits, all `dispatch-runbook.md:211–213`.
After the edit, `grep -cE` on the file with the same pattern gives 0.
Control: `grep -c '派发词构造细则'` on the same file gives 1.
4. **Rule B stays untouched: HOLDS.** `grep -n 'hold 索引'
.claude/skills/pm-dispatch/references/triage-duties.md` hits lines 30
and 31, and that file is not in the diff.
Also checked: no file cites a line number inside `dispatch-runbook.md`,
so the 3-line shift leaves nothing stale. `git grep -nE
'dispatch-runbook(\.md)?[:#L ]+[0-9]{3}'` finds 0 hits. The tree grep in
premise 3 also shows that no test corpus pins the deleted text.
## Gates
17 commands derived by `node scripts/pm/dispatch-gates.mjs --commands
--repo objectstack-ai/objectstack` at HEAD `3969b2c3c`, the final
commit. This is the same list the dispatch derived at `9b2953d62`. Every
command ran at that head, and each exit code was captured before any
pipe:
```text
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/pm/check-harness-current.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pm-skill-ratchet :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:watch-hint-literal :: exit 0
```
- Ratchet line for this file: `✓ check-skill-line-ratchet:
.claude/skills/pm-dispatch/references/dispatch-runbook.md is 238 lines
(ceiling 241; headroom 3).`
- `check:doc-formula-expressions` first answered exit 3 (PREREQUISITE
NOT MET: the `@objectstack/formula` and `@objectstack/lint` dist were
not built). That is not a measurement. Both packages were then built
under the verify lock (`VERDICT command-exit 0`), and the re-run
answered exit 0.
- `--ran` reconciliation: `✓ dispatch-gates --ran: 17 derived famil(ies)
accounted for — 17 run, 0 NOT-MEASURED (a DERIVED zero — all 17 recorded
an exit code and none of them is 3).`
- Not run locally:
- No package is touched, so there is no build closure and no package
test or typecheck to run.
- `check:dev-prereqs` and `check:skill-frame-freshness` are not owed:
the diff touches neither `packages/spec` nor the four-axis frame file.
- No ablation: this is a text deletion and no tested behaviour changes.
- The CI families are read from this PR's check-runs.
- No changeset: `.claude/**` publishes nothing, so `skip-changeset` is
declared on create.
## Acceptance notes
- No out-of-scope findings.
- `origin/main` moved from `9b2953d62` (the dispatch's read) to
`7e7e605de` (this branch's base) between the two reads. The target file
did not change between them: line numbers, byte counts and the tree grep
are identical.
## 维护者速读(草稿)
**改了什么**
- 删掉派发运行细则里「规则 A」的三行,只删不加。
- 这条规则原本要求:当一张卡的代码最先读到 spec 新版本首发的键时,同一个 PR 必须把消费包的 `@objectstack/spec`
版本下限一起抬上去。
- 规则 B(bump 单的等待卡清单)保持不动。
**为什么改**
- 规则 A 现在没有适用对象了。
- 依据是维护者对 objectstack-ai/objectui#12955 的裁决 B:objectui 改为按提交 pin 消费
`@objectstack/*`。
- objectstack-ai/objectui#12958 已经落地这一点(objectstack-ai/objectui#13024
已合并):objectui 发布时按 `.objectstack-sha` 自动算出每个下限,并改写低于下限的版本区间。
- 其余几处也都不需要手抬下限:objectstack 自身全部用 `workspace:` 依赖,hotcrm 逐包写定版本号,cloud 走
pin bump 单。
- 留着这条规则,派发词就会要求开发者手改一个发布时反正会被覆盖的下限,复核时还要去找一个不存在的预期文件。
**风险与代价(含回滚)**
- 风险很低:纯文本删除,不涉及任何代码或发布物。
- 文件从 241 行降到 238 行,上限 241 保持不变。
- 回滚:日后如果出现手写版本区间的新消费者,revert 这一个 commit 即可还原。
**席位意见**
**你要做的**
- 无需操作。本 PR 属于 Tier S,由席位在达档复核 PASS 且全部检查转绿后落地。
- 这段给你知情,你也可以在此期间否决。
---
_Generated by [Claude
Code](https://claude.ai/code/session_01HEdP5tPhqQfzwRmKDxwn85)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent fc34d00 commit 9bc4dde
1 file changed
Lines changed: 0 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
208 | 208 | | |
209 | 209 | | |
210 | 210 | | |
211 | | - | |
212 | | - | |
213 | | - | |
214 | 211 | | |
215 | 212 | | |
216 | 213 | | |
| |||
0 commit comments