Uh oh!
There was an error while loading. Please reload this page.
fix(devx): mark ratchet-editing remedies as maintainer-only in both gates' own output (#8435) - #8517
Merged
Merged
Conversation
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
qq9340100
marked this pull request as ready for review
August 13, 2026 17:13
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 13, 2026
Merged
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#8435
Committed scope item 1 only: any gate whose second remedy edits a ratchet/ledger/baseline file now marks that path as maintainer-only in its own output. Item 2 (the shared engine-double helper) is declined with a measured reason — see "Item 2: not now" below.
What changed
Diagnostic text plus embedded self-tests in the two gates the card names. Nothing else.
scripts/check-engine-double-contract.mjs— PINNED's second remedy used to read "Or add a MEASURED entry toscripts/engine-double-contract.baseline.jsonsaying why not", presented symmetrically with the real fix. It now reads "That is the fix, and the only one of the two you can take on your own. ⛔ MAINTAINER-ONLY, NOT a co-equal option: … That baseline is shrink-only, so an entry weakens a ratchet and needs a maintainer to agree first — do not take this path to get CI green."scripts/check-type-check-coverage.mjs— the TEST_DEBT upward-drift message got the same treatment, with every existing requirement preserved verbatim (thenote-rewriting clause, the "if the delta cannot be attributed" clause).Both gates carry the same greppable marker token,
⛔ MAINTAINER-ONLY, so it reads as one farm convention rather than one author's phrasing.⛔ Nothing is weakened
No threshold moved, no baseline entry added, no ledger number raised, no check made skippable.
scripts/engine-double-contract.baseline.jsonand the TEST_DEBT numbers are untouched — confirmed by the diff (two files, both underscripts/).Verdicts proven unchanged, not asserted: each gate was run on this branch and on
origin/mainin the same worktree, and the outputs diffed.check-engine-double-contract— full output byte-identical,OK — 197 pinned, 133 in the DEBT ledger, 2 exemptboth sides.check-type-check-coverage— full output byte-identical,OK — 64/77 workspace packages type-checked … 13 in the DEBT ledger.The changed text renders only on a failing run, so on a green tree it is the self-tests that exercise it — which is why the assertions below exist.
Assertions, and the mutation testing that proves they are not empty
Three new named assertions per gate, deliberately non-overlapping so each way this can rot has exactly one owner:
Each direction was predicted in writing before running. Six mutations, one per assertion per gate; every one was caught by exactly one named assertion:
return trueHonest note on how (3) got there: its fixture was first derived from the real message with the marker stripped out, and in that shape the reword mutation fired both (1) and (3) — two failures for one rot, the second misdescribing the cause. It was rebuilt as a synthetic fixture, independent of the real message's wording, and the mutation matrix above is the re-run.
Item 2: not now — and the measurement that decides it
The card asks whether a shared in-memory engine-double helper can route the dispatch predicates by construction. It cannot, not as an additive change, and the blocker is this gate's own discovery scope:
scripts/check-engine-double-contract.mjswalks only files matching\.(test|spec)\.(ts|tsx|mts)$. A helper living inpackages/qa/src/…is not a test file, so the gate would not see it. Two consequences, both bad:ObjectQL.update", with nothing reading it.Two further findings that bear on the design, measured on the three landed files the card names:
system-caller-inert-grant.test.tsreturns{ ok: true, updated }from a multi-row update and{ ok: true }from delete;impersonation-bearer-rotation.test.tsreturnstargets.lengthand a deleted-row count. The dispatch routing is uniform and already one line; the storage and return semantics are per-test contracts.ObjectQL.update— the second-source problem again.A helper is still plausible if it is paired with a change to the gate's scan scope so the helper is itself pinned and adopters stay counted. That is a gate-verdict change, out of this card's declared surface and explicitly out of its 裁决.
Census — the "only two instances" hypothesis is falsified
The card and its triage list two instances. Swept the farm (76 scripts, 9 ratchet/baseline/ledger files, plus in-script ledgers) and found five, with a positive control confirming the sweep reaches the two known ones:
check-engine-double-contract.mjsengine-double-contract.baseline.jsoncheck-type-check-coverage.mjscheck-durability-degradation-log-level.mjsdurability-read-invention.baseline.json— its own text already says "(shrink-only, hand-edited)"check-role-word.mjsrole-word-baseline.jsonvia--updatecheck-driver-conformance.mjsThe last three are outside this card's declared file surface, so they are filed rather than fixed here; that issue is referenced from the report comment.
Deliberately not counted, because adding an entry there is the correct fix rather than a weakening:
check-cross-package-test-inputs.mjs(input-radius declaration),check-agent-model-declared.mjs(INHERIT_JUSTIFIED), andcheck-durability-degradation-log-level.mjs's FAILURE_PROPAGATION lists.check-driver-memory-census.mjsis the precedent worth copying — its output already refuses the weakening remedy outright ("Do NOT add an entry to make …").Verification
--self-testand full runs: greenpnpm check:type-check-debtafter building the closure aslint.ymldoes (turbo run build --filter='./packages/*' --filter='./packages/*/*', 70/70 successful):OK — 33 ledger entr(ies) re-measured, 1969 raw tsc error(s) total, none above its recorded number. surplus: nonepnpm check:type-source-resolution: green — this one was not in the dispatch brief; it came out of re-derivingscripts/pm/dispatch-gates.mjsagainst the actual changed pathspnpm check:nul-bytes: green, plus a control-character self-scan of both changed fileseslinton both changed files: cleanScripts-only, no package surface touched, so
skip-changeset.Generated by Claude Code