v4.0 QC Sweep Review — 2026-05-14

77 unique pages · Lighthouse + Playwright mobile + raw HTTP · composite 0-100 + verdict tier

← Command Centre · Go-Live Dashboard → · sweep run 2026-05-14 21:30-23:25 BST · RULES SHIPPED: Sheet-write auto-pull (2026-05-15) · Lighthouse perf budget gate (2026-05-15)

🛡 Shipped since the sweep (2026-05-15)

Commit bf981a4 on feature/v4-migration · 6 files / 692 insertions

Outcome at a glance

88 v4.0 published registry rows → 77 unique handles after cross-market dupe collapse. Each page passed through three independent probes: Lighthouse (desktop perf/SEO/a11y/best-practices), Playwright mobile (console + render + screenshot), and raw HTTP (canonical/hreflang/JSON-LD/og/meta). Composite 0-100 per page. No FAILs.

77
Total pages QC'd
5
PASS (≥80)
63
WARN 70-79
9
WARN 60-69
73.7
Mean score
231
Cells written to Sheet

Systemic findings (theme-wide patterns)

What the sweep surfaced: the issues below are not page-specific; they recur across the v4.0 theme. Fixing the root once removes the finding from dozens of pages at a time.
100%
Console errors
77/77 pages have ≥1 JS error at runtime — theme-wide
65%
Accessibility < 90
50/77 pages — likely shared template a11y gap
52%
No JSON-LD structured data
40/77 pages — SEO gap; rich-result eligibility
43%
Performance < 50
33/77 pages — LCP / TBT pressure under 4G profile
25%
OG image / title missing
19/77 pages — social-share preview broken
12%
Slow load (>15s)
9/77 pages — tail latency outliers
99%
SEO score ≥ 90
76/77 pages — on-page SEO basics are solid
100%
HTTP 200
77/77 reachable — no orphan / 404 / 500 pages

✓ Banked decisions — logged 2026-05-15

All 8 decisions banked — submitted by Calum 2026-05-15 (see projects/briefs/qc-v4-sweep-2026-05-14/DECISIONS-LOG.md). Every card below is shown as BANKED ✓ — settled. The original slow_load → PROFILE_TOP3 verdict was superseded by the diagnosed slow_load_diagnosed card.
#DecisionVerdictStatus
1Console errors on 100% of pagesAUDIT_THEME_JSBANKED
2JSON-LD missing on 40 pagesTEMPLATE_PER_TYPEBANKED
323 exam-season city LPsREFACTOR_TEMPLATE_NOWBANKED
4Accessibility < 90 on 50 pagesAXE_AUDITBANKED
5OG image/title missing on 19 pagesTEMPLATE_DEFAULTBANKED
6qc_result schema formatKEEP_HYBRIDBANKED
79 slow pages — diagnosed (ship which fixes)SHIP_ALL_NOW
⚠ plan later invalidated — see Corrected diagnosis
BANKED
8Lighthouse perf gate — adoption scopeRETROACTIVE_FULLBANKED
9 pages slow load (original framing)PROFILE_TOP3SUPERSEDED

⚠ Corrected diagnosis — the perf fix plan changed

The original PERF-DIAGNOSIS guessed the mechanism and got it wrong. Ground-truth investigation of the live themes (2026-05-15) found:

Live deploys were halted — the original SHIP_ALL_NOW authorised an invalidated plan. Codex 5.5 decision-QC confirmed the halt (RETHINK). Full detail: PERF-DIAGNOSIS-v2.md · THEME-JS-AUDIT.md · FINAL-PLAN.md (the last reviewed by Codex 5.5 + Gemini, both REFINE, all points folded in).

✓ Decisions — all 15 banked

All 15 cards banked ✓ — 8 QC decisions + D1–D7 performance decisions, all settled 2026-05-15. The performance workstream is now parked — Calum pivoted to the ads-go-live path. Remaining app-stack actions (Judge.me, Reamaze, Web Pixels audit, Consent Mode v2) are tracked as app-side tasks in pending-tasks-registry.md §v4.0 Performance. Cards render read-only below with the decided verdict.

🛠 Corrected fix plan — 3 workstreams

The v1 fix plan (Groups A–E) was invalidated. It was built on PERF-DIAGNOSIS.md v1's wrong "hero MP4" mechanism — the preload/poster fixes it proposed are already in place. The corrected plan is in PERF-DIAGNOSIS-v2.md + FINAL-PLAN.md (Codex 5.5 + Gemini reviewed). The performance workstream is now PARKED — Calum pivoted to the ads-go-live path; the live D1–D7 app-stack decisions above carry the real fixes.
WorkstreamWhat it actually isRiskStatus
WS1 — Carousel mobile videobz-slide-video Embla carousel keeps preload="metadata" on mobile (8–34 videos/page). Already optimised on desktop (click-only play, posters, Codex-reviewed preload fix). Needs a real mobile-device test before any change — the component is shared across 55+ live pages mid-T1.High carePARKED
WS2 — Theme JS baselineThe likely dominant fleet-wide LCP driver: ~440–587 KB unused JS + ~4.4 s JS execution per page from third-party apps (gtag, Judge.me, Reamaze, Meta Pixel, Hextom, Web Pixels). App-injected — fixed app-side via the D1–D6 decisions above, not in theme code.App-sidePARKED
WS3 — JSON-LD + CLS40 pages emit zero JSON-LD (additive Liquid, low risk). sections/bz-exam-city.liquid <img> tags lack width/height — the CLS fix. Two small reviewed batches; the only genuinely low-risk work.LowPARKED

🏆 Top 10 — strongest pages

#MktWaveHandleScorePerf/SEO/A11y/BPLive URL

🚨 Bottom 10 — pages needing attention

#MktWaveHandleScorePerf/SEO/A11y/BPFindingsLive URL

All 77 pages — per-row review

MktWaveTypeHandleScoreP/S/A/BFindingsDecisionFeedback
Methodology — how the score is calculated (composite 0-100)

30 pts — HTTP probe: status 200 (8) + canonical (5) + hreflang ≥3 (5) + JSON-LD ≥1 (6) + og:title+og:image (3) + meta title+desc (3).

40 pts — Lighthouse: perf×0.15 + seo×0.10 + a11y×0.10 + best-practices×0.05.

30 pts — Playwright mobile: nav 200 (10) + zero console errors (12, sliding) + load <8s (8) / <15s (4).

Verdict tiers: PASS ≥ 80 · WARN-A 70-79 · WARN-B 60-69 · FAIL < 60.

What's already been done as a result of this sweep
  • Pages Registry Sheet: 231 cells written (QC Result / QC Findings / Last QC) for 77 v4 rows by Handle match.
  • Go-Live dashboard: A/B link + LP-LIVE/DRAFT chip + QC score collapsed into a single two-tier widget per variant. Hover shows Lighthouse breakdown + findings + last-QC timestamp.
  • data.json refresh rule: every Sheet-write now MUST call tools/registry_pull_after_write.py in the same script — codified in AGENTS.md, ops-pages-registry SKILL, and memory/feedback_sheet_write_auto_pull.md.
  • qc_result schema v1.7: accepts numeric-suffix variants PASS|WARN|FAIL (NN/100) alongside the lowercase enum. Schema warnings on pull dropped 69 → 2.
  • GSD hook stubs: 4 missing hook scripts at C:/Users/PC/.claude/hooks/ stubbed to suppress the spurious MODULE_NOT_FOUND noise on every Write/Edit.