Skip to content

Three more gates offer a shrink-only ratchet edit as a co-equal remedy with no authority marker — the #8435 convention stops one gate short of its own census #8519

Description

@qq9340100

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.mjsCROSS_PACKAGE_TEST_INPUTS declares a test's input radius; the entry is required for cache correctness.
  • check-agent-model-declared.mjsINHERIT_JUSTIFIED; model: inherit is a legal answer that must be justified.
  • check-durability-degradation-log-level.mjs:1822FAILURE_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

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions