Skip to contentWolf-Rayet

Decision records

ADR-0086 The only check that looks at the page, and what it found when it was finally read

Accepted2026-09-06Phase 6

#Context

Phase 4 closed with the roster complete at 38 of 38. Phase 6 is the docs site, and its exit criteria have carried the same sentence for several passes: *"nothing was fetched from r136.dev this pass, so every claim about the served site is carried forward, unverified."* The route figure in the snapshot was 297, recorded at 3a26a31, and marked as known to have moved.

docs:check-site is the only check in this repository that looks at what a reader would see: it renders the built site and reads it back — every local reference, every fragment href, every on-this-page anchor, every heading, and every element's width at 375px and at 1920px. It has never run in CI. tools/battery.js recorded the exclusion rather than hiding it, and gave the reason:

NOT IN CI, and this is a gap rather than a decision ... It carries one known pre-existing failure (a table-row cell overflow) that nobody has investigated, and putting it in CI red would train people to ignore a red workflow.

That reasoning is right and it has a cost: a check nobody runs is a check that rots, and the exclusion had outlived four component builds.

#What it found

Routes served: 334, against a snapshot claiming 297. The figure had moved by thirty-seven and was carried rather than measured, exactly as the snapshot said.

The first measurement of it was 333, and it was wrong. It was taken against a .next directory that had accumulated several builds in this session. CI's fresh checkout reported 334; deleting the directory and rebuilding reproduced CI exactly. This repository's rule is that no figure is written without a tool call producing it in the same pass, and that rule was followed — the tool call ran and the answer was still wrong, because the input was stale. The rule needs its other half: *the build has to be clean as well as current*.

Two failures, and the first was an hour old.

/components/link — # names no element on the page. The docs specimen for the component built earlier in this same session rendered <Link href="#">, and a bare hash resolves to nothing. It is the one defect this component may not have: its entire governed obligation is to name where it goes, and the specimen demonstrating that pointed nowhere. The check caught it on its first run against the new page, which is the argument for the check being in CI stated as an event rather than as a principle.

The second is the one nobody had investigated, and it is not what the battery's note said it was. The note named a table-row cell overflow. What actually fails is /components/sla-countdown, at both 375px and 1920px, and the report is seven rows long because the overflow propagates: mount, cell, grid, section, article, main, shell — until the page itself measures 304px inside a 267px viewport.

#The component is not at fault

sla-countdown is intrinsically 291px wide: a gauge, a number and a word. The docs grid gives its cell 241px at a 375px viewport, the component cannot shrink below its content, and it overflows.

That is a reasonable width for an instrument in a control room. This system's field themes exist for screens that are not phones, and narrowing a countdown so that a documentation gallery can render it on a handset would be letting the docs site design the component. The leaf rows of the failure are attributed to sla-countdown.css and are already on the check's pre-existing list for that reason.

What was wrong is that a gallery cell let its specimen set the page's width, and that is a documentation-template decision.

#Decision

.specimenMount becomes a scroll container. A specimen wider than its cell scrolls inside the cell instead of widening every ancestor it has. min-width: 0 was already there and does not do this on its own — it lets the mount shrink below its content's intrinsic size, and the content then overflows visibly rather than being contained.

No component changes. The overflow was never the component's.

The link specimen takes a real route rather than #.

And docs:check-site joins the battery and the docs workflow. The reason for its exclusion was the uninvestigated failure; the failure is investigated, so the exclusion ends with it. The battery goes from 23 checks to 24, and every one of the 24 is a script run by a named workflow — which is what battery:check asserts and now asserts over one more.

#Rejected options

Narrow sla-countdown so it fits a 375px gallery cell. The change that makes the number go green by moving the thing being measured. It would let a documentation layout set a component's dimensions, and it is the wrong direction for a system whose §4 designs for field conditions first.

Add the site-template rows to the pre-existing list and put the check in CI green. Fastest, and it converts a real defect into a permanent annotation. The pre-existing list exists for findings that have been read and attributed — the leaf rows are on it because the component is not at fault — and adding the propagation chain would have hidden the one part of the failure that *was* fixable.

Leave the check out of CI because it needs a build and a browser. It does, and the docs workflow already runs docs:build for the same reason. The marginal cost is the check itself.

Fix the specimen href and stop there. The defect that was mine, without the one that was not. The check's whole value is that it looks at the page; running it once, taking the finding that is easy and leaving the finding that is hard, is the shape of an exclusion that never ends.

#Consequences

docs:check-site is green: 15 checks, 0 failing, across 334 routes — and it is in CI, so it stays that way or says so.

Its first CI run was red, and the finding was the workflow rather than the site. apps/docs depends on playwright-core, which drives a browser and never downloads one; the docs job installed none, so the five static checks passed and the dynamic half stopped at browserType.launch: Executable doesn't exist. A check put into a workflow that cannot run it is a red workflow with no finding in it — which is the failure mode the original exclusion was written to avoid, arriving through the fix for it. The job now installs Chromium from the budget package, where the lockfile pins it.

pnpm battery is 24 of 24. The exclusion list in tools/battery.js loses its only entry that called itself *a gap rather than a decision*; what remains there are scripts that generate rather than check, and production builds gated by a workflow.

The route figure is measured rather than carried, for the first time in several passes: 334 — and it agrees across both platforms, which is how the stale-directory error was caught at all.

A defect written in this session was caught in this session by a check that had never run. That is the second time today a check has caught something a reader would not have: react:test reported that .wr-popover { display: flex } outranked the UA's [hidden] rule before any scene ran.

Phase 6's remaining claim is still the deploy. Everything above is the built site read from disk. r136.dev itself was not fetched, and no claim here is about the served site.

#Measured

  • pnpm docs:build from a clean .next, this pass: 334 routes — 191 under /components, 91 under /governance, 22 under /getting-started, 16 under /foundations, 6 under /patterns, 4 under /support, one each for /roadmap, /receipts, /proof and the index — against a snapshot carrying 297 from 3a26a31 *(darwin-arm64, this pass)*.
  • The same command against a .next carrying this session's earlier builds: 333. CI's fresh checkout at e5073df: 334. Deleting the directory and rebuilding: 334 *(both platforms, this pass)*.
  • pnpm docs:check-site before this record: 15 checks run, 2 failing — every fragment href resolves to an element with that id, 2363 links, 1 failing (/components/link); and no element this template authors overflows at 375px or 1920px, 666 page widths, 25 failing, all /components/sla-countdown *(darwin-arm64, this pass)*.
  • The propagation, as reported: shell 304 > 267, main 304 > 267, article 304 > 267, section 304 > 267, specimenGrid 304 > 267, specimenCell 303 > 265, specimenMount 291 > 241 — seven ancestors of one component that measures 291 *(darwin-arm64, this pass)*.
  • After the specimen href and .specimenMount { overflow-x: auto }: 15 checks run, 0 failing, on a clean build *(darwin-arm64, this pass)*.
  • The check's first CI run at e5073df: the five static checks passed and the dynamic half failed on browserType.launch: Executable doesn't exist. apps/docs depends on playwright-core, which drives a browser and never downloads one, and the docs job installed none — so the workflow needed the budget package's Chromium install step, which it now has *(linux-x64, run at e5073df)*.
  • pnpm battery:check — 24 check(s), each a script and each run by a named workflow; pnpm battery — 24 of 24 *(darwin-arm64, this pass)*.