Salvaged and re-implemented from PR #15:
- Deterministic environment shim (seeded Math.random, pinned-but-advancing
Date consistent across constructor/now/getTime/valueOf/toISOString) so
time/random-dependent pages capture reproducibly; epoch and seed are
recorded run metadata, performance.now stays real for motion sampling
- Post-snapshot lazy-asset discovery sweep for channels the walker misses:
noscript contents (DOMParser), inline style url(), data-background(-image),
img[loading=lazy] currentSrc
- Navigation gets a total 90s budget, an early bot-wall probe that aborts
with a pollution-style error instead of capturing garbage (WALL_RE now
shared with the validator gate), and one fresh-context retry scoped to
the initial nav on retryable failure classes only
505 tests pass (29 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- 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>
- A grid-cols-N recipe plan may only override the authored template when
computed tracks are near-equal - asymmetric sidebar templates
(260px 1fr) keep their authored geometry
- Source-intent named tokens (max-w-md etc.) re-emit only when their
Tailwind-4 value matches the captured computed px; mismatches (older
token scales) emit the captured value instead
- Per-axis source-variant selection keeps the highest-min-width active
variant instead of last-in-class-order, matching real Tailwind cascade
(lg:grid-cols-3 no longer loses to a later md:grid-cols-2 at desktop) -
latent since the initial commit
- New non-blocking textHiddenInClone metric in the dom gate: counts
capture-visible text that renders hidden in the clone, so silent
disappearances surface in reports
435 tests pass (10 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Walker serializes the composed (flattened) tree: open shadow roots walk
as host children with <slot> replaced by its assigned light nodes (or
fallback), so custom-element content (product cards, web components) is
captured instead of arriving childless
- In-flow visibility:hidden nodes with a nonzero border box survive the
prune as sized invisible placeholders - ghost spacers carry load-bearing
geometry
- When pruning drops leading in-flow children of a horizontally-translated
track, the baked translateX is re-anchored by their aggregate margin-box
width (settled carousel tracks return to origin instead of pushing real
content off-screen); animation-owned transforms unaffected
- Circular-shrink slide guard counts block-level fill children as
width-deriving regardless of wAuto (block auto-width IS fill), pinning
library-sized slide widths uniformly
- javascript: hrefs emit as "#" and the link gate normalizes both sides
382 tests pass (18 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Overlay detection resolves effective z-index through stacking ancestors,
treats a zero-size max-z wrapper plus its full-viewport descendant as one
removable unit, pierces open shadow roots, and relaxes the z floor when
the page is scroll-locked; a lock persisting after dismissal reports
blocking even with no detected overlay
- clickDismiss runs in every frame (close buttons live in cross-origin
popup iframes), matches decline/no-thanks/aria-label close affordances,
and re-runs before every snapshot AND screenshot to catch late-mounting
dialogs
- rootUnclamp triggers from IR content extent (a scroll-lock collapses
captured scrollHeight) and strips vendor-injected body position/overflow
locks when firing
- Pollution gate fails on the scroll-lock contradiction: scrollHeight
pinned to one viewport while IR content spans multiple
- Frame graft skips popup-creative vendor hosts; inline embedded signup
forms remain graftable (regression-tested)
322 tests pass (24 new), typecheck clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>