Repository navigation
Commit 58ac824
docs(skills): runbook reading three carries the declared population and 同席号 (#19304)
Fixes #18957
Clause-②: no
One line of `.claude/skills/pm-dispatch/references/dispatch-runbook.md`,
rewritten in place. No `SKILL.md` edit: the contract is right, only the
paraphrase moves.
## The change, with byte counts
The contract :61 paraphrases, `.claude/skills/pm-dispatch/SKILL.md` :80
(verbatim, untranslated):
```text
- 读数三:本车道 `pm:dispatched` ∪ `pm:queue` 卡最新非本 session 同席号的 `Claim:` 评论。
```
`references/dispatch-runbook.md` :61, before — **114 B**:
```text
- 第三读数(车道 `pm:dispatched` 卡最新非本 session `Claim:`)出自车道盘点,不在座位贴线程。
```
after — **120 B** (cap 120):
```text
- 第三读数(本车道 `pm:dispatched` ∪ `pm:queue` 卡最新非本 session 同席号 `Claim:`)出自车道盘点。
```
Both missing clauses now stand in the contract's own words: the
population `本车道 pm:dispatched ∪ pm:queue`, and 同席号. The 同席号 spelling is
`SKILL.md` :82's (「首张带同席号 `Claim:` 卡」) rather than :80's 「同席号的 `Claim:`
评论」 — the same word, and not a third one; :80's full form measures 130 B
and does not fit.
## What paid for it: a retirement inside the same block
Net **0 lines**: 241 / 241, ceiling 241, headroom 0 — the file's line
count never moves, and no line was bought.
The 「不在座位贴线程」 tail is retired as the negative restatement of :60, which
is unchanged and reads:
```text
- 互斥最小尾页读法:尾页配方只覆盖座位贴的两个读数,判空缺另对正文与标题。
```
:60 already states that the tail-page recipe covers only the seat post's
two readings — the same fact, from the other direction. What :61 keeps
is the half :60 does not carry: where reading three DOES come from
(车道盘点). Nothing else in the file is touched; #18964 queues behind this
card on the same file.
### Why nothing smaller fits
Measured on the landed bytes, all four candidates against the 120-byte
cap:
| candidate | bytes | verdict |
|:---|---:|:---|
| both clauses kept, population and 同席号 added | 142 | over the cap |
| :80's exact 「同席号的 `Claim:` 评论」 | 130 | over the cap |
| 「不在座位贴线程」 kept, 「出自车道盘点」 dropped | 123 | over the cap |
| **landed** — 「不在座位贴线程」 retired | **120** | at the cap, green |
Folding the retired clause into :60 instead was measured and refused:
:60 is 106 B, so it carries 14 B of headroom against the 22 B the clause
plus its separator needs, and buying the room would mean rewriting a
line PR #18950 landed three days ago.
## Predecessor read first
`a85b5dc` (PR #18950) rewrote this same block on 2026-09-18. It touched
:60 and :63 and deliberately left :61 alone, recording its headroom at 6
B. Neither of its two lines is undone here; :61 was not one of them.
## Landing tier
`node scripts/pm/check-governed-merges.mjs --test
.claude/skills/pm-dispatch/references/dispatch-runbook.md` reads **Tier
S (席内达档复核落地)** — `.claude/**` ×1, the agent instruction tree. The PR
stays DRAFT; the owning seat lands it once the thread carries a `##
Contract review` record for the current head. Size: 2 changed lines, far
under the 5,000-line human-merge threshold.
## Gates — head `cec2518`
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` with no paths derived 16 families from the
tree at `cec2518`; every one was run and every exit code captured before
any pipe.
| gate | 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 |
| `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:nul-bytes` | 0 |
| `pnpm check:pm-governed-merges` | 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 |
Reconciliation, `dispatch-gates.mjs --repo objectstack-ai/objectstack
--ran`:
```text
✓ dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED
(a DERIVED zero — all 16 recorded an exit code and none of them is 3).
```
`check:doc-formula-expressions` first returned **exit 3** — PREREQUISITE
NOT MET, an unbuilt `@objectstack/formula` and `@objectstack/lint`,
nothing measured. It was re-run at exit 0 after `pnpm exec turbo run
build --filter=@objectstack/formula --filter=@objectstack/lint` under
`scripts/pm/os-verify-lock.sh` (`VERDICT command-exit 0`).
Two families the derivation flagged rather than cleared were also run:
- `pnpm check:pm-settings-deny-roster` — exit 0; the derivation marks
its roster as living under `.claude`, which one of the changed paths is
in, so its silence is evidence in neither direction.
- `node scripts/pm/check-governed-merges.mjs --test` — the tier read
above.
The ratchet's own verdict lines, from `pnpm check:pm-skill-ratchet`:
```text
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 241 lines (ceiling 241; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md: widest table row is 0 bytes (pin 0; headroom 0).
```
and its 120-byte rule, read back through the gate's own `lengthVerdict`
on the edited tree:
```text
.claude/skills/pm-dispatch/references/dispatch-runbook.md: every line is within 120 bytes (or structurally exempt). | offenders: 0
```
## Lint: a measured narrowing, not a skipped run
`pnpm lint` (`eslint . --no-inline-config`) is CI's repo-wide run.
Narrowed here to the one changed path, with the three readings that make
the narrowing a measurement:
1. **Population, read from eslint's own config** — every block in
`eslint.config.mjs` matches `**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}` or a
subtree of it. No block names `.md`.
2. **File count, from `--format json`** — `pnpm exec eslint
--no-inline-config --format json
.claude/skills/pm-dispatch/references/dispatch-runbook.md` exits 0 over
1 file, 0 errors, and the single message is `File ignored because no
matching configuration was supplied.`
3. **Invariance for untouched files** — the diff contains no file of a
linted extension at all, so no eslint verdict anywhere in the repo can
move; type-aware linting is not enabled, so nothing reaches an untouched
file through a program graph either.
## Acceptance notes
- `references/core-rules.md` :18
(「开轮互斥四读数:收班简报、开轮标记、本车道同席号最新他会话认领与最新关闭卡认领。」) is the nearest sibling
paraphrase and was checked: it NAMES the four readings and spells no
population at all, so it is not a narrower restatement and needs no
matching edit. Noted, not filed; no queued card carries `core-rules.md`.
- No changeset: `.claude/**` publishes nothing from any released
package. Label `skip-changeset`.
---
_Generated by [Claude
Code](https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 3d18877 commit 58ac824
1 file changed
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
61 | | - | |
| 61 | + | |
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
| |||
0 commit comments