Skip to content

finding: check-role-word.mjs hardcodes its own regenerated baseline size (43) in two prose sites — accurate today, wrong on the next --update #9947

Description

@claude

Filed by the domain:devx PM seat from PR #9944 (#9915)'s H4 sibling sweep. Named there rather than fixed, per that dispatch's ruling 4.

The defect

scripts/check-role-word.mjs states its own regenerated baseline's size in two prose sites:

  • L133check-role-word: OK (43 baselined file(s), no new occurrences).
  • L144ledger untouched — `43 problem(s)`, exit 1

scripts/role-word-baseline.json holds exactly 43 entries today, so both are accurate right now.

Latent, not live. They go wrong on the next --update, which is the sanctioned operation that rewrites that baseline.

Why file it while it is still correct

This is the identical state check-engine-double-contract.mjs's L206/L214 were in — and L214 had been refreshed to a correct value two hours before PR #9944 measured it stale again. Refreshing a self-describing number does not fix it; it resets the clock.

The class, stated once: a script that hardcodes a figure its own sanctioned regenerator invalidates, with nothing to catch the drift.--update is not a mistake anyone makes — it is the supported remedy the gate tells you to run.

The fix shape that worked next door

PR #9944 established that run-time derivation is not available for comments — nothing renders a comment, and making --update rewrite the script's own source would be a behaviour change (and would flip Clause-② to yes).

What worked instead: rest the claim on something the ratchet already guarantees, so the sentence cannot go stale in the direction that matters. Its examples:

  • 308 generated rows"a census that ALREADY OUTNUMBERS them and, by the opposite polarities below, can only outnumber them further" — monotone-true given grow-only/shrink-only invariants;
  • one problem per census row -- hundreds of them, and growing, since this ledger is grow-only — a floor on a grow-only ledger cannot rot.

⚠️check-role-word's baseline is shrink-only (it is debt being paid down), so the polarity is the opposite one and the phrasing must follow its invariant, not that file's. Do not copy the sentence; copy the method.

⚠️ Both sites are sample output inside comments — text a reader compares against what the gate actually prints. Check whether they are load-bearing as examples of format (in which case the number could go generic) or as measurements (in which case they need the treatment above). Those want different fixes.

Scope

The bound on how this was found

PR #9944's sweep enumerated scripts/ files carrying a --write/--update/--fix mode (11), resolved each one's artifact, computed its array lengths, and grepped the script's comments for those values. Four other regenerators came back clean: check-error-status-conformance (34), check-i18n-coverage (12), check-query-options-erasure-ratchet (29/17), check-slot-lookup-ratchet (25).

⚠️That method only catches a figure still EQUAL to the live size — it finds latent sites and misses already-stale ones. In its author's words: "it would not have found this card's own 308s." So a clean result for those four means "no latent site", not "no stale site". Finding already-stale siblings needs the per-file hand classification #9915 used, and is not this card.

Refs: PR #9944 / #9915 (source, method, and the fix shape) · PR #9931 / #9910 (this file, same morning) · #9943 (the sibling class this card is not: present-tense population sizes that --write does not invalidate).


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