Filed by the dev seat that implemented #8435 (PR #8517). Unassigned and unlabeled for triage. Lands in the gate-farm / developer-ergonomics surface.
⚠️No gate is asked to be weakened here. All five gates below are correct. This is about which remedy their output teaches, exactly as #8435 framed it.
Context
#8435 established the convention: any gate whose second remedy is editing a ratchet/ledger/baseline file must mark that path as maintainer-only in its own output. Its triage comment listed "both known instances", and PR #8517 fixed those two.
The card's own PM note flagged that the two-instance count was not established and asked for a census before writing the convention. That sweep was run, and the count is five, not two — so the convention as landed covers 2 of 5 live instances.
The census
Swept all 76 scripts/*.mjs, the 9 ratchet/baseline/ledger JSON files, and the in-script ledgers. Positive control: the sweep pattern re-finds both known instances.
| gate | ratchet it offers to edit | covered by PR #8517 |
|---|
check-engine-double-contract.mjs | engine-double-contract.baseline.json | ✅ |
check-type-check-coverage.mjs | in-script TEST_DEBT | ✅ |
check-durability-degradation-log-level.mjs:1702 | durability-read-invention.baseline.json | ❌ |
check-role-word.mjs:81 | role-word-baseline.json (via --update) | ❌ |
check-driver-conformance.mjs:715 | in-script LEDGER DEBT/EXEMPT entry | ❌ |
The three uncovered, verbatim
check-durability-degradation-log-level.mjs:1702 — the message names the ratchet semantics itself and still offers the path without saying whose it is:
OR : if the seam is a REVIEWED, legitimate degradation, add an entry naming why to scripts/durability-read-invention.baseline.json (shrink-only, hand-edited).
check-role-word.mjs:81 — a new file entry expands the allowlist; the gate enforces ratchet-DOWN elsewhere in the same file, so the direction is unambiguous:
ADR-0090 D3: use permission_set / position / business_unit — or, for a genuine boundary (better-auth, ARIA, quoted history), add it to scripts/role-word-baseline.json with --update.
check-driver-conformance.mjs:715 — the sharpest of the three, because the authority rule already exists and simply never reaches the author. The gate says:
CONSUMED: <driver> does not run <marker>. Add a suite that drives the shared cases, or add a measured DEBT/EXEMPT entry to the ledger in scripts/check-driver-conformance.mjs saying why not.
while that same file's source comment at line 438 says a DEBT entry is
a MEASURED, tracked exception the maintainer has agreed to, never the cheaper half of "enroll the driver".
The rule is written down; it is just written where only a maintainer reading the script will see it, never where the author who trips the gate will.
Deliberately excluded from the count
These offer "add an entry" but adding one is the correct fix, not a weakening — they are declaration registries, not debt ratchets. Listing them so a future sweep does not re-litigate:
check-cross-package-test-inputs.mjs — CROSS_PACKAGE_TEST_INPUTS declares a test's input radius; the entry is required for cache correctness.check-agent-model-declared.mjs — INHERIT_JUSTIFIED; model: inherit is a legal answer that must be justified.check-durability-degradation-log-level.mjs:1822 — FAILURE_PROPAGATION_CALLEES / FAILURE_PROPAGATION_SITES classify how a failure is delivered.
Precedent worth copying
check-driver-memory-census.mjs:377 already does the right thing and does it more strongly than a marker — it refuses the weakening remedy outright:
A new arrival is not a bookkeeping chore: it is the #6664 defect itself. Do NOT add an entry to make …
Suggested shape (⛔ not decided here)
PR #8517 gives each fixed gate the same greppable token, ⛔ MAINTAINER-ONLY, plus a pure ratchetRemedyCarriesAuthority() predicate and three non-overlapping self-test assertions (detector-reaches-subject, marker-present, unmarked-offer-rejected). That block is written to be copyable. Whether the three above should copy it per-gate, or whether the farm should get one shared helper module that all five import, is a call for triage — the shared-module route is the only one that makes the convention mechanically enforceable across the farm rather than by convention.
Related: #8435 (the card that established the convention), PR #8517 (which fixes 2 of the 5).
Generated by Claude Code
Filed by the dev seat that implemented #8435 (PR #8517). Unassigned and unlabeled for triage. Lands in the gate-farm / developer-ergonomics surface.
Context
#8435 established the convention: any gate whose second remedy is editing a ratchet/ledger/baseline file must mark that path as maintainer-only in its own output. Its triage comment listed "both known instances", and PR #8517 fixed those two.
The card's own PM note flagged that the two-instance count was not established and asked for a census before writing the convention. That sweep was run, and the count is five, not two — so the convention as landed covers 2 of 5 live instances.
The census
Swept all 76
scripts/*.mjs, the 9 ratchet/baseline/ledger JSON files, and the in-script ledgers. Positive control: the sweep pattern re-finds both known instances.check-engine-double-contract.mjsengine-double-contract.baseline.jsoncheck-type-check-coverage.mjsTEST_DEBTcheck-durability-degradation-log-level.mjs:1702durability-read-invention.baseline.jsoncheck-role-word.mjs:81role-word-baseline.json(via--update)check-driver-conformance.mjs:715LEDGERDEBT/EXEMPT entryThe three uncovered, verbatim
check-durability-degradation-log-level.mjs:1702— the message names the ratchet semantics itself and still offers the path without saying whose it is:check-role-word.mjs:81— a new file entry expands the allowlist; the gate enforces ratchet-DOWN elsewhere in the same file, so the direction is unambiguous:check-driver-conformance.mjs:715— the sharpest of the three, because the authority rule already exists and simply never reaches the author. The gate says:while that same file's source comment at line 438 says a DEBT entry is
The rule is written down; it is just written where only a maintainer reading the script will see it, never where the author who trips the gate will.
Deliberately excluded from the count
These offer "add an entry" but adding one is the correct fix, not a weakening — they are declaration registries, not debt ratchets. Listing them so a future sweep does not re-litigate:
check-cross-package-test-inputs.mjs—CROSS_PACKAGE_TEST_INPUTSdeclares a test's input radius; the entry is required for cache correctness.check-agent-model-declared.mjs—INHERIT_JUSTIFIED;model: inheritis a legal answer that must be justified.check-durability-degradation-log-level.mjs:1822—FAILURE_PROPAGATION_CALLEES/FAILURE_PROPAGATION_SITESclassify how a failure is delivered.Precedent worth copying
check-driver-memory-census.mjs:377already does the right thing and does it more strongly than a marker — it refuses the weakening remedy outright:Suggested shape (⛔ not decided here)
PR #8517 gives each fixed gate the same greppable token,
⛔ MAINTAINER-ONLY, plus a pureratchetRemedyCarriesAuthority()predicate and three non-overlapping self-test assertions (detector-reaches-subject, marker-present, unmarked-offer-rejected). That block is written to be copyable. Whether the three above should copy it per-gate, or whether the farm should get one shared helper module that all five import, is a call for triage — the shared-module route is the only one that makes the convention mechanically enforceable across the farm rather than by convention.Related: #8435 (the card that established the convention), PR #8517 (which fixes 2 of the 5).
Generated by Claude Code