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 performed | 38 |
Verdict confirmed | 8 |
Verdict partial | 26 |
Verdict refuted | 0 |
| Cross-check tokens | 770,912 |
Reviewer assignment
| Prompt | Built by | Reviewed by | Platform |
|---|---|---|---|
| Liquid Glass Voyage | hy4-preview-f | gpt-5.5 | workbuddy |
| Scroll Atlas | MiniMaxAI/MiniMax-M3 | gpt-5.4 | workbuddy |
| Magnetic Orbit | glm-5.3 | MiniMaxAI/MiniMax-M3 | cmdcode |
| Neural Drift | kimi-k3 | glm-5.2 | workbuddy |
| Kinetic Type | gemini-3.5-flash | moonshotai/Kimi-K2.7-Code | cmdcode |
| Stack Deck | gpt-5.5 | kimi-k2.8-preview | workbuddy |
| Aurora Freight | hy4-preview-f | hy3 | workbuddy |
| Basalt | stealth/space-bunny-alpha | moonshotai/Kimi-K2.7-Code | cmdcode |
| Bracket | stealth/space-bunny-alpha | moonshotai/Kimi-K2.7-Code | cmdcode |
| Cadence | xiaomi/mimo-v2.6-pro | kimi-k2.8-preview | workbuddy |
| Camber | stealth/space-bunny-alpha | kimi-k2.8-preview | workbuddy |
| Cant | stealth/space-bunny-alpha | glm-5.2 | workbuddy |
| Carbon | stealth/space-bunny-alpha | MiniMaxAI/MiniMax-M3 | cmdcode |
| Cardinal | stealth/space-bunny-alpha | deepseek-v4.1-flash | workbuddy |
| Cascade | stealth/space-bunny-alpha | kimi-k2.8-preview | workbuddy |
| Chrome Bloom | MiniMaxAI/MiniMax-M3 | gpt-5.6-luna | workbuddy |
| Data Tide | glm-5.3 | glm-5.3-flash | workbuddy |
| Echo | xiaomi/mimo-v2.6-pro | glm-5.2 | workbuddy |
| Filament | stealth/space-bunny-alpha | glm-5.2 | workbuddy |
| Fringe | stealth/space-bunny-alpha | glm-5.3-flash | workbuddy |
| Grid Collapse | kimi-k3 | deepseek-v4.1-flash | workbuddy |
| Halide | xiaomi/mimo-v2.6-pro | gpt-5.5 | workbuddy |
| Headlight | stealth/space-bunny-alpha | MiniMaxAI/MiniMax-M3 | cmdcode |
| Interactive Discovery | hy4-preview-f | — | — |
| Lattice | xiaomi/mimo-v2.6-pro | MiniMaxAI/MiniMax-M3 | cmdcode |
| Margin | stealth/space-bunny-alpha | gpt-5.6-luna | workbuddy |
| Meridian | xiaomi/mimo-v2.6-pro | — | — |
| Monolith Type | gpt-5.5 | MiniMaxAI/MiniMax-M3 | cmdcode |
| Nebula | stealth/space-bunny-alpha | hy3 | workbuddy |
| Prism | stealth/space-bunny-alpha | gpt-5.5 | workbuddy |
| Rift | xiaomi/mimo-v2.6-pro | — | — |
| Sable | xiaomi/mimo-v2.6-pro | — | — |
| Signal Room | gpt-5.5 | hy4-preview-f | workbuddy |
| Slipstream | stealth/space-bunny-alpha | deepseek-v4.1-flash | workbuddy |
| Smolder | stealth/space-bunny-alpha | gpt-5.4 | workbuddy |
| Solstice | stealth/space-bunny-alpha | gpt-5.6-luna | workbuddy |
| Tally | stealth/space-bunny-alpha | gpt-5.5 | workbuddy |
| Tessellate | stealth/space-bunny-alpha | glm-5.3-flash | workbuddy |
| Thermal | xiaomi/mimo-v2.6-pro | gpt-5.4 | workbuddy |
| Undertow | stealth/space-bunny-alpha | gpt-5.4 | workbuddy |
| Upslope | stealth/space-bunny-alpha | hy3 | workbuddy |
| Vellum | xiaomi/mimo-v2.6-pro | hy3 | workbuddy |
| Voltage | xiaomi/mimo-v2.6-pro | — | — |
| About Brand Overview | stealth/space-bunny-alpha | — | — |
| About Countdown | stealth/space-bunny-alpha | — | — |
| About Multi Layout | stealth/space-bunny-alpha | — | — |
| About Team Overview | stealth/space-bunny-alpha | — | — |
| About us 01 Blaze | stealth/space-bunny-alpha | — | — |
| About Us 01 Kelo | stealth/space-bunny-alpha | — | — |
| About Us 01 Orbit | stealth/space-bunny-alpha | — | — |
| About Us 02 Orbit | stealth/space-bunny-alpha | — | — |
| About Us 03 Moxo | stealth/space-bunny-alpha | — | — |
| About Us 03 Orbit | stealth/space-bunny-alpha | — | — |
| About Us 04 Orbit | stealth/space-bunny-alpha | — | — |
| About Us 05 Moxo | stealth/space-bunny-alpha | — | — |
| About Us 05 Orbit | stealth/space-bunny-alpha | — | — |
| About Us 06 Orbit | stealth/space-bunny-alpha | — | — |
| About Us 07 Orbit | stealth/space-bunny-alpha | — | — |
| AI Agent Hero Kelo | stealth/space-bunny-alpha | — | — |
| AI Automation Hero Kelo | stealth/space-bunny-alpha | — | — |
| AI Budget Tracker Hero Velara | stealth/space-bunny-alpha | — | — |
| AI Budget Tracking Landing Page - Velara AI | stealth/space-bunny-alpha | — | — |
| AI Chatbot Agent Header | stealth/space-bunny-alpha | — | — |
| AI Content Generator Hero Velara | stealth/space-bunny-alpha | — | — |
| AI Customer Support Hero Kelo | stealth/space-bunny-alpha | — | — |
| AI Customer Support Landing Page - Kelo | stealth/space-bunny-alpha | — | — |
| AI Developer Solver Hero Velara | stealth/space-bunny-alpha | — | — |
| AI HR Manager Website Header | stealth/space-bunny-alpha | — | — |
| AI Image Genertion Hero kelo | stealth/space-bunny-alpha | — | — |
| AI Interior Generator Header | stealth/space-bunny-alpha | — | — |
| AI Marketing Hero Kelo | stealth/space-bunny-alpha | — | — |
| AI Marketing Landing Page - Kelo | stealth/space-bunny-alpha | — | — |
| AI Notepad Website Header | stealth/space-bunny-alpha | — | — |
| AI Notes Taker Hero Velara | stealth/space-bunny-alpha | — | — |
| AI Sales Call Analyzer Header | stealth/space-bunny-alpha | — | — |
| AI Task Management Hero Velara | stealth/space-bunny-alpha | — | — |
| AI Video Editor Hero Luma | stealth/space-bunny-alpha | — | — |
| AI video Translator Hero Luma | stealth/space-bunny-alpha | — | — |
| AI Voice Generator Header | stealth/space-bunny-alpha | — | — |
| AI Voice Platform Hero Luma | stealth/space-bunny-alpha | — | — |
| Aurora Gradient | stealth/space-bunny-alpha | — | — |
| Blog 01 Blaze | stealth/space-bunny-alpha | — | — |
| Blog 01 Orbit | stealth/space-bunny-alpha | — | — |
| Blog 01 Pixa | stealth/space-bunny-alpha | — | — |
| Blog 02 Pixa | stealth/space-bunny-alpha | — | — |
| Blogs - Luxterra | stealth/space-bunny-alpha | — | — |
| Charity Headers | stealth/space-bunny-alpha | — | — |
| Chrome Bezel 3D | stealth/space-bunny-alpha | — | — |
| Circle Reveal Button | stealth/space-bunny-alpha | — | — |
| Contact Us 01 Orbit | stealth/space-bunny-alpha | — | — |
| Contact Us 02 Orbit | stealth/space-bunny-alpha | — | — |
| CTA 01 Luma | stealth/space-bunny-alpha | — | — |
| CTA 01 Orbit | stealth/space-bunny-alpha | — | — |
| CTA 01 Velara | stealth/space-bunny-alpha | — | — |
| CTA 02 Luma | stealth/space-bunny-alpha | — | — |
| CTA 02 Orbit | stealth/space-bunny-alpha | — | — |
| CTA 03 orbit | stealth/space-bunny-alpha | — | — |
| Electric Border Button | stealth/space-bunny-alpha | — | — |
| Energy Beam Bg | stealth/space-bunny-alpha | — | — |
| FAQ 01 Kelo | stealth/space-bunny-alpha | — | — |
| FAQ 01 Luma | stealth/space-bunny-alpha | — | — |
| FAQ 01 Moxo | stealth/space-bunny-alpha | — | — |
| FAQ 01 Orbit | stealth/space-bunny-alpha | — | — |
| FAQ 01 Velara | stealth/space-bunny-alpha | — | — |
| FAQ 02 Kelo | stealth/space-bunny-alpha | — | — |
| FAQ 02 Luma | stealth/space-bunny-alpha | — | — |
| FAQ 02 Moxo | stealth/space-bunny-alpha | — | — |
| FAQ 02 Orbit | stealth/space-bunny-alpha | — | — |
| FAQ 02 Velara | stealth/space-bunny-alpha | — | — |
| FAQ 03 Kelo | stealth/space-bunny-alpha | — | — |
| FAQ 03 Luma | stealth/space-bunny-alpha | — | — |
| FAQ 03 Moxo | stealth/space-bunny-alpha | — | — |
| FAQ 03 Orbit | stealth/space-bunny-alpha | — | — |
| FAQ 03 Velara | stealth/space-bunny-alpha | — | — |
| FAQ 04 Kelo | stealth/space-bunny-alpha | — | — |
| FAQ 04 Luma | stealth/space-bunny-alpha | — | — |
| FAQ 04 Moxo | stealth/space-bunny-alpha | — | — |
| FAQ 04 Orbit | stealth/space-bunny-alpha | — | — |
| FAQ 05 Kelo | stealth/space-bunny-alpha | — | — |
| FAQ 05 Moxo | stealth/space-bunny-alpha | — | — |
| FAQ 05 Velara | stealth/space-bunny-alpha | — | — |
| FAQ 2 Column Straight | stealth/space-bunny-alpha | — | — |
| FAQ Middle Image | stealth/space-bunny-alpha | — | — |
| FAQ Middle Simple | stealth/space-bunny-alpha | — | — |
| FAQ Vendo | stealth/space-bunny-alpha | — | — |
| FAQ with Image | stealth/space-bunny-alpha | — | — |
| FAQs 01 Pixa | stealth/space-bunny-alpha | — | — |
| FAQs 01 Solra | stealth/space-bunny-alpha | — | — |
| FAQs - Luxterra | stealth/space-bunny-alpha | — | — |
| Feature 04 Solra | stealth/space-bunny-alpha | — | — |
| Feature Work Benjamen | stealth/space-bunny-alpha | — | — |
| Features 01 Halo | stealth/space-bunny-alpha | — | — |
| Features 01 Kelo | stealth/space-bunny-alpha | — | — |
| Features 01 Learn.AI | stealth/space-bunny-alpha | — | — |
| Features 01 Luma | stealth/space-bunny-alpha | — | — |
| Features 01 Moxo | stealth/space-bunny-alpha | — | — |
| Features 01 Orbit | stealth/space-bunny-alpha | — | — |
| Features 01 Velara | stealth/space-bunny-alpha | — | — |
| Features 01 Vendo | stealth/space-bunny-alpha | — | — |
| Features 02 Kelo | stealth/space-bunny-alpha | — | — |
| Features 02 Luma | stealth/space-bunny-alpha | — | — |
| Features 02 NexVPN | stealth/space-bunny-alpha | — | — |
| Features 02 Orbit | stealth/space-bunny-alpha | — | — |
| Features 02 Velara | stealth/space-bunny-alpha | — | — |
| Features 02 Vendo | stealth/space-bunny-alpha | — | — |
| Features 03 Kelo | stealth/space-bunny-alpha | — | — |
| Features 03 Luma | stealth/space-bunny-alpha | — | — |
| Features 03 Moxo | stealth/space-bunny-alpha | — | — |
| Features 03 Orbit | stealth/space-bunny-alpha | — | — |
| Features 03 Velara | stealth/space-bunny-alpha | — | — |
| Features 04 Luma | stealth/space-bunny-alpha | — | — |
| Features 04 Orbit | stealth/space-bunny-alpha | — | — |
| Features 04 Velara | stealth/space-bunny-alpha | — | — |
| Features 05 Kelo | stealth/space-bunny-alpha | — | — |
| Features 05 Luma | stealth/space-bunny-alpha | — | — |
| Features 05 Orbit | stealth/space-bunny-alpha | — | — |
| Features 05 Velara | stealth/space-bunny-alpha | — | — |
| Features 06 Luma | stealth/space-bunny-alpha | — | — |
| Features 06 Moxo | stealth/space-bunny-alpha | — | — |
| Features 06 Orbit | stealth/space-bunny-alpha | — | — |
| Features 06 Velara | stealth/space-bunny-alpha | — | — |
| Features 07 Luma | stealth/space-bunny-alpha | — | — |
| Features 07 Orbit | stealth/space-bunny-alpha | — | — |
| Features 07 Velara | stealth/space-bunny-alpha | — | — |
| Features 08 Luma | stealth/space-bunny-alpha | — | — |
| Features 08 Orbit | stealth/space-bunny-alpha | — | — |
| Features 09 Luma | stealth/space-bunny-alpha | — | — |
| Features 09 Moxo | stealth/space-bunny-alpha | — | — |
| Features 09 Orbit | stealth/space-bunny-alpha | — | — |
| Features 10 Luma | stealth/space-bunny-alpha | — | — |
| Features 10 Moxo | stealth/space-bunny-alpha | — | — |
| Features 10 Orbit | stealth/space-bunny-alpha | — | — |
| Features 11 Luma | stealth/space-bunny-alpha | — | — |
| Features 11 Orbit | stealth/space-bunny-alpha | — | — |
| Features 12 Orbit | stealth/space-bunny-alpha | — | — |
| Finance Management Landing Page - Finsyc | stealth/space-bunny-alpha | — | — |
| Fluid Gradient Engine | stealth/space-bunny-alpha | — | — |
| Footer 01 Kelo | stealth/space-bunny-alpha | — | — |
| Footer 01 Luma | stealth/space-bunny-alpha | — | — |
| Footer 01 Pixa | stealth/space-bunny-alpha | — | — |
| Footer 01 Solra | stealth/space-bunny-alpha | — | — |
| Footer 01 Velara | stealth/space-bunny-alpha | — | — |
| Footer 02 Kelo | stealth/space-bunny-alpha | — | — |
| Footer 02 Luma | stealth/space-bunny-alpha | — | — |
| Footer 02 Pixa | stealth/space-bunny-alpha | — | — |
| Footer 02 Solra | stealth/space-bunny-alpha | — | — |
| Footer 02 Velara | stealth/space-bunny-alpha | — | — |
| Footer 03 Kelo | stealth/space-bunny-alpha | — | — |
| Footer 03 Luma | stealth/space-bunny-alpha | — | — |
| Footer 03 Orbit | stealth/space-bunny-alpha | — | — |
| Footer 03 Solra | stealth/space-bunny-alpha | — | — |
| Footer 03 Velara | stealth/space-bunny-alpha | — | — |
| Footer 04 Kelo | stealth/space-bunny-alpha | — | — |
| Footer 04 Moxo | stealth/space-bunny-alpha | — | — |
| Footer 04 Orbit | stealth/space-bunny-alpha | — | — |
| Footer 04 Solra | stealth/space-bunny-alpha | — | — |
| Footer 05 Kelo | stealth/space-bunny-alpha | — | — |
| Footer 05 Moxo | stealth/space-bunny-alpha | — | — |
| Footer 05 Orbit | stealth/space-bunny-alpha | — | — |
| Footer 06 Moxo | stealth/space-bunny-alpha | — | — |
| Footer Basic | stealth/space-bunny-alpha | — | — |
| Footer - Glimpse | stealth/space-bunny-alpha | — | — |
| Footer o1 Moxo | stealth/space-bunny-alpha | — | — |
| Footer With Newsletter | stealth/space-bunny-alpha | — | — |
| Freelance Coach Hero Orbit | stealth/space-bunny-alpha | — | — |
| Glow Button | stealth/space-bunny-alpha | — | — |
| Glow Color | stealth/space-bunny-alpha | — | — |
| Header 02 Pixa | stealth/space-bunny-alpha | — | — |
| Header 02 Solra | stealth/space-bunny-alpha | — | — |
| Header 03 Pixa | stealth/space-bunny-alpha | — | — |
| Header 04 Pixa | stealth/space-bunny-alpha | — | — |
| Header 04 Solra | stealth/space-bunny-alpha | — | — |
| Hero 02 Moxo | stealth/space-bunny-alpha | — | — |
| Hero 03 Moxo | stealth/space-bunny-alpha | — | — |
| Hero 05 Moxo | stealth/space-bunny-alpha | — | — |
| How it Works 01 Halo | stealth/space-bunny-alpha | — | — |
| How it works 01 Kelo | stealth/space-bunny-alpha | — | — |
| How it Works 01 Luma | stealth/space-bunny-alpha | — | — |
| How it Works 01 Orbit | stealth/space-bunny-alpha | — | — |
| How It Works 01 Pixa | stealth/space-bunny-alpha | — | — |
| How it Works 02 Halo | stealth/space-bunny-alpha | — | — |
| How it Works 02 Kelo | stealth/space-bunny-alpha | — | — |
| How it Works 02 Luma | stealth/space-bunny-alpha | — | — |
| How It Works 02 Pixa | stealth/space-bunny-alpha | — | — |
| How it Works 03 Velara | stealth/space-bunny-alpha | — | — |
| How it Works 04 Kelo | stealth/space-bunny-alpha | — | — |
| How it works 04 Velara | stealth/space-bunny-alpha | — | — |
| How it Works 05 Halo | stealth/space-bunny-alpha | — | — |
| How it Works 05 Velara | stealth/space-bunny-alpha | — | — |
| How it works Creation.AI | stealth/space-bunny-alpha | — | — |
| How it Wroks 01 Velara | stealth/space-bunny-alpha | — | — |
| Human Synthesis Header - The World | stealth/space-bunny-alpha | — | — |
| Integration 01 Kelo | stealth/space-bunny-alpha | — | — |
| Integration 01 Luma | stealth/space-bunny-alpha | — | — |
| Integration 01 Velara | stealth/space-bunny-alpha | — | — |
| Integration 02 Kelo | stealth/space-bunny-alpha | — | — |
| Integration 02 Luma | stealth/space-bunny-alpha | — | — |
| Jelly Explore Button | stealth/space-bunny-alpha | — | — |
| Juice Ecommerce Header - Strip | stealth/space-bunny-alpha | — | — |
| Left to Right Scan | stealth/space-bunny-alpha | — | — |
| Light Beam Button | stealth/space-bunny-alpha | — | — |
| Liquid Glass | stealth/space-bunny-alpha | — | — |
| Metal Button | stealth/space-bunny-alpha | — | — |
| Mindfulness Landing Page Design - Solra | stealth/space-bunny-alpha | — | — |
| Neon Typing Button | stealth/space-bunny-alpha | — | — |
| Nutrition-Health Hero 03 Halo | stealth/space-bunny-alpha | — | — |
| Nutrition-Health Hero 04 Halo | stealth/space-bunny-alpha | — | — |
| Online AI Learning Platform Hero Orbit | stealth/space-bunny-alpha | — | — |
| Online Store Manager AI Website Header | stealth/space-bunny-alpha | — | — |
| Online Yoga Programs Landing Page - Solra | stealth/space-bunny-alpha | — | — |
| Personal Business Coach Hero Orbit | stealth/space-bunny-alpha | — | — |
| Personal Fitness Coach Hero Orbit | stealth/space-bunny-alpha | — | — |
| Pricing 01 Kelo | stealth/space-bunny-alpha | — | — |
| Pricing 01 Luma | stealth/space-bunny-alpha | — | — |
| Pricing 01 Orbit | stealth/space-bunny-alpha | — | — |
| Pricing 01 Solra | stealth/space-bunny-alpha | — | — |
| Pricing 02 Kelo | stealth/space-bunny-alpha | — | — |
| Pricing 02 Orbit | stealth/space-bunny-alpha | — | — |
| Pricing 02 Velara | stealth/space-bunny-alpha | — | — |
| Pricing 03 Kelo | stealth/space-bunny-alpha | — | — |
| Pricing 03 Luma | stealth/space-bunny-alpha | — | — |
| Pricing 03 Orbit | stealth/space-bunny-alpha | — | — |
| Pricing 03 Pixa | stealth/space-bunny-alpha | — | — |
| Pricing 03 Solra | stealth/space-bunny-alpha | — | — |
| Pricing 04 Kelo | stealth/space-bunny-alpha | — | — |
| Pricing 04 Luma | stealth/space-bunny-alpha | — | — |
| Pricing 04 Orbit | stealth/space-bunny-alpha | — | — |
| Pricing 04 Velara | stealth/space-bunny-alpha | — | — |
| Pricing 05 Kelo | stealth/space-bunny-alpha | — | — |
| Pricing 05 Luma | stealth/space-bunny-alpha | — | — |
| Pricing 05 Solra | stealth/space-bunny-alpha | — | — |
| Pricing 05 Velara | stealth/space-bunny-alpha | — | — |
| Pricing 06 Kelo | stealth/space-bunny-alpha | — | — |
| Pricing 3 Card Long | stealth/space-bunny-alpha | — | — |
| Spot Fill Button | stealth/space-bunny-alpha | — | — |
| Stacked Card | stealth/space-bunny-alpha | — | — |
| Stats and Metrics 01 Luma | stealth/space-bunny-alpha | — | — |
| Stats & Metrics 01 Halo | stealth/space-bunny-alpha | — | — |
| Stats & Metrics 01 kelo | stealth/space-bunny-alpha | — | — |
| Stats Metrics 01 Pixa | stealth/space-bunny-alpha | — | — |
| Stats & Metrics 02 Halo | stealth/space-bunny-alpha | — | — |
| Stats & Metrics 02 Kelo | stealth/space-bunny-alpha | — | — |
| Stats & Metrics 02 Moxo | stealth/space-bunny-alpha | — | — |
| Stats Metrics 02 Pixa | stealth/space-bunny-alpha | — | — |
| Stats & Metrics 04 Moxo | stealth/space-bunny-alpha | — | — |
| Stats & Metrics 05 Moxo | stealth/space-bunny-alpha | — | — |
| Stats & Metrics o1 Moxo | stealth/space-bunny-alpha | — | — |
| Stats & Metrics Vendo | stealth/space-bunny-alpha | — | — |
| Swap Button | stealth/space-bunny-alpha | — | — |
| Swiss-style Card | stealth/space-bunny-alpha | — | — |
| Team 02 Pixa | stealth/space-bunny-alpha | — | — |
| Team 02 Solra | stealth/space-bunny-alpha | — | — |
| Team 03 Pixa | stealth/space-bunny-alpha | — | — |
| Team 03 Solra | stealth/space-bunny-alpha | — | — |
| Team Showcase | stealth/space-bunny-alpha | — | — |
| Team Talent | stealth/space-bunny-alpha | — | — |
| Testimonial 01 Blaze | stealth/space-bunny-alpha | — | — |
| Testimonial 01 Kelo | stealth/space-bunny-alpha | — | — |
| Testimonial 01 Luma | stealth/space-bunny-alpha | — | — |
| Testimonial 01 Orbit | stealth/space-bunny-alpha | — | — |
| Testimonial 01 Velara | stealth/space-bunny-alpha | — | — |
| Testimonial 02 Blaze | stealth/space-bunny-alpha | — | — |
| Testimonial 02 Halo | stealth/space-bunny-alpha | — | — |
| Testimonial 02 Kelo | stealth/space-bunny-alpha | — | — |
| Testimonial 02 Luma | stealth/space-bunny-alpha | — | — |
| Testimonial 02 Orbit | stealth/space-bunny-alpha | — | — |
| Testimonial 02 Pixa | stealth/space-bunny-alpha | — | — |
| Testimonial 02 Velara | stealth/space-bunny-alpha | — | — |
| Testimonial 03 Luma | stealth/space-bunny-alpha | — | — |
| Testimonial 03 Moxo | stealth/space-bunny-alpha | — | — |
| Testimonial 03 Orbit | stealth/space-bunny-alpha | — | — |
| Testimonial 03 Velara | stealth/space-bunny-alpha | — | — |
| Testimonial 04 Halo | stealth/space-bunny-alpha | — | — |
| Testimonial 04 Luma | stealth/space-bunny-alpha | — | — |
| Testimonial 04 Orbit | stealth/space-bunny-alpha | — | — |
| Testimonial 04 Velara | stealth/space-bunny-alpha | — | — |
| Testimonial 05 Luma | stealth/space-bunny-alpha | — | — |
| Testimonial Masonry | stealth/space-bunny-alpha | — | — |
| Testimonial Modern | stealth/space-bunny-alpha | — | — |
| Testimonial Video | stealth/space-bunny-alpha | — | — |
| Testimonials 01 Solra | stealth/space-bunny-alpha | — | — |
| Testimonials 02 Solra | stealth/space-bunny-alpha | — | — |
| Text to Video Generator Hero | stealth/space-bunny-alpha | — | — |
| Trusted Brand 2 Column | stealth/space-bunny-alpha | — | — |
| Trusted Brand Black | stealth/space-bunny-alpha | — | — |
| Trusted Brand Box | stealth/space-bunny-alpha | — | — |
| Trusted Brand | stealth/space-bunny-alpha | — | — |
| Video Generation Pricing | stealth/space-bunny-alpha | — | — |
| Why Choose us 01 Finsyc | stealth/space-bunny-alpha | — | — |
| Why Choose Us 01 Luma | stealth/space-bunny-alpha | — | — |
| Why Choose Us 01 Orbit | stealth/space-bunny-alpha | — | — |
| Why Choose Us 01 Velara | stealth/space-bunny-alpha | — | — |
| Why Choose Us 02 Luma | stealth/space-bunny-alpha | — | — |
| Why us 01 Solra | stealth/space-bunny-alpha | — | — |
| Why us 03 Solra | stealth/space-bunny-alpha | — | — |
| ZiroBuild Hero | stealth/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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Footer is missing from the rendered viewport | Screenshot at 1024x640 ends at the stat cards; the "© 2026 Abyssal Research" row and social icons are not visible. In th |
| medium | Backdrop is visually too flat for the requested film of underwater light | Screenshot shows an almost uniform dark teal background with no discernible large cyan/blue radial light pools, warm pas |
| medium | Email capture confirmation is an abrupt content swap, not a morph/fade interaction | Submit handler uses input.style.display = 'none'; btn.style.display = 'none'; success.style.display = 'flex'; and late |
| medium | Pointer tilt behavior is coupled incorrectly | Code listens on document.addEventListener('pointermove', ...) and writes global --rotX / --rotY on `document.docum |
| low | Palette cross-fade does not satisfy the requested cancellation behavior | Fade trigger is guarded by && !fadeActive, so an active fade is never cancelled and restarted from current weights. |
| low | Specular sweep is not tied to actual hero entry | The page runs setTimeout(() => { document.body.classList.add('hero-entered'); }, 100); instead of detecting when the h |
| low | Header center navigation is only space-betweened, not truly centered | header { justify-content: space-between; } with unequal brand/action widths; in the screenshot the nav cluster sits le |
| low | Button hover scales the whole control instead of only lifting and boosting specular | button.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
| Severity | Issue | Evidence |
|---|---|---|
| high | The 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 |
| medium | Beat 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 |
| medium | Pin 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 |
| medium | Required 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 |
| low | The 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. |
| low | There 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 |
| medium | Route 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
| Severity | Issue | Evidence |
|---|---|---|
| high | Magnetic elements move AWAY from pointer instead of toward it | if (d > 0.001){ ox += (dx / d) * s * -1; oy += (dy / d) * s * -1; } — the * -1 inverts the direction. Brief C explicitly |
| low | Ring border 'thinning' on interactive hover not implemented as described | var bw = magneticHover ? 1 : (interactiveHover ? 1 : 1.5); — border is 1px on BOTH magnetic and interactive, so the 1.5→ |
| low | Custom cursor not scoped to hero only | body.fine-pointer .hero{cursor:none} applies to hero, but cursor-dot/ring are fixed positioned and visible everywhere; b |
| medium | Node tilt direction appears reversed/intuitive-fail | tiltY = (dx / m.w) * 10; tiltX = (-dy / m.h) * 10; — when pointer is to the right of node, dx>0 so tiltY is positive (ro |
| medium | Orbit 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 |
| low | Orbit-stage and hero-inner have overlapping z-index with nodes potentially rendering over text | orbit-stage z-index:4, hero-inner z-index:5, nodes absolutely positioned at left:9% top:22% etc. — at 1024x640 the node- |
| medium | Screenshot shows the page renders correctly overall but node-3 (Brand) overlaps the orange CTA button | node-3 {left:22%; bottom:20%} at 1024x640 puts the 72px node at approximately (225, 512) which visually overlaps the 'St |
| low | H1 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 |
| low | Marquee uses 'padding-right:0' and a trailing in spans; seamless wrap depends on duplicated spans being identical — fragile but works | <span>MOTION · SYSTEMS · BRAND · INTERFACES · SOUND · </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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Pulse 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 metaphor | var picked = 0; while (picked < 7) { var c = 90 + ((Math.random() * (N - 90)) | 0); ... hubs[c] = 1; } and drawNodes fi |
| low | Connection alpha formula multiplies by 1.9 for hub-hub pairs, an unrequested modification that overrides the brief's specified alpha formula | if (hubs[i] && hubs[j]) a *= 1.9; |
| low | Telemetry 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> |
| low | Reduced-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 effects | if (!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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Band 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). |
| medium | Marquee 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 |
| low | Header 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. |
| low | Footer 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>. |
| low | Hero paragraph font size is 16px, not the requested 15px. | CSS: .hero-desc { font-size: 16px; line-height: 1.7; ... }. |
| low | Split-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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Bento 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} |
| medium | No-IO fallback leaves deck invisible instead of final state | if(!('IntersectionObserver' in window)||reduce){setCountsFinal();renderDeck();...;return} — renderDeck computes p from |
| low | Brightness 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 uneven | var stacked=Math.max(0,landed-1-i), bright=1-stacked*.05 — no reset when deal>0 |
| low | Muted 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) |
| low | Card 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
| Severity | Issue | Evidence |
|---|---|---|
| low | Aurora field reads as very subdued in the 1024x640 screenshot — only a faint right-edge glow is visible | Spec deliberately caps luminance <0.78 to protect readability (B.5 note) and uses peak alphas 0.28–0.62, so this is by d |
| low | Anti-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
| Severity | Issue | Evidence |
|---|---|---|
| high | SVG 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. |
| medium | The animation loop only recomputes face fills when the sample index changes, not each frame with fractional interpolation. | render() wraps applySample() inside if (current !== lastIndex). |
| medium | The 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) { ... } |
| medium | The error catch block stops the loop but never resets face fills to cached fallback values. | catch block only pushes error.message and returns. |
| medium | The 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. |
| low | Column opacity is computed by linear row interpolation rather than the specified rear/middle/front lookup. | const opacity = .42 + (row / 8) * .50; |
| low | Haze is implemented as real <div> elements, not CSS pseudo-elements as described. | <div class="haze-far"></div><div class="haze-near"></div> |
| low | Document title has an extra trailing period compared to the brief. | <title>Basalt — Geothermal Energy From Deep Ground.</title> |
| low | Top 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; ... }); |
| low | Grain 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. |
| low | No 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
| Severity | Issue | Evidence |
|---|---|---|
| high | Row 03 bracket annotation is not visible in the rendered screenshot | No bracket overlay appears around the heading 'Leave a trail your future self can follow.', which is the only element th |
| medium | Annotation SVG contains duplicate midpoint circles | The SVG defines four corner circles plus eight r=3 midpoint-positioned circles, with the last four duplicating the coord |
| medium | Red strikethrough is vertically misplaced | syncStrike sets strikeTop = usefulBounds.height * 0.52 instead of 4 px below the h1's top. |
| medium | Red-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)) |
| low | Missing .sr-only utility layer from the z-index contract | No .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
| Severity | Issue | Evidence |
|---|---|---|
| low | Pivot sits inside the header band and the housing circle visually collides with the 'Rigs' nav link | P = (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 |
| low | Beat-dot opacity decay driven by CSS keyframes, not the JS opacity writes the brief specifies | updateBeat 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
| Severity | Issue | Evidence |
|---|---|---|
| high | The 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 |
| low | Empty dd element after final dt leaves an invalid/empty definition row in the balance rail. | <dt>London · Geneva · Singapore</dt><dd></dd> |
| low | Reduced-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" |
| low | drawGrain 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
| Severity | Issue | Evidence |
|---|---|---|
| high | h1 wordmark severely clipped at 1024x640 viewport, only 'ON' or last portion visible at left edge instead of full 'CARBON' centered in hero | Screenshot shows large white letters 'ON' at left edge of viewport with 'CARB' missing; .wordmark-form width:max-content |
| medium | Footer not visible in 1024x640 screenshot | Screenshot shows only backdrop, header, partial hero, and seam-label; no footer strip at bottom edge |
| medium | Main 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' |
| low | Hero grid template deviates from brief literal specification | Generated: grid-template-columns: minmax(0, 1fr) minmax(0, var(--hero-width)) minmax(0, 1fr); Brief: grid-template-colum |
| low | Unspecified 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 |
| low | backdrop-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 |
| low | primary-action transition only covers transform, not background/box-shadow specified in brief hover state | CSS: 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
| Severity | Issue | Evidence |
|---|---|---|
| low | Compass rose is visually subordinated: the h1 sits dead-centre over the dial and completely hides the E and W cardinal labels | Screenshot shows 'NAVIGATE WITH ABSOLUTE CERTAINTY' covering the rose centre; only N and S labels are legible. This is t |
| low | Nav 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 |
| low | Three 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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Duplicate 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)} |
| low | Signal legend text sits over the brightest token columns and its small grey mono labels have poor contrast against the dense white token field | legend at right:100px bottom:24px renders as tiny dim text over the right-side comb of tokens in the screenshot |
| low | Rightmost canvas region shows a dead gap: columns are squeezed by the 0.82 field factor, leaving the far-right edge emptier than the composition implies | columnX uses fieldWidth * 0.82 * (0.045 + i * 0.0825) |
| low | Hot-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 column | plan.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
| Severity | Issue | Evidence |
|---|---|---|
| high | The 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 |
| medium | The 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 |
| medium | Orb 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 |
| medium | An 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 |
| low | The 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
| Severity | Issue | Evidence |
|---|---|---|
| low | resize() 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' unconditionally | scheduleResize(): 'sizeCanvas(); if (reduce) draw(true);' — draw omitted when not reduce |
| low | Escape 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 implies | document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeMenu(); }) |
| low | Screenshot could not be visually inspected (no image input available), so rendered composition, scrim coverage, and ribbon rendering could only be verified from code | review 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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Missing 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 |
| low | Menu panel uses visibility:hidden with a visibility transition delay not in the brief, which slightly alters the specified transition property list | transition: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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Reduced-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; .. |
| low | Reduced-motion canvas stops animating entirely rather than running a static loop | if (!reduced) { requestAnimationFrame(loop); } combined with a separate one-shot paint(0) |
| low | Frame counter increments twice on the reduced-motion path | loop() paints and increments, then the reduced block runs paint(0) and increments __DEMO__.frames again |
| low | Longitudinal polyline drops one segment at every alpha-bucket transition (moveTo instead of lineTo), leaving sub-pixel gaps in the rails | if (lvl !== prevBucket) { ...; paths[lvl].push(0, sx, sy); prevBucket = lvl; } else { paths[lvl].push(1, sx, sy); } |
| low | Rung alpha is quantised with the rail denominator 0.34 although rung peak alpha is 0.30, so rungs land in a coarser bucket than specified | lvl = 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
| Severity | Issue | Evidence |
|---|---|---|
| high | Dust motes render as oversized glowing orbs instead of tiny rising dust particles | Screenshot shows many large soft circular blobs, some tens of pixels wide; JS builds gradients with `var R = (30 + m.r * |
| high | Canvas dust does not follow the brief's exact per-mote paint style | Brief requires fillStyle 'rgba(255,206,152,' + alpha + ')' and radius 0.6px–2.2px; generated code uses cached radial g |
| high | Bloom 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 |
| medium | Bloom-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 |
| medium | The lens is visually too subdued compared with the accidental dust glow field | In the 1024x640 screenshot the central iris is dark and low-contrast while the page is dominated by large scattered warm |
| medium | The requested bloom behind the optic is not visibly centered behind the iris | Screenshot shows no strong warm radial bloom centered on the iris; the brightest glow is distributed as separate blobs a |
| low | Optical stage centering does not use the specified transform method | Brief specifies .iris-stage ... transform:translate(-50%,-50%); generated CSS uses `margin-left:calc(var(--iris) / -2) |
| low | Mobile menu default CSS differs from specified display behavior | Brief 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() * 10produces 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: hiddenin 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:1on.exposure-washand animates from 0→1 withbackwardsfill 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 animatesopacityfrom 0→1 separately, causing double fade not specified in the brief - Pointer parallax uses
event.clientX / width * 2 - 1but 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>withid="service"; implementation reuses#serviceon the status strip inside main, creating duplicate IDs - Quiet link underline offset is
5px, correct, buttext-decoration:underlineis 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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Duplicate 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" ... |
| high | Particle group split is wrong: amber group only gets indices 56..139 (84 particles) instead of the required 104 | const group = index < 39 ? "red" : index < 56 ? "blue" : "amber"; produces 39 red + 17 blue + 84 amber |
| medium | Sodium 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 wrap | group === "red" ? 358 + random() * 10 : group === "blue" ? 204 + random() * 18 : 18 + random() * 24 |
| low | Implementation 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 |
| low | Status 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"> |
| low | Body 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; } |
| low | Footer 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; } |
| high | Screenshot 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 |
| medium | Screenshot 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 strip | Visible dark band runs horizontally across the page just above the status strip in the rendered image |
| low | Type 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 width | Screenshot: '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.1renders 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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Lattice wireframe reads as a dense opaque cube-like tangle rather than a clearly architected gyroid minimal surface | Screenshot: the structure occupies most of the right half of the viewport and individual gyroid saddles are not legible; |
| medium | Horizon glow band and 1px core line are not visible in the rendered page | Screenshot shows no detectable soft horizontal band around y=cy and no 1px line crossing the lattice |
| low | Vignette appears too strong, washing the canvas edges to near-black and partially clipping the lattice's left/back faces | Screenshot edges (especially bottom and top corners) are nearly pure black; lattice wireframe fades into the vignette ag |
| low | Footer status pip lacks the expected halo glow | Screenshot shows a flat 7px square in the center footer line; box-shadow:0 0 8px var(--accent-dim) appears to render wit |
| low | Greek ρ 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
| Severity | Issue | Evidence |
|---|---|---|
| high | The 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 |
| high | The 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 |
| medium | The 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 |
| medium | The 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 |
| medium | The 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 |
| high | The 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
| Severity | Issue | Evidence |
|---|---|---|
| high | Letter 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 |
| medium | Stage 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% + |
| low | Specular 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%)...} |
| low | Reflection 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 |
| low | Mobile 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);...} |
| low | Screenshot 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 DOM | 1024x640 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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Rendered nebula is washed out — the specified violet core, cyan fringe and rose fringe are visually faint | Screenshot shows a near-monochrome dark indigo background with only a faint violet haze at the top; no discernible cyan |
| medium | CSS 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 |
| low | rAF loop is unconditionally scheduled outside the two-rAF fallback, breaking the brief's prescribed flow where the loop starts inside the fallback when frames==0 | Final lines: if (!reduced) raf = requestAnimationFrame(loop); runs alongside the nested double-rAF block that also con |
| medium | Star count visible in the rendered frame is sparse and lacks the 'crisp white-violet' punch the brief calls for | Screenshot shows roughly a dozen discernible stars across 1024x640; near-group 4px drift is overshadowed by darkening la |
| low | Redundant 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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Incoming 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 |
| high | Canvas 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 |
| high | Generated 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 |
| medium | Specular 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 |
| medium | Wedge 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 |
| low | The 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, |
| low | Layer 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 |
| low | Footer 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
| Severity | Issue | Evidence |
|---|---|---|
| low | Brand 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"/> |
| low | Reflection 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)"; |
| low | Volumetric light shafts render subtly in the viewport at 1024x640 even though CSS opacity values match the brief | Visual inspection of screenshot — shafts are perceptible but understated |
| low | hero-actions has no explicit width:100% on mobile, so buttons rely on flex-wrap without container width | CSS 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
| Severity | Issue | Evidence |
|---|---|---|
| high | Hero paragraph occupies too much horizontal space; the right half is not kept empty | In the 1024x640 screenshot the two-line paragraph stretches far into the right side, leaving only a narrow empty strip. |
| medium | Opening paragraph is rendered extremely dim in the captured composition | The screenshot shows the h1 nearly disappearing into the background at top-of-page. While the base words begin at 0.14 o |
| high | Scroll progress is not calculated from window.scrollY and cached paragraph travel range as specified | JS uses const progress = clamp((viewportHeight * 0.34 - rect.top) / cachedTravel, 0, 1); and never uses cachedTop af |
| medium | Paragraph rect is read outside the animation frame loop on scroll | The brief required the paragraph document position to be cached at startup and on resize, with one live container rect r |
| medium | Reduced-motion implementation contradicts the requested static readable state | The CSS says .base-word { opacity: 1 !important; }, but the JS still runs and writes per-word opacities because `updat |
| low | Entrance animation wiring does not follow the stated failure-guard pattern | The 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
| Severity | Issue | Evidence |
|---|---|---|
| high | The 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 |
| high | The 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 |
| medium | At 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 |
| medium | The 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 |
| low | The 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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Hero 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. |
| high | Canvas 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 ` |
| high | Bloom 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 |
| medium | First 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 |
| medium | Load 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 |
| medium | Amber 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 |
| low | Footer/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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Cannot evaluate rendered composition: screenshot not viewable in this environment; no image-based issues could be confirmed or ruled out | System reminder: the current model does not support images |
| low | Triangle 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)" |
| low | Header 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 side | header { 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
| Severity | Issue | Evidence |
|---|---|---|
| high | Hottest-cell crosshair appears on the wrong location | HUD reads "R25 · C46 · 620°C", and the visible pink crosshair sits near the lower-right hotspot, while the brightest whi |
| high | Readout-to-image mismatch makes the instrument HUD look untrustworthy | The panel claims a max of 620°C at the lower-right region, but that region is not rendered as the hottest area; the cent |
| medium | Hotspot marker is too inconspicuous relative to the briefed cinematic instrument marker | In 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
| Severity | Issue | Evidence |
|---|---|---|
| high | The 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 |
| high | The 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 |
| medium | Footer 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) |
| medium | The 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 |
| medium | Responsive 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 |
| medium | The 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 |
| low | The 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 |
| medium | The 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
| Severity | Issue | Evidence |
|---|---|---|
| medium | Y-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; |
| medium | Q1 '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 |
| low | rAF 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' budget | animate() body sets ghost/visible/area/ticks[0..7]/marker/crosshair in a single callback |
| low | Marker 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
| Severity | Issue | Evidence |
|---|---|---|
| low | Header CTA 'REQUEST A PROOF' sits hard against the right edge with the box border visually touching the screenshot frame | At 1024px, --header-x reduces to 32px (901-1279 breakpoint); the long button 'Request a proof' hugs the right margin wit |
| low | Specimen row 'Cotton · 600 gsm' wraps to two lines at 1024px viewport | spec-sm line wraps 'Cotton · 600' then 'gsm' inside the 244px aside column — minor aesthetic break, not incorrect per sp |
| low | Top-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 |
| low | Grain overlay (--grain-op 0.11) is barely perceptible at 1024x640; relies heavily on the muted film-grain SVG working in browsers | No 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.