- Lazy-loading semantics: an @font-face never matched by rendered text
stays "unloaded" forever - the readiness poll now waits only on faces
in "loading" state, ending the instant fetches settle (removes ~3s of
dead deadline per viewport on affected pages); unreferenced faces log
per-face informationally instead of warning
- Asset gate counts a failure only for real HTTP >= 400 or a failed
fetch whose target file is genuinely absent from the export - aborted
srcset-candidate image fetches with valid files on disk are excused,
matching the existing streaming-media treatment
458 tests pass (11 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- The render walk and screenshots now await document.fonts.ready plus a
bounded state-based poll until every declared face is terminal
(loaded/error); pending families surface as a font_wait_warning event
instead of skewing text metrics with fallback-font boxes
- position:sticky full-width wrappers share the static/relative
fluid-fill branch (a sticky box fills its containing block like any
in-flow box) instead of freezing at canonical px; fixed-width sticky
rails still freeze
447 tests pass (12 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- serveStatic answers single-range requests with proper 206/Content-Range
(416 for unsatisfiable), so Chromium streams large media in bounded
chunks instead of holding one throttled progressive request open past
the navigation budget
- goto policy: waitUntil "load" + up to 10s of sustained-quiet polling
replaces the hard networkidle timeout - long autoplaying media can no
longer make validation unreachable (applied to renderApp, probe widths,
and the interaction gate)
- validateRun catches render crashes and records them as runtime errors,
so a failed render writes a report with a failed gate 0 instead of
crashing reportless
292 tests pass (14 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>