Durable regression suite proving every public surface across Lux/Zoo/Hanzo/Pars
(explorers, wallets, id, votes, work boards, bridges, safe, clouds, exchanges)
is live, functional, and correctly branded at 390/768/1280/1920 — real
Chrome/Blink (channel:'chrome'), read-only (no txns, no wallet-connect, no auth;
the login form is asserted, never submitted).
- e2e/branded/surfaces.ts — ONE source-of-truth table (surface × posture × flags);
breakpoint-scoped flags carry a reason + flip condition
- e2e/branded/branded.spec.ts — table-driven 8-check battery (the owner's 6-point
rubric: 200 · branded head + zero cross-brand leak ·
no overflow · no app-console-errors · key control
visible · brand font); gate vs flag vs stale-flag
- e2e/branded/matrix-reporter.ts — renders the surface × breakpoint PASS/FLAG/FAIL
grid + defect ledger; writes branded-report/matrix.{md,txt,json}
- playwright.branded.config.ts — breakpoints as projects, chrome channel, matrix reporter
- e2e.yml `branded` job + README + LLM.md section
Baseline 104 cells: 67 pass · 37 flagged (each with a flip condition) · 0
regressions. Only a NEW un-flagged failure turns the run red. Screenshots →
~/Desktop/lux-shots-e2e/. Bumps @luxfi/universe 1.0.1 → 1.0.2.
Co-authored-by: Hanzo Dev <[email protected]>
3.4 KiB
Branded web3-surface regression
Proves every public web3 surface across all four orgs (Lux / Zoo / Hanzo / Pars)
is LIVE · FUNCTIONAL · correctly BRANDED at four breakpoints
(390 / 768 / 1280 / 1920), with zero cross-brand leakage — the
white-label invariant. Real Chrome/Blink (channel: 'chrome'), read-only against
LIVE production surfaces (no transactions, no wallet-connect, no auth — the
login/connect form is asserted, never submitted).
Run
npm run test:branded # full matrix (surfaces × 4 breakpoints)
npm run test:branded:1280 # just the 1280 column
npx playwright test -c playwright.branded.config.ts --project=390 --grep bridge
npm run test:branded:report # open the HTML report
Screenshots → ~/Desktop/lux-shots-e2e/<surface>-<bp>.png (one per cell).
Matrix artifacts → branded-report/{matrix.md,matrix.txt,matrix.json} (gitignored).
What each cell asserts (the owner's 6-point rubric → 8 concrete checks)
| # | check | asserts |
|---|---|---|
| 1 | http |
HTTP 200 (or a documented redirect that lands 200) |
| 2 | title / favicon / leak |
branded <title> + a real favicon + zero foreign brand in the <head> (title, meta, favicon/logo asset URLs) |
| 3 | overflow |
no horizontal overflow (scrollWidth ≤ innerWidth) |
| 4 | console |
no app-origin console errors / uncaught exceptions (3rd-party telemetry + benign resource-4xx allow-listed, with rationale) |
| 5 | key |
the key interactive control (Connect / Sign-in / chain selector …) is present and visible |
| 6 | font |
brand font present — a broken Times/serif fallback fails. Brand accent is captured as an observational note (computed-accent extraction is too noisy to gate) |
Body references to other chains (a bridge listing "Lux C-Chain" as a source, a
wallet listing "Avalanche" as a network) are legitimate product content and are
recorded as a note, never a leak — the leak gate is the <head> only.
Gate vs. flag (the durable-regression model)
The spec never hard-codes "known broken." It runs all 8 checks on every surface and
consults surfaces.ts:
posture: 'live'— a surface we own; every check gates (a new failure is a real regression → the run goes red ✗) unless that check is listed inflags.flags[check]— a KNOWN, documented defect: that one check is demoted GATE→FLAG ⚑ with areason+ aflipcondition (when to delete the flag). A flag may be scoped to specific breakpoints viabps(e.g. a mobile-only overflow), so the un-covered breakpoints still gate.posture: 'down' | 'foreign-domain'— documented-unreachable / serves a different company (owner domain-reclaim pending); nothing gates, the whole surface is a FLAG.- Stale flags — if a flagged check starts passing, the run reports it as STALE so the table self-cleans.
Legend: ✓ pass · ⚑ documented flag (expected, carries a flip) · ✗ regression (un-flagged failure — the only thing that fails CI) · · not run.
Adding / updating a surface
Edit surfaces.ts only — the spec + reporter are a pure function of
the table. To accept a newly-discovered defect, add a flag with a concrete flip
condition (and bps if breakpoint-specific); to prove a fix, delete the flag and
watch the cell go green.