Repository navigation
v2.28.0 — LLM-as-a-Judge QA + 85-Round Flywheel
What's New
LLM-as-a-Judge QA Scoring System
Replaced 120+ regex false-positive patterns with Gemini 2.0 Flash semantic classification. The judge classifies QA issues into 4 categories:
genuine_bug— real functional/visual defectsdesign_opinion— subjective design preferences, not bugsscreenshot_artifact— compression artifacts misread as issuesmock_data— placeholder content flagged as incomplete
Expanded Deterministic Metrics (Layer 1)
7 → 12 boolean Playwright checks:
no_layout_shift(CLS post-hydration, Google 0.25 threshold)no_404_resources(static asset 404s)no_slow_resources(>5s load time)no_mixed_content(HTTP on HTTPS)viewport_meta_ok(viewport meta validation)
3-Layer Scoring Rebalance
- Layer 1 (60%): 12 deterministic boolean metrics — zero variance
- Layer 2 (30%): Severity rubric on LLM-judged genuine issues only
- Layer 3 (10%): Legacy P-level taste deductions
QA Score Journey: R50→R85
R50: 56/100 (regex-only era, 120+ patterns)
R78: 85/100 (first LLM judge run)
R82: 82/100 (Layer 1 permanent failures fixed)
R84: 97/100 (judge tuning converging)
R85: 100/100 ✅ (perfect score — all 3 layers maxed)
148-Screenshot Gallery
Full responsive matrix: dark desktop, light desktop, dark mobile, light mobile — covering all 37 routes.
UI Polish (200+ components)
- Motion-safe animations (111 files)
- Dark mode gap fixes (research, analytics, narrative, onboarding)
- Jargon purge (ISO dates, label consistency)
- Accessibility (focus rings, ARIA labels)
Packages
Key Files
scripts/ui/runDogfoodGeminiQa.mjs— Complete scoring engine rewrite.claude/rules/gemini_qa_loop.md— QA loop integration rulepublic/dogfood/qa-results.json— 85-round score historypublic/dogfood/screenshots/— 148 screenshots
Full Changelog: v2.27.0...v2.28.0