Repository navigation
Commit 1d41aa8
docs(pm): arm-time drift re-measurement becomes standing in landing-operations B (#19697)
Part of #19244
Remainder item ① of the card, carrying the pure-regeneration ruling's
fourth bullet into the landing protocol: the generated-artefact drift
reading is taken in the SAME act that arms auto-merge, and an earlier
zero is never reused.
## What changed — one line in, one line out, net 0
`.claude/skills/pm-dispatch/references/landing-operations.md` sits at
its ratchet ceiling (69 / 69, headroom 0). The ceiling in
`scripts/pm/check-skill-line-ratchet.mjs` is **not** touched; the new
rule is funded by retiring a provable duplicate in the same file. The
file is 69 lines before and after.
**In** — section B, line 30 (115 bytes, under the gate's 120-byte cap):
```
- 挂 auto-merge 的同一动作里重测生成物漂移,⛔ 不复用更早的零;非零 ⇒ 按 A 的固定序。
```
**Out** — section A's former tail, line 15:
```
- ⛔ 不得要求 `baseRev == merge-base`。
```
## Placement, and the candidate that was rejected
The rule governs the **arm act** — B:21 「绿即转 ready + 挂 auto-merge」 — so
it sits directly under B's existing arm-act re-read, B:29 「再读
`mergeable_state`:`dirty` ⇒ 先 merge `origin/main` 再挂;生成物在面上按 A 的固定序」,
which already routes a generated-artefact hit into A's fixed sequence.
The arm act now carries both of its readings on adjacent lines, and the
new line's consequence clause reuses the vocabulary of the line above
it.
Section A's tail was the other candidate and was rejected on
measurement: A is the sync-and-regenerate procedure — what to DO once
drift is found — while the ruled bullet is about WHEN the reading is
taken. A rule about the timing of a reading placed in the procedure that
consumes it would have to name the arm act anyway, at more bytes and
further from B:21.
## Why the retired line is a duplicate and not a rule
Four legs, all on this tree:
1. **The surviving neighbour states it.** A:14 reads 「`baseRev`
允许滞后,是一行提示不是错误;⛔ 禁为凑相等手改锚点。」 — a lagging `baseRev` is permitted and is
*not an error*, and hand-editing the anchor to reach 相等 is banned. A
rule that permits the inequality and calls it a non-error already
forbids demanding the equality, which is the whole content of the
retired line.
2. **They were ONE sentence.** Until the rules-only rewrite
(`2a7feb96d`) the region was a single prose sentence: 「…`baseRev`
允许滞后(一行提示,不是错误);⛔ 禁为凑「相等」手改锚点,⛔ 不得要求 `baseRev == merge-base`。」 The
rewrite split a comma-clause of A:14's own clause into its own bullet —
the same 相等, counted twice.
3. **Its once-distinct content is held by A:13.** The clause used to end
「—— 那个等式不是任何门的判据」 (that equality is not any gate's criterion); that tail
was deleted earlier, by `a6d8ae9bf`, and the fact now lives at A:13
「锚点断言的正确措辞:断言 `pnpm --filter @objectstack/spec check:authorable-surface`
绿即可。」 — the gate's green IS the criterion, so the equality is not.
4. **No gate reads the equality.** `grep -rn 'baseRev' scripts/` finds
it only in `scripts/regen-artifacts.mjs` comments and the docs-audit
helpers; no gate compares `baseRev` to a merge base, so retiring the
line detaches no mechanism. The corpus's only other copy of the fact,
`.claude/agents/os-dev.md:195`, is untouched and says the same thing.
Nothing else in the tree changed.
## Gates
Derived with `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands` (no paths — the script took the
change set from the merge base itself) and reconciled with `--ran`. Exit
codes captured before any pipe, per `cmd redirected-to-a-file; EXIT=$?`.
Union re-run on the final head `859c3df37` (the merge of `origin/main`
`40626bdca` is in it, so the ratchet reading below is the one that
counts):
```
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).
```
Named families, verdict lines as the gates printed them:
| gate | exit | verdict |
|:---|:---|:---|
| `pnpm check:pm-skill-ratchet` | 0 | `landing-operations.md is 69 lines
(ceiling 69; headroom 0)`; widest table row 0 bytes (pin 0) |
| `pnpm check:pm-skill-id-lint` | 0 | `30 file(s) clean (pattern
/#[0-9]{3,}/g)` |
| `pnpm check:skill-frame-sync` | 0 | one declared copy coherent; 77
markdown files scanned for undeclared copies |
| `pnpm check:pm-governed-prose` | 0 | `2 instruction surface(s) name
all 6 registered governed surfaces` |
| `pnpm check:doc-authoring` | 0 | `403 files clean`; `44 published
skill files clean`; 16120 customer-facing strings clean |
| `pnpm check:nul-bytes` | 0 | `OK (scanned 9202 text file(s) … no raw
ASCII control bytes)` |
| `node scripts/check-skills-token-ratchet.mjs` | 0 | `34 authored
bundle file(s) within their ceilings` |
| `pnpm check:pm-governed-merges` | 0 | self-test green |
The other nine derived families (`check-closing-keyword-parity` and its
self-test, `check-comment-mask-corpus`, `check-harness-current
--self-test`, `check:doc-formula-expressions`,
`check:agent-test-spelling`, `check:cross-package-test-inputs`,
`check:driver-memory-census`, `check:gitlink-declared`,
`check:refd-timer-probe`, `check:watch-hint-literal`) each exited 0 on
the same head. `check:pm-settings-deny-roster` was run too although its
verdict is silent-by-roster: the derivation flags its roster as living
under `.claude/`, one of this PR's paths, where silence is evidence in
neither direction.
Two families first came back **exit 3, PREREQUISITE NOT MET — nothing
measured**, and are recorded here as the re-runs they became, never as
readings: `check:doc-authoring` before `pnpm install` in this fresh
worktree, and `check:doc-formula-expressions` before `pnpm exec turbo
run build --filter=@objectstack/formula --filter=@objectstack/lint`
(through the shared verify lock: `VERDICT command-exit 0 · held the lock
157s`). Both are exit 0 above.
`node scripts/pm/check-governed-merges.mjs --pr` on this PR is reported
in the dev report on the card.
## Landing
- **Governed surface, Tier S** (`.claude/**`): opened as draft and it
**stays draft** — the owning seat lands it on a contract-tier review of
record. No seat approval, no queue, no auto-merge from here.
- Every governed path is under `references/`, so this is fact-layer text
and no 维护者速读 section is owed.
- **No changeset**: `.claude/**` is in no package's published `files[]`
— it ships to nobody — so `skip-changeset`.
## Acceptance notes
- Remainder items ② (the post-merge audit's 「for the PR's CURRENT head」
prose) and ③ (the queue guard rendering a refused carry without naming
the refusing path) stay on the card and are **untouched** here, as
dispatched.
- No out-of-scope findings: the file's other 68 lines were read for
further duplicates only as far as needed to fund this one line, and
nothing else was changed.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 28f9277 commit 1d41aa8
1 file changed
Lines changed: 1 addition & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
16 | 15 | | |
17 | 16 | | |
18 | 17 | | |
| |||
28 | 27 | | |
29 | 28 | | |
30 | 29 | | |
| 30 | + | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
| |||
0 commit comments