Skip to content

Commit 1d41aa8

Browse files
huangyiireneclaude
andauthored
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

File tree

‎.claude/skills/pm-dispatch/references/landing-operations.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
- 更硬的旁证是查上一单的实现体完好:`git grep` 带引号精确名对 `origin/main` 与实现文件。
1313
- 锚点断言的正确措辞:断言 `pnpm --filter @objectstack/spec check:authorable-surface` 绿即可。
1414
- `baseRev` 允许滞后,是一行提示不是错误;⛔ 禁为凑相等手改锚点。
15-
- ⛔ 不得要求 `baseRev == merge-base`。
1615

1716
## B. 跟到 MERGED 为止;入队后的看护归车道 PM 落地窗口
1817

@@ -28,6 +27,7 @@
2827
- Tier H(其余受管面)者:四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地。
2928
- ⛔ 两层不由席位批准;清标即落地同受此闸,漏判会被队列守卫在 merge group 里拒收。
3029
- 再读 `mergeable_state`:`dirty` ⇒ 先 merge `origin/main` 再挂;生成物在面上按 A 的固定序。
30+
- 挂 auto-merge 的同一动作里重测生成物漂移,⛔ 不复用更早的零;非零 ⇒ 按 A 的固定序。
3131
- ready + 全绿 ≠ 已入队:队列从不主动拉 PR,入队是显式动作。
3232
- 零 `enqueued` 事件按序查三条:① `mergeable_state` 是否 `dirty`。
3333
- ② enable-auto-merge 调用根本没落地,重发与效果验证序列见 `platform-readings.md`。

0 commit comments

Comments
 (0)