docs(pm): arm-time drift re-measurement becomes standing in landing-operations B - #19697
Conversation
…perations B The ruled fourth bullet of the pure-regeneration ruling: the generated-artefact drift reading is taken in the SAME act that arms auto-merge, and an earlier zero is never reused — a zero that was true when read goes false the moment a sibling PR lands, which is how a PASSed PR gets kicked out of the queue two minutes after it was armed. A non-zero reading routes back to section A's fixed sequence. Placed in B beside the existing arm-act re-read of `mergeable_state`, which already routes a generated-artefact hit into A's sequence: both readings of the arm act now sit adjacent. Section A is what to DO once drift is found, not when to measure it. Paid at the ratchet ceiling (69 / 69, headroom 0) by retiring the duplicate `⛔ 不得要求 baseRev == merge-base`: it and the line above it were ONE sentence until the rules-only rewrite split a comma-clause into its own bullet, the surviving line already states that a lagging `baseRev` is allowed and is not an error (so the equality cannot be required) and names the same 相等, and the only content the retired line ever had of its own — that the equality is not any gate's criterion — is held by the line naming `check:authorable-surface` green as the criterion. No gate reads the equality. Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc Co-authored-by: Claude <noreply@anthropic.com>
…m-time-drift-remeasure
Contract reviewServed-tier: ① Derived judgmentsRendered in-seat by the skills seat 1 session at the served tier the maintainer named on this date (the fable tier word at
② Semver levelNone — no release. ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
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.mdsits at its ratchet ceiling (69 / 69, headroom 0). The ceiling inscripts/pm/check-skill-line-ratchet.mjsis 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):
Out — section A's former tail, line 15:
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⇒ 先 mergeorigin/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:
baseRev允许滞后,是一行提示不是错误;⛔ 禁为凑相等手改锚点。」 — a laggingbaseRevis 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.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.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.grep -rn 'baseRev' scripts/finds it only inscripts/regen-artifacts.mjscomments and the docs-audit helpers; no gate comparesbaseRevto 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, percmd redirected-to-a-file; EXIT=$?.Union re-run on the final head
859c3df37(the merge oforigin/main40626bdcais in it, so the ratchet reading below is the one that counts):Named families, verdict lines as the gates printed them:
pnpm check:pm-skill-ratchetlanding-operations.md is 69 lines (ceiling 69; headroom 0); widest table row 0 bytes (pin 0)pnpm check:pm-skill-id-lint30 file(s) clean (pattern /#[0-9]{3,}/g)pnpm check:skill-frame-syncpnpm check:pm-governed-prose2 instruction surface(s) name all 6 registered governed surfacespnpm check:doc-authoring403 files clean;44 published skill files clean; 16120 customer-facing strings cleanpnpm check:nul-bytesOK (scanned 9202 text file(s) … no raw ASCII control bytes)node scripts/check-skills-token-ratchet.mjs34 authored bundle file(s) within their ceilingspnpm check:pm-governed-mergesThe other nine derived families (
check-closing-keyword-parityand 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-rosterwas 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-authoringbeforepnpm installin this fresh worktree, andcheck:doc-formula-expressionsbeforepnpm 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 --pron this PR is reported in the dev report on the card.Landing
.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.references/, so this is fact-layer text and no 维护者速读 section is owed..claude/**is in no package's publishedfiles[]— it ships to nobody — soskip-changeset.Acceptance notes
Generated by Claude Code