Skip to content
LandingPagePrompts

Report 04 · Cross-check

Cross-check report

Every demo, plus its original brief, handed to a different model than the one that built it — with instructions to be hostile and report only concrete mismatches.

reports/04-crosscheck.md · rendered from the Markdown source


Verification with a headless browser proves a page runs. It cannot prove the page is the page that was asked for. So each demo was also handed — together with the full original brief — to a different model than the one that built it, with instructions to be hostile and to report only concrete mismatches.

Reviewer models are never reused, and no reviewer is the builder.

Summary

Reviews performed38
Verdict confirmed8
Verdict partial26
Verdict refuted0
Cross-check tokens770,912

Reviewer assignment

PromptBuilt byReviewed byPlatform
Liquid Glass Voyagehy4-preview-fgpt-5.5workbuddy
Scroll AtlasMiniMaxAI/MiniMax-M3gpt-5.4workbuddy
Magnetic Orbitglm-5.3MiniMaxAI/MiniMax-M3cmdcode
Neural Driftkimi-k3glm-5.2workbuddy
Kinetic Typegemini-3.5-flashmoonshotai/Kimi-K2.7-Codecmdcode
Stack Deckgpt-5.5kimi-k2.8-previewworkbuddy
Aurora Freighthy4-preview-fhy3workbuddy
Basaltstealth/space-bunny-alphamoonshotai/Kimi-K2.7-Codecmdcode
Bracketstealth/space-bunny-alphamoonshotai/Kimi-K2.7-Codecmdcode
Cadencexiaomi/mimo-v2.6-prokimi-k2.8-previewworkbuddy
Camberstealth/space-bunny-alphakimi-k2.8-previewworkbuddy
Cantstealth/space-bunny-alphaglm-5.2workbuddy
Carbonstealth/space-bunny-alphaMiniMaxAI/MiniMax-M3cmdcode
Cardinalstealth/space-bunny-alphadeepseek-v4.1-flashworkbuddy
Cascadestealth/space-bunny-alphakimi-k2.8-previewworkbuddy
Chrome BloomMiniMaxAI/MiniMax-M3gpt-5.6-lunaworkbuddy
Data Tideglm-5.3glm-5.3-flashworkbuddy
Echoxiaomi/mimo-v2.6-proglm-5.2workbuddy
Filamentstealth/space-bunny-alphaglm-5.2workbuddy
Fringestealth/space-bunny-alphaglm-5.3-flashworkbuddy
Grid Collapsekimi-k3deepseek-v4.1-flashworkbuddy
Halidexiaomi/mimo-v2.6-progpt-5.5workbuddy
Headlightstealth/space-bunny-alphaMiniMaxAI/MiniMax-M3cmdcode
Interactive Discoveryhy4-preview-f——
Latticexiaomi/mimo-v2.6-proMiniMaxAI/MiniMax-M3cmdcode
Marginstealth/space-bunny-alphagpt-5.6-lunaworkbuddy
Meridianxiaomi/mimo-v2.6-pro——
Monolith Typegpt-5.5MiniMaxAI/MiniMax-M3cmdcode
Nebulastealth/space-bunny-alphahy3workbuddy
Prismstealth/space-bunny-alphagpt-5.5workbuddy
Riftxiaomi/mimo-v2.6-pro——
Sablexiaomi/mimo-v2.6-pro——
Signal Roomgpt-5.5hy4-preview-fworkbuddy
Slipstreamstealth/space-bunny-alphadeepseek-v4.1-flashworkbuddy
Smolderstealth/space-bunny-alphagpt-5.4workbuddy
Solsticestealth/space-bunny-alphagpt-5.6-lunaworkbuddy
Tallystealth/space-bunny-alphagpt-5.5workbuddy
Tessellatestealth/space-bunny-alphaglm-5.3-flashworkbuddy
Thermalxiaomi/mimo-v2.6-progpt-5.4workbuddy
Undertowstealth/space-bunny-alphagpt-5.4workbuddy
Upslopestealth/space-bunny-alphahy3workbuddy
Vellumxiaomi/mimo-v2.6-prohy3workbuddy
Voltagexiaomi/mimo-v2.6-pro——
About Brand Overviewstealth/space-bunny-alpha——
About Countdownstealth/space-bunny-alpha——
About Multi Layoutstealth/space-bunny-alpha——
About Team Overviewstealth/space-bunny-alpha——
About us 01 Blazestealth/space-bunny-alpha——
About Us 01 Kelostealth/space-bunny-alpha——
About Us 01 Orbitstealth/space-bunny-alpha——
About Us 02 Orbitstealth/space-bunny-alpha——
About Us 03 Moxostealth/space-bunny-alpha——
About Us 03 Orbitstealth/space-bunny-alpha——
About Us 04 Orbitstealth/space-bunny-alpha——
About Us 05 Moxostealth/space-bunny-alpha——
About Us 05 Orbitstealth/space-bunny-alpha——
About Us 06 Orbitstealth/space-bunny-alpha——
About Us 07 Orbitstealth/space-bunny-alpha——
AI Agent Hero Kelostealth/space-bunny-alpha——
AI Automation Hero Kelostealth/space-bunny-alpha——
AI Budget Tracker Hero Velarastealth/space-bunny-alpha——
AI Budget Tracking Landing Page - Velara AIstealth/space-bunny-alpha——
AI Chatbot Agent Headerstealth/space-bunny-alpha——
AI Content Generator Hero Velarastealth/space-bunny-alpha——
AI Customer Support Hero Kelostealth/space-bunny-alpha——
AI Customer Support Landing Page - Kelostealth/space-bunny-alpha——
AI Developer Solver Hero Velarastealth/space-bunny-alpha——
AI HR Manager Website Headerstealth/space-bunny-alpha——
AI Image Genertion Hero kelostealth/space-bunny-alpha——
AI Interior Generator Headerstealth/space-bunny-alpha——
AI Marketing Hero Kelostealth/space-bunny-alpha——
AI Marketing Landing Page - Kelostealth/space-bunny-alpha——
AI Notepad Website Headerstealth/space-bunny-alpha——
AI Notes Taker Hero Velarastealth/space-bunny-alpha——
AI Sales Call Analyzer Headerstealth/space-bunny-alpha——
AI Task Management Hero Velarastealth/space-bunny-alpha——
AI Video Editor Hero Lumastealth/space-bunny-alpha——
AI video Translator Hero Lumastealth/space-bunny-alpha——
AI Voice Generator Headerstealth/space-bunny-alpha——
AI Voice Platform Hero Lumastealth/space-bunny-alpha——
Aurora Gradientstealth/space-bunny-alpha——
Blog 01 Blazestealth/space-bunny-alpha——
Blog 01 Orbitstealth/space-bunny-alpha——
Blog 01 Pixastealth/space-bunny-alpha——
Blog 02 Pixastealth/space-bunny-alpha——
Blogs - Luxterrastealth/space-bunny-alpha——
Charity Headersstealth/space-bunny-alpha——
Chrome Bezel 3Dstealth/space-bunny-alpha——
Circle Reveal Buttonstealth/space-bunny-alpha——
Contact Us 01 Orbitstealth/space-bunny-alpha——
Contact Us 02 Orbitstealth/space-bunny-alpha——
CTA 01 Lumastealth/space-bunny-alpha——
CTA 01 Orbitstealth/space-bunny-alpha——
CTA 01 Velarastealth/space-bunny-alpha——
CTA 02 Lumastealth/space-bunny-alpha——
CTA 02 Orbitstealth/space-bunny-alpha——
CTA 03 orbitstealth/space-bunny-alpha——
Electric Border Buttonstealth/space-bunny-alpha——
Energy Beam Bgstealth/space-bunny-alpha——
FAQ 01 Kelostealth/space-bunny-alpha——
FAQ 01 Lumastealth/space-bunny-alpha——
FAQ 01 Moxostealth/space-bunny-alpha——
FAQ 01 Orbitstealth/space-bunny-alpha——
FAQ 01 Velarastealth/space-bunny-alpha——
FAQ 02 Kelostealth/space-bunny-alpha——
FAQ 02 Lumastealth/space-bunny-alpha——
FAQ 02 Moxostealth/space-bunny-alpha——
FAQ 02 Orbitstealth/space-bunny-alpha——
FAQ 02 Velarastealth/space-bunny-alpha——
FAQ 03 Kelostealth/space-bunny-alpha——
FAQ 03 Lumastealth/space-bunny-alpha——
FAQ 03 Moxostealth/space-bunny-alpha——
FAQ 03 Orbitstealth/space-bunny-alpha——
FAQ 03 Velarastealth/space-bunny-alpha——
FAQ 04 Kelostealth/space-bunny-alpha——
FAQ 04 Lumastealth/space-bunny-alpha——
FAQ 04 Moxostealth/space-bunny-alpha——
FAQ 04 Orbitstealth/space-bunny-alpha——
FAQ 05 Kelostealth/space-bunny-alpha——
FAQ 05 Moxostealth/space-bunny-alpha——
FAQ 05 Velarastealth/space-bunny-alpha——
FAQ 2 Column Straightstealth/space-bunny-alpha——
FAQ Middle Imagestealth/space-bunny-alpha——
FAQ Middle Simplestealth/space-bunny-alpha——
FAQ Vendostealth/space-bunny-alpha——
FAQ with Imagestealth/space-bunny-alpha——
FAQs 01 Pixastealth/space-bunny-alpha——
FAQs 01 Solrastealth/space-bunny-alpha——
FAQs - Luxterrastealth/space-bunny-alpha——
Feature 04 Solrastealth/space-bunny-alpha——
Feature Work Benjamenstealth/space-bunny-alpha——
Features 01 Halostealth/space-bunny-alpha——
Features 01 Kelostealth/space-bunny-alpha——
Features 01 Learn.AIstealth/space-bunny-alpha——
Features 01 Lumastealth/space-bunny-alpha——
Features 01 Moxostealth/space-bunny-alpha——
Features 01 Orbitstealth/space-bunny-alpha——
Features 01 Velarastealth/space-bunny-alpha——
Features 01 Vendostealth/space-bunny-alpha——
Features 02 Kelostealth/space-bunny-alpha——
Features 02 Lumastealth/space-bunny-alpha——
Features 02 NexVPNstealth/space-bunny-alpha——
Features 02 Orbitstealth/space-bunny-alpha——
Features 02 Velarastealth/space-bunny-alpha——
Features 02 Vendostealth/space-bunny-alpha——
Features 03 Kelostealth/space-bunny-alpha——
Features 03 Lumastealth/space-bunny-alpha——
Features 03 Moxostealth/space-bunny-alpha——
Features 03 Orbitstealth/space-bunny-alpha——
Features 03 Velarastealth/space-bunny-alpha——
Features 04 Lumastealth/space-bunny-alpha——
Features 04 Orbitstealth/space-bunny-alpha——
Features 04 Velarastealth/space-bunny-alpha——
Features 05 Kelostealth/space-bunny-alpha——
Features 05 Lumastealth/space-bunny-alpha——
Features 05 Orbitstealth/space-bunny-alpha——
Features 05 Velarastealth/space-bunny-alpha——
Features 06 Lumastealth/space-bunny-alpha——
Features 06 Moxostealth/space-bunny-alpha——
Features 06 Orbitstealth/space-bunny-alpha——
Features 06 Velarastealth/space-bunny-alpha——
Features 07 Lumastealth/space-bunny-alpha——
Features 07 Orbitstealth/space-bunny-alpha——
Features 07 Velarastealth/space-bunny-alpha——
Features 08 Lumastealth/space-bunny-alpha——
Features 08 Orbitstealth/space-bunny-alpha——
Features 09 Lumastealth/space-bunny-alpha——
Features 09 Moxostealth/space-bunny-alpha——
Features 09 Orbitstealth/space-bunny-alpha——
Features 10 Lumastealth/space-bunny-alpha——
Features 10 Moxostealth/space-bunny-alpha——
Features 10 Orbitstealth/space-bunny-alpha——
Features 11 Lumastealth/space-bunny-alpha——
Features 11 Orbitstealth/space-bunny-alpha——
Features 12 Orbitstealth/space-bunny-alpha——
Finance Management Landing Page - Finsycstealth/space-bunny-alpha——
Fluid Gradient Enginestealth/space-bunny-alpha——
Footer 01 Kelostealth/space-bunny-alpha——
Footer 01 Lumastealth/space-bunny-alpha——
Footer 01 Pixastealth/space-bunny-alpha——
Footer 01 Solrastealth/space-bunny-alpha——
Footer 01 Velarastealth/space-bunny-alpha——
Footer 02 Kelostealth/space-bunny-alpha——
Footer 02 Lumastealth/space-bunny-alpha——
Footer 02 Pixastealth/space-bunny-alpha——
Footer 02 Solrastealth/space-bunny-alpha——
Footer 02 Velarastealth/space-bunny-alpha——
Footer 03 Kelostealth/space-bunny-alpha——
Footer 03 Lumastealth/space-bunny-alpha——
Footer 03 Orbitstealth/space-bunny-alpha——
Footer 03 Solrastealth/space-bunny-alpha——
Footer 03 Velarastealth/space-bunny-alpha——
Footer 04 Kelostealth/space-bunny-alpha——
Footer 04 Moxostealth/space-bunny-alpha——
Footer 04 Orbitstealth/space-bunny-alpha——
Footer 04 Solrastealth/space-bunny-alpha——
Footer 05 Kelostealth/space-bunny-alpha——
Footer 05 Moxostealth/space-bunny-alpha——
Footer 05 Orbitstealth/space-bunny-alpha——
Footer 06 Moxostealth/space-bunny-alpha——
Footer Basicstealth/space-bunny-alpha——
Footer - Glimpsestealth/space-bunny-alpha——
Footer o1 Moxostealth/space-bunny-alpha——
Footer With Newsletterstealth/space-bunny-alpha——
Freelance Coach Hero Orbitstealth/space-bunny-alpha——
Glow Buttonstealth/space-bunny-alpha——
Glow Colorstealth/space-bunny-alpha——
Header 02 Pixastealth/space-bunny-alpha——
Header 02 Solrastealth/space-bunny-alpha——
Header 03 Pixastealth/space-bunny-alpha——
Header 04 Pixastealth/space-bunny-alpha——
Header 04 Solrastealth/space-bunny-alpha——
Hero 02 Moxostealth/space-bunny-alpha——
Hero 03 Moxostealth/space-bunny-alpha——
Hero 05 Moxostealth/space-bunny-alpha——
How it Works 01 Halostealth/space-bunny-alpha——
How it works 01 Kelostealth/space-bunny-alpha——
How it Works 01 Lumastealth/space-bunny-alpha——
How it Works 01 Orbitstealth/space-bunny-alpha——
How It Works 01 Pixastealth/space-bunny-alpha——
How it Works 02 Halostealth/space-bunny-alpha——
How it Works 02 Kelostealth/space-bunny-alpha——
How it Works 02 Lumastealth/space-bunny-alpha——
How It Works 02 Pixastealth/space-bunny-alpha——
How it Works 03 Velarastealth/space-bunny-alpha——
How it Works 04 Kelostealth/space-bunny-alpha——
How it works 04 Velarastealth/space-bunny-alpha——
How it Works 05 Halostealth/space-bunny-alpha——
How it Works 05 Velarastealth/space-bunny-alpha——
How it works Creation.AIstealth/space-bunny-alpha——
How it Wroks 01 Velarastealth/space-bunny-alpha——
Human Synthesis Header - The Worldstealth/space-bunny-alpha——
Integration 01 Kelostealth/space-bunny-alpha——
Integration 01 Lumastealth/space-bunny-alpha——
Integration 01 Velarastealth/space-bunny-alpha——
Integration 02 Kelostealth/space-bunny-alpha——
Integration 02 Lumastealth/space-bunny-alpha——
Jelly Explore Buttonstealth/space-bunny-alpha——
Juice Ecommerce Header - Stripstealth/space-bunny-alpha——
Left to Right Scanstealth/space-bunny-alpha——
Light Beam Buttonstealth/space-bunny-alpha——
Liquid Glassstealth/space-bunny-alpha——
Metal Buttonstealth/space-bunny-alpha——
Mindfulness Landing Page Design - Solrastealth/space-bunny-alpha——
Neon Typing Buttonstealth/space-bunny-alpha——
Nutrition-Health Hero 03 Halostealth/space-bunny-alpha——
Nutrition-Health Hero 04 Halostealth/space-bunny-alpha——
Online AI Learning Platform Hero Orbitstealth/space-bunny-alpha——
Online Store Manager AI Website Headerstealth/space-bunny-alpha——
Online Yoga Programs Landing Page - Solrastealth/space-bunny-alpha——
Personal Business Coach Hero Orbitstealth/space-bunny-alpha——
Personal Fitness Coach Hero Orbitstealth/space-bunny-alpha——
Pricing 01 Kelostealth/space-bunny-alpha——
Pricing 01 Lumastealth/space-bunny-alpha——
Pricing 01 Orbitstealth/space-bunny-alpha——
Pricing 01 Solrastealth/space-bunny-alpha——
Pricing 02 Kelostealth/space-bunny-alpha——
Pricing 02 Orbitstealth/space-bunny-alpha——
Pricing 02 Velarastealth/space-bunny-alpha——
Pricing 03 Kelostealth/space-bunny-alpha——
Pricing 03 Lumastealth/space-bunny-alpha——
Pricing 03 Orbitstealth/space-bunny-alpha——
Pricing 03 Pixastealth/space-bunny-alpha——
Pricing 03 Solrastealth/space-bunny-alpha——
Pricing 04 Kelostealth/space-bunny-alpha——
Pricing 04 Lumastealth/space-bunny-alpha——
Pricing 04 Orbitstealth/space-bunny-alpha——
Pricing 04 Velarastealth/space-bunny-alpha——
Pricing 05 Kelostealth/space-bunny-alpha——
Pricing 05 Lumastealth/space-bunny-alpha——
Pricing 05 Solrastealth/space-bunny-alpha——
Pricing 05 Velarastealth/space-bunny-alpha——
Pricing 06 Kelostealth/space-bunny-alpha——
Pricing 3 Card Longstealth/space-bunny-alpha——
Spot Fill Buttonstealth/space-bunny-alpha——
Stacked Cardstealth/space-bunny-alpha——
Stats and Metrics 01 Lumastealth/space-bunny-alpha——
Stats & Metrics 01 Halostealth/space-bunny-alpha——
Stats & Metrics 01 kelostealth/space-bunny-alpha——
Stats Metrics 01 Pixastealth/space-bunny-alpha——
Stats & Metrics 02 Halostealth/space-bunny-alpha——
Stats & Metrics 02 Kelostealth/space-bunny-alpha——
Stats & Metrics 02 Moxostealth/space-bunny-alpha——
Stats Metrics 02 Pixastealth/space-bunny-alpha——
Stats & Metrics 04 Moxostealth/space-bunny-alpha——
Stats & Metrics 05 Moxostealth/space-bunny-alpha——
Stats & Metrics o1 Moxostealth/space-bunny-alpha——
Stats & Metrics Vendostealth/space-bunny-alpha——
Swap Buttonstealth/space-bunny-alpha——
Swiss-style Cardstealth/space-bunny-alpha——
Team 02 Pixastealth/space-bunny-alpha——
Team 02 Solrastealth/space-bunny-alpha——
Team 03 Pixastealth/space-bunny-alpha——
Team 03 Solrastealth/space-bunny-alpha——
Team Showcasestealth/space-bunny-alpha——
Team Talentstealth/space-bunny-alpha——
Testimonial 01 Blazestealth/space-bunny-alpha——
Testimonial 01 Kelostealth/space-bunny-alpha——
Testimonial 01 Lumastealth/space-bunny-alpha——
Testimonial 01 Orbitstealth/space-bunny-alpha——
Testimonial 01 Velarastealth/space-bunny-alpha——
Testimonial 02 Blazestealth/space-bunny-alpha——
Testimonial 02 Halostealth/space-bunny-alpha——
Testimonial 02 Kelostealth/space-bunny-alpha——
Testimonial 02 Lumastealth/space-bunny-alpha——
Testimonial 02 Orbitstealth/space-bunny-alpha——
Testimonial 02 Pixastealth/space-bunny-alpha——
Testimonial 02 Velarastealth/space-bunny-alpha——
Testimonial 03 Lumastealth/space-bunny-alpha——
Testimonial 03 Moxostealth/space-bunny-alpha——
Testimonial 03 Orbitstealth/space-bunny-alpha——
Testimonial 03 Velarastealth/space-bunny-alpha——
Testimonial 04 Halostealth/space-bunny-alpha——
Testimonial 04 Lumastealth/space-bunny-alpha——
Testimonial 04 Orbitstealth/space-bunny-alpha——
Testimonial 04 Velarastealth/space-bunny-alpha——
Testimonial 05 Lumastealth/space-bunny-alpha——
Testimonial Masonrystealth/space-bunny-alpha——
Testimonial Modernstealth/space-bunny-alpha——
Testimonial Videostealth/space-bunny-alpha——
Testimonials 01 Solrastealth/space-bunny-alpha——
Testimonials 02 Solrastealth/space-bunny-alpha——
Text to Video Generator Herostealth/space-bunny-alpha——
Trusted Brand 2 Columnstealth/space-bunny-alpha——
Trusted Brand Blackstealth/space-bunny-alpha——
Trusted Brand Boxstealth/space-bunny-alpha——
Trusted Brandstealth/space-bunny-alpha——
Video Generation Pricingstealth/space-bunny-alpha——
Why Choose us 01 Finsycstealth/space-bunny-alpha——
Why Choose Us 01 Lumastealth/space-bunny-alpha——
Why Choose Us 01 Orbitstealth/space-bunny-alpha——
Why Choose Us 01 Velarastealth/space-bunny-alpha——
Why Choose Us 02 Lumastealth/space-bunny-alpha——
Why us 01 Solrastealth/space-bunny-alpha——
Why us 03 Solrastealth/space-bunny-alpha——
ZiroBuild Herostealth/space-bunny-alpha——

Findings

Liquid Glass Voyage — liquid-glass-voyage

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 15,225

This is a recognizable implementation of the brief, but it lands as a clean generic glass hero rather than the requested cinematic liquid-light composition. The main visual failures are the flat backdrop, missing footer in the shown viewport, and several motion interactions implemented as simple shortcuts.

Requirements confirmed met

  • Abyssal-specific copy is present for eyebrow, headline, paragraph and stats
  • Header pill contains mark, wordmark, nav links, sign-in link and request-access button
  • Display type uses Instrument Serif with italic second headline line
  • Reusable .liquid-glass class includes the requested blur, saturation, inset shadow, isolation and masked 1.4px edge
  • Canvas backdrop is procedural and uses multiple soft gradients plus a warm highlight
  • DPR is capped and the canvas backing store is downscaled to 0.6x
  • CSS grain, caustic-line overlay and bottom vignette are present
  • Stats cards and one-shot animated counters are implemented

Requirements not met

  • The visible composition at 1024x640 does not include the requested footer row
  • The backdrop in the screenshot reads as a flat dark teal field, not a cinematic underwater light film with visible drifting pools
  • Email confirmation does not morph or fade; it hard-swaps display states
  • Pointer tilt is document-wide and globally applied, not scoped to pointer movement over the hero with panes tilting individually toward the pointer
  • In-progress palette fade cancellation/restart is not implemented
  • Specular sweep is started by a fixed timeout, not by the hero entering
  • Header/nav/footer are not all inside main, contrary to the layout wording

Issues raised

SeverityIssueEvidence
mediumFooter is missing from the rendered viewportScreenshot at 1024x640 ends at the stat cards; the "© 2026 Abyssal Research" row and social icons are not visible. In th
mediumBackdrop is visually too flat for the requested film of underwater lightScreenshot shows an almost uniform dark teal background with no discernible large cyan/blue radial light pools, warm pas
mediumEmail capture confirmation is an abrupt content swap, not a morph/fade interactionSubmit handler uses input.style.display = 'none'; btn.style.display = 'none'; success.style.display = 'flex'; and late
mediumPointer tilt behavior is coupled incorrectlyCode listens on document.addEventListener('pointermove', ...) and writes global --rotX / --rotY on `document.docum
lowPalette cross-fade does not satisfy the requested cancellation behaviorFade trigger is guarded by && !fadeActive, so an active fade is never cancelled and restarted from current weights.
lowSpecular sweep is not tied to actual hero entryThe page runs setTimeout(() => { document.body.classList.add('hero-entered'); }, 100); instead of detecting when the h
lowHeader center navigation is only space-betweened, not truly centeredheader { justify-content: space-between; } with unequal brand/action widths; in the screenshot the nav cluster sits le
lowButton hover scales the whole control instead of only lifting and boosting specularbutton.liquid-glass:hover, a.liquid-glass:hover { transform: translateY(-1px) scale(1.04); }; the brief asked for a 1p

Scroll Atlas — scroll-atlas

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 13,068

The page hits the broad structure and copy, but the hero composition is off: the globe is overblown and cropped until it stops reading as the requested object. Several brief-specific implementation details are also wrong, especially the crossfade timing, pin styling, and required typed-array technique.

Requirements confirmed met

  • Fixed translucent blurred top bar with correct nav items and pill CTA
  • Pinned full-viewport stage with canvas, stacked text beats, and right-side progress rail
  • All four requested beat titles and body lines are present as real DOM text
  • Canvas visual is procedurally drawn rather than image-based
  • Closing section includes the requested h2 and ghost-style CTA
  • Footer is arranged as three columns with a bottom copyright row
  • Dark palette and serif display treatment broadly match the brief

Requirements not met

  • Globe is not presented clearly as a readable rotating sphere in the shown composition
  • Beat cross-fade window is not the requested 0.08 width
  • Survey pins are not rendered as small filled circles with a 1.5px halo
  • Precomputation does not use typed arrays as specified
  • Display font is applied beyond h1/h2 despite the brief limiting it
  • There is continuous pulsing UI animation in the stage chrome, which conflicts with the film-scrub-only motion direction
  • Route connection logic can break when a predecessor pin is back-facing instead of consistently connecting each new pin to its predecessor

Issues raised

SeverityIssueEvidence
highThe main visual reads as an oversized clipped grid with a horizontal divider, not a clear globe of front-hemisphere arcs.In the screenshot the circular form is so enlarged that only partial arcs are visible and a single straight purple line
mediumBeat crossfade timing is wider than specified.Code sets const win = 0.08 but then uses smoothstep(0, win*2, d), creating a 0.16-wide opacity/translate window inst
mediumPin styling does not match the brief's small filled circles with a 1.5px halo.Pins are drawn with three circles: arc(..., 5.5), arc(..., 3.2) and arc(..., 1.8), which produces a much larger ma
mediumRequired typed-array precomputation technique is not implemented.Sphere data is built into nested normal arrays via pts.push([ ... ]); no Float32Array or other typed arrays are used
lowThe wordmark uses the display serif font even though the brief reserves it for h1/h2 only..word{ font-family: var(--display); } applies Instrument Serif to header and footer branding.
lowThere is extra autonomous motion unrelated to scroll scrubbing..stage__topright .pulse runs animation:pulse 1.8s ease-in-out infinite; even though the brief says the page should f
mediumRoute drawing can drop continuity instead of always connecting a pin to its predecessor.Inside the pin loop, if(q[2] > 0.02){ prevProj = null; continue; } resets the predecessor whenever a pin is back-facin

Magnetic Orbit — magnetic-orbit

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 10,614

Composition, copy, palette and structure match the brief closely, but the magnetic offset is sign-inverted so elements repel rather than attract the pointer, the cursor ring isn't scoped to the hero, and the Brand node visually collides with the CTA in the 1024x640 screenshot. Aesthetically it reads as a deliberate, premium studio page rather than a default AI template.

Requirements confirmed met

  • Wordmark FIELD in header with correct tracking/weight
  • Index, Contact, Book a call pill in header
  • H1 copy 'Design that pulls back.' with second line dimmed
  • Lede paragraph with correct copy and styling
  • Primary CTA solid orange with rounded-full
  • Ghost CTA with 1px translucent border
  • Three orbit nodes with Motion/Systems/Brand labels
  • Magnetic nodes drift on slow independent sine paths
  • Marquee strip with MOTION · SYSTEMS · BRAND · ... repeated
  • Footer with copyright and email
  • Custom cursor dot and ring with lerp
  • Two spotlights (warm + cold) with mix-blend-mode: screen
  • Magnetism applied to CTA, nodes, and logo
  • Critically-damped spring back on pointer leave
  • Grid overlay with radial mask
  • System fonts only, no external resources
  • Touch fallback: static glow when no fine pointer
  • Reduced motion respected

Requirements not met

  • Cursor ring is sized at 40px but element has 40px width/height so 3.2x scale makes it 128px — does not match the 1px border thinning on interactive hover (border remains at calculated 1px only when explicitly set, not the 1.5→1 transition described)
  • Magnetic offset direction: brief says 'translates toward the pointer' but code applies sign-inverted offset (multiplied by -1), pushing elements AWAY from the pointer
  • Tilt direction looks reversed: code uses (-dy) for rotateX and (dx) for rotateY which tilts nodes away from pointer in a non-intuitive way, and clamp is ±10 but values can hit ±10 abruptly
  • Spotlight translation subtracts 520/900 from coords (intended to center radial gradient on pointer) — this is correct only if radial gradient is centered at 50% 50%; the spot element is 1040×1040 with 520px gradient at center, so subtract 520 is correct, but spotCold is 1800×1800 with 900px gradient, so subtract 900 is correct — actually this is fine
  • marqueeTrack: halfWidth measured only on first child span, and modulo uses that — but with two duplicated spans, after first wrap the visible content shifts; the implementation may not wrap seamlessly if the two spans have different measured widths (they should match but it's fragile)
  • Cursor ring uses 'transform-origin: center' only via class but transform string also includes translate3d — the scale origin will be at the translated position's center which is correct
  • Node hover detection via mouseenter/mouseleave sets --hs but never reads it; instead the rAF loop uses m.hovering which is set by pointerover delegation — there is a code path that sets both, indicating confusion
  • The hero 'min-height: 100vh' plus large padding plus 3 absolutely positioned nodes plus orbit-stage with z-index means nodes can sit on top of or behind text depending on z-stacking — node-3 is at left:22% bottom:20% which is fine, but at smaller viewports the orbit-stage becomes static and nodes appear below the CTA — this is acceptable per brief for touch devices only, but the breakpoint is 900px which is mid-desktop
  • Brief says custom cursor should be 'inside the hero' only; code applies it body-wide via body.fine-pointer class
  • Eyebrow text 'A studio of three — everywhere at once' is present in code but not described in brief — extra content not required
  • Brief specifies 'logo mark' should be data-magnetic — wordmark is data-magnetic but is text, not a mark

Issues raised

SeverityIssueEvidence
highMagnetic elements move AWAY from pointer instead of toward itif (d > 0.001){ ox += (dx / d) * s * -1; oy += (dy / d) * s * -1; } — the * -1 inverts the direction. Brief C explicitly
lowRing border 'thinning' on interactive hover not implemented as describedvar bw = magneticHover ? 1 : (interactiveHover ? 1 : 1.5); — border is 1px on BOTH magnetic and interactive, so the 1.5→
lowCustom cursor not scoped to hero onlybody.fine-pointer .hero{cursor:none} applies to hero, but cursor-dot/ring are fixed positioned and visible everywhere; b
mediumNode tilt direction appears reversed/intuitive-failtiltY = (dx / m.w) * 10; tiltX = (-dy / m.h) * 10; — when pointer is to the right of node, dx>0 so tiltY is positive (ro
mediumOrbit nodes break into 3-up grid at <=900px (tablet portrait and below)@media (max-width:900px){ .orbit-stage{position:static; ... display:flex; ...} } — at 768px tablet width, nodes become s
lowOrbit-stage and hero-inner have overlapping z-index with nodes potentially rendering over textorbit-stage z-index:4, hero-inner z-index:5, nodes absolutely positioned at left:9% top:22% etc. — at 1024x640 the node-
mediumScreenshot shows the page renders correctly overall but node-3 (Brand) overlaps the orange CTA buttonnode-3 {left:22%; bottom:20%} at 1024x640 puts the 72px node at approximately (225, 512) which visually overlaps the 'St
lowH1 has <br> instead of the two-line layout the brief implies<h1>Design that<br><span class="dim">pulls back.</span></h1> — uses literal <br> rather than two block elements; visuall
lowMarquee uses 'padding-right:0' and a trailing &nbsp; in spans; seamless wrap depends on duplicated spans being identical — fragile but works<span>MOTION · SYSTEMS · BRAND · INTERFACES · SOUND ·&nbsp;</span><span>...</span>

Neural Drift — neural-drift

Verdict: partial · confidence: high · aesthetic score: 8/10 · tokens: 12,520

The field, motion choreography, and page structure faithfully implement nearly every specification in the brief with correct particle counts, spatial hashing, BFS-based pulses, and two-pass bloom. The only real deviation is an unrequested 'hub nodes' system that introduces 7 green-accented nodes from mid/far layers and amplifies certain edges, which is not part of the specified constellation metaphor.

Requirements confirmed met

  • 3 depth layers with correct counts (90/55/26), radii, and alphas
  • Spatial hash grid used for connections (O(n) neighbor scan via cell bucketing)
  • Pointer repulsion with correct force formula and 0.06 lerp back to base velocity
  • Signal pulses via BFS queue (no recursion), 4-7s interval, 400ms duration
  • Two-pass bloom with offscreen canvas, globalAlpha 0.28, blur(6px)
  • devicePixelRatio capped at 2
  • Sticky blurred header with correct rgba and blur(14px)
  • SVG glyph with three connected dots
  • Correct nav items, Sign in, and Deploy pill
  • Hero scrim for text legibility
  • Eyebrow pill, h1 with correct clamp/font/letter-spacing, paragraph with max-width 540px
  • Telemetry card with correct labels, aria-live=off, 1.4s update interval, 200ms count-up
  • Features section with 3 cards, stroke-only SVG icons, 2px lift + #34d399/40 border on hover, 720px breakpoint
  • Closing CTA band with correct h2 copy and one button
  • Footer with four columns and bottom row with copyright and pulsing green dot status pill
  • Correct palette and font usage (JetBrains Mono for telemetry only)
  • Reduced motion renders field statically and disables telemetry ticking
  • window.__DEMO__ telemetry hook with all required fields

Requirements not met

  • Hub nodes are not the specified 'near-nodes'; pulses originate from random near-nodes but 7 hub nodes are drawn from indices 90-170 (mid+far), contradicting 'a random near-node' for pulse origin while also adding an unrequested 'hub-nodes' visual effect with amplified edges and green tinting

Issues raised

SeverityIssueEvidence
mediumPulse spawning selects from NEAR array (correct), but an unrequested 'hubs' system creates 7 visually-distinct green nodes from indices 90+ (mid and far layers), which is not in the brief and visually deviates from the pure constellation metaphorvar picked = 0; while (picked < 7) { var c = 90 + ((Math.random() * (N - 90)) | 0); ... hubs[c] = 1; } and drawNodes fi
lowConnection alpha formula multiplies by 1.9 for hub-hub pairs, an unrequested modification that overrides the brief's specified alpha formulaif (hubs[i] && hubs[j]) a *= 1.9;
lowTelemetry format for INGEST displays '41.2k/s' but the brief specified 'INGEST 41.2k/s' as the displayed string; the implementation splits label and value into separate spans losing the inline monospace figure format<span class="t-label">INGEST</span><span class="t-value" id="tIngest">41.2k/s</span>
lowReduced-motion path sets D.frames=1 but does not push 'signal-pulses' or 'pointer-repulsion' into effects array (effects are pushed conditionally before reduced check); the 'telemetry-ticker' effect is only pushed in the non-reduced branch which is correct, but the effects list naming is slightly inconsistent with the brief's described effectsif (!reduced) D.effects.push('pointer-repulsion', 'signal-pulses', 'telemetry-ticker');

Kinetic Type — kinetic-type

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 12,540

The page looks intentionally editorial and type-driven, but several concrete spec mismatches remain: the background stroke band is the wrong color, the header top rule is missing, the marquee wrap algorithm is off, and the footer copy is wrong. It feels premium at first glance, but a hostile review finds the brief was not followed to the letter.

Requirements confirmed met

  • single valid HTML file
  • header 3-part grid with logo, meta, actions
  • hero h1 split into per-word w/wi spans
  • three marquee bands present and driven by one rAF loop
  • scroll-linked h1 scale and letter-spacing
  • two-column hero content stacks below 720px
  • index list with five numbered rows and CSS hover transforms
  • subscribe form with inline success message
  • footer masthead + link columns + bottom row structure
  • light paper palette with Instrument Serif/Inter fonts
  • prefers-reduced-motion safeguard

Requirements not met

  • header hairline rule above the header
  • band 2 white 1px text-stroke color
  • marquee seamless wrap: duplicate twice + half-width modulo
  • exact footer bottom copy
  • hero paragraph size 15px/1.7
  • split reveal cubic-bezier(.16,1,.3,1) easing

Issues raised

SeverityIssueEvidence
mediumBand 2 text-stroke is dark ink instead of the specified rgba(255,255,255,.13), making the 'PRINT IS NOT DEAD...' background band appear muddy or nearly invisible against the paper background instead of a subtle white outline.CSS: .band-2 span { -webkit-text-stroke: 1px rgba(20, 20, 15, 0.13); } — brief requires rgba(255,255,255,.13).
mediumMarquee seamless-wrap implementation does not follow the brief's algorithm: it duplicates content by a calculated multiplier rather than exactly twice, and wraps using single-text-width modulo instead of half the scroll width.JS: const multiplier = Math.max(3, ...); and offset = baseOffsets[idx] % singleWidth; instead of duplicate twice and
lowHeader lacks the required hairline rule above it; only a bottom border is present.HTML: <header class="border-bottom"> only; no .border-top or top border rule applied.
lowFooter bottom text does not match the brief: it reads '© 2026 OFFCUT Press — Rotterdam' and adds an extra 'Printed on FSC Certified 120gsm paper' line instead of '© 2026 OFFCUT Press — printed in Rotterdam'.HTML: <span>© 2026 OFFCUT Press — Rotterdam</span><span>Printed on FSC Certified 120gsm paper</span>.
lowHero paragraph font size is 16px, not the requested 15px.CSS: .hero-desc { font-size: 16px; line-height: 1.7; ... }.
lowSplit-text reveal easing is a quartic ease-out approximation, not the specified cubic-bezier(.16,1,.3,1).JS: const ease = 1 - Math.pow(1 - t, 4); // Quartic approximation of easeOut.

Stack Deck — stack-deck

Verdict: confirmed · confidence: high · aesthetic score: 8/10 · tokens: 15,334

The screenshot's hero is clean and premium — strong clamp type, correct serif italic second line, tidy header — and the code faithfully implements the stacking, dimming, smoothstep deal, and counter choreography. It is docked for a no-IntersectionObserver path that renders an invisible deck instead of the final bento, and a dealt-state bottom row that gets clipped on short viewports.

Requirements confirmed met

  • 500vh deck-wrap with sticky 100vh stage and perspective: 1400px
  • five 460x300 glass cards (rgba white fill, .09 border, 18px radius, blur(10px), 40px shadow) with hue hairline, 01-05 index, h3, two copy lines, and five distinct stroke-only SVGs (pipeline, branch, gauge, timeline, shield) in the specified hue order
  • arrival window [i*0.16, i*0.16+0.16] driving translateY(60vh)->-i*14px, scale .92->1-i*.012, rotateX 18->0, opacity 0->1
  • brightness drops 5% per card stacked on landed cards
  • smoothstep deal between p=.82 and 1.0 into a 3+2 bento with 2deg alternating rotateZ
  • 1 / 5 readout pinned to stage bottom tracking the most recently landed card
  • four stat counters animating 0->target with easeOutExpo over 1.8s, toLocaleString separators, s/% in separate spans
  • sticky blurred header with anchor glyph, exact nav labels, Sign in + solid #6366f1 Start free
  • hero clamp(2.5rem,7vw,5.2rem) weight 650 -0.03em h1 with muted Instrument Serif italic second line, 560px paragraph, both buttons
  • CTA band h2 and one button; footer with wordmark, description, three link columns, (c) 2026 Harbour Labs, green-dot status pill
  • resize debounce 150ms + orientationchange rect recompute; reduced-motion collapses deck and jumps counters
  • copy is real, specific, and on-theme throughout

Requirements not met

  • IntersectionObserver-unavailable guard does not render the deck in final state: it calls renderDeck() once with wrapTop=0/travel=1, giving p=0 and all cards at opacity 0 (invisible), not the dealt bento the brief demands

Issues raised

SeverityIssueEvidence
mediumBento bottom row overflows short viewports: finalY=230 for cards 04/05 but deck height is min(620px,72vh), so at 640px-tall stages the dealt cards extend ~60px past the stage bottom and are clipped by overflow:hidden (diagrams and card bottoms cut off, readout overlaps)var finalY=[-92,-92,-92,230,230]; .deck{height:min(620px,72vh)}; .deck-stage{...;overflow:hidden}
mediumNo-IO fallback leaves deck invisible instead of final stateif(!('IntersectionObserver' in window)||reduce){setCountsFinal();renderDeck();...;return} — renderDeck computes p from
lowBrightness dimming persists after the deal even though cards are no longer stacked (card 01 sits at 0.80 in the final bento), leaving the grid permanently unevenvar stacked=Math.max(0,landed-1-i), bright=1-stacked*.05 — no reset when deal>0
lowMuted ink deviates from the stated palette: --muted is rgba(237,238,244,.68) while brief specifies .58 (--soft is defined at .58 but barely used)--muted:rgba(237,238,244,.68)
lowCard fill is a linear-gradient (.07 -> .035) rather than the specified flat rgba(255,255,255,.045).card{background:linear-gradient(145deg,rgba(255,255,255,.07),rgba(255,255,255,.035))}

Aurora Freight — aurora-freight

Verdict: confirmed · confidence: high · aesthetic score: 8/10 · tokens: 27,033

A faithful, end-to-end implementation of the Aurora Freight brief — copy is exact, tokens, breakpoints, layer stack, sprite/aurora math, palette cross-fade, amber sweep, grain, entrance stagger, mobile menu, reduced-motion and __DEMO__ telemetry are all correctly wired and the screenshot is free of clipping or mis-positioned elements. The aurora field is on the quiet end at 1024x640 because the spec deliberately caps luminance; nothing in the rendering is broken.

Requirements confirmed met

  • document title exactly 'Aurora Freight — Freight Intelligence, Orchestrated'
  • lang='en' on html
  • pure black ground (body inline + html,body !important)
  • fixed canvas #aurora with required CSS (z:0, pointer-events:none, #000 background)
  • DPR capped at 2, SCALE 0.5, 2,600,000 device-pixel clamp implemented
  • 18 pre-rendered radial sprite canvases (256x256, 5-stop gradient)
  • screen composite mode, hard-black ground each frame
  • 5 Lissajous bands + amber sweep band 5 with 30s cycle, easeInOutSine envelope
  • palette cross-fade every 20s with cancellation snapshot rule (B.6)
  • dt clamp at 0.05, ~60fps draw budget (15.5ms), visibilitychange handling
  • SVG feTurbulence grain at 4% with 6-step drift animation (compositor-only)
  • scrim: fixed, z:1, pointer-events:none, correct radial + linear gradient stops
  • layer stack z-indices (0/1/2/90/100) match spec
  • all required CSS tokens declared on :root at default values
  • header with inline SVG brand-mark (3-arc path + 2.2r amber circle + linearGradient markGrad)
  • four pills in exact order Platform/Network/Pricing/Docs + Request access ghost
  • burger 40x40 with 3x 1x16 white bars, aria-label/expanded/controls
  • hero bottom-anchored via align-items:flex-end, padding per spec
  • two-line masked h1 with em 'freight' in italic Instrument Serif, color --muted
  • lede copy exact, max-width var(--lede-max)
  • two hero CTAs: btn-solid 'Request access' and btn-line 'Watch the 2-min tour'
  • footer stats with exactly three li items, tabular-nums on b
  • mobile menu overlay z:90 with backdrop-filter blur+saturate, link/Escape/resize close
  • anti-flash rules in correct order at top of stylesheet
  • .appear resting state opacity:1, .is-in settlement, two-rAF fallback implemented
  • all 7 entrance keyframes defined with correct end states
  • stagger table matches element-to-animation-to-delay mapping
  • lede override animation-duration:1.25s applied
  • all 8 responsive breakpoints present and ordered (1600/1920/1280-1599/901-1279/<=850/<=720/<=900/<=560)
  • desktop lock (>=901px) sets html/body height:100% overflow:hidden and .page 100dvh overflow:hidden
  • <=900px disables desktop lock, hides nav-desktop, shows burger
  • prefers-reduced-motion media query with full overrides + canvas still frames-counter
  • window.__DEMO__ telemetry (ready/frames/effects/errors/name) implemented
  • window.error handler pushes to D.errors
  • no console.log, no third-party JS, no remote media, only Google Fonts request

Issues raised

SeverityIssueEvidence
lowAurora field reads as very subdued in the 1024x640 screenshot — only a faint right-edge glow is visibleSpec deliberately caps luminance <0.78 to protect readability (B.5 note) and uses peak alphas 0.28–0.62, so this is by d
lowAnti-flash rules list order differs from brief ordering — brief specifies inline body style as item 2 between two html,body rules, generated file only has two html,body rules + body attribute (acceptable collapse)CSS lines 41–42 ('html, body { background:#000000 !important; color:#ffffff; }' then 'html, body { background:#000000; b

Basalt — basalt

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 34,229

It mostly looks like the specified landing page, but the field is built only with JavaScript, the startup and interpolation logic deviate from the brief, and the layer stack is nested rather than flat. Premium feel is undermined by these reliability and precision gaps.

Requirements confirmed met

  • Single valid index.html with standalone HTML/CSS/JS
  • Semantic landmarks: header, nav with aria-label, main, footer
  • Exactly one h1 with required text content
  • Document language and title present
  • Custom properties defined on :root and used throughout
  • Backdrop radial/linear gradients implemented
  • Grain layer present with pointer-events none
  • SVG field generated in JS with 60 columns and 180 face paths
  • Flat-top hex geometry, depth formula, and skewX(-6deg) applied
  • Light sweep element, animation keyframes, and timing values
  • Header, hero copy, buttons, readout, and footer content match the brief
  • Button states and focus-visible outline implemented
  • Named keyframes and entrance animation delays applied
  • Responsive overrides for 1920, 1440, 901-1439, 768-900, 390-767, and short heights
  • Reduced-motion static state supported
  • Telemetry object and error listener implemented

Requirements not met

  • Page readable with JavaScript disabled (field is empty without JS)
  • Exact two-rAF startup fallback with 50 ms setTimeout
  • Error fallback that restores face fills to cached values
  • Global layer stack with z-index values as direct siblings
  • Per-frame fractional interpolation between light-angle samples
  • Cached depth opacity lookup values (.42/.68/.92)
  • Haze implemented as CSS pseudo-elements
  • Exact document title punctuation

Issues raised

SeverityIssueEvidence
highSVG field is empty in the HTML; it is drawn entirely by JavaScript, so the page fails the brief's no-JS readability requirement.<svg id="field" viewBox="0 0 1600 1000" ...></svg> contains no static content.
mediumThe animation loop only recomputes face fills when the sample index changes, not each frame with fractional interpolation.render() wraps applySample() inside if (current !== lastIndex).
mediumThe two-rAF fallback is not implemented as specified; the 50 ms setTimeout path is missing and the fallback check if (!second) is invalid because requestAnimationFrame always returns a positive ID.const second = requestAnimationFrame(() => { ... }); if (!second) { ... }
mediumThe error catch block stops the loop but never resets face fills to cached fallback values.catch block only pushes error.message and returns.
mediumThe backdrop layer stack is nested inside .backdrop instead of direct siblings, so the specified global z-index ordering is not literally applied.<div class="backdrop"> contains .backdrop-gradient, .grain, #field, .haze-far, .haze-near, .light-sweep, .vignette.
lowColumn opacity is computed by linear row interpolation rather than the specified rear/middle/front lookup.const opacity = .42 + (row / 8) * .50;
lowHaze is implemented as real <div> elements, not CSS pseudo-elements as described.<div class="haze-far"></div><div class="haze-near"></div>
lowDocument title has an extra trailing period compared to the brief.<title>Basalt — Geothermal Energy From Deep Ground.</title>
lowTop face geometry uses a six-vertex trigonometric hex, not the brief's x±46, y+23 / x, y−39 construction.const hex = radius => Array.from({length:6}, (_, i) => { const angle = Math.PI * i / 3; ... });
lowGrain background adds extra stops and a fixed background-size that differ from the specified repeating-radial-gradient.repeating-radial-gradient(...) includes .34px, 1px, transparent 1px, transparent 7px with background-size: 7px 7px.
lowNo fill-rule="evenodd" is applied to the face paths despite the brief's instruction.make() sets class and d but not fill-rule.

Bracket — bracket

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 32,956

Most of the requested document-like composition is present, but the rendered page omits the row-03 bracket annotation, duplicates annotation dots, and misplaces the red strikethrough. These deviations make the output look like an incomplete implementation rather than a faithful build.

Requirements confirmed met

  • Single-file document structure with one nav, header, main, footer and single h1
  • Exact title, lang, charset, and viewport declaration
  • Five-layer backdrop, guide lines, cross-paper texture, and margin notes
  • Navigation copy and 1fr auto 1fr layout
  • Hero eyebrow, h1, span#useful-word, and two-column hero grid copy
  • Workflow row copy and annotation of row 03 only
  • Evidence band testimonial and index copy
  • Footer copy, layout, and visible border
  • IBM Plex Mono with preconnect and system fallback
  • Visible #C2452D 2px/3px focus-visible outline
  • Responsive breakpoints and no horizontal overflow
  • window.__DEMO__ telemetry, error handlers, and live rAF loop
  • prefers-reduced-motion static fallback

Requirements not met

  • Bracket annotation visible in final render
  • Correct annotation dot geometry (eight total: four corner + four midpoint)
  • Red strikethrough positioned 4px below h1 top
  • Red-line animation driven solely by rAF --strike-progress
  • .sr-only utility layer in z-index contract

Issues raised

SeverityIssueEvidence
highRow 03 bracket annotation is not visible in the rendered screenshotNo bracket overlay appears around the heading 'Leave a trail your future self can follow.', which is the only element th
mediumAnnotation SVG contains duplicate midpoint circlesThe SVG defines four corner circles plus eight r=3 midpoint-positioned circles, with the last four duplicating the coord
mediumRed strikethrough is vertically misplacedsyncStrike sets strikeTop = usefulBounds.height * 0.52 instead of 4 px below the h1's top.
mediumRed-line animation is driven by CSS keyframes rather than the rAF custom property.motion-ready .strike-line { animation: correction-strike ... } overrides the transform: scaleX(var(--strike-progress))
lowMissing .sr-only utility layer from the z-index contractNo .sr-only rule is present in the stylesheet.

Cadence — cadence

Verdict: confirmed · confidence: high · aesthetic score: 8/10 · tokens: 24,202

The page renders as the brief's room-sized metronome scene with correct geometry, palette, copy and choreography, and nothing in the screenshot is broken, clipped or misplaced. Residual gaps are minor: the beat-dot decay is CSS-driven rather than JS-driven, and the mandated pivot position crowds the center nav link slightly.

Requirements confirmed met

  • Composition matches brief: header / bottom-anchored hero / right-side meter / 3-stat footer at one frame
  • Copy is exact: chip, h1 two masked lines with mono accent 'beat', lead paragraph, stat pairs all verbatim
  • Beat clock constants correct (96 BPM, 0.625s beat, 1.25s swing, theta = A*cos(2*pi*t/1.25), downbeat at right extreme)
  • Canvas geometry tiers, pitch, weight sizes and amplitude breakpoints implemented per section B
  • Grid alpha formula, 6-bucket batching, measure-line accent override present
  • 4 pre-allocated ring slots, born/down on new beatIndex, r = 14 + 300a, pow(1.7) decay, downbeat 1.4x heavier
  • Pendulum details present: ghost trails at 4 offsets, 3px rod, rotated rounded weight with groove, pivot cap layers, accent tip, 11-tick scale arc with accent extremes
  • Token table, breakpoint overrides, and desktop viewport lock implemented as specified
  • Entrance stagger table with per-element --d delays and all seven named keyframes; resting state = final state
  • Failure guards: black-first CSS, two-rAF getAnimations fallback, no-canvas static stage, reduced-motion frozen frame at t=0.22
  • dpr cap of 2, single getBoundingClientRect in resize, rAF-queued resize, no ctx.filter/shadowBlur, no in-loop allocation
  • Telemetry hook exact shape with five effects pushed in order

Requirements not met

  • Beat-dot decay is done via CSS animation classes (is-a/is-b) instead of JS writing opacity 1 -> 0.25 each beat as briefed
  • Mobile menu wraps the 4 links in a nested <nav> rather than direct flex children, a structural deviation from the specified .menu layout

Issues raised

SeverityIssueEvidence
lowPivot sits inside the header band and the housing circle visually collides with the 'Rigs' nav linkP = (w*0.5, h*0.075) is mandated, so the r=22 housing circle and rings render behind the centered nav at 1024x640; nav t
lowBeat-dot opacity decay driven by CSS keyframes, not the JS opacity writes the brief specifiesupdateBeat sets style.opacity='1' then toggles .is-a/.is-b classes with dot-tick keyframes; brief: 'opacity written per

Camber — camber

Verdict: partial · confidence: high · aesthetic score: 5/10 · tokens: 20,332

The structural composition, copy, and motion spec are faithfully implemented, but the rendered screenshot is missing the entire second headline line 'held in balance.', which is the page's primary statement and gut-punches the design. Until that line renders reliably, the page reads as an unfinished hero with a floating CTA.

Requirements confirmed met

  • exact specified copy throughout (wordmark, eyebrow, nav, button, proof, footer)
  • header/nav/rule structure with Contact divider matches brief
  • balance rail right-aligned to h1 bottom edge with specified figures
  • conic orbit backdrop and paper grain canvas present behind page
  • single pill CTA with specified gradient and hover/active states
  • footer three-column grid with centre-centred copy
  • staggered entrance animation timings and named keyframes present
  • no second CTA, hamburger, or extraneous controls

Requirements not met

  • second h1 line 'held in balance.' not visible in the rendered screenshot
  • last balance row uses an empty <dd></dd> with 'London · Geneva · Singapore' as a dt
  • drawGrain omits the specified rgba(239,237,232,0) fill of the 192x192 working canvas
  • reduced-motion selector .line.two does not match the actual .line-two class names

Issues raised

SeverityIssueEvidence
highThe second headline line 'held in balance.' is entirely absent from the rendered page; only the graphite 'Holdings,' line is visible above the CTA, leaving a large blank band where the primary ink headline should sit.Screenshot: only 'Holdings,' renders; no second line below it despite h1 containing span.line.line-two with the gradient
lowEmpty dd element after final dt leaves an invalid/empty definition row in the balance rail.<dt>London · Geneva · Singapore</dt><dd></dd>
lowReduced-motion rule for the sweep uses selector .line.two which matches nothing (elements use .line-two), so background-position:50% 0 is never applied under reduced motion.CSS: .line.two { background-position: 50% 0 !important; } vs HTML class="line line-two"
lowdrawGrain deviates from the exact JS: no fill of the 192x192 working canvas with rgba(239,237,232,0) after clearRect, and an extra initial drawGrain() call was added in startAndReady.drawGrain() only calls context.clearRect then four drawImage calls

Cant — cant

Verdict: unparsed · confidence: low · aesthetic score: —/10 · tokens: 36,630

Carbon — carbon

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 23,679

The page implements the brief's token system, backdrop layers, motion choreography, and copy faithfully, but the hero h1 rendering is broken at the 1024px viewport — the wordmark is severely clipped showing only a fragment, and the footer is not visible. The main landmark also has the wrong id (top instead of process), and the grid template deviates from the literal spec. Visually premium in concept but the screenshot reveals a critical layout failure at this resolution.

Requirements confirmed met

  • Document title and lang attribute exact
  • Single h1 present with exact copy CARBON
  • Token table complete with all specified values
  • Backdrop weave uses exact specified gradients with correct offsets
  • Blue seam at 63% with correct linear-gradient and animation
  • Backdrop light veil with correct mask-image (both webkit and standard)
  • Grain layer uses 4px conic-gradient with correct opacity
  • Header three-column grid with brand/nav/action
  • Footer three-column grid with exact copy
  • Edge-index with vertical-rl writing mode and correct copy
  • Hero seam label with exact copy and correct positioning
  • Primary action button with arrow glyph in aria-hidden span
  • Secondary link beside primary
  • Reduced motion media query stops all animations and sets static states
  • Telemetry script matches brief with frames counter and error listener
  • No external resources, no canvas, no images
  • Motion choreography matches specified durations and delays
  • Named keyframes (reveal-up, reveal-title, reveal-rule, lightSweep, seamPulse, grainShift) implemented correctly

Requirements not met

  • Main element has id="top" instead of id="process" as explicitly required
  • Grid template uses minmax(0, var(--hero-width)) instead of literal 1fr 1120px 1fr
  • h1 rendering appears severely clipped at 1024px viewport showing only partial text
  • Footer is not visible in the 1024x640 screenshot, likely clipped by overflow
  • Unspecified .wordmark-viewport and .wordmark-form wrapper elements added without brief authorization

Issues raised

SeverityIssueEvidence
highh1 wordmark severely clipped at 1024x640 viewport, only 'ON' or last portion visible at left edge instead of full 'CARBON' centered in heroScreenshot shows large white letters 'ON' at left edge of viewport with 'CARB' missing; .wordmark-form width:max-content
mediumFooter not visible in 1024x640 screenshotScreenshot shows only backdrop, header, partial hero, and seam-label; no footer strip at bottom edge
mediumMain landmark has id='top' but brief explicitly states 'Give main id=process'<main class="hero" id="top"> vs brief: 'Give main id="process". Put id="contact" on the primary action wrapper'
lowHero grid template deviates from brief literal specificationGenerated: grid-template-columns: minmax(0, 1fr) minmax(0, var(--hero-width)) minmax(0, 1fr); Brief: grid-template-colum
lowUnspecified wordmark wrapper elements add rendering risk.wordmark-viewport and .wordmark-form classes are not mentioned in the brief but are inserted around the h1 text
lowbackdrop-base lacks explicit z-index: 1 while its pseudo-elements have z-index: 1.backdrop-base has no z-index property; .backdrop-base::before and ::after have z-index: 1
lowprimary-action transition only covers transform, not background/box-shadow specified in brief hover stateCSS: transition: transform var(--motion-fast) var(--ease-out); on .primary-action

Cardinal — cardinal

Verdict: confirmed · confidence: high · aesthetic score: 7/10 · tokens: 16,330

The build is a near-verbatim transcription of the brief — tokens, layer stack, stagger table, keyframes and the spring-needle loop are all present and correct, and nothing in the screenshot is clipped, mis-sized or misplaced. It reads as a competent, restrained dark instrument page rather than a default AI template, though the centred H1 burying the E/W bearings makes the rose decorative instead of functional.

Requirements confirmed met

  • Layer stack z0 bg-glow / z1 #rings / z2 #rose-container / z3 header / z4 .hero / z5 footer all present and ordered correctly
  • 72 ticks generated at 5° intervals with cardinal/ordinal/minor length and stroke-width differentiation, rOuter 48
  • 4 cardinal labels N/E/S/W at r=42, fill var(--text-main), font-size 4, mono family
  • 3 magnetic rings r=30/40/50, fill none, stroke var(--accent) 0.3 units, pulse-ring 4s/5s/6s with 0/1.3/2.6s delays
  • Ring container drift animation: translate(-50%,-50%) rotate(360deg) over 180s linear infinite
  • Exact radial glow: circle at 50% 50%, rgba(248,113,113,0.08) 0% -> rgba(5,5,5,1) 60% on a full-viewport pseudo-element at z-index 0
  • Header grid 1fr auto, CARDINAL with 0.5em letter-spacing, nav with TECHNOLOGY/FLEET/CONTACT in mono uppercase
  • Hero absolute 50%/50% translate(-50%,-50%), single h1 'NAVIGATE WITH ABSOLUTE CERTAINTY' + #readout 'BRG 000°' in accent mono
  • Footer grid 1fr auto with STATUS: ONLINE, 8px blinking accent dot, and pill button group
  • Stagger table honoured exactly: header fade-down 0.6s/0.1s, h1 fade-up 0.8s/0.2s, readout fade-up 0.8s/0.4s, footer fade-up 0.6s/0.6s
  • All six named keyframes (pulse-ring, drift, fade-in, fade-up, fade-down, blink) present with brief-specified values
  • Spring needle JS verbatim from brief: stiffness 0.08, damping 0.85, shortest-path diff normalization, 2 DOM writes per frame
  • Reduced-motion guard in CSS and JS (bearing pinned to 45°, no rAF, no setInterval)
  • Responsive table reproduced at 900/768/390px and 700/500px height breakpoints with matching token overrides
  • Focus-visible 2px accent outline with 2px offset on all interactive elements

Issues raised

SeverityIssueEvidence
lowCompass rose is visually subordinated: the h1 sits dead-centre over the dial and completely hides the E and W cardinal labelsScreenshot shows 'NAVIGATE WITH ABSOLUTE CERTAINTY' covering the rose centre; only N and S labels are legible. This is t
lowNav anchors point at unrelated landmark IDs that are not navigation destinations<a href="#technology"> resolves to <main id="technology">, #fleet to the button group, #contact to <footer>. Clicking 'F
lowThree declared design tokens are dead code; tick and needle geometry is hardcoded instead--tick-length-cardinal/ordinal/minor and --needle-length are declared in :root but never referenced; JS hardcodes 2.5/1.

Cascade — cascade

Verdict: confirmed · confidence: high · aesthetic score: 7/10 · tokens: 22,570

The rendered page matches the brief's composition: restrained observability aesthetic, exact copy, left-anchored hero over a veiled 14-stream waterfall, correct chrome and footer. Main defects are a doubled scan-line implementation and a legend whose legibility drowns against the brightest token columns.

Requirements confirmed met

  • 14-column token waterfall rendered behind UI with dark base gradient
  • Hero copy block on left with exact eyebrow, h1 CASCADE, statement, lede, buttons, proof row
  • Header with brand lockup, three nav links, Request access pill
  • Footer with exact left copy, centered ALL SYSTEMS OBSERVABLE status, copyright
  • Signal legend TRACE/BATCH/HOT ROW positioned bottom-right with correct dots
  • Hot rows rendered green with 76x14 wash visible in the field
  • Content veil, vignette, and layer stacking present; hero text sits on controlled dark veil
  • Token heads are short horizontal segments (56-86% column width), not full-width lines or Matrix rain
  • Two horizontal rules and restrained palette; no neon field, no glow overload
  • Staggered entrance keyframes (fade-up/fade-down/fade-in) with the specified durations and delays

Requirements not met

  • Single scan line implementation: both a CSS .scan-runner (scan-sweep) and a JS-drawn scan sprite exist, producing two independently timed sweeps
  • Brief's token table is extended with non-specified variables (--header-bg-top, --vignette-edge, etc.) and header/footer/vignette use colors not routed through the mandated gradient tokens

Issues raised

SeverityIssueEvidence
mediumDuplicate scan line: CSS-animated div and canvas-drawn scan sweep run simultaneously with different clocks, so two scan lines can be visible at once instead of one.scan-runner{animation:scan-sweep 5900ms linear infinite} plus frame(){ctx.drawImage(scanSprite, x, 0, 2, scaleY)}
lowSignal legend text sits over the brightest token columns and its small grey mono labels have poor contrast against the dense white token fieldlegend at right:100px bottom:24px renders as tiny dim text over the right-side comb of tokens in the screenshot
lowRightmost canvas region shows a dead gap: columns are squeezed by the 0.82 field factor, leaving the far-right edge emptier than the composition impliescolumnX uses fieldWidth * 0.82 * (0.045 + i * 0.0825)
lowHot-row uniqueness per column not guaranteed by the ordinal scheme; several columns show clusters of green rows while the spec says exactly one hot row visible per columnplan.hot = ordinal % 29 === 0 with ordinal = columnIndex * 29 + residue

Chrome Bloom — chrome-bloom

Verdict: partial · confidence: high · aesthetic score: 5/10 · tokens: 20,679

The structure and copy are largely faithful, but the screenshot fails the central visual promise: the supposed liquid chrome renders as an uncontrolled neon blob and the wordmark lacks a convincing chrome finish. Several implementation details also violate the specified motion and fallback behavior.

Requirements confirmed met

  • Desktop composition uses the required header, centered hero, and three-part footer within one viewport
  • Header contains the Bloom brand, exactly three primary nav links, and the Start a project CTA
  • Hero copy matches the specified eyebrow, h1, and lede exactly
  • Footer copy and three social links match the brief
  • Six orb elements, radial chrome gradients, compositing filter, grain SVG, conic text sheen, and hue-drift keyframes are present
  • Entrance animations use the requested named keyframes, stagger delays, and easing
  • Mobile overlay menu structure and breakpoint behavior are implemented

Requirements not met

  • The six orbs do not have their required base x/y offsets in CSS; those offsets exist only in JavaScript
  • The page adds an unrequested continuously pulsing footer status dot animation
  • The rendered bloom does not read as a single premium liquid-chrome mass; it reads as a brightly colored neon blob
  • The rendered wordmark is visually flat beige/gold rather than convincingly chrome-sheened
  • Mobile orb sizes at <=560px differ from the specified responsive table, using 32/28/24/20/16/14% instead of 36/30/26/22/18/16%
  • The hue-drift keyframes hard-code desktop blur and contrast values, overriding the specified mobile filter values during animation

Issues raised

SeverityIssueEvidence
highThe central bloom is visibly wrong for the requested liquid-metal aesthetic: it shows saturated yellow, red, and white neon regions rather than a unified warm chrome metaball surface.Screenshot: the bloom behind the heading is a high-saturation yellow/red/white shape with separate visually distinct zon
mediumThe bloom overwhelms and competes with the hero text instead of supporting it.Screenshot: the brightest white and red bloom sits directly behind the eyebrow and h1, reducing the expensive, controlle
mediumOrb fallback positioning is not implemented in CSS as required.The .orb rules set left:50% and top:50% but no base x/y transforms; the only offsets are computed in JS as baseXPct/base
mediumAn extra animated effect violates the stated motion restriction.The footer dot uses animation: pulse 2.4s ease-in-out infinite, while the brief permits the chrome bloom motion and grai
lowThe hue animation defeats the mobile filter tuning.@keyframes hue-drift always uses filter: blur(28px) contrast(18), including on mobile where the brief requires 22/16 or

Data Tide — data-tide

Verdict: confirmed · confidence: high · aesthetic score: 8/10 · tokens: 26,792

The implementation is a near-literal transcription of the brief: seeded field math, envelope, stagger table, glass border mask, ticker recurrence, and breakpoint token overrides all match line-for-line. Only trivial deviations exist (resize redraw gating, overeager menu close handlers), and the visual composition cannot be independently confirmed since no screenshot was actually evaluated.

Requirements confirmed met

  • Single self-contained index.html, correct title and lang, Google Fonts as only network request
  • Full token table on :root with all specified values
  • Seeded mulberry32(20260114), 40 ribbon records, 12 rnd() calls in exact order, pre-built stroke strings
  • DPR cap at 2 plus 3.4M pixel clamp, setTransform to CSS px, 150ms debounced resize + orientationchange
  • Surge envelope: 6.0s period, Gaussian sigma 0.085W, env 0.30 + 2.30g, two-pass stroke with teal hot highlight and clamped window
  • Deterministic 48-sample prefill from the same rnd() stream; ticker every 1200ms with exact delta/sub formulas and sparkline geometry (x=j*480/47, y=50-clamp*44)
  • Glass panel: mask-composite 1px gradient border, ::after sheen, backdrop-filter, three-node wrap/float/glass transform separation
  • Stagger table matches exactly (in-scale/in-soft alternation on pills, in-pop badge, in-mask h1 lines, 1.25s lede, 1.15s panel, in-stat footer)
  • Desktop lock at >=901px (height:100%, overflow:hidden) plus max-height token overrides; scrolling permitted only <=900px
  • Mobile menu at z-index:90 with Escape, link-click, and >=901px-resize close; aria-expanded flips
  • Reduced-motion: static frame at cx=0.5W, animations killed, ticker/sparkline continue, rAF only counts frames
  • Effects list pushed in required order with conditional panel-tilt and tide-canvas-fallback substitution
  • Zero console output, no forbidden libraries/CDNs, damped tilt clamped at 2deg gated on hover:fine and !reduce

Issues raised

SeverityIssueEvidence
lowresize() only redraws immediately under reduced-motion; in normal mode a resize leaves the field stale until the next throttled rAF tick (up to 15.5ms) — brief section 8 says resize should 'draw(reduce) once' unconditionallyscheduleResize(): 'sizeCanvas(); if (reduce) draw(true);' — draw omitted when not reduce
lowEscape keydown always calls closeMenu even when the menu is already closed, and resize listener closes menu at >=901px on every resize event rather than only on transition — harmless but sloppier than specified behavior impliesdocument.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeMenu(); })
lowScreenshot could not be visually inspected (no image input available), so rendered composition, scrim coverage, and ribbon rendering could only be verified from codereview performed on source only

Echo — echo

Verdict: partial · confidence: high · aesthetic score: 8/10 · tokens: 36,641

A highly faithful implementation that nails the sonar scope, motion choreography, copy, and token system — the missing 901–1279px breakpoint is the one concrete gap, causing a wider copy column and larger padding at common laptop widths. Premium look with one structural omission.

Requirements confirmed met

  • Full sonar canvas: graticule blit, 4 ping rings with pk^0.82 exponent, 8 trail buckets, leading edge + tip dot, contact glow+core, edge fade, vignette
  • Graticule: 6 range rings, 36 bearing ticks (major every 30°), 4 labels at R+26px, offscreen canvas blitted once per frame
  • 30 contacts via mulberry32 seed 20260214, wrap-aware ignition, 2.6s decay, 64×64 glow sprite + core circle
  • Grain element with inline SVG feTurbulence data-URI, 0.9s steps(4), correct jitter translates
  • Layer stack z-indices correct: canvas 0, scrim 1, page 2, grain 5
  • Token table :root defaults match exactly
  • Header composition: brand SVG, blinking cursor, 3 nav links with marker on platform, CTA
  • Hero: chip, h1 with em on Sound, lead, two buttons, readout with accent values and opt span
  • Footer: copyright, beacon with 7px marker, exactly 3 links
  • Button styles: primary gradient, ghost, sm, active/focus-visible
  • Motion stagger table: all 15 elements with correct modifiers and delays
  • Named keyframes: in-fade, in-soft, in-mask, in-chip, in-pop, in-read, blink, pulse, grain
  • Copy text is exact and specific throughout (no filler)
  • Reduced motion: frozen frame at bearing 042°, pk=[0.18,0.42,0.66,0.90], life=0.55, frames=1
  • Canvas fallback: .no-canvas class + repeating-radial-gradient
  • Entrance fallback: two nested rAFs then .is-in sweep
  • Mobile menu: burger, overlay, Escape/link/resize close handlers
  • Telemetry hook exact shape; effects pushed in specified order
  • DPR caps: 2 desktop, 1.5 mobile; setTransform applied
  • Per-frame budget ≤78 primitives; zero ctx.filter/shadowBlur
  • Responsive overrides present for >=1600, >=1920, 1280-1599, max-height 850/720, <=900, <=560
  • Contact count scales: 30/22/16 at correct breakpoints
  • Graticule labels drop to 000/180 only at <=560px

Requirements not met

  • 901–1279px breakpoint token overrides entirely absent — no @media (min-width:901px) and (max-width:1279px) rule exists
  • Menu adds visibility:hidden and a visibility transition not specified in the brief

Issues raised

SeverityIssueEvidence
mediumMissing 901–1279px breakpoint: at 1024px width, --copy-max stays 560px (should be 460px), --header-x/--hero-x stay 40px (should be 32px), --nav-h stays 38px (should be 34px). Copy column extends ~140px further into the scope area than designed.No @media (min-width:901px) and (max-width:1279px) block in CSS; brief table specifies --h1:48px --nav-h:34px --header-x
lowMenu panel uses visibility:hidden with a visibility transition delay not in the brief, which slightly alters the specified transition property listtransition:transform 0.45s var(--ease-out), visibility 0s 0.45s — brief specifies only transition: transform 0.45s var(-

Filament — filament

Verdict: unparsed · confidence: low · aesthetic score: —/10 · tokens: 0

Fringe — fringe

Verdict: unparsed · confidence: low · aesthetic score: —/10 · tokens: 0

Grid Collapse — grid-collapse

Verdict: confirmed · confidence: high · aesthetic score: 7/10 · tokens: 22,522

The page renders exactly as briefed: black terminal frame, converging accent grid at cy=42%, correctly staggered terminal-chip header and masked hero, with the exact required copy and no layout breakage in the 1024x640 capture. Only real deviations are reduced-motion details (the rAF loop halts, and the mobile overlay menu degrades to a static block under the footer), none of which affect the default desktop composition.

Requirements confirmed met

  • Single self-contained index.html, no frameworks, no external media (SVG data-URI grain only)
  • Layer stack correct: canvas z0, scrim z1, .page z2, .scanline z3, .grain z4
  • Header composition: chevron brand + blinking _ cursor, 4 ./-prefixed nav links, accent chip CTA '$ npx vector init'
  • Hero left-aligned and vertically centred with prompt / two masked H1 lines / output line
  • Exact copy reproduced: prompt, 'Ship to the grid.' / 'Collapse the distance.' with mono accent <em>distance</em>, [ok] output line
  • Footer: © 2026 Vector Systems, status pixel + 'status: all systems nominal', github/x/irc
  • Canvas projection maths (cx=w/2, cy=h*0.42, f=h*0.9, zNear 0.6, zFar 80, N=26, 60 exponential segments, step 1.14, speed 0.55) implemented as specified
  • 8 alpha buckets with single beginPath per level; radial distance mask + vignette drawn after grid
  • Scanline CSS (1px, 4s linear, gradient + box-shadow) matches spec exactly
  • Entrance stagger table implemented with correct modifiers and --d values; in-fade/in-soft/in-mask/in-chip/in-type keyframes verbatim
  • Responsive token overrides for 1600/1920/1280-1599/901-1279/max-height 850/720/900/560 all present and correct
  • Mobile: burger, full-viewport overlay menu, Escape/link/resize close, CTA relocated into menu
  • Failure guards: black-first rule + body inline style, .is-in fallback, .no-canvas CSS grid, reduced-motion rules, no console calls

Requirements not met

  • Reduced-motion: the rAF chain is terminated after the single static frame (if (!reduced) requestAnimationFrame(loop)), whereas the brief requires the loop to keep running with speed = 0
  • Reduced-motion: the mobile .menu is forced to visibility:visible/position:static/transform:none, turning the overlay into an in-flow block rendered below the footer on <=900px

Issues raised

SeverityIssueEvidence
mediumReduced-motion mobile menu becomes a static in-flow section appended under the footer instead of an overlay@media (prefers-reduced-motion: reduce){ .menu{ visibility:visible; transform:none; position:static; background:none; ..
lowReduced-motion canvas stops animating entirely rather than running a static loopif (!reduced) { requestAnimationFrame(loop); } combined with a separate one-shot paint(0)
lowFrame counter increments twice on the reduced-motion pathloop() paints and increments, then the reduced block runs paint(0) and increments __DEMO__.frames again
lowLongitudinal polyline drops one segment at every alpha-bucket transition (moveTo instead of lineTo), leaving sub-pixel gaps in the railsif (lvl !== prevBucket) { ...; paths[lvl].push(0, sx, sy); prevBucket = lvl; } else { paths[lvl].push(1, sx, sy); }
lowRung alpha is quantised with the rail denominator 0.34 although rung peak alpha is 0.30, so rungs land in a coarser bucket than specifiedlvl = Math.round(alpha * (BUCKETS - 1) / 0.34) applied to alpha = 0.30 * Math.pow(1 - ze / zFar, 1.5)

Halide — halide

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 23,269

The page has the right content structure and a recognizable dark photographic landing-page composition, but the optical effect is compromised by oversized glowing dust blobs and mis-centered bloom layers. It looks competent, not blank or broken, but it does not faithfully deliver the brief's precise 'one light behind one lens' cinematic optical stack.

Requirements confirmed met

  • Single cinematic viewport composition at desktop with header, hero, and three-stat footer visible
  • Required Halide copy is present and specific
  • Header navigation, CTA, hero chip, two headline lines, lead, two buttons, and three stats are present
  • Procedural optical stack is present: iris SVG, conic ring, bloom, fringe, dust canvas, grain
  • Desktop screenshot shows no scrollbars or horizontal overflow

Requirements not met

  • Dust motes are not implemented as tiny 0.6px–2.2px arcs; they render as large glowing blobs across the page
  • Bloom and bloom-core are mis-centered in CSS and do not sit cleanly behind the lens axis
  • The requested single visual idea is weakened: the iris/lens is dim and visually secondary to scattered glow blobs
  • Canvas dust implementation violates the specified exact fill style and primitive budget behavior
  • Optical centering uses negative margins instead of the specified translate centering in several layers

Issues raised

SeverityIssueEvidence
highDust motes render as oversized glowing orbs instead of tiny rising dust particlesScreenshot shows many large soft circular blobs, some tens of pixels wide; JS builds gradients with `var R = (30 + m.r *
highCanvas dust does not follow the brief's exact per-mote paint styleBrief requires fillStyle 'rgba(255,206,152,' + alpha + ')' and radius 0.6px–2.2px; generated code uses cached radial g
highBloom layers are mathematically mis-centered relative to the iris.bloom sets left:50%, margin-left:calc(var(--iris) * -0.775), and also transform:translate(-50%,-50%); this doub
mediumBloom-core has the same double-centering error.bloom-core uses `margin-left:calc(var(--iris) * -0.25); margin-top:calc(var(--iris) * -0.25); transform:translate(-50
mediumThe lens is visually too subdued compared with the accidental dust glow fieldIn the 1024x640 screenshot the central iris is dark and low-contrast while the page is dominated by large scattered warm
mediumThe requested bloom behind the optic is not visibly centered behind the irisScreenshot shows no strong warm radial bloom centered on the iris; the brightest glow is distributed as separate blobs a
lowOptical stage centering does not use the specified transform methodBrief specifies .iris-stage ... transform:translate(-50%,-50%); generated CSS uses `margin-left:calc(var(--iris) / -2)
lowMobile menu default CSS differs from specified display behaviorBrief specifies .menu { display:flex; ... transform: translateY(-100%) }; generated CSS sets `.menu{ display:none; ...

Headlight — headlight

Verdict: partial · confidence: high · aesthetic score: 5/10 · tokens: 21,308

Composition, copy, tokens, and z-index stack are mostly correct, but the particle group split (60/27.9/12.1 amber/red/blue instead of 74.3/27.9/12.1) and the unrelated DOM wrappers + duplicate IDs are clear spec violations. The screenshot reveals a visually weak trail field concentrated in the top-left rather than the described long-exposure road surface, with an unintended dark band cutting across the lower copy.

Requirements confirmed met

  • Document lang, title, and viewport meta correct
  • All required copy strings present verbatim (eyebrow, h1, paragraph, status, footer, CTA)
  • Single h1 with required text and styling tokens
  • CTA cluster with primary pill button and quiet link
  • Two radial glow layers with correct colors, sizes, positions, and 70px blur
  • Canvas backdrop with inset:-12px and CSS blur(0.4px)
  • Vignette and grain layers present at correct z-indexes
  • Footer shows required left/right text strings
  • Readability scrim implemented as gradient on .site-shell::before
  • System font stack used, no Google Fonts request
  • Header brand 'NOCTURNE' with letter-spacing 0.24em and nav links to #service/#safety
  • Reduced-motion fallback implemented with static seeded frame
  • Telemetry hook with name, ready, frames, effects, errors fields
  • Canvas DPR handling with cap and 2.5M pixel budget

Requirements not met

  • Particle counts wrong: brief requires 39 red + 17 blue + 104 amber = 160 total, but implementation uses 39 red + 17 blue + 84 amber = 140 total with index < 39 ? 'red' : index < 56 ? 'blue' : 'amber'
  • Tone-mapping wrong: brief says 74.3% amber / 27.9% red / 12.1% blue, implementation produces 60% amber / 27.9% red / 12.1% blue
  • Hue ranges wrong: brief says sodium 18–42deg, brake red 358–8deg (wrapping), headlight blue 204–222deg; implementation uses 358–368 / 204–222 / 18–42 which collapses the percentage signs into numeric degree ranges (e.g. 358 + random() * 10 produces 358–368, not 358–8 wrap)
  • Excess DOM wrappers: brief requires the exposure wash to be inside .canvas-wrap; implementation wraps canvas in two additional divs (.canvas-inner, .canvas-drift) plus the wash, adding opacity-fading overlays not in the brief
  • Body still overflows horizontally on small viewports because html/body do not enforce overflow-x: hidden in the base styles (only inside @media (max-width: 900px)); brief requires it always
  • Per-frame draw operations exceed budget: brief allows ≤420 (140 updates + 140 current stamps + 140 previous stamps + 1 fade + 1 composite); implementation uses globalAlpha + 6 path commands + 3 property writes per particle, which inflates the per-frame draw call count and likely violates the cost budget
  • Brief specifies 'Every particle must leave a 6px to 34px trail by stamping points'; implementation draws only a single line per particle with no multi-stamp trail
  • Status strip is rendered inside the .hero-copy block (and uses id="safety") instead of being placed above the CTA cluster or directly below the paragraph as a sibling; this collapses the layout structure
  • CTA cluster and footer share z-index logic poorly: footer is z-index:1 while site-shell is z-index:4, so footer sits below the shell's ::before scrim and may be visually subdued beyond spec
  • Exposure ramp default state is wrong: brief says exposure wash defaults to opacity:0 then ramps to 1; implementation declares opacity:1 on .exposure-wash and animates from 0→1 with backwards fill mode, so on first paint the wash is hidden (correct behavior) but the final opacity is back to 1 (correct). However the canvas-inner also animates opacity from 0→1 separately, causing double fade not specified in the brief
  • Pointer parallax uses event.clientX / width * 2 - 1 but width is 0 at startup before resize runs, so first pointer event after load gets NaN; brief calls for clamping [-1,1] which fails on the first frame
  • Brief mandates 'exactly one visible h1' and a dedicated <main> with id="service"; implementation reuses #service on the status strip inside main, creating duplicate IDs
  • Quiet link underline offset is 5px, correct, but text-decoration:underline is applied at all states including hover which loses the offset on hover (the brief requires the offset to persist)
  • Brand link href="#service" is wrong: brief requires it to be a home link, but pointing to #service (same as 'The service') creates a duplicate navigation target. Spec only mandates aria-label 'Nocturne home', not a particular href, so this is a soft miss

Issues raised

SeverityIssueEvidence
mediumDuplicate id="service" on <main> and id="safety" is placed inside hero-copy on the status strip, breaking the navigation anchors<main id="service" class="hero" ...><div class="hero-copy">...<div id="safety" class="status-strip" ...
highParticle group split is wrong: amber group only gets indices 56..139 (84 particles) instead of the required 104const group = index < 39 ? "red" : index < 56 ? "blue" : "amber"; produces 39 red + 17 blue + 84 amber
mediumSodium hue range should be 18–42deg but brief also restricts brake red to 358–8deg (wrapping); code generates 358–368 instead of 358–8 modulo wrapgroup === "red" ? 358 + random() * 10 : group === "blue" ? 204 + random() * 18 : 18 + random() * 24
lowImplementation wraps the canvas in two extra divs (.canvas-inner, .canvas-drift) plus an exposure wash, none of which are specified in the brief<div class="canvas-inner"><div class="canvas-drift"><canvas id="traffic-canvas"></canvas><div class="exposure-wash"></di
lowStatus strip is a child of .hero-copy and uses role="status" which would announce the whole strip to screen readers, while the brief describes a decorative timing line<div id="safety" class="status-strip" role="status">
lowBody baseline lacks overflow-x: hidden outside the media query; only added via @media (max-width: 900px)body { ... } (no overflow-x) then @media (max-width: 900px) html,body,.site-shell { overflow-x: hidden; }
lowFooter z-index 1 sits below the page shell (z-index 4) and its scrim, so the footer is drawn under the readability overlay.site-footer { ... z-index: 1; }
highScreenshot shows the entire visual weight of the trail field clustered in the top-left quadrant with the lower-right and lower-center nearly empty, contradicting the brief's 'darkest quadrant is lower-left' and 'biased toward y between 4% and 62%'Screenshot at 1024x640: traffic-light trails concentrated upper-left, lower third mostly empty except for a few stray am
mediumScreenshot shows the .vignette darkening the bottom-center heavily while the required readability scrim on .site-shell::before is also darkening that same area, producing a visible dark band that crops through the paragraph and status stripVisible dark band runs horizontally across the page just above the status strip in the rendered image
lowType ramp at 1024px renders the h1 at roughly 70–80px (between the clamp minimums) and looks noticeably smaller than the brief's intended editorial display weight at this widthScreenshot: 'Take the long way home.' occupies roughly 55% of viewport width; the brief expects clamp(54px, 7.2vw, 128px

Lattice — lattice

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 22,026

The implementation faithfully delivers the structural brief — typography, layout, tokens, telemetry, motion choreography, and failure guards are all present and correctly wired. Visually it lands in the right neighborhood but the depth fade and horizon glow read weakly in the screenshot, leaving the canvas looking like a uniformly dense cube tangle rather than a clearly architected gyroid with crisp near edges and dissolved far edges.

Requirements confirmed met

  • Single self-contained index.html with no external media
  • Google Fonts loaded with Inter and IBM Plex Mono
  • Telemetry hook with correct fields (name, ready, frames, effects, errors)
  • Three effects pushed in correct order
  • Gyroid Newton projection with analytic gradient and displacement clamp
  • 12 depth buckets with preallocated Uint16Array buffers and cached strokeStyle strings
  • Horizon glow band and 1px core line built from cached gradients
  • Vignette radial gradient drawn last
  • Canvas resolution trick with dpr capped at 2 / 1.5 and setTransform
  • Grain texture via inline SVG feTurbulence data URI with stepped animation
  • Brand mark SVG path matches brief exactly
  • Nav with 4 mono links, numerals in .num, word/nav hover color transition
  • Header CTA ghost-style button with correct hover state
  • Hero eyebrow with in-type reveal and exact copy
  • Two-line H1, .em styled mono accent for 'unit cell'
  • Lead paragraph with exact copy and max-width:520px
  • Spec line with .hi accent on 'G-surface' and .opt span at <=560px
  • Two actions: btn--primary with gradient + inset highlight, btn--ghost with subtle bg
  • Footer with copyright, centered SEM batch with pip, three mono links
  • Viewport lock at >=901px (html/body overflow:hidden, page height:100dvh)
  • Mobile burger at <=900px and full-screen menu overlay with backdrop blur
  • Reduced motion fallback that freezes t at 7.5s and hides grain/blink
  • Entrance fallback via two nested rAFs + getAnimations check + .is-in sweep
  • Canvas fallback grid + horizon line via .no-canvas class

Requirements not met

  • Canvas center at desktop is cx = w * 0.635, but rendered lattice looks centered slightly right-of-center (around ~0.62 visually fine)
  • Rendered lattice occupies a noticeably larger share of the viewport than the designed 62% — at 1024x640 the wireframe appears to span ~80% of viewport width/height
  • Horizon glow band and 1px core line are essentially invisible in the screenshot — core line cannot be seen at all, band is barely detectable
  • Depth fade does not read clearly: far geometry dissolves but the bulk of the mesh reads as a uniformly dense, near-opaque tangle rather than a sparse architected surface with selective crisp near edges
  • Spec line G-surface · Si–O system · ρ* 0.42 g/cm³ · E*/E_s 3.1 renders as monospace but the in-text stylized Greek/sub characters (ρ) are using plain ASCII p with a star, not the actual ρ character (the brief says 'ρ*' which is acceptable as text, but it is followed by a plain ' g' that reads as '0.42 g/cm³' — the 'g' should be italicized or rendered as g for grams; brief copy uses the unicode ρ so partial)
  • Footer pip is not visibly glowing in the screenshot (only the 7px square is seen, no halo)
  • Header CTA appears far to the right at 1024px (visually fine, but the right alignment pushes it slightly off-center relative to the grid)
  • Footer has 4 line items rendered side-by-side at 1024px, but the footer should align footer-left flush-left, footer-center physically centered, footer-right flush-right — the layout looks acceptable but the middle item is slightly offset

Issues raised

SeverityIssueEvidence
mediumLattice wireframe reads as a dense opaque cube-like tangle rather than a clearly architected gyroid minimal surfaceScreenshot: the structure occupies most of the right half of the viewport and individual gyroid saddles are not legible;
mediumHorizon glow band and 1px core line are not visible in the rendered pageScreenshot shows no detectable soft horizontal band around y=cy and no 1px line crossing the lattice
lowVignette appears too strong, washing the canvas edges to near-black and partially clipping the lattice's left/back facesScreenshot edges (especially bottom and top corners) are nearly pure black; lattice wireframe fades into the vignette ag
lowFooter status pip lacks the expected halo glowScreenshot shows a flat 7px square in the center footer line; box-shadow:0 0 8px var(--accent-dim) appears to render wit
lowGreek ρ character in spec line is rendered as plain ASCII 'p' (the brief uses the actual ρ glyph, but the source code uses 'p*')HTML spec line: ρ* 0.42 g/cm³ uses U+03C1 (ρ) which is correct in source — actually verified the source uses 'ρ' so th

Margin — margin

Verdict: partial · confidence: high · aesthetic score: 5/10 · tokens: 30,611

The page has the correct copy, palette, and procedural ingredients, but the defining desktop composition is wrong: the message and garment columns are in the wrong positions and the 1024px view is visibly clipped. The canvas also ignores the required static low-cost lattice and instead adds conspicuous animated texture that makes the result look like an unrefined AI mockup.

Requirements confirmed met

  • The page uses the specified title, language, semantic landmarks, and one h1.
  • The visible copy is specific and matches the brief.
  • The desktop presentation uses the intended bone, ink, muted dye, editorial palette.
  • The page includes procedural SVG garment plates, CSS weave layers, fades, counter-scroll animations, and focus styling.
  • The 390px, 768px, and 1440px compositions avoid horizontal overflow according to the supplied harness.

Requirements not met

  • The desktop grid does not place the center message between the two garment columns because the DOM/grid item order is wrong.
  • The ambient canvas is not the required static two-pass lattice; it adds extra fibers and a continuously repainted moving mark.
  • The 901px–1023px layout does not reliably keep both 280px columns visible alongside the center panel.
  • The required column article ordering is not satisfied for the left column: it repeats SS / 01 through SS / 06 rather than using the required different authored order.
  • The specified static canvas opacity values are changed from 0.018/0.012 to 0.045/0.03, with additional much darker marks.
  • The canvas is repainted every animation frame, contradicting the requirement to redraw it only on resize.

Issues raised

SeverityIssueEvidence
highThe primary composition is structurally misordered: the center message renders in the left grid column, the left garment track renders in the center, and the right track renders on the right.In .hero, .center-message is the first grid item, followed by .mobile-columns with display: contents; the screenshot sho
highThe 1024px screenshot visibly clips the intended composition and loses the left garment column.At 1024px the compact grid requires roughly 1018px for columns and gaps before the 64px hero padding, while the screensh
mediumThe ambient backdrop is visibly a dotted/fiber pattern rather than the specified subtle two-pass 3px lattice.drawWeave() adds a fiberRow/fiberColumn loop with repeated 5x2 and 2x5 rectangles and uses rgba(26,24,21,0.16); repaintW
mediumThe canvas animation violates the requested motion coupling and performance choreography.frame() calls repaintWeaveMark(time) and schedules itself every frame, while the brief requires the canvas to redraw onl
mediumThe left column does not use a different authored plate order from the right column.The left track's authored six are SS / 01 through SS / 06 in order, while the brief explicitly requires different author
highThe screenshot reads as a broken/default generated composition rather than a deliberate three-column marketplace scene.The headline occupies a narrow left strip, the central garment is disconnected from the message, and the right card is p

Monolith Type — monolith-type

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 21,602

The composition, copy, token system, and procedural backdrop are faithfully implemented and the screenshot shows a convincing metallic extruded wordmark with the requested chrome. The main substantive defect is that the per-letter cascade animation is applied to extrusion-layer letters (which sit behind the top-face and are mostly hidden) rather than to the visible top-face letters, weakening the requested letter-by-letter entrance. Secondary issues are a mis-centered stage-grid background that prevents the 96px horizontal drift from being visible and a small transform/keyframe mismatch on the specular mask.

Requirements confirmed met

  • Single h1 with aria-label='MONOLITH'
  • 12 extrusion spans with data-depth 12..1 plus top-face
  • Each extrusion has 8 letter spans M O N O L I T H
  • Specular mask overlay with duplicated letters and sweep animation
  • Reflection div with flipped/transformed text and floor-glow
  • Procedural backdrop (stage-field, stage-grid, stage-noise) with feTurbulence SVG
  • Hero copy text matches brief exactly
  • Footer metrics: 01 Variable wordmarks / 02 Optical correction / 03 UI type systems
  • Header has brand mark SVG, three nav links, Request specimen CTA
  • Mobile burger menu with aria-expanded/aria-label toggling
  • Token table in :root with required values
  • Desktop lock: html, body height 100%, overflow hidden at >=901px
  • Pill component with .pill::before shine and hover transform
  • Inter + Instrument Serif via Google Fonts preconnect
  • prefers-reduced-motion handling with .specular-mask display:none
  • window.__DEMO__ telemetry with effects and error listener
  • animationend adds .is-in class to .appear and .letter

Requirements not met

  • Specular mask transform starts at translateX(-72%) but @keyframes specular-sweep keyframes go from -76% to 76% — initial transform not matching the keyframe start exactly
  • .top-face::after is supposed to be inside the text via background-clip:text but the rule sets color:transparent on the pseudo while the parent is also color:transparent; the bevel strip may not render as intended on a transparent parent
  • Reflection z-index:1 but reflection div is OUTSIDE h1.monolith-stack in the DOM; brief places it inside .wordmark-scene which is fine, but reflection does not duplicate the 12 extrusion layers (brief only requires top-face duplicate, so this is actually correct)
  • Header padding uses padding-top only (var(--header-y) var(--header-x) 0) but the brief specifies padding var(--header-y) var(--header-x) 0 — this matches, however the desktop lock does not include the height lock padding for chip rendering
  • Grid-drift keyframes use background-position but the .stage-grid already has background-position set — animation overrides it; this works but the 96px 96px shift in BOTH axes may cause visible jumpiness vs the requested 96px on both axes (correct per spec)
  • letter:nth-child(1) targets first letter of first extrusion span (M of depth 12), not letters within the top-face — so the in-letter cascade applies to the BACK extrusion letters (which are dark/hidden behind the top-face) rather than visible letters; the top-face letters use class .in-letter but rely on :nth-child for delay, meaning all extrusion letters cascade with the same delays as top-face — wasted/incorrect cascade
  • .stage-grid background-position keyframe goes from 'center calc(50% + 8px)' to 'calc(50% + 96px) calc(50% + 104px)' which is a 96px shift in both axes; but 104-8=96, so this is correct
  • Reflection opacity is 0.28 default and 0.20 at <=720px height — but on a 1024x640 viewport the desktop default 0.28 applies; per the screenshot the reflection appears very faint, which matches the brief

Issues raised

SeverityIssueEvidence
highLetter cascade animation targets extrusion letter spans (behind top-face) rather than visible top-face letters, so the requested per-letter cascade is effectively invisible.letter:nth-child(N){animation-delay:.44s...} and the visible top-face letters have class 'in-letter' but no per-child d
mediumStage grid background-size is 96px but background-position goes from 'center calc(50% + 8px)' — using 'center' as first value means the grid is centered horizontally with a vertical offset; this means grid-drift horizontal motion starts from a computed 'center' not from a deterministic pixel, causing the horizontal drift to be 0px (since center is auto-centered)@keyframes grid-drift{from{background-position:center calc(50% + 8px)}to{background-position:calc(50% + 96px) calc(50% +
lowSpecular mask initial transform translateX(-72%) does not match the keyframe start at translateX(-76%) — for the 1.2s delay the element sits at -72% before animation begins, then jumps to -76% when animation starts.specular-mask{transform:translateX(-72%)} and @keyframes specular-sweep{0%{transform:translateX(-76%)...}
lowReflection uses raw <span> children for letters but the brief asked for the reflection to duplicate the top-face MONOLITH with the same per-letter class; the reflection here has no .letter class on its spans, so any reflection-only styling (e.g. background-clip on individual letters) would not apply<div class="reflection..."...><span>M</span><span>O</span>... — no class='letter' on these spans
lowMobile menu panel has top:calc(var(--header-y) + var(--header-h) + 14px) but the brief only requires it to be 'a dark glass sheet' — position is implementation detail; however the panel lacks an explicit max-height and could overflow the viewport on small phones with long content.mobile-menu-panel{position:fixed;z-index:80;left:0;right:0;top:calc(var(--header-y) + var(--header-h) + 14px);...}
lowScreenshot shows the wordmark with visible staircase extrusion, top-face gradient, and faint reflection — composition matches the brief; chip and footer render correctly. The specular sweep is not visible in the static screenshot but the element is present in DOM1024x640 screenshot inspection: chip 'VARIABLE TYPE SYSTEMS / 2026' present, extruded MONOLITH with metallic top face, f

Nebula — nebula

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 21,422

Composition, copy, tokens, motion choreography and responsive table are implemented faithfully and the page reads as a polished serif-driven observatory hero — but the cumulative canvas-plus-CSS scrim stack crushes the nebula's chromatic target, leaving the backdrop looking flat and the star field under-served. The two-rAF fallback is also structurally off-spec because the loop is started unconditionally outside the fallback path.

Requirements confirmed met

  • Document title 'NEBULA — Deep Space Observatory' set
  • lang='en' and viewport meta present
  • Single h1 with 'NEBULA<br><span>IN THE DARK</span>' markup
  • Semantic header/nav/main/footer landmarks
  • Full token table implemented exactly as specified
  • Five cloud layers with correct octaves, base frequencies, amplitude, and palette arrays
  • 240 stars split into 72/112/56 depth groups with seeded properties
  • OffscreenCanvas with detached fallback for cloud generation
  • Layered canvas draw order: bg fill → 5 clouds → stars → scrim → inner border
  • Cloud drift periods 74/91/113/137/157 s with translation ≤18px/12px and scale 1.00–1.025
  • Star drift periods 62s/88s/131s with twinkle periods 3.8s/5.1s/7.4s
  • Telemetry object with ready, frames, effects, errors populated
  • Effects pushed as 'precomputed-nebula', 'depth-stars', 'camera-drift'
  • nebulaFade/nebulaRise keyframes with exact durations and delays (80/180/300/420/460/620/700 ms)
  • Exact copy: 'DEEP SPACE OBSERVATORY / 01', lede, footer strings
  • Primary/secondary anchor hover states match brief gradients and shadows
  • Responsive breakpoints at 900px, 560px, 720px height, 600px height implemented
  • prefers-reduced-motion block sets opacity:1!important and disables animations
  • Visible :focus-visible outline 3px var(--accent-bright) with 4px offset

Requirements not met

  • Nebula visual target is very dim in the rendered output — violet core, cyan lower-left fringe, and warm rose right fringe are barely perceptible against the dark background
  • Stars appear sparse in the screenshot relative to the stated 'crisp white-violet stars' target, partially obscured by stacked scrim layers
  • Two-rAF fallback is non-strict: the rAF loop is started immediately at the end of the script AND a separate double-rAF fallback exists, rather than the loop starting only inside the fallback as the brief specifies

Issues raised

SeverityIssueEvidence
mediumRendered nebula is washed out — the specified violet core, cyan fringe and rose fringe are visually faintScreenshot shows a near-monochrome dark indigo background with only a faint violet haze at the top; no discernible cyan
mediumCSS scrim stack (vignette + readability-scrim + content-scrim-accent) is layered on top of the canvas-drawn scrim, compounding darkening and further suppressing nebula contrast.backdrop-vignette, .readability-scrim, .content-scrim-accent all use rgba(3,4,12,*) stops combined with the JS canvas s
lowrAF loop is unconditionally scheduled outside the two-rAF fallback, breaking the brief's prescribed flow where the loop starts inside the fallback when frames==0Final lines: if (!reduced) raf = requestAnimationFrame(loop); runs alongside the nested double-rAF block that also con
mediumStar count visible in the rendered frame is sparse and lacks the 'crisp white-violet' punch the brief calls forScreenshot shows roughly a dozen discernible stars across 1024x640; near-group 4px drift is overshadowed by darkening la
lowRedundant animation: none; declaration in :hover rules.button-primary:hover and .button-secondary:hover both set animation: none; despite no animation being applied to begi

Prism — prism

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 12,642

The rendered page broadly resembles the requested PRISM landing page, but several exact implementation requirements were ignored. The biggest failures are the illegal per-frame canvas repainting, the shortened incoming beam, and structural deviations from the specified SVG and animation behavior.

Requirements confirmed met

  • The page renders as a single cinematic landing page with copy on the left and the prism/spectrum scene to the right.
  • The visible copy matches the requested PRISM text and is not placeholder filler.
  • The header, navigation, hero copy, CTA, and footer are visually present in the expected locations.
  • The scene uses procedural canvas/CSS/SVG visuals rather than image media.
  • The screenshot shows no obvious horizontal overflow or clipped primary content at 1024x640.

Requirements not met

  • The incoming beam is visually a short stub near the prism, not a thin white beam entering from the left as described.
  • The exact canvas technique is not followed: the canvas is modified every animation frame despite the brief requiring draw exactly once per size and never per frame.
  • The exact required JS was not inserted; extra live canvas mutation variables and per-frame fillRect logic were added.
  • The SVG prism structure does not match the brief: the specular polyline is placed in a separate svg.specular-svg instead of the specified polyline.specular over the prism structure.
  • The fanOut animation ends all wedges at opacity 0.88, overriding the seven distinct wedge opacity tokens after animation.
  • The beam width token is effectively ignored by clamping it to calc(var(--prism-w) + 24px), producing a much shorter beam than the specified --beam-w behavior.
  • Footer contents are wrapped in div elements rather than being the specified left and right text nodes.
  • The body::after vignette is assigned z-index:1, competing with the bg-drift layer instead of being cleanly represented as the described backdrop vignette layer.

Issues raised

SeverityIssueEvidence
mediumIncoming beam is mis-sized and visually fails the requested left-entry beam.CSS: .beam { left: 0; width: min(var(--beam-w), calc(var(--prism-w) + 24px)); } Screenshot shows only a short white line
highCanvas is repainted inside the hot rAF loop, directly violating the static grain requirement.JS loop contains liveContext.fillRect(liveSeed % liveWidth, (liveSeed >>> 8) % liveHeight, 2, 2); Brief required: Draw e
highGenerated script is not the exact requested script.Generated JS adds liveContext/liveWidth/liveHeight/liveSeed state and per-frame canvas writes not present in the specifi
mediumSpecular edge implementation does not match the requested SVG structure.Generated HTML uses <svg class="specular-svg"> containing <polyline class="specular"> after a separate <svg class="prism
mediumWedge opacity tokens are defeated by the animation final state.@keyframes fanOut { ... to { opacity:0.88; ... } } applies to all seven wedges with animation-fill-mode: both, overridin
lowThe spectrum reads as blurred colored rays rather than seven crisp dispersion wedges.Screenshot shows soft horizontal/diagonal blurred bands; CSS uses thin divs with height var(--wedge-h) and blur filters,
lowLayer stack is not implemented exactly for the vignette/backdrop.body::after has z-index: 1 while .bg-drift also has z-index: 1; the brief separately specified #grain at z-index 0 and b
lowFooter markup does not match the requested text-node structure.Generated footer contains <div>© 2025 PRISM Optics. All rights reserved.</div> and <div>Precision · Dispersion · Clarity

Signal Room — signal-room

Verdict: partial · confidence: high · aesthetic score: 8/10 · tokens: 27,457

Faithful, near-complete implementation that satisfies the cinematic-room composition, responsive token table, telemetry contract, motion choreography, and accessibility rules, with only minor cosmetic deviations (shorter brand SVG stroke heights and a slightly off-canvas reflection opacity). Composition reads as premium with a well-centered hero panel, glass buttons, subtle volumetric ambience, and visible audio bars — minor shortcoming, not refuted.

Requirements confirmed met

  • Document title 'Signal Room — Audio AI for Live Work' and lang=en
  • Single file ~25KB, well under 90KB
  • All :root tokens defined per brief
  • First CSS rule is html,body background guard; body has inline background
  • Backdrop layer stack with correct z-indices (0,1,2,3,4,5,6,8)
  • Four light shafts with exact positions, widths, transforms, gradients, animations and durations
  • Rear-haze, floor-glow with breathing animation, room-lines perspective grid, SVG grain
  • Canvas#audio-bars with 64/52/44 bars at correct breakpoints
  • Bar sine formula, envelope, laneBoost, clamp(0.10,0.96) match spec
  • Bar gradient stops rgba(210,250,255,0.94)/(119,232,255,0.70)/(61,102,190,0.24) at 0/42/100%
  • DPR 1.75 desktop / 1.5 mobile; setTransform and resize via single queued rAF
  • Telemetry hook window.__DEMO__ with name 'signal-room', ready/frames/effects/errors
  • Effects array pushed in exact order: volumetric-light-shafts, floor-glow, audio-bars-canvas, grain-texture, mobile-menu
  • Window error listener pushes to errors array
  • Stagger table delays exactly match spec (0.06, 0.14, 0.20, 0.26, 0.32, 0.34, 0.48, 0.55, 0.62, 0.69, 0.76, 0.83, 1.00, 1.14, 1.22, 1.30, 1.40, 1.50)
  • One h1 'Hear the work before it slips.' wrapped in word spans
  • Lead paragraph copy is verbatim from brief
  • Chip 'REAL-TIME AUDIO AI', primary 'Start with Signal', ghost 'View security model'
  • Header CTA 'Hear a demo' as anchor pill
  • Three footer metrics with correct span/text content
  • Real header/nav/main/footer landmarks
  • Mobile burger with aria-label, aria-expanded, aria-controls, three 16px bars
  • Mobile panel with three nav links plus CTA, aria-hidden toggling, Escape closes
  • Glass-signal pill/button treatment with 112deg glint, hover translateY -1px
  • Primary button gradient #d2faff→#77e8ff→#76a8ff and hover variant
  • Focus-visible outlines var(--focus-w) solid var(--focus)
  • ::selection background rgba(119,232,255,0.30)
  • All eight responsive breakpoints (1600, 1920, 1280-1599, 901-1279, <=900, <=560, height<=850, height<=720)
  • Two-rAF animation fallback that adds .is-in when getAnimations missing or all finished
  • Reduced motion CSS disables animation and freezes shaft base transforms
  • Reduced motion JS draws one static frame at t=2.4 then stops
  • Footer bottom scrim above bars

Requirements not met

  • SVG brand mark signal stroke heights: actual 4, 10, 6 instead of spec 6, 12, 8
  • Reflection color is rgba(119,232,255,0.12) with globalAlpha 0.46 (effective ~0.055) instead of spec rgba(119,232,255,0.06) directly

Issues raised

SeverityIssueEvidence
lowBrand SVG signal strokes are shorter than spec — actual path lengths 4, 10, 6 vs required 6, 12, 8<path d="M7 13V9M11 16V6M15 14V8" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
lowReflection fill uses rgba(119,232,255,0.12) plus globalAlpha 0.46 (effective ≈0.055) instead of direct rgba(119,232,255,0.06)glowCtx.globalAlpha=.46;glowCtx.fillStyle="rgba(119,232,255,0.12)";
lowVolumetric light shafts render subtly in the viewport at 1024x640 even though CSS opacity values match the briefVisual inspection of screenshot — shafts are perceptible but understated
lowhero-actions has no explicit width:100% on mobile, so buttons rely on flex-wrap without container widthCSS only sets display:flex; gap:12px; flex-wrap:wrap; justify-content:center

Slipstream — slipstream

Verdict: unparsed · confidence: low · aesthetic score: —/10 · tokens: 0

Smolder — smolder

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 13,583

The page hits the general mood and restraint, but the desktop composition misses the main spatial requirement: the paragraph intrudes too far into the right side instead of preserving an empty half-frame. Under the hood, the scroll technique also does not match the brief's exact method, so this is not a faithful implementation.

Requirements confirmed met

  • Single-screen editorial composition with warm-black gradient backdrop
  • Exact hero copy and eyebrow copy are present
  • Exactly one h1 used as the paragraph
  • Bottom navigation line is fixed to the viewport bottom
  • No extra sections, cards, images, or decorative media were added
  • Typography generally follows the requested serif/sans split
  • Footer nav uses the requested link text and helper label

Requirements not met

  • Hero does not leave the right half empty at desktop size
  • Scroll-mapping technique does not match the brief's exact implementation
  • Cached paragraph position is not actually used for progress calculation
  • Paragraph rect is read outside the rAF loop on scroll events
  • Reduced-motion behavior conflicts with the brief's stated static readable state
  • Load animation is triggered via :has() on the body instead of a direct JS-added class approach described in the brief

Issues raised

SeverityIssueEvidence
highHero paragraph occupies too much horizontal space; the right half is not kept emptyIn the 1024x640 screenshot the two-line paragraph stretches far into the right side, leaving only a narrow empty strip.
mediumOpening paragraph is rendered extremely dim in the captured compositionThe screenshot shows the h1 nearly disappearing into the background at top-of-page. While the base words begin at 0.14 o
highScroll progress is not calculated from window.scrollY and cached paragraph travel range as specifiedJS uses const progress = clamp((viewportHeight * 0.34 - rect.top) / cachedTravel, 0, 1); and never uses cachedTop af
mediumParagraph rect is read outside the animation frame loop on scrollThe brief required the paragraph document position to be cached at startup and on resize, with one live container rect r
mediumReduced-motion implementation contradicts the requested static readable stateThe CSS says .base-word { opacity: 1 !important; }, but the JS still runs and writes per-word opacities because `updat
lowEntrance animation wiring does not follow the stated failure-guard patternThe brief said to apply entrance animation 'through a class added by JavaScript'; this build instead relies on `body:has

Solstice — solstice

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 22,352

The page captures the requested visual language and most visible copy, but multiple named rendering techniques and semantic composition requirements are only approximated. The supplied screenshot is polished enough to pass as a landing page, yet the oversized card and simplified glow/reflection system prevent it from being a faithful implementation.

Requirements confirmed met

  • Rendered desktop composition has the requested left hero copy, CTA row, right telemetry card, atmospheric backdrop, horizon, and footer rail
  • Visible copy matches the specified SOLSTICE brief, including the lede, CTA labels, telemetry values, footer metadata, and availability pill
  • The screenshot shows the intended dawn palette, star field, sun arc marker, horizon line, and glass instrument-card treatment
  • The generated environment contains 24 stars, 9 clouds, a horizon SVG, particle canvas, solar-system elements, vignette, and grain layer
  • The solar cycle, clock, phase thresholds, and sun trajectory are substantially implemented
  • Named entry keyframes enter-up, enter-right, reveal-card, and drift-cloud are present
  • Responsive rules for tablet, mobile, and short desktop viewports are present

Requirements not met

  • The hero copy, telemetry cluster, primary actions, and status rail are not implemented as semantic section elements; they are divs or a nav
  • The required desktop header nav gap is 8px, but the default CSS uses 24px
  • The upper glow is not the required blurred absolutely positioned ellipse; .solar-glow is a full-viewport element with no blur filter or ellipse geometry
  • The upper glow color is always emitted with alpha 0.98 instead of interpolating dawn 0.88, noon 0.98, and dusk 0.82
  • The sun reflection is a CSS ellipse with box-shadow, not a canvas reflection composed from three concentric translucent ellipses with the specified blur representation
  • The canvas backing resolution uses devicePixelRatio clamped from 1 to 2 rather than always sizing from cssWidth*2 and cssHeight*2 as required for smaller viewports
  • paletteAt returns the reflection color as a CSS string instead of retaining the required RGB channel array representation
  • The runtime performs additional per-frame root custom-property writes for --sun-x and --glow-x, and transforms three solar elements rather than adhering to the specified write budget
  • The responsive short-height overrides do not implement the required internal scrolling guard when hero content exceeds 600px
  • The status rail is a nav rather than the requested semantic status-rail section
  • The visible 1024x640 composition has no GRID ONLINE status pill because the implementation hides it for all 901–1100px widths, although the screenshot viewport is otherwise desktop-like

Issues raised

SeverityIssueEvidence
highThe atmospheric glow implementation is visibly and structurally wrong: the screenshot shows a broad diffuse wash, while the brief requires a distinct 70px-equivalent blurred ellipse centered at the sun.The runtime sets .solar-glow to width:100vw and height:100vh, but never sets filter:blur(38px), border-radius:50%, or el
highThe reflection technique does not match the brief.The code creates one .sun-reflection div with background:currentColor and box-shadow; no canvas reflection or three conc
mediumAt the supplied 1024x640 screenshot, the telemetry card is oversized and visually dominates the right side, with its bottom nearly colliding with the footer region.The card occupies approximately x=672–981 and y=101–540 in the screenshot; the short-height rule increases telemetry row
mediumThe screenshot's footer and horizon are visually crowded: the horizon crosses directly through the CTA/card region and the footer begins only about 140px below it.At 1024x640, the hard horizon is around y=439 while the footer border is around y=580, leaving a shallow lower field and
lowThe implementation looks like a competent generic AI landing page rather than a fully resolved cinematic system because several required atmospheric details are approximated with simple CSS defaults.The sun uses simple white box-shadow styling, the reflection is a single div, and the glow is a full-screen radial backg

Tally — tally

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 20,839

The page gets the broad Northlight departure-board composition right, but several of the brief’s defining canvas and motion techniques are not implemented exactly. The screenshot is usable, but the hero is poorly separated from the brightest canvas cluster and the short-height layout feels cramped.

Requirements confirmed met

  • Desktop composition uses the required fixed header, fixed hero, fixed footer, full-bleed canvas, veil, and event line stack.
  • The visible copy is specific to Northlight and mostly matches the required wording.
  • The header sailing table is present at the top right with the required rows and amber final status.
  • The hero column contains the required eyebrow, h1, paragraph, two actions, and harbour signal row.
  • The footer metadata rail is thin and anchored to the bottom rather than rendered as a card.
  • The screenshot shows the intended monochrome/mint/amber harbour-display visual language rather than generic stock imagery.

Requirements not met

  • At 1024×640 the hero copy is laid directly over a very bright mint dot cluster, reducing legibility and undermining the requested cinematic departure-display composition.
  • The canvas bloom pass is not implemented as the specified direct second full-lattice pass on the main context; it draws bloom circles to an offscreen canvas and then blurs the drawn image.
  • The bloom alpha calculation is wrong for lit mint dots: it uses rowAlpha * waveEase * 0.34 instead of multiplying the dot’s live alpha by exactly 0.34.
  • The generated canvas loop does not reset ctx.filter to "none" before the first pass each frame, contrary to the exact script/technique requirement.
  • The load wipe does not implement the specified row visibility rule and 10-unit feather; it uses a simple per-row alpha clamp based on revealY - row.
  • The CSS keyframe amber-column uses a 50% midpoint fade, not the requested opacity 0 to 1 to 0 over 1200ms with steps timing as a hard event pulse.
  • The status row is visually too close to the footer rail at the tested short desktop height, making the lower-left composition cramped.
  • Several sizes, colours, and timings are introduced as additional custom properties beyond the required token table rather than using only the specified design tokens.

Issues raised

SeverityIssueEvidence
mediumHero title and paragraph sit on top of a high-intensity mint canvas blob in the screenshot, so the main message is visually contaminated by the backdrop instead of reading cleanly.Screenshot at 1024×640 shows the large mint dot mass directly behind “Know when / the water / opens.” and the paragraph.
highCanvas bloom technique deviates from the brief: the second pass is rendered into bloomCanvas and composited with drawImage, not drawn as the required second full-lattice pass with blurred arcs on the main context.Script creates const bloomCanvas = document.createElement("canvas") and draws bloom arcs with bloomCtx, then calls `
highBloom alpha is not the required live dot alpha multiplied by 0.34.Script sets bloomAlphas[i] = rowAlpha * waveEase * 0.34; instead of using `(0.52 + 0.48 * energy) * waveEase * rowAlph
mediumFirst canvas pass does not explicitly reset ctx.filter to none each frame before drawing the lattice.In drawFrame, before the first pass it sets ctx.globalCompositeOperation, ctx.globalAlpha, and ctx.fillStyle, bu
mediumLoad wipe row activation is simplified and does not match the specified feathered reveal boundary.Script computes rowAlphas[y] from revealY - y; the brief required each row visible when revealY is at least row-1 wi
mediumAmber event line keyframe is not a hard steps pulse as specified.@keyframes amber-column uses 0%, 50%, and 100%; the animation rule uses steps(1,end), but the midpoint is not
lowFooter/status area is cramped in the actual 1024×640 rendering.Screenshot shows the harbour signal row only just above the footer border, with the lower composition compressed.

Tessellate — tessellate

Verdict: partial · confidence: medium · aesthetic score: 7/10 · tokens: 9,860

Code is a faithful, nearly byte-exact implementation of the brief's structure, tokens, keyframes, breakpoints, and JS telemetry; the only concrete deviation is the triangle pattern alpha assignment. The screenshot could not be inspected, so the rendered composition itself remains unverified.

Requirements confirmed met

  • Document title, lang='en', viewport meta correct
  • Token table fully declared in :root with all required variables
  • Backdrop SVG with 3 patterns (#pat-tri, #pat-hex, #pat-herr), mask with exactly 6 shapes (2 polygon, 2 path, 1 circle, 1 rect), 3 cross-fading rects in masked group
  • viewBox 0 0 1440 900 with preserveAspectRatio xMidYMid slice; no blur anywhere
  • Layer stack z-indexes 0/1/2/3/10 as specified
  • Header/nav links Work/Studio/Contact with text accessible names
  • Hero copy exact: h1 'TESSELLATE', subtitle sentence, readout span
  • Footer left '© 2024 Tessellate Studio' mono 0.7rem, right .pill button 'Pause Motion'
  • All fadeUp delays 0.2/0.4/0.6/0.8s with fill-mode both
  • Named keyframes match brief exactly (maskRotate, maskScale, crossFadeTri/Hex/Herr, fadeUp)
  • All 4 responsive breakpoint blocks present with correct token overrides
  • prefers-reduced-motion block matches brief (rect-hex/herr hidden, rect-tri opacity 1, static mask transform)
  • JS telemetry hook byte-for-byte faithful to section J
  • Google Fonts preconnect + Space Grotesk 700 / JetBrains Mono 400 with fallback stacks

Requirements not met

  • Pattern fill alphas deviate: brief requires triangle paths filled rgba(192,132,252,0.15) AND rgba(192,132,252,0.05); implementation uses fill 0.05 with 0.15 only as stroke color
  • Screenshot could not be inspected — rendered composition unverifiable

Issues raised

SeverityIssueEvidence
mediumCannot evaluate rendered composition: screenshot not viewable in this environment; no image-based issues could be confirmed or ruled outSystem reminder: the current model does not support images
lowTriangle pattern fills do not use the two specified flat-alpha fills (0.15 and 0.05); 0.15 is applied as stroke instead of fill#pat-tri: fill="rgba(192,132,252,0.05)" stroke="rgba(192,132,252,0.15)"
lowHeader uses justify-content: space-between but contains only the nav, so the brief's space-between behavior is inert (no left-side element); screenshot may show nav oddly left-anchored against an empty right sideheader { justify-content: space-between; } with only <nav> as child

Thermal — thermal

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 22,940

Most of the page composition is on-brief and the copy is specific, not filler. The major acceptance failure is the hottest-cell instrumentation: the marker and HUD do not agree with the actual rendered heat field in the screenshot.

Requirements confirmed met

  • Single-frame desktop composition with full-bleed procedural heat canvas
  • Required header / hero / footer structure is present in the rendered composition
  • Brand mark, four-item nav, and header ghost CTA match the briefed content
  • Hero copy matches the specified Thermal messaging and formatting
  • HUD panel includes hottest-cell label, live value, stats, legend strip, and sampling footer
  • Footer contains the specified copyright, centre status line, and exactly three links
  • Color language broadly matches the requested cool-edge / violet / magenta / white-hot ramp
  • Grid hairlines and heavier periodic guides are visibly present over the heat field
  • Industrial mono/sans pairing and chip-style buttons are implemented

Requirements not met

  • Visible hottest-cell marker does not appear to identify the actual hottest visible cell
  • Crosshair/hotspot effect is visually weak and reads as detached from the heat maxima
  • The screenshoted HUD temperature conflicts with the brightest visible heat core

Issues raised

SeverityIssueEvidence
highHottest-cell crosshair appears on the wrong locationHUD reads "R25 · C46 · 620°C", and the visible pink crosshair sits near the lower-right hotspot, while the brightest whi
highReadout-to-image mismatch makes the instrument HUD look untrustworthyThe panel claims a max of 620°C at the lower-right region, but that region is not rendered as the hottest area; the cent
mediumHotspot marker is too inconspicuous relative to the briefed cinematic instrument markerIn the screenshot the marker reduces to a small plus and does not clearly read as a crosshair with pulsing ring on the a

Undertow — undertow

Verdict: partial · confidence: high · aesthetic score: 6/10 · tokens: 19,769

The copy block and general dark premium styling are in place, but the page misses the main visual requirement: there is no convincing off-centre drain or readable teal vortex anchoring the composition. It looks competent but generic, and several exact motion and particle implementation requirements were not followed.

Requirements confirmed met

  • single-viewport dark editorial landing page structure is present
  • left-aligned hero block occupies the calmer left side of the viewport
  • header uses restrained navigation with wordmark left, nav centered, CTA right
  • hero copy matches the specified headline and paragraph text
  • proof strip exists with the three requested claims
  • canvas, grain, vignette, and dark gradient backdrop layers are present
  • overall palette stays near-black with teal accents
  • footer is minimal and visually subdued

Requirements not met

  • visual centre is not a clearly legible off-centre black drain at 66% / 51%
  • teal particle acceleration around the drain is not visibly established in the rendered composition
  • left-side footer alignment does not match the required inset padding
  • exact footer layout from the brief is not honored in CSS
  • the required exact JavaScript implementation was not used
  • responsive particle-count table is not fully implemented
  • several motion and particle-behavior details differ from the brief

Issues raised

SeverityIssueEvidence
highThe central drain, which was supposed to be the visual centrepiece, is effectively missing in the rendered image.Brief: “The visual centre ... is an off-centre black drain at 66% horizontal and 51% vertical, surrounded by teal partic
highThe vortex field does not read as an approximately 900-particle cinematic swirl concentrated around the drain.Screenshot shows sparse, barely perceptible speckling rather than a readable vortex with teal acceleration. The intended
mediumFooter horizontal placement is wrong; the left edge is flush to the viewport instead of padded to page inset.CSS uses .site-footer { inset: auto var(--page-pad-x) 28px 0; } while the brief required `inset:auto var(--page-pad-x)
mediumThe exact JS contract in the design brief was not followed; the generated script materially changes the particle implementation.Brief said “Use this exact script at the end of body.” Actual script changes getContext options, changes `glowCtx.setT
mediumResponsive particle counts do not match the brief’s override table.Script uses only 420 / 580 / 720 / 900. Brief additionally required 760 at min-width:901px and max-height:820px an
mediumThe glow canvas scaling implementation does not match the requested technique.Brief required the offscreen canvas to use a 0.5 scale multiplier relative to visible backing dimensions and the provide
lowThe footer center operational-status treatment is visually weak and not centered as a distinct middle element in the screenshot.Brief required a three-column footer with the center as a 6px teal status dot. In the screenshot the middle area reads a
mediumThe page reads more like a generic dark SaaS hero than the specified cinematic product statement built around a drain/vortex phenomenon.The screenshot is dominated by a standard left-copy/right-empty composition. The unique centerpiece—the off-centre drain

Upslope — upslope

Verdict: partial · confidence: high · aesthetic score: 7/10 · tokens: 27,586

The page nails the cinematic single-slide composition, copy, tokens, animation choreography, telemetry, responsive tables, and reduced-motion fallback. The two real defects are visibility failures: the y-axis title and Q1 '24 label both sit inside the chart-stage's left bleed zone (left:-5vw) and are clipped off-screen on desktop, leaving the y-axis unlabelled and the x-axis starting at Q2 '24 in the rendered output.

Requirements confirmed met

  • Document title is 'Moraine — Upslope' and lang='en' set
  • Exactly one h1 with exact required copy
  • header/main/footer landmarks present with correct contents
  • Three radial gradients and one linear wash on .slide-backdrop with exact rgba values
  • 14 dust points at exact x/y coordinates with correct colors and 2x2px sizing
  • Vertical rail at 5vw with 20% white opacity from header to bottom
  • SVG viewBox 0 0 1200 620 with preserveAspectRatio none and overflow visible
  • Chart-stage positioned at left:-5vw, width:110vw, top:38vh, height:62vh
  • Initial cubic path matches the brief verbatim
  • Area fill gradient matches: #5B2BD9 0% 0.22 / #8D4DE4 48% 0.11 / #FF6FB5 100% 0
  • Visible path 4px stroke with horizontal indigo-to-pink gradient
  • Ghost path 24px stroke at rgba(255,255,255,0.09)
  • Marker halo 100x100, center dot 10x10 with blue gradient
  • 8 x-axis ticks at x=0,150,300,450,600,750,900,1050 with correct Q1'24-Q4'25 labels
  • Crosshair 2px vertical 40px tick from marker center
  • Hero copy: eyebrow, h1, deck, meta with exact copy and spacing
  • Footer copy exact: 'MORAINE / A VENTURE-RESEARCH HOUSE' and 'ONE CURVE AT A TIME'
  • Inquiry link 'Request the full note' with underline and focus ring
  • CSS custom properties on :root match token table exactly
  • Two-rAF fallback before entrance timeline
  • Telemetry hook window.__DEMO__ with name 'upslope', frames, effects, errors
  • Error listener pushes to errors array
  • prefers-reduced-motion forces opacity:1, animation-duration:1ms
  • Responsive breakpoints at 390/768/901/1440/1920px and height overrides at 600/700px
  • Hover redraw handler changes path data, label text, marker/crosshair origins once

Requirements not met

  • Y-axis title 'MARKET VALUE / USD' is positioned at SVG x=34 but the chart-stage is offset left:-5vw, mapping x=34 to approximately viewport x=-19px at 1024px width — the text is rendered fully off-screen on the left
  • Q1 '24 tick label at SVG x=0 with text-anchor:middle is positioned at viewport x=-5vw (approx -51px at 1024px width), so it is clipped off the left edge of the viewport — screenshot shows Q2 '24 as the leftmost visible label
  • Marker caption color is #A6AAB5 rather than the palette --muted #8A8F9C used elsewhere; minor inconsistency

Issues raised

SeverityIssueEvidence
mediumY-axis title rendered off-screen left due to chart-stage left:-5vw offset conflicting with x=34 position<text x="34" y="250" transform="rotate(-90 34 250)">MARKET VALUE / USD</text> inside SVG with .chart-stage { left: -5vw;
mediumQ1 '24 tick label clipped off left viewport edge; screenshot confirms Q2 '24 is leftmost<text class="axis-label" x="0" y="548" text-anchor="middle">Q1 '24</text> — at chart-stage left:-5vw the center of this
lowrAF loop performs far more than 2 style writes per frame (2 dashoffsets + area + 8 ticks×2 + marker×2 + crosshair×2 = ~20 writes once elapsed passes 1600ms), contradicting the 'no more than 2 style writes per frame' budgetanimate() body sets ghost/visible/area/ticks[0..7]/marker/crosshair in a single callback
lowMarker caption uses custom fill #A6AAB5 instead of the design-system --muted #8A8F9C<text class="sector-caption" x="874" y="218" fill="#A6AAB5"

Vellum — vellum

Verdict: confirmed · confidence: high · aesthetic score: 9/10 · tokens: 29,750

A high-fidelity, character-perfect implementation of the Vellum brief: paper backdrop, hairline grid, registration marks, down-sampled canvas, oxide accent on outlives, and the bleed-mask h1 with correct per-glyph stagger all land exactly as specified. Only nitpicks are layout-density (CTA crowding the right edge, specimen mono row breaking) and the grain being nearly invisible at this size — none break the design.

Requirements confirmed met

  • Exactly one h1 with aria-label='Print that outlives us.' and two .line blocks
  • Glyphs are inline-block .ltr spans; outlives uses ltr--spot (oxide red)
  • Ink-bleed reveal via registered --bleed custom property driving radial mask-image
  • Per-glyph --ox/--oy cycling (six-origin) resetting per line
  • Stagger delays for line 1 (0.46 + i*0.034) and line 2 (0.62 + i*0.030 + 0.22 if spot) implemented exactly
  • Canvas bloom rendered at downsampled store (innerWidth*0.28 / innerHeight*0.28), no dpr, single 30px blur
  • Six blooms (4 ink, 2 oxide) with correct bx/by/r/a/P/phase/ax/ay parameters, single clearRect + 6 drawImage
  • Reduced r * min(iw,ih) size and pulsing s = s0 * (1 + 0.12*sin(t*w3))
  • Hairline grid via repeating-linear-gradients with radial mask fade
  • Four registration marks at inset:26px in each corner via 4 background-image SVGs
  • Layer stack matches: paper z0, canvas z1, rules z2, sheen z3, vign z4, page z10, grain z40
  • All token values, responsive breakpoint tables (>=1920, >=1600, 1280-1599, 901-1279, max-height 850/720, <=900, <=560)
  • Squared buttons with correct hover/active states and shadow
  • Mobile menu overlay with transform/visibility transition, backdrop-filter blur(14px)
  • Failure guards: paper-first, resting opacity 1, two-rAF entrance fallback, canvas fallback, prefers-reduced-motion reset
  • Footer with 3 meta items and 3 links exactly as specified
  • Telemetry hook with window.__DEMO__, ready, frames, effects, errors pushed in correct order
  • Mobile burger toggle, Escape key, link click, and resize all close the menu

Issues raised

SeverityIssueEvidence
lowHeader CTA 'REQUEST A PROOF' sits hard against the right edge with the box border visually touching the screenshot frameAt 1024px, --header-x reduces to 32px (901-1279 breakpoint); the long button 'Request a proof' hugs the right margin wit
lowSpecimen row 'Cotton · 600 gsm' wraps to two lines at 1024px viewportspec-sm line wraps 'Cotton · 600' then 'gsm' inside the 244px aside column — minor aesthetic break, not incorrect per sp
lowTop-right registration mark is visible bleeding through/around the header CTA button (z-index layering: marks z2 behind header z30, but the accent-wash CTA background is mostly transparent so the mark reads through)Screenshot shows a small crosshair-like shape adjacent to the right of the header CTA in the top-right corner
lowGrain overlay (--grain-op 0.11) is barely perceptible at 1024x640; relies heavily on the muted film-grain SVG working in browsersNo obvious film grain texture visible in the screenshot — likely just under-subtle, not a bug

Generated 2026-10-05T15:16:34.131Z by tools/reports.mjs. Raw data: data/crosscheck.json.