Skip to contentWolf-Rayet

Decision records

ADR-0123 The length ceiling retires with the corpus it was bootstrapped from

Accepted2026-09-21Phase 7

#Context

ADR-0018 gave @wolf-rayet/content-lint a per-level string length ceiling, and it was careful about where the numbers came from. They were not chosen freehand and not borrowed from an outside style guide: each was the longest real string the real-copy scan measured shipping at that level, rounded up to the next multiple of ten. ADR-0019 refreshed them once real copy existed at every level. Both records say plainly that the numbers are descriptive of what ships rather than a budget imposed on it, and ADR-0019's own note in data/length-ceilings.json describes the refresh mechanism: a longer real string at any level raises that level's ceiling.

That mechanism has no input any more.

ADR-0120 made scan-real-copy.js fail when it checks nothing, on ADR-0032's reasoning that zero violations across zero strings is a tautology and a tautology reporting green is worse than a gap reporting red. Measured in CI on f3e7981c, the scan reports:

  • 0 components scanned
  • 38 reported without real copy
  • 0 real strings checked

The scan's own failure message names the cause and the two exits: the tone functions are called only inside packages/react/src, by the components themselves, never with literal copy a scan can read, so either a story or a fixture supplies a real call, or ADR-0018's ceiling retires on the record.

Nothing in this tree supplies that call. Not the workbench, not apps/proof, not the docs site. The corpus the ceiling was bootstrapped from does not exist here, which means the four numbers in data/length-ceilings.json rest on a measurement no one can reproduce and the refresh mechanism ADR-0019 describes can never fire.

#Decision

ADR-0018's length ceiling retires, and scan-real-copy.js retires with it.

The rule goes, with its data file. A ceiling whose numbers came from a corpus, whose stated mechanism for changing is a new measurement of that corpus, and whose corpus is gone, is not a rule the repository can stand behind. Keeping it would mean enforcing four numbers because they were once true somewhere.

The scan goes for the reason ADR-0122 retired three checks in the docs harness: it has no population. Its subject was the real copy components ship through their tone functions, and no surface in this tree ships any. A check with nothing to read is not evidence, whichever way it reports.

What stays, and is not weakened:

  • Every other content rule. The twelve that remain are unchanged.
  • scan-site-prose.js, which reads the documentation site's own copy and passes over 270 strings. Ten of the twelve remaining rules run there, against real shipped copy, which is more real copy than scan-real-copy has read since the rewrite.
  • content-lint:test, where each rule fires on a fixture built for it and on nothing else.

What this record admits it loses: button-title-case and required-parts-present are the two rules scan-site-prose does not run, so after this record they are exercised by their fixtures and by no shipped string. That is a gap, it is smaller than the one it replaces, and it is written here rather than left to be discovered.

#Consequences

content-lint goes green, and for the right reason: it stops asserting a ceiling it cannot justify and stops running a scan with no subject.

The four numbers are not preserved anywhere. If real copy arrives later — a story that calls a tone function with literal text, which is all it takes — a ceiling can be bootstrapped again from that corpus, by the method ADR-0018 already describes. This record retires the numbers, not the method.

ADR-0018 and ADR-0019 are superseded by this record rather than edited, the way ADR-0019 declined to edit ADR-0018 and recorded its movement in the data file's own note.

#Rejected

Write the corpus: 38 components, each supplying real copy through its tone function, reviewed per component. This is the other exit the scan names and it is a real option. It is rejected here because the corpus would exist to feed a ceiling rather than because any surface needed it, and copy written to satisfy a measurement is not the shipped copy the ceiling claims to describe. ADR-0018's numbers were trustworthy precisely because nobody wrote that copy for the scan.

Keep the ceiling and let the scan pass on an empty corpus. The count goes to zero and the check reports green, which is the failure mode check-docs.mjs's own header warns about and which ADR-0120 was written three records ago to stop.

Keep the ceiling and let the scan stay red. A permanent red is a decision deferred at the cost of every future run's signal.