Break a passing page on purpose, one defect at a time.

A quality gate that only ever sees good pages is unproven: any of its checks could be dead and the record would look identical. So the suite takes a page that already passed all 13 checks, injects one known defect per run, and asserts that exactly the right check fires, with no collateral from the others. Generated from the committed evals/results.json; no number on this page is typed in by hand.

the run
14/14 mutations detected 0 collateral flags 0 false fails on the clean page 13 checks in the gate
every mutation, and the check that caught it
mutationdefect injectedcheck firedverdictcollateral
strip-closing-html closing </html> tag removed valid-document caught none
inline-script a <script> tag, so the page no longer ships zero JS single-file caught none
broken-cta-link a CTA pointing at a host that cannot resolve cta-specific caught none
fixed-width-overflow a 2000px fixed-width element, far wider than the 375px viewport responsive caught none
low-contrast-text body copy at #bbbbbb on white, under the AA contrast floor semantic-html / contrast-aa caught none
copy-tell-em-dash an em dash in rendered copy copy-tells caught none
tel-digit-drop one digit removed from a tel: href while its label still reads correctly contact-integrity caught none
tel-space-separator a tel: href written with spaces, so the digits match but the URI is malformed contact-integrity caught none
page-over-weight an embedded image large enough to push the page past its byte budget page-weight caught none
side-accent-stripe a coloured stripe down one edge of a callout, the generated-UI callout tell no-side-stripe caught none
unresolved-image-placeholder an image placeholder left in the src, so the page renders a broken image imagery-resolved caught none
accent-swapped the brief's accent hex replaced everywhere by a nearby darker tone palette-from-brief caught none
entrance-never-resolves an entrance start state with no animation to bring it back, so the text never appears motion-visible caught none
reduced-motion-hides-content content removed entirely under prefers-reduced-motion instead of just its motion motion-visible caught none
the known blind spot, on the record
unsourced-copy-claims

defecta claim in the copy that appears nowhere in the brief, such as the drafter's invented "the keys stay with you" and "no term, no penalty"

why the gate cannot catch itchecking a sentence against a brief is a judgement, not a comparison; nothing deterministic can decide it

caught bythe advisory review pass, which is why that pass exists

the freshness guarantee

CI regenerates SCORECARD.md and results.json on every run and fails on a git diff, so the committed numbers cannot drift from the code: the file this page renders is the file the workflow just reproduced. The workflow is .github/workflows/evals.yml.

The suite runs local-only with no API key, so it gates fork pull requests too.

The suite grew from 5/6 to 14/14 across five committed runs; that history, including the checks that were added and the one that was demoted, is in evals/history.md. The finding that started it, a check the page under test could switch off with its own overflow-x:hidden, is told in full on the page above this frame. Repository: landing-page-engine.