Verified without screenshots
Last reviewed: July 2026.
A rendered UI can pass every structural check and still be wrong. The edit applied, the binding resolved, nothing overflowed – and the body text sits at a contrast the design system forbids. Until now that class of defect had two detectors: a human looking at the screen, or a vision-language model sent a screenshot. The first doesn't scale; the second is slow, costly, and non-deterministic – and a verifier that returns different verdicts on the same input cannot gate a build.
Fuaran's position: most of "does it look right" is not a perceptual question. It decomposes into quantified invariants that can be checked exactly – if the rendered result is available as typed facts rather than only as pixels. Three pieces make that possible:
- Computed-style read-back. Because every rendered element carries its node's permanent id, an observer can return the styles the browser actually resolved for any node – foreground, background, the achieved contrast, weight, size – as a handful of typed facts. Not a screenshot: facts, addressed to the exact node the agent emitted.
- A design contract with teeth. Design-token systems say what the values are; they
don't say what must remain true. Fuaran's theme manifest adds the two things a
verifier needs: semantic role bindings (this node is "body text on a raised
surface", not merely
grey-700) and quantified invariants – a contrast floor per role (generalising the fixed WCAG ratio to whatever the design system demands) and a usage budget bounding the share of the surface a colour may occupy, so an accent spent across half the screen is a named violation, not a vibe. - A deterministic verdict with a repair hint. At render time the verifier checks facts against contract. A violation comes back as a declared-versus-actual diff in the manifest's own vocabulary – "body-text contrast 3.8 against a floor of 4.5; raise the surface tone or darken the text token" – which an authoring agent consumes exactly like any other typed refusal (Errors that enumerate the fix). Same tree, same manifest, same verdict, every run: it can sit in CI as a build gate.
The honest boundary: genuine aesthetic judgement – rhythm, tonal balance a contrast floor permits – is outside what an invariant can express, and there vision-model evaluation is the right instrument. The claim is not that vision is obsolete; it is that the deterministic, CI-gateable share of design verification is far larger than the industry's screenshot habit suggests: it only looked small because, without a typed tree and per-node read-back, the rendered result was never anything but an image.
There's a drift dividend, too: reduce the facts to named flags per node (below-contrast, over-budget, mis-bound) and a design regression becomes a flag that flipped between renders – no baseline screenshots per viewport, no human triaging antialiasing diffs. Semantic regression detection, from the same substrate.