Skip to content

finding: the #8435 detector cannot reach a correctly-refusing gate whose testimony is governance — two independent stops, measured on check-driver-memory-census.mjs #8585

Description

@qq9340100

Observation-class, filed unassigned from the #8576 dev seat (PR #8583). No gate is asked to change and nothing here is a defect in a verdict.check-ratchet-remedy-authority.mjs reports nothing false; the finding is about how far it can reach.

Blocked-by: #8576 — the measurement below is of the state PR #8583 creates. Before it, the census gate carried no governance testimony in author-facing text at all, so only stop (2) below was observable and stop (1) was masked.

The measurement

#8576 mirrored one clause of each of three refusing gates' comments into their refusal strings. Two of the three consequently moved excluded to refused in the detector. The third did not, and tracing why turned up two independent stops, either one of which alone is sufficient to keep it unreachable:

  1. Stage 1 — no target inside the offer window.check-driver-memory-census.mjs's refusal reads "Do NOT add an entry to make this green if the answer is …". Within OFFER_WINDOW (200 chars after the verb) there is no declared-caps identifier, no .json / .mjs / .mts path, and no REGISTRY_NOUN — the sentence names its ledger before the verb, and offerTarget only ever looks forward. Measured: the window truncates at 200 characters mid-word, so no clause appended to that message can ever bring a target into range.

  2. Stage 2 — governance wording outside the vocabulary.GOVERN_TESTIMONY recognises maintainer has agreed, maintainer to agree, a maintainer action, maintainer-governed, tracked exception. This gate's own long-standing wording is "is a maintainer ruling", which matches none of them.

Why it is worth recording

Stop (1) is the more general one and mirrors a defect the detector already paid for once. Its offer grammar was deliberately built to accept both word orders — the header records that demanding "add … to … REGISTRY" cost the #8540 prototype a third of its recall, because check-type-check-coverage.mjs names its registry before the noun. The fix accepted either order after the verb. A registry named before the verb is the same class of blind spot one step further out, and it is currently invisible for the same reason the first one was: the gate reports clean.

Stop (2) is narrower — a vocabulary list that grew to fit check-driver-conformance.mjs and was never re-read against the other governed registries in the farm.

Consequence, and it is the same one #8576 recorded: the refusal limb's evidence base is smaller than the farm's actual refusing population. PR #8583 grows it from one gate to three; this gate is a fourth that refuses correctly and still cannot be counted.

Possible shapes (not decided here)

  • Let offerTarget consider a bounded span before the verb as well as after, with the same message boundary already enforced. ⚠️ Any such widening has to be re-audited against the ~20 declaration registries the control corpus exists to protect — the measured check-adr-anchors.mjs false positive came from exactly this kind of reach extension.
  • Add "maintainer ruling" (and re-read the farm for other spellings) to GOVERN_TESTIMONY.
  • Or decide the reach is correct as-is and record this gate's distance from it permanently — the control's why already states both stops after PR fix(scripts): make the three refusal-shape gates state their registry's nature in author-facing text (#8576) #8583, so this option costs nothing further.

⛔ Explicitly not proposed: rewording check-driver-memory-census.mjs to satisfy either grammar. Its refusal is correct and its wording predates the convention; bending a correct gate to make a detector reach it is the control flattering the detector, which is the one thing PR #8575's control corpus exists to prevent.

Related: #8435 established the convention; #8540 and PR #8575 built the detector; #8576 and PR #8583 are where this was measured. Neither #8540 nor #8576 is addressed here.


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions