From 5d68928b971fcedc5d88d90c9df46b8c1df93f33 Mon Sep 17 00:00:00 2001 From: TurtleWolfe Date: Thu, 6 Aug 2026 15:47:15 +0000 Subject: [PATCH] feat(#575): capture the cloud E2E baseline before it becomes unrecoverable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #575 moves E2E onto a per-runner ephemeral Supabase. That switch is only safe if the local suite runs THE SAME TESTS, and nothing in the repo could express what "the same tests" means. Captured from run 31048279017 (SHA de0f7f0), the last green cloud run — 66 minutes before #567 exhausted the quota: 2001 tests, 1807 expected, 194 skipped, 0 flaky, across {chromium,firefox,webkit} x {gen,msg,msg-iso}. WHY NOW. The source artifacts expire 2026-08-12T22:13Z, and the next cloud run that could regenerate them is impossible until the quota refills 2026-09-02. The obvious fallback does not work: the `github` reporter only annotates FAILURES, so this green run left 6 check-run annotations, not 2001. Measured, not assumed. IDENTITIES, NOT COUNTS. A suite can drop one test, gain another, and still total 2001. That matters concretely: 228 tests — all 76 *-msg-iso per browser — sit behind `test.skip(!fixture, 'isolation seed failed')`, and seedIsolatedAdmin (test-user-factory.ts:2761-2772) returns null on two silent paths before its loud throw. If a local stack cannot seed them, all 228 skip quietly and the run is green. A count gate waves that through. The comparison is directional: expected->skipped or a missing test is coverage LOST and fails; expected->unexpected/flaky fails; skipped->expected is a gain, reported and allowed, because a local stack can legitimately run what cloud could not. VERIFIED BY MAKING IT FAIL. `--selftest` mutates the baseline four ways and asserts rejection, including the same-count-different-tests case. 12 node:test cases run under `pnpm test:scripts` in ci.yml (134 pass, 0 fail). CLI exit codes checked without a pipe, since `| tail` eats them: 2 on no args, 0 on the real report, 1 on a mutated one. Three of the numbers I had been quoting were wrong before this landed, which is the argument for the file: the baseline is now asserted in a test rather than repeated in prose. Refs #575 Co-Authored-By: Claude Opus 5 (1M context) --- scripts/__tests__/e2e-parity-diff.test.js | 190 ++ scripts/e2e-parity-diff.mjs | 195 ++ tests/e2e/parity/README.md | 72 + tests/e2e/parity/baseline-de0f7f0.json | 2024 +++++++++++++++++++++ 4 files changed, 2481 insertions(+) create mode 100644 scripts/__tests__/e2e-parity-diff.test.js create mode 100644 scripts/e2e-parity-diff.mjs create mode 100644 tests/e2e/parity/README.md create mode 100644 tests/e2e/parity/baseline-de0f7f0.json diff --git a/scripts/__tests__/e2e-parity-diff.test.js b/scripts/__tests__/e2e-parity-diff.test.js new file mode 100644 index 00000000..cc8b350b --- /dev/null +++ b/scripts/__tests__/e2e-parity-diff.test.js @@ -0,0 +1,190 @@ +/** + * Tests for the E2E parity comparator (#575). + * + * The comparator is the ONLY thing standing between "we switched E2E to a local + * Supabase" and "we switched E2E to a local Supabase and quietly stopped running 228 + * messaging tests". If it can't fail, the switch is unlicensed. So these tests are + * mostly about proving it REJECTS things. + * + * Runs under `pnpm test:scripts` (node:test), which ci.yml executes. vitest cannot + * load `node:test`, hence the placement here — see vitest.config.ts:20-21. + */ + +const test = require('node:test'); +const assert = require('node:assert'); +const path = require('node:path'); +const { pathToFileURL } = require('node:url'); + +const MOD = pathToFileURL( + path.join(__dirname, '..', 'e2e-parity-diff.mjs') +).href; + +/** Minimal Playwright-JSON-shaped report. */ +function report(entries) { + return { + suites: entries.map(([project, file, title, status]) => ({ + file, + specs: [{ file, title, tests: [{ projectName: project, status }] }], + suites: [], + })), + }; +} + +test('extractTests flattens nested suites and keys on project|file|title', async () => { + const { extractTests } = await import(MOD); + const r = { + suites: [ + { + file: 'a.spec.ts', + specs: [ + { + file: 'a.spec.ts', + title: 'top', + tests: [{ projectName: 'chromium-gen', status: 'expected' }], + }, + ], + suites: [ + { + // No `file` here — must inherit from the parent suite, or nested describes + // key on an empty path and silently collide. + specs: [ + { + title: 'nested', + tests: [{ projectName: 'chromium-gen', status: 'skipped' }], + }, + ], + }, + ], + }, + ], + }; + const out = extractTests(r); + assert.strictEqual(out['chromium-gen|a.spec.ts|top'], 'expected'); + assert.strictEqual(out['chromium-gen|a.spec.ts|nested'], 'skipped'); + assert.strictEqual(Object.keys(out).length, 2); +}); + +test('identical input passes', async () => { + const { compare } = await import(MOD); + const b = { 'p|f|t': 'expected', 'p|f|u': 'skipped' }; + assert.strictEqual(compare(b, { ...b }).ok, true); +}); + +test('expected -> skipped is a coverage LOSS and fails', async () => { + const { compare } = await import(MOD); + const b = { 'p|f|t': 'expected' }; + const res = compare(b, { 'p|f|t': 'skipped' }); + assert.strictEqual(res.ok, false); + assert.deepStrictEqual(res.lost, ['p|f|t']); +}); + +test('a test vanishing entirely fails', async () => { + const { compare } = await import(MOD); + const res = compare({ 'p|f|t': 'expected' }, {}); + assert.strictEqual(res.ok, false); + assert.deepStrictEqual(res.missing, ['p|f|t']); +}); + +test('same COUNT but different tests still fails', async () => { + // The whole reason this compares identities. A count gate passes this. + const { compare } = await import(MOD); + const res = compare({ 'p|f|a': 'expected' }, { 'p|f|b': 'expected' }); + assert.strictEqual(res.ok, false); + assert.strictEqual(res.missing.length, 1); + assert.strictEqual(res.added.length, 1); +}); + +test('skipped -> expected is a GAIN: reported, allowed', async () => { + // A local stack can legitimately enable a spec the cloud project could not run. + // That must not fail the gate, but it must be visible. + const { compare } = await import(MOD); + const res = compare({ 'p|f|t': 'skipped' }, { 'p|f|t': 'expected' }); + assert.strictEqual(res.ok, true); + assert.deepStrictEqual(res.gained, ['p|f|t']); +}); + +test('a genuine failure (expected -> unexpected) fails the gate', async () => { + const { compare } = await import(MOD); + const res = compare({ 'p|f|t': 'expected' }, { 'p|f|t': 'unexpected' }); + assert.strictEqual(res.ok, false); + assert.strictEqual(res.changed.length, 1); +}); + +test('flaky is not treated as a pass', async () => { + const { compare } = await import(MOD); + const res = compare({ 'p|f|t': 'expected' }, { 'p|f|t': 'flaky' }); + assert.strictEqual(res.ok, false); +}); + +test('brand-new tests are allowed but reported', async () => { + const { compare } = await import(MOD); + const res = compare({}, { 'p|f|new': 'expected' }); + assert.strictEqual(res.ok, true); + assert.deepStrictEqual(res.added, ['p|f|new']); +}); + +test('the committed baseline is well-formed and self-consistent', async () => { + const fs = require('node:fs'); + const p = path.join( + __dirname, + '..', + '..', + 'tests', + 'e2e', + 'parity', + 'baseline-de0f7f0.json' + ); + const m = JSON.parse(fs.readFileSync(p, 'utf8')); + + assert.strictEqual(m.sha, 'de0f7f080c8d75949e4e6c89fdf66ab7d3da8029'); + assert.strictEqual(m.backend, 'cloud'); + assert.deepStrictEqual( + m.duplicateKeys, + [], + 'keys must be unique or the diff is unsound' + ); + + const statuses = Object.values(m.tests); + assert.strictEqual(statuses.length, m.totals.tests); + assert.strictEqual( + statuses.filter((s) => s === 'expected').length, + m.totals.expected + ); + assert.strictEqual( + statuses.filter((s) => s === 'skipped').length, + m.totals.skipped + ); + // The numbers quoted throughout #575 and its PRs. If these ever change, the + // baseline was regenerated and every claim referencing them needs revisiting. + assert.strictEqual(m.totals.expected, 1807); + assert.strictEqual(m.totals.skipped, 194); + assert.strictEqual(m.totals.tests, 2001); +}); + +test('the baseline round-trips through compare() against itself', async () => { + const fs = require('node:fs'); + const { compare } = await import(MOD); + const p = path.join( + __dirname, + '..', + '..', + 'tests', + 'e2e', + 'parity', + 'baseline-de0f7f0.json' + ); + const m = JSON.parse(fs.readFileSync(p, 'utf8')); + const res = compare(m.tests, { ...m.tests }); + assert.strictEqual(res.ok, true); +}); + +test('report() shape: extract on a synthetic report matches compare expectations', async () => { + const { extractTests, compare } = await import(MOD); + const base = extractTests( + report([['chromium-gen', 'x.spec.ts', 'one', 'expected']]) + ); + const now = extractTests( + report([['chromium-gen', 'x.spec.ts', 'one', 'skipped']]) + ); + assert.strictEqual(compare(base, now).ok, false); +}); diff --git a/scripts/e2e-parity-diff.mjs b/scripts/e2e-parity-diff.mjs new file mode 100644 index 00000000..bd9ee339 --- /dev/null +++ b/scripts/e2e-parity-diff.mjs @@ -0,0 +1,195 @@ +#!/usr/bin/env node +/** + * E2E parity diff — compare a Playwright JSON report against a captured baseline. + * + * #575. Switching E2E from the shared cloud project to a per-runner ephemeral stack + * is only safe if the local run covers the SAME TESTS. Counts alone cannot show that: + * a suite can drop one test and gain another and still total 2001. + * + * So this compares per-test IDENTITIES, not totals, and it is directional — a test + * that went `expected -> skipped` is a coverage LOSS and fails; the reverse is a gain + * and is reported but allowed (a local stack legitimately enables things cloud could + * not run, e.g. a spec gated on a service the cloud project lacks). + * + * node scripts/e2e-parity-diff.mjs [--baseline ] [--json] + * node scripts/e2e-parity-diff.mjs --selftest + * + * WHY A SELFTEST. Every probe written in this repo that could not fail turned out to + * be wrong (#396, and four in one session). `--selftest` mutates a copy of the baseline + * three ways and asserts this script REJECTS each. Run it in CI next to the real diff; + * a comparison tool that cannot fail is worse than none, because it licenses the switch. + */ + +import { readFileSync, existsSync } from 'node:fs'; +import { pathToFileURL } from 'node:url'; + +const DEFAULT_BASELINE = 'tests/e2e/parity/baseline-de0f7f0.json'; + +/** Extract {key -> status} from a Playwright JSON report. Key excludes line numbers + * deliberately: they shift on any edit above a test and would churn without any + * change in coverage. */ +export function extractTests(report) { + const out = {}; + const walk = (suite, inheritedFile) => { + const file = suite.file || inheritedFile; + for (const spec of suite.specs || []) { + for (const t of spec.tests || []) { + out[`${t.projectName || ''}|${spec.file || file}|${spec.title || ''}`] = + t.status || ''; + } + } + for (const s of suite.suites || []) walk(s, file); + }; + for (const s of report.suites || []) walk(s, s.file); + return out; +} + +/** Directional comparison. Returns {lost, missing, added, gained, changed, ok}. */ +export function compare(baselineTests, actualTests) { + const lost = []; // expected -> skipped: COVERAGE LOSS + const missing = []; // present in baseline, absent entirely: COVERAGE LOSS + const added = []; // absent from baseline, present now: report only + const gained = []; // skipped -> expected: report only + const changed = []; // any other status transition + + for (const [k, was] of Object.entries(baselineTests)) { + if (!(k in actualTests)) { + missing.push(k); + continue; + } + const now = actualTests[k]; + if (was === now) continue; + if (was === 'expected' && now === 'skipped') lost.push(k); + else if (was === 'skipped' && now === 'expected') gained.push(k); + else changed.push(`${k} (${was} -> ${now})`); + } + for (const k of Object.keys(actualTests)) { + if (!(k in baselineTests)) added.push(k); + } + + // `changed` includes transitions to `unexpected` (a real failure) and `flaky`. + // Both must fail the gate — a parity run that goes red on a test the cloud passed + // is precisely the signal this exists to surface. + return { + lost, + missing, + added, + gained, + changed, + ok: lost.length === 0 && missing.length === 0 && changed.length === 0, + }; +} + +function loadReport(path) { + const raw = JSON.parse(readFileSync(path, 'utf8')); + // Accept either a raw Playwright report or a previously-written baseline manifest. + if (raw.tests && !raw.suites) return raw.tests; + return extractTests(raw); +} + +function report(res, baseCount, actualCount) { + const line = (label, arr, fatal) => { + if (!arr.length) return; + console.log(`\n${fatal ? '✗' : 'ℹ'} ${label}: ${arr.length}`); + for (const k of arr.slice(0, 25)) console.log(` ${k}`); + if (arr.length > 25) console.log(` … and ${arr.length - 25} more`); + }; + console.log(`baseline tests: ${baseCount}`); + console.log(`actual tests: ${actualCount}`); + line('COVERAGE LOST (ran on baseline, skipped now)', res.lost, true); + line('MISSING ENTIRELY (in baseline, absent now)', res.missing, true); + line('STATUS REGRESSION', res.changed, true); + line('gained (skipped on baseline, runs now)', res.gained, false); + line('new tests (not in baseline)', res.added, false); +} + +function selftest() { + if (!existsSync(DEFAULT_BASELINE)) { + console.error(`✗ selftest needs ${DEFAULT_BASELINE}`); + process.exit(1); + } + const base = JSON.parse(readFileSync(DEFAULT_BASELINE, 'utf8')).tests; + const keys = Object.keys(base); + const ranKey = keys.find((k) => base[k] === 'expected'); + let failures = 0; + const check = (name, actual, shouldPass) => { + const res = compare(base, actual); + const good = res.ok === shouldPass; + console.log( + ` ${good ? '✓' : '✗'} ${name} — ok=${res.ok}, want ${shouldPass}` + ); + if (!good) failures++; + }; + + // 1. Identity: the baseline against itself MUST pass, or every other case is noise. + check('identity (baseline vs itself) passes', { ...base }, true); + + // 2. A test silently flipping to skipped MUST be rejected. This is the exact + // failure mode: 228 *-msg-iso tests sit behind `test.skip(!fixture, …)`. + const flipped = { ...base, [ranKey]: 'skipped' }; + check('expected -> skipped is REJECTED', flipped, false); + + // 3. A test vanishing entirely MUST be rejected — a dropped shard or project. + const dropped = { ...base }; + delete dropped[ranKey]; + check('missing test is REJECTED', dropped, false); + + // 4. Swapping one test for another keeps the COUNT identical. A count-based gate + // passes here; this one must not. + const swapped = { ...base }; + delete swapped[ranKey]; + swapped['chromium-gen|tests/e2e/fake.spec.ts|invented'] = 'expected'; + check('same count, different tests is REJECTED', swapped, false); + + console.log( + failures ? `\n✗ selftest FAILED (${failures})` : '\n✓ selftest passed' + ); + process.exit(failures ? 1 : 0); +} + +// Only run the CLI when invoked directly. Without this guard, importing this module +// from a test executes the argument parsing below and exits the test runner. +const isMain = + process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href; +if (!isMain) { + // Imported for its exports (see scripts/__tests__/e2e-parity-diff.test.js). +} else { + runCli(); +} + +function runCli() { + const argv = process.argv.slice(2); + if (argv.includes('--selftest')) selftest(); + + const asJson = argv.includes('--json'); + const bi = argv.indexOf('--baseline'); + // `bi + 1` is only a real argument when --baseline was actually passed. Without this + // guard bi is -1, argv[0] IS the report path, and the filter below discards it — + // which made every real invocation print usage and exit 2 while --selftest passed. + const baselineArg = bi >= 0 ? argv[bi + 1] : null; + const baselinePath = baselineArg ?? DEFAULT_BASELINE; + const reportPath = argv.find((a) => !a.startsWith('--') && a !== baselineArg); + + if (!reportPath) { + console.error( + 'Usage: node scripts/e2e-parity-diff.mjs [--baseline ] [--json]\n' + + ' node scripts/e2e-parity-diff.mjs --selftest' + ); + process.exit(2); + } + + const baseline = JSON.parse(readFileSync(baselinePath, 'utf8')).tests; + const actual = loadReport(reportPath); + const res = compare(baseline, actual); + + if (asJson) console.log(JSON.stringify(res, null, 2)); + else report(res, Object.keys(baseline).length, Object.keys(actual).length); + + if (!res.ok) { + console.log( + `\n✗ PARITY FAILED — ${res.lost.length} lost, ${res.missing.length} missing, ${res.changed.length} regressed.` + ); + process.exit(1); + } + console.log('\n✓ parity holds — every baseline test still runs.'); +} diff --git a/tests/e2e/parity/README.md b/tests/e2e/parity/README.md new file mode 100644 index 00000000..414d180c --- /dev/null +++ b/tests/e2e/parity/README.md @@ -0,0 +1,72 @@ +# E2E parity baseline + +`baseline-de0f7f0.json` is a per-test record of the **last green E2E run against the +cloud Supabase project** before #567 exhausted the quota. + +It exists because #575 moves E2E onto a per-runner ephemeral Supabase, and that switch is +only safe if the local suite runs **the same tests**. This file is what "the same tests" +is measured against. + +| | | +| -------- | ------------------------------------------------------------- | +| run | 31048279017 | +| SHA | `de0f7f080c8d75949e4e6c89fdf66ab7d3da8029` | +| captured | 2026-08-06 | +| backend | cloud | +| tests | 2001 — **1807 expected, 194 skipped, 0 flaky** | +| projects | `{chromium,firefox,webkit}` × `{gen, msg, msg-iso}` = 24 jobs | + +## Why it is committed rather than fetched + +The source artifacts expire **2026-08-12T22:13Z**. After that the run's per-test detail is +unrecoverable — and the obvious fallback does not work: the `github` reporter only +annotates failures, so a green run leaves **6** check-run annotations, not 2001. Verified, +not assumed. + +The next cloud run that could regenerate this is impossible until the quota refills on +**2026-09-02**. So this file was captured inside the window and committed. + +## Why per-test identities, not counts + +A suite can drop one test and gain another and still total 2001. Counts would pass that; +`scripts/e2e-parity-diff.mjs` compares identities and rejects it. There is a test for +exactly that case (`same COUNT but different tests still fails`). + +This matters concretely here. **228 tests** — all 76 `*-msg-iso` per browser — sit behind +`test.skip(!fixture, 'isolation seed failed…')`, and `seedIsolatedAdmin` +(`tests/e2e/utils/test-user-factory.ts:2761-2772`) returns `null` on two silent paths +before reaching its loud `throw`. If the local stack cannot seed them, all 228 skip +quietly and the run is green. That is the failure this baseline exists to catch. + +## Direction matters + +The comparison is deliberately asymmetric: + +- `expected → skipped`, or a test **missing entirely** — coverage **lost**, fails. +- `expected → unexpected`/`flaky` — a real regression, fails. +- `skipped → expected` — a **gain**; reported, allowed. A local stack can legitimately run + something the cloud project could not. + +## Usage + +```bash +# after a run, merge the shards then diff +pnpm exec playwright merge-reports --reporter=json ./all-blob-reports > merged.json +node scripts/e2e-parity-diff.mjs merged.json + +# prove the comparator can still fail before trusting a pass +node scripts/e2e-parity-diff.mjs --selftest +``` + +## Known caveats + +The 194 skips are **not** uniform across browsers — 60 chromium / 70 firefox / 61 webkit. +Those 11 are browser-keyed and port cleanly. The rest are environment-keyed (66 +admin-dashboard, 27 avatar upload, 54 payment) and are the ones that could flip on a +different backend, in **either** direction. At least one is already known to: +`debug/capture-decryption-logs.spec.ts` skips on cloud and is expected to run locally, so +a small `gained` set is anticipated, not a bug. + +**Regenerating this file invalidates every claim that quotes 1807/194/2001** — including +`scripts/__tests__/e2e-parity-diff.test.js`, which asserts those three numbers precisely +so a silent regeneration cannot pass unnoticed. diff --git a/tests/e2e/parity/baseline-de0f7f0.json b/tests/e2e/parity/baseline-de0f7f0.json new file mode 100644 index 00000000..245e3d59 --- /dev/null +++ b/tests/e2e/parity/baseline-de0f7f0.json @@ -0,0 +1,2024 @@ +{ + "_comment": "Per-test baseline from the last green CLOUD E2E run. Captured because the source artifacts expire 2026-08-12T22:13Z and check-run annotations hold only 6 entries, not 2001. See #575.", + "run": 31048279017, + "sha": "de0f7f080c8d75949e4e6c89fdf66ab7d3da8029", + "capturedAt": "2026-08-06", + "backend": "cloud", + "stats": { + "startTime": "2026-08-05T21:39:09.530Z", + "duration": 871695.4850000001, + "expected": 1807, + "skipped": 194, + "unexpected": 0, + "flaky": 0 + }, + "totals": { + "tests": 2001, + "expected": 1807, + "skipped": 194 + }, + "duplicateKeys": [], + "tests": { + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-001: Upload button meets touch target requirements": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-002: Upload button has descriptive ARIA label": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-003: Keyboard navigation - Tab to upload button": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-004: Keyboard navigation - Enter activates upload": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-005: Crop modal traps focus": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-006: Escape key closes crop modal": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-007: Focus restored after closing crop modal": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-008: Error messages announced via aria-live": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-009: Success messages announced via aria-live": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-010: Color contrast meets WCAG AA (4.5:1)": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-011: Remove button has descriptive ARIA label": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-012: Zoom slider has accessible label and value": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-013: Screen reader announces avatar status": "expected", + "chromium-gen|accessibility/avatar-upload.a11y.test.ts|A11y-014: Component has landmark roles": "expected", + "chromium-gen|accessibility/colorblind-toggle.spec.ts|should close dropdown when clicking outside": "expected", + "chromium-gen|accessibility/colorblind-toggle.spec.ts|should close dropdown with Escape key": "expected", + "chromium-gen|accessibility/colorblind-toggle.spec.ts|should maintain focus management in dropdown": "expected", + "chromium-gen|accessibility/colorblind-toggle.spec.ts|should persist selected mode across page navigation": "expected", + "chromium-gen|accessibility/colorblind-toggle.spec.ts|should show pattern toggle when colorblind mode is active": "expected", + "chromium-gen|accessibility/colorblind-toggle.spec.ts|should support keyboard navigation in dropdown": "expected", + "chromium-gen|accessibility/contact-form-keyboard.spec.ts|should allow form submission via keyboard (Enter key)": "expected", + "chromium-gen|accessibility/contact-form-keyboard.spec.ts|should be keyboard navigable with proper tab order": "expected", + "chromium-gen|accessibility/contact-form-keyboard.spec.ts|should maintain focus after validation errors": "expected", + "chromium-gen|accessibility/contact-form-keyboard.spec.ts|should support Shift+Tab for backwards navigation": "expected", + "chromium-gen|admin/admin-conversation-list.spec.ts|flags the seeded >30d conversation as stale, leaves fresh rows unflagged": "skipped", + "chromium-gen|admin/admin-conversation-list.spec.ts|renders all five metadata column headers": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display activity badges": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display anomaly alerts when failed logins exist": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display authentication statistics": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display burst detection cards": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display event log table with rows": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display messaging statistics": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display payment statistics": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display payment trend chart": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display provider breakdown table": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display sparkline trend charts": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display stat cards with non-zero values": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display top senders table": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display users table with data": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should display volume trends": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should expand burst card to show event details": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should filter events by type": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should have working date range filter": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should navigate between all admin tabs": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should search/filter users": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should show retention notice": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should sort event log columns": "skipped", + "chromium-gen|admin/admin-dashboard.spec.ts|should sort users by column": "skipped", + "chromium-gen|admin/admin-depth.spec.ts|/admin/messaging: every table scroller sits in a padded well": "expected", + "chromium-gen|admin/admin-depth.spec.ts|/admin/payments: every table scroller sits in a padded well": "expected", + "chromium-gen|admin/admin-depth.spec.ts|an admin route is reachable at all \u2014 the gate opens for a promoted user": "expected", + "chromium-gen|admin/admin-user-pagination.spec.ts|should disable Next on last page": "skipped", + "chromium-gen|admin/admin-user-pagination.spec.ts|should display pagination when more than PAGE_SIZE users exist": "skipped", + "chromium-gen|admin/admin-user-pagination.spec.ts|should navigate to page 2 and update table rows": "skipped", + "chromium-gen|admin/admin-user-pagination.spec.ts|should search users and reset to page 1": "skipped", + "chromium-gen|admin/admin-user-pagination.spec.ts|should search, page forward, and confirm results update at each step": "skipped", + "chromium-gen|auth/protected-routes.spec.ts|should allow authenticated users to access protected routes": "expected", + "chromium-gen|auth/protected-routes.spec.ts|should enforce RLS policies on payment access": "expected", + "chromium-gen|auth/protected-routes.spec.ts|should handle session expiration gracefully": "expected", + "chromium-gen|auth/protected-routes.spec.ts|should preserve session across page navigation": "expected", + "chromium-gen|auth/protected-routes.spec.ts|should redirect to intended URL after authentication": "expected", + "chromium-gen|auth/protected-routes.spec.ts|should redirect unauthenticated users to sign-in": "expected", + "chromium-gen|auth/protected-routes.spec.ts|should show email verification notice for unverified users": "expected", + "chromium-gen|auth/protected-routes.spec.ts|should verify cascade delete removes related records": "expected", + "chromium-gen|auth/session-persistence.spec.ts|should automatically refresh token before expiration": "expected", + "chromium-gen|auth/session-persistence.spec.ts|should clear session on sign out": "expected", + "chromium-gen|auth/session-persistence.spec.ts|should expire session after maximum duration": "expected", + "chromium-gen|auth/session-persistence.spec.ts|should extend session duration with Remember Me checked": "expected", + "chromium-gen|auth/session-persistence.spec.ts|should handle concurrent tab sessions correctly": "expected", + "chromium-gen|auth/session-persistence.spec.ts|should persist session across browser restarts": "expected", + "chromium-gen|auth/session-persistence.spec.ts|should refresh session automatically on page reload": "expected", + "chromium-gen|auth/session-persistence.spec.ts|should use short session without Remember Me": "expected", + "chromium-gen|auth/user-registration.spec.ts|should complete full registration flow from sign-up to protected access": "skipped", + "chromium-gen|auth/user-registration.spec.ts|should display OAuth buttons on sign-up page": "expected", + "chromium-gen|auth/user-registration.spec.ts|should navigate to sign-in from sign-up page": "expected", + "chromium-gen|auth/user-registration.spec.ts|should show error for password mismatch": "expected", + "chromium-gen|auth/user-registration.spec.ts|should show validation errors for invalid TLD email": "expected", + "chromium-gen|auth/user-registration.spec.ts|should show validation errors for weak password": "expected", + "chromium-gen|avatar/upload.spec.ts|Accessibility: Keyboard navigation": "skipped", + "chromium-gen|avatar/upload.spec.ts|Edge Case: Handle network interruption gracefully": "skipped", + "chromium-gen|avatar/upload.spec.ts|Edge Case: Reject invalid file format": "skipped", + "chromium-gen|avatar/upload.spec.ts|Edge Case: Reject oversized file": "skipped", + "chromium-gen|avatar/upload.spec.ts|US1.1 - Upload new avatar with crop interface": "skipped", + "chromium-gen|avatar/upload.spec.ts|US1.2 - Replace existing avatar": "skipped", + "chromium-gen|avatar/upload.spec.ts|US1.3 - Remove avatar": "skipped", + "chromium-gen|avatar/upload.spec.ts|US1.4 - Cancel crop without saving": "skipped", + "chromium-gen|avatar/upload.spec.ts|US1.5 - Avatar displays in both nav and account page (SC-005)": "skipped", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /__contrast-probe-unmatched-route__/": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /accessibility": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /account": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /account/audit": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/audit": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/email": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/messaging": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/payments": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/users": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/playable-city-chattanooga": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/seo": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/tags": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/tags/digital-twin": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /comment-policy": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /contact": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /cookies": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /docs": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /docs/install-and-first-run": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /forgot-password": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /game": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /game/3d": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /map": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages/new-group": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages/setup": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment-demo": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment-result": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /privacy": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /privacy-controls": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /profile": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /reset-password": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /schedule": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /sign-in": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /sign-up": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /status": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /themes": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /verify-email": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /wireframes": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /__contrast-probe-unmatched-route__/": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /accessibility": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /account": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /account/audit": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/audit": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/email": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/messaging": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/payments": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/users": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/playable-city-chattanooga": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/seo": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/tags": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/tags/digital-twin": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /comment-policy": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /contact": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /cookies": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /docs": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /docs/install-and-first-run": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /forgot-password": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /game": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /game/3d": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /map": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages/new-group": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages/setup": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment-demo": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment-result": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /privacy": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /privacy-controls": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /profile": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /reset-password": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /schedule": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /sign-in": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /sign-up": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /status": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /themes": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /verify-email": "expected", + "chromium-gen|color-contrast.spec.ts|scripthammer-light \u2014 /wireframes": "expected", + "chromium-gen|colorblind-fixed.spec.ts|a fixed element stays viewport-anchored on a scrolled page": "expected", + "chromium-gen|debug/capture-decryption-logs.spec.ts|capture console output from message exchange": "skipped", + "chromium-gen|embed-theme-contrast.spec.ts|acid \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|aqua \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|autumn \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|black \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|bumblebee \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|business \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|cmyk \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|coffee \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|corporate \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|cupcake \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|cyberpunk \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|dark \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|dim \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|dracula \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|emerald \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|fantasy \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|forest \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|garden \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|halloween \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|lemonade \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|light \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|lofi \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|luxury \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|night \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|nord \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|pastel \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|retro \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|scripthammer-dark \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|scripthammer-light \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|sunset \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|synthwave \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|valentine \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|winter \u2014 embed colors legible": "expected", + "chromium-gen|embed-theme-contrast.spec.ts|wireframe \u2014 embed colors legible": "expected", + "chromium-gen|form-label-grid.spec.ts|fields agree with their siblings at 1024px": "expected", + "chromium-gen|form-label-grid.spec.ts|fields agree with their siblings at 1280px": "expected", + "chromium-gen|form-label-grid.spec.ts|fields agree with their siblings at 320px": "expected", + "chromium-gen|form-label-grid.spec.ts|fields agree with their siblings at 390px": "expected", + "chromium-gen|form-label-grid.spec.ts|fields agree with their siblings at 768px": "expected", + "chromium-gen|game-3d.spec.ts|auto-orbit is active when reduced-motion is not set": "expected", + "chromium-gen|game-3d.spec.ts|auto-orbit is disabled when prefers-reduced-motion: reduce": "expected", + "chromium-gen|game-3d.spec.ts|canvas drag triggers a re-render (orbit controls active)": "expected", + "chromium-gen|game-3d.spec.ts|clicking Retry re-runs the WebGL probe (stays in fallback if still unavailable)": "expected", + "chromium-gen|game-3d.spec.ts|mouse drag changes camera position": "expected", + "chromium-gen|game-3d.spec.ts|mouse wheel zoom changes camera position": "expected", + "chromium-gen|game-3d.spec.ts|navigating to /game/3d mounts a element": "expected", + "chromium-gen|game-3d.spec.ts|no SSR errors: page reaches network idle without console.error": "expected", + "chromium-gen|game-3d.spec.ts|page heading and breadcrumb render": "expected", + "chromium-gen|game-3d.spec.ts|rendered content fills available width on mobile viewport without horizontal overflow": "expected", + "chromium-gen|game-3d.spec.ts|renders FallbackPanel when WebGL is unavailable (probe returns null)": "expected", + "chromium-gen|game-3d.spec.ts|switching data-theme on updates the scene mesh color": "expected", + "chromium-gen|game-3d.spec.ts|touch drag changes camera position": "expected", + "chromium-gen|landmarks.spec.ts|/ has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/__landmark-probe-unmatched-route__/ has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/accessibility has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/account has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/account/audit has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/admin has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/admin/audit has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/admin/email has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/admin/messaging has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/admin/payments has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/admin/users has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/blog has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/blog/playable-city-chattanooga has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/blog/seo has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/blog/tags has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/blog/tags/digital-twin has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/comment-policy has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/contact has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/cookies has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/docs has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/docs/install-and-first-run has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/forgot-password has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/game has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/game/3d has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/map has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/messages has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/messages/new-group has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/messages/setup has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/payment has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/payment-demo has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/payment-result has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/privacy has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/privacy-controls has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/profile has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/reset-password has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/schedule has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/sign-in has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/sign-up has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/status has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/themes has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/verify-email has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|/wireframes has one
and a working skip link": "expected", + "chromium-gen|landmarks.spec.ts|the skip link is the first thing keyboard focus reaches, and moves focus into content": "expected", + "chromium-gen|landmarks.spec.ts|the sweep covers every enumerated route": "expected", + "chromium-gen|map.spec.ts|should be responsive on mobile": "expected", + "chromium-gen|map.spec.ts|should display accuracy circle when available": "expected", + "chromium-gen|map.spec.ts|should display custom markers": "expected", + "chromium-gen|map.spec.ts|should display location button when showUserLocation is enabled": "expected", + "chromium-gen|map.spec.ts|should get user location after accepting consent": "expected", + "chromium-gen|map.spec.ts|should handle accessibility requirements": "expected", + "chromium-gen|map.spec.ts|should handle dark mode theme": "expected", + "chromium-gen|map.spec.ts|should handle keyboard navigation": "expected", + "chromium-gen|map.spec.ts|should handle location permission denial": "expected", + "chromium-gen|map.spec.ts|should handle map pan gestures": "expected", + "chromium-gen|map.spec.ts|should handle map zoom controls": "expected", + "chromium-gen|map.spec.ts|should handle rapid location updates": "expected", + "chromium-gen|map.spec.ts|should load map page successfully": "expected", + "chromium-gen|map.spec.ts|should remember consent decision": "expected", + "chromium-gen|map.spec.ts|should show consent modal on first location request": "expected", + "chromium-gen|map.spec.ts|should show marker popups on click": "expected", + "chromium-gen|map.spec.ts|should work offline with cached tiles": "expected", + "chromium-gen|mobile-check.spec.ts|mobile status check": "expected", + "chromium-gen|mobile-dropdown-screenshot.spec.ts|should capture dropdown menu on mobile": "expected", + "chromium-gen|payment/01-stripe-onetime.spec.ts|should allow selecting different payment providers": "expected", + "chromium-gen|payment/01-stripe-onetime.spec.ts|should complete one-time payment successfully": "skipped", + "chromium-gen|payment/01-stripe-onetime.spec.ts|should display error for declined card": "skipped", + "chromium-gen|payment/01-stripe-onetime.spec.ts|should enforce payment consent requirement": "expected", + "chromium-gen|payment/01-stripe-onetime.spec.ts|should handle payment cancellation gracefully": "skipped", + "chromium-gen|payment/01-stripe-onetime.spec.ts|should redirect to subscription-mode Stripe Checkout": "skipped", + "chromium-gen|payment/01-stripe-onetime.spec.ts|should show offline queue indicator when offline": "skipped", + "chromium-gen|payment/01-stripe-onetime.spec.ts|should show payment options after granting consent": "expected", + "chromium-gen|payment/02-paypal-subscription.spec.ts|should allow subscription cancellation": "skipped", + "chromium-gen|payment/02-paypal-subscription.spec.ts|should create PayPal subscription successfully": "skipped", + "chromium-gen|payment/02-paypal-subscription.spec.ts|should handle failed payment retry logic": "skipped", + "chromium-gen|payment/02-paypal-subscription.spec.ts|should prevent duplicate subscriptions": "expected", + "chromium-gen|payment/02-paypal-subscription.spec.ts|should show PayPal payment button": "expected", + "chromium-gen|payment/02-paypal-subscription.spec.ts|should show PayPal provider tab": "expected", + "chromium-gen|payment/02-paypal-subscription.spec.ts|should show grace period warning": "expected", + "chromium-gen|payment/02-paypal-subscription.spec.ts|subscription management route renders for an authed user (#5)": "expected", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should display offline error banner when offline": "expected", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should display retry button for failed payment": "skipped", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should display user-friendly error messages": "skipped", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should expand recovery list at retry_count >= 2": "skipped", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should grant consent and show payment options": "expected", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should log error details for debugging": "skipped", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should mount SwitchProviderPanel when \"Use a different payment method\" is clicked": "skipped", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should offer + run a dunning retry for a past_due subscription": "expected", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should render payment result page with malformed ID": "expected", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should render payment result page with missing session": "expected", + "chromium-gen|payment/03-failed-payment-retry.spec.ts|should show payment demo page correctly": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should allow proceeding after consent": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should allow withdrawing payment consent (GDPR right to withdraw)": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should handle consent decline gracefully": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should have accessible consent buttons": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should not load payment scripts before consent": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should persist consent decision": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should remember consent across page reloads": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should show consent section on first visit": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should show payment options after consent granted": "expected", + "chromium-gen|payment/04-gdpr-consent.spec.ts|should show privacy information": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|queue management UI renders on the payment hub (#4)": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should clear the queue manually": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should drain the queue on Retry (needs live provider)": "skipped", + "chromium-gen|payment/05-offline-queue.spec.ts|should grant consent successfully": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should handle multiple queued payments": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should persist queue across page reloads": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should show Max-retries badge after max attempts": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should show payment demo page": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should show queued items and the Offline badge when offline": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should show retry count on queued items": "expected", + "chromium-gen|payment/05-offline-queue.spec.ts|should warn when device storage is near quota": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should coalesce a burst of updates into an \"N updates\" indicator": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should handle subscription status changes in real-time": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should load payment demo page": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should render a payment trend chart from the user's payments": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should show \"Reconnecting\u2026\" on a channel drop (unit-covered)": "skipped", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should show a realtime connection-status indicator": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should show live transaction counter": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should show payment history section after consent": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should show real-time payment status updates": "skipped", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should surface an error alert when a realtime payment fails": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should update payment list when new payment added": "expected", + "chromium-gen|payment/06-realtime-dashboard.spec.ts|should update webhook verification status in real-time": "skipped", + "chromium-gen|payment/07-performance.spec.ts|should grant consent within reasonable time": "expected", + "chromium-gen|payment/07-performance.spec.ts|should load payment demo page within reasonable time": "expected", + "chromium-gen|payment/08-subscription-lifecycle.spec.ts|cancel and resume round-trip through the deployed Edge Functions": "skipped", + "chromium-gen|security/oauth-csrf.spec.ts|OAuth buttons should be visible and enabled on sign-in page": "expected", + "chromium-gen|security/oauth-csrf.spec.ts|OAuth flow should include required OAuth parameters": "expected", + "chromium-gen|security/oauth-csrf.spec.ts|OAuth redirect should go to correct provider": "expected", + "chromium-gen|security/oauth-csrf.spec.ts|OAuth redirect should include state parameter for CSRF protection": "expected", + "chromium-gen|security/oauth-csrf.spec.ts|OAuth redirect_uri should point to Supabase callback": "expected", + "chromium-gen|security/oauth-csrf.spec.ts|OAuth state parameter should be unique per request": "expected", + "chromium-gen|security/oauth-csrf.spec.ts|different browser sessions should have isolated OAuth state": "expected", + "chromium-gen|security/payment-isolation.spec.ts|Payment buttons require GDPR consent": "expected", + "chromium-gen|security/payment-isolation.spec.ts|Payment history shows only own payments": "expected", + "chromium-gen|security/payment-isolation.spec.ts|Payment intent includes correct user association": "expected", + "chromium-gen|security/payment-isolation.spec.ts|Unauthenticated users see sign-in prompt on payment page": "expected", + "chromium-gen|security/payment-isolation.spec.ts|User A and User B have isolated payment sessions": "expected", + "chromium-gen|tests/accessibility.spec.ts|ARIA landmarks are present": "expected", + "chromium-gen|tests/accessibility.spec.ts|accessibility settings page passes automated checks": "expected", + "chromium-gen|tests/accessibility.spec.ts|all form inputs have labels": "expected", + "chromium-gen|tests/accessibility.spec.ts|all images have alt text": "expected", + "chromium-gen|tests/accessibility.spec.ts|color contrast advisory (axe-core executes successfully)": "expected", + "chromium-gen|tests/accessibility.spec.ts|error messages are associated with form fields": "expected", + "chromium-gen|tests/accessibility.spec.ts|focus indicators are visible": "expected", + "chromium-gen|tests/accessibility.spec.ts|font size controls actually resize text": "expected", + "chromium-gen|tests/accessibility.spec.ts|homepage passes automated accessibility checks": "expected", + "chromium-gen|tests/accessibility.spec.ts|keyboard navigation works throughout the site": "expected", + "chromium-gen|tests/accessibility.spec.ts|links have distinguishable text": "expected", + "chromium-gen|tests/accessibility.spec.ts|page has proper heading hierarchy": "expected", + "chromium-gen|tests/accessibility.spec.ts|reduced motion is respected": "expected", + "chromium-gen|tests/accessibility.spec.ts|sign-in page passes automated accessibility checks": "expected", + "chromium-gen|tests/accessibility.spec.ts|skip to main content link works": "expected", + "chromium-gen|tests/accessibility.spec.ts|themes page passes automated accessibility checks": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should allow code blocks to scroll internally": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should display SEO badge in top-right corner": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should display TOC button in top-right corner": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should display featured image without cropping important content": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should display footer at bottom of page": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should have readable text without zooming": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should have touch-friendly interactive elements": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should maintain layout when scrolling": "expected", + "chromium-gen|tests/blog-mobile-ux-iphone.spec.ts|should not have horizontal scroll on page": "expected", + "chromium-gen|tests/blog-mobile-ux-pixel.spec.ts|should display footer at bottom": "expected", + "chromium-gen|tests/blog-mobile-ux-pixel.spec.ts|should not have horizontal scroll": "expected", + "chromium-gen|tests/blog-touch-targets.spec.ts|Blog list cards have adequate touch targets (44x44px minimum)": "expected", + "chromium-gen|tests/blog-touch-targets.spec.ts|Blog post interactive elements meet 44x44px": "expected", + "chromium-gen|tests/broken-links.spec.ts|check all internal links for 404s": "skipped", + "chromium-gen|tests/broken-links.spec.ts|check meta tag images and resources": "expected", + "chromium-gen|tests/broken-links.spec.ts|check specific known problematic links": "expected", + "chromium-gen|tests/broken-links.spec.ts|validate sitemap entries": "expected", + "chromium-gen|tests/container-width.spec.ts|container fills the viewport at every width below the cap": "expected", + "chromium-gen|tests/container-width.spec.ts|container stops widening at the cap": "expected", + "chromium-gen|tests/container-width.spec.ts|widening the container introduces no horizontal overflow": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|404 page handles non-existent routes": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|active navigation item is highlighted": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|anchor links within pages work": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|breadcrumb navigation works if present": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|browser back/forward navigation works": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|deep linking works correctly": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|external links open in new tab": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|mobile navigation menu works": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|navigate through all main pages": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|navigation menu is consistent across pages": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|navigation menu is keyboard accessible": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|navigation preserves theme selection": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|page transitions are smooth": "expected", + "chromium-gen|tests/cross-page-navigation.spec.ts|scroll position resets on navigation": "expected", + "chromium-gen|tests/depth-tokens.spec.ts|a depth utility beats component styles on the default themes": "expected", + "chromium-gen|tests/depth-tokens.spec.ts|a plate reads as raised and a well as cut, on every theme": "expected", + "chromium-gen|tests/depth-tokens.spec.ts|depth primitives derive from theme colour, not literal black": "expected", + "chromium-gen|tests/depth-tokens.spec.ts|every theme renders depth with at least one visible ink": "expected", + "chromium-gen|tests/depth-tokens.spec.ts|the three depth utilities are emitted": "expected", + "chromium-gen|tests/form-submission.spec.ts|disabled fields cannot be edited": "expected", + "chromium-gen|tests/form-submission.spec.ts|error messages display correctly": "expected", + "chromium-gen|tests/form-submission.spec.ts|form data persists on page reload": "expected", + "chromium-gen|tests/form-submission.spec.ts|form fields have proper labels and ARIA attributes": "expected", + "chromium-gen|tests/form-submission.spec.ts|form fields maintain focus order": "expected", + "chromium-gen|tests/form-submission.spec.ts|form shows loading state during submission": "expected", + "chromium-gen|tests/form-submission.spec.ts|form submission with valid data": "expected", + "chromium-gen|tests/form-submission.spec.ts|form validation prevents submission with invalid data": "expected", + "chromium-gen|tests/form-submission.spec.ts|help text is properly associated with fields": "expected", + "chromium-gen|tests/form-submission.spec.ts|multi-step form navigation works correctly": "expected", + "chromium-gen|tests/form-submission.spec.ts|required fields show indicators": "expected", + "chromium-gen|tests/homepage.spec.ts|GitHub repository link opens in new tab": "skipped", + "chromium-gen|tests/homepage.spec.ts|homepage loads with correct title": "expected", + "chromium-gen|tests/homepage.spec.ts|navigate to game page": "expected", + "chromium-gen|tests/homepage.spec.ts|navigate to storybook page": "expected", + "chromium-gen|tests/homepage.spec.ts|navigate to themes page": "expected", + "chromium-gen|tests/homepage.spec.ts|navigation links in secondary nav work": "expected", + "chromium-gen|tests/homepage.spec.ts|skip to main content link works": "expected", + "chromium-gen|tests/homepage.spec.ts|the four modules are present and numbered": "expected", + "chromium-gen|tests/homepage.spec.ts|the install block shows the Docker path, never npx": "expected", + "chromium-gen|tests/mobile-buttons.spec.ts|All buttons meet 44x44px minimum on mobile": "expected", + "chromium-gen|tests/mobile-buttons.spec.ts|Buttons have 8px minimum spacing": "expected", + "chromium-gen|tests/mobile-card-layout.spec.ts|Cards fit within viewport at all mobile widths": "expected", + "chromium-gen|tests/mobile-card-layout.spec.ts|Cards stack vertically on mobile (320px-767px)": "expected", + "chromium-gen|tests/mobile-card-layout.spec.ts|Cards use grid layout on tablet (768px+)": "expected", + "chromium-gen|tests/mobile-footer.spec.ts|Footer fits within viewport": "expected", + "chromium-gen|tests/mobile-footer.spec.ts|Footer links meet touch target standards": "expected", + "chromium-gen|tests/mobile-footer.spec.ts|Footer links stack vertically on mobile": "expected", + "chromium-gen|tests/mobile-form-inputs.spec.ts|Form fields have adequate spacing": "expected", + "chromium-gen|tests/mobile-form-inputs.spec.ts|Form inputs meet 44px height minimum": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|Images do not cause horizontal overflow": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /accessibility": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /account": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /account/audit": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/audit": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/email": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/messaging": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/payments": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/users": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/playable-city-chattanooga": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/seo": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/tags": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/tags/digital-twin": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /chatt": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /comment-policy": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /contact": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /cookies": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /docs": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /docs/install-and-first-run": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /forgot-password": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /game": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /game/3d": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /map": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages/new-group": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages/setup": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment-demo": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment-result": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /privacy": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /privacy-controls": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /profile": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /reset-password": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /schedule": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /sign-in": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /sign-up": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /status": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /themes": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /verify-email": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /wireframes": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|Pre/code blocks are responsive": "expected", + "chromium-gen|tests/mobile-horizontal-scroll.spec.ts|Tables are responsive on mobile": "expected", + "chromium-gen|tests/mobile-images.spec.ts|Images fit within 320px viewport": "expected", + "chromium-gen|tests/mobile-images.spec.ts|Images fit within 390px viewport": "expected", + "chromium-gen|tests/mobile-images.spec.ts|Images fit within 428px viewport": "expected", + "chromium-gen|tests/mobile-images.spec.ts|Images use lazy loading": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Mobile menu toggle works on narrow viewports": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation adapts to orientation change": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation controls are all visible at 320px (narrowest mobile)": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation fits within Narrow Mobile (320px) viewport (320px)": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 12 Landscape viewport (844px)": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 12 viewport (390px)": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 13 viewport (390px)": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 Pro Max Landscape viewport (926px)": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 Pro Max viewport (428px)": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 viewport (390px)": "expected", + "chromium-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone SE viewport (375px)": "expected", + "chromium-gen|tests/mobile-orientation.spec.ts|Content adapts to orientation without breaking": "expected", + "chromium-gen|tests/mobile-orientation.spec.ts|Orientation change triggers responsive adjustments": "expected", + "chromium-gen|tests/mobile-orientation.spec.ts|Tablet landscape uses tablet/desktop layout": "expected", + "chromium-gen|tests/mobile-orientation.spec.ts|iPhone 12 landscape STAYS in mobile mode (critical test)": "expected", + "chromium-gen|tests/mobile-orientation.spec.ts|iPhone 12 portrait uses mobile styles": "expected", + "chromium-gen|tests/mobile-orientation.spec.ts|matchMedia detects orientation correctly": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|All interactive elements meet 44x44px minimum on iPhone 12": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|Form inputs meet touch target height standards": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|Links in content meet touch target standards": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|Navigation buttons meet touch target standards": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|Touch targets have adequate spacing (8px minimum)": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|Touch targets maintain size across mobile widths": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|desktop nav group menus expose 44px targets (#378)": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|the Demos menu is keyboard operable and Escape restores focus (#378)": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|the Display popover is reachable at every width and its controls meet 44px (#378)": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|the banner spacer reserves the banner\u2019s real height (#457)": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|the cookie banner's OWN controls meet 44px (#457)": "expected", + "chromium-gen|tests/mobile-touch-targets.spec.ts|the mobile menu's own items meet 44px (#378)": "expected", + "chromium-gen|tests/mobile-typography.spec.ts|Body text is readable without zoom (\u226514px minimum)": "expected", + "chromium-gen|tests/mobile-typography.spec.ts|Font sizes scale with viewport using fluid typography": "expected", + "chromium-gen|tests/mobile-typography.spec.ts|Headings scale appropriately on mobile": "expected", + "chromium-gen|tests/mobile-typography.spec.ts|Line height is comfortable (\u22651.5)": "expected", + "chromium-gen|tests/mobile-typography.spec.ts|Small text is avoided or has min-font-size": "expected", + "chromium-gen|tests/mobile-typography.spec.ts|Text does not overflow containers on mobile": "expected", + "chromium-gen|tests/mobile-typography.spec.ts|Text remains readable in landscape orientation": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|PWA install prompt component is present": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|app works offline after service worker activation": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|apple touch icons are present for iOS": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|install button shows on supported browsers": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|manifest contains required PWA fields": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|manifest file is linked correctly": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|maskable icon is provided for Android": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|service worker registers successfully": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|shortcuts are defined in manifest": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|theme color meta tags are valid": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|viewport meta tag is set for mobile": "expected", + "chromium-gen|tests/pwa-installation.spec.ts|web app is installable (Lighthouse PWA criteria)": "expected", + "chromium-gen|tests/theme-switching.spec.ts|all theme buttons are present": "expected", + "chromium-gen|tests/theme-switching.spec.ts|can switch to bumblebee theme": "expected", + "chromium-gen|tests/theme-switching.spec.ts|can switch to corporate theme": "expected", + "chromium-gen|tests/theme-switching.spec.ts|can switch to cupcake theme": "expected", + "chromium-gen|tests/theme-switching.spec.ts|can switch to emerald theme": "expected", + "chromium-gen|tests/theme-switching.spec.ts|can switch to light theme": "expected", + "chromium-gen|tests/theme-switching.spec.ts|localStorage stores theme preference": "expected", + "chromium-gen|tests/theme-switching.spec.ts|switch to dark theme and verify persistence": "expected", + "chromium-gen|tests/theme-switching.spec.ts|switch to light theme and verify persistence": "expected", + "chromium-gen|tests/theme-switching.spec.ts|theme applies to all pages consistently": "expected", + "chromium-gen|tests/theme-switching.spec.ts|theme preview shows correct colors": "expected", + "chromium-gen|tests/theme-switching.spec.ts|theme switcher is accessible from homepage": "expected", + "chromium-gen|tests/theme-switching.spec.ts|theme transition is smooth": "expected", + "chromium-gen|tests/type-scale-truth.spec.ts|a first-time visitor paints at the medium default, not 1": "expected", + "chromium-gen|tests/type-scale-truth.spec.ts|the /docs h1 uses text-5xl at/above sm and text-4xl below": "expected", + "chromium-gen|tests/type-scale-truth.spec.ts|the font scale is applied before hydration, including a stored preference": "expected", + "chromium-gen|tests/type-stack-truth.spec.ts|a stored font preference applies to headings before hydration": "expected", + "chromium-gen|tests/type-stack-truth.spec.ts|body, headings and code render the declared faces": "expected", + "chromium-gen|tests/type-stack-truth.spec.ts|choosing a font replaces the display face on headings": "expected", + "chromium-gen|tests/type-stack-truth.spec.ts|font utilities still override the base heading rule": "expected", + "chromium-gen|tests/type-stack-truth.spec.ts|font variables are declared on :root, not below it": "expected", + "chromium-gen|twin-glass-contrast.spec.ts|nav text clears AAA against ANY backdrop the scene can produce": "expected", + "chromium-gen|twin-glass-contrast.spec.ts|the glass is scoped to twin routes only": "expected", + "chromium-gen|twins.spec.ts|/twins/chatt/?diorama loads the baked manifest and shows the camera dock": "expected", + "chromium-gen|twins.spec.ts|?atlas remains a working alias for links shared before the flip": "expected", + "chromium-gen|twins.spec.ts|?diorama still reaches the exhibit": "expected", + "chromium-gen|twins.spec.ts|Top-down compare mode (#233): dock button + ?ortho render without errors": "expected", + "chromium-gen|twins.spec.ts|exactly one contentinfo landmark, and it carries the real links (#301)": "expected", + "chromium-gen|twins.spec.ts|no unexpected console.error on load": "expected", + "chromium-gen|twins.spec.ts|the HUD is capped in width and wraps rather than clips (#307)": "expected", + "chromium-gen|twins.spec.ts|the R3F canvas mounts when WebGL is available": "expected", + "chromium-gen|twins.spec.ts|the atlas MODULE mounts on /chatt (no WebGL needed)": "expected", + "chromium-gen|twins.spec.ts|the atlas SCENE initialises without erroring": "expected", + "chromium-gen|twins.spec.ts|the atlas keeps its cookie banner and drops the PWA popup (#301)": "expected", + "chromium-gen|twins.spec.ts|the atlas reports a real building count, not an empty scene": "expected", + "chromium-gen|twins.spec.ts|the diorama hides the cookie banner its dock sits under (#301)": "expected", + "chromium-gen|twins.spec.ts|the diorama wordmark is finally out from under the nav (#299)": "expected", + "chromium-gen|twins.spec.ts|the page cannot scroll, so the HUD cannot hide (#301)": "expected", + "chromium-gen|twins.spec.ts|the twin is reachable from normal navigation (homepage demo card)": "expected", + "chromium-gen|twins.spec.ts|the type chip is reachable, even after trying to scroll (#301)": "expected", + "chromium-msg-iso|messaging/complete-user-workflow.spec.ts|Complete messaging workflow: send -> receive -> reply -> verify encryption": "expected", + "chromium-msg-iso|messaging/complete-user-workflow.spec.ts|should load conversations page within 5 seconds (SC-001)": "expected", + "chromium-msg-iso|messaging/complete-user-workflow.spec.ts|should show retry button on error state (FR-005)": "expected", + "chromium-msg-iso|messaging/cross-window-delivery.spec.ts|partner receives a message viewer sends, via the polling effect": "expected", + "chromium-msg-iso|messaging/encrypted-messaging.spec.ts|should load message history with pagination": "expected", + "chromium-msg-iso|messaging/encrypted-messaging.spec.ts|should never send private keys to server": "expected", + "chromium-msg-iso|messaging/encrypted-messaging.spec.ts|should send and receive encrypted message between two users": "expected", + "chromium-msg-iso|messaging/encrypted-messaging.spec.ts|should show delivery status indicators": "expected", + "chromium-msg-iso|messaging/encrypted-messaging.spec.ts|should verify zero-knowledge encryption in database": "expected", + "chromium-msg-iso|messaging/friend-requests.spec.ts|addressee can decline a friend request": "expected", + "chromium-msg-iso|messaging/friend-requests.spec.ts|connections page meets WCAG standards": "expected", + "chromium-msg-iso|messaging/friend-requests.spec.ts|duplicate requests are prevented": "expected", + "chromium-msg-iso|messaging/friend-requests.spec.ts|requester can cancel a sent pending request": "expected", + "chromium-msg-iso|messaging/friend-requests.spec.ts|requester sends friend request and addressee accepts": "expected", + "chromium-msg-iso|messaging/friend-requests.spec.ts|tab navigation works correctly": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should be keyboard navigable (T193)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should close modal on cancel button click (T192)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should delete account and redirect to sign-in (T192)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should export decrypted messages (T191)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should have ARIA live regions for status updates (T193)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should have accessible ARIA attributes (T192)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should open confirmation modal on delete button click (T192)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should require typing \"DELETE\" to enable deletion (T192)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should show account deletion button in account settings (T192)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should show data export button in account settings (T191)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should show error message on deletion failure (T192)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should show error on export failure (T191)": "expected", + "chromium-msg-iso|messaging/gdpr-compliance.spec.ts|should trigger data export download (T191)": "expected", + "chromium-msg-iso|messaging/group-chat-multiuser.spec.ts|contract - isolated connection helper is usable": "expected", + "chromium-msg-iso|messaging/group-chat-multiuser.spec.ts|member A sends an encrypted group message and member B decrypts it": "expected", + "chromium-msg-iso|messaging/group-chat-multiuser.spec.ts|sends and reads an encrypted message in a UI-created group (#182)": "skipped", + "chromium-msg-iso|messaging/group-chat-multiuser.spec.ts|should create group with connected users": "expected", + "chromium-msg-iso|messaging/group-chat-multiuser.spec.ts|should navigate back to messages when clicking back button": "expected", + "chromium-msg-iso|messaging/group-chat-multiuser.spec.ts|should navigate to new-group page and show connections": "expected", + "chromium-msg-iso|messaging/group-chat-multiuser.spec.ts|should show New Group link in sidebar": "expected", + "chromium-msg-iso|messaging/message-delete-placeholder.spec.ts|should show [Message deleted] placeholder and preserve adjacent messages": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|T115: should edit message within 15-minute window": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|T116: should delete message within 15-minute window": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|T117: should not show Edit/Delete buttons for messages older than 15 minutes": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|T130: edit mode should have proper ARIA labels": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|delete confirmation modal should be keyboard navigable": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|delete confirmation modal should have proper ARIA labels": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|should cancel deletion from confirmation modal": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|should cancel edit without saving": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|should disable Save button when content unchanged": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|should not allow editing empty message": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|should not show Edit/Delete buttons on deleted message": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|should not show Edit/Delete buttons on received messages": "expected", + "chromium-msg-iso|messaging/message-editing.spec.ts|should show Edit/Delete buttons only for own recent messages": "expected", + "chromium-msg-iso|messaging/oauth-setup-modal.spec.ts|US-1: OAuth user with no keys sees setup mode": "expected", + "chromium-msg-iso|messaging/oauth-setup-modal.spec.ts|US-2: returning OAuth user sees unlock mode with provider badge": "expected", + "chromium-msg-iso|messaging/oauth-setup-modal.spec.ts|US-3: email user sees unchanged unlock modal (regression)": "expected", + "chromium-msg-iso|messaging/offline-queue-sync.spec.ts|should queue a message offline and sync when reconnected": "expected", + "chromium-msg-iso|messaging/offline-queue.spec.ts|T146: should queue message when offline and send when online": "expected", + "chromium-msg-iso|messaging/offline-queue.spec.ts|T147: should queue multiple messages and sync all when reconnected": "expected", + "chromium-msg-iso|messaging/offline-queue.spec.ts|T148: should retry with exponential backoff on server failure": "expected", + "chromium-msg-iso|messaging/offline-queue.spec.ts|T149: should handle conflict resolution with server timestamp": "expected", + "chromium-msg-iso|messaging/offline-queue.spec.ts|should show failed status after max retries": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|Auto-scroll to bottom on new message": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|Jump to bottom button with smooth scroll": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|Performance monitoring logs for large conversations": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|Scroll position maintained during pagination": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|T166: Performance with 1000 messages - scrolling FPS": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|T167: Pagination loads next 50 messages": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|T169: Keyboard navigation through messages": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|T172b: Virtual scrolling activates at exactly 100 messages": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|Tab navigation to jump to bottom button": "expected", + "chromium-msg-iso|messaging/performance.spec.ts|Virtual scrolling maintains 60fps during rapid scrolling": "expected", + "chromium-msg-iso|messaging/real-time-delivery.spec.ts|should auto-expire typing indicator after 5 seconds": "expected", + "chromium-msg-iso|messaging/real-time-delivery.spec.ts|should deliver message in <500ms between two windows": "expected", + "chromium-msg-iso|messaging/real-time-delivery.spec.ts|should handle rapid message exchanges": "expected", + "chromium-msg-iso|messaging/real-time-delivery.spec.ts|should hide typing indicator when user stops typing": "expected", + "chromium-msg-iso|messaging/real-time-delivery.spec.ts|should remove typing indicator when message is sent": "expected", + "chromium-msg-iso|messaging/real-time-delivery.spec.ts|should show delivery status (sent \u2192 delivered \u2192 read)": "expected", + "chromium-msg-iso|messaging/real-time-delivery.spec.ts|should show multiple typing indicators correctly": "expected", + "chromium-msg-iso|messaging/real-time-delivery.spec.ts|should show typing indicator when user types": "expected", + "chromium-msg|messaging/messaging-scroll.spec.ts|T003: Message input visible on mobile viewport (375x667)": "expected", + "chromium-msg|messaging/messaging-scroll.spec.ts|T004: Message input visible on tablet viewport (768x1024)": "expected", + "chromium-msg|messaging/messaging-scroll.spec.ts|T005: Message input visible on desktop viewport (1280x800)": "expected", + "chromium-msg|messaging/messaging-scroll.spec.ts|T006: Scroll container constrained to MessageThread": "expected", + "chromium-msg|messaging/messaging-scroll.spec.ts|T007-T008: Jump button appears when scrolled and does not overlap input": "expected", + "chromium-msg|messaging/messaging-scroll.spec.ts|T009: Jump button click scrolls to bottom": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-001: Upload button meets touch target requirements": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-002: Upload button has descriptive ARIA label": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-003: Keyboard navigation - Tab to upload button": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-004: Keyboard navigation - Enter activates upload": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-005: Crop modal traps focus": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-006: Escape key closes crop modal": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-007: Focus restored after closing crop modal": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-008: Error messages announced via aria-live": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-009: Success messages announced via aria-live": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-010: Color contrast meets WCAG AA (4.5:1)": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-011: Remove button has descriptive ARIA label": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-012: Zoom slider has accessible label and value": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-013: Screen reader announces avatar status": "expected", + "firefox-gen|accessibility/avatar-upload.a11y.test.ts|A11y-014: Component has landmark roles": "expected", + "firefox-gen|accessibility/colorblind-toggle.spec.ts|should close dropdown when clicking outside": "expected", + "firefox-gen|accessibility/colorblind-toggle.spec.ts|should close dropdown with Escape key": "expected", + "firefox-gen|accessibility/colorblind-toggle.spec.ts|should maintain focus management in dropdown": "expected", + "firefox-gen|accessibility/colorblind-toggle.spec.ts|should persist selected mode across page navigation": "expected", + "firefox-gen|accessibility/colorblind-toggle.spec.ts|should show pattern toggle when colorblind mode is active": "expected", + "firefox-gen|accessibility/colorblind-toggle.spec.ts|should support keyboard navigation in dropdown": "expected", + "firefox-gen|accessibility/contact-form-keyboard.spec.ts|should allow form submission via keyboard (Enter key)": "expected", + "firefox-gen|accessibility/contact-form-keyboard.spec.ts|should be keyboard navigable with proper tab order": "expected", + "firefox-gen|accessibility/contact-form-keyboard.spec.ts|should maintain focus after validation errors": "expected", + "firefox-gen|accessibility/contact-form-keyboard.spec.ts|should support Shift+Tab for backwards navigation": "expected", + "firefox-gen|admin/admin-conversation-list.spec.ts|flags the seeded >30d conversation as stale, leaves fresh rows unflagged": "skipped", + "firefox-gen|admin/admin-conversation-list.spec.ts|renders all five metadata column headers": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display activity badges": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display anomaly alerts when failed logins exist": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display authentication statistics": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display burst detection cards": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display event log table with rows": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display messaging statistics": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display payment statistics": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display payment trend chart": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display provider breakdown table": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display sparkline trend charts": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display stat cards with non-zero values": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display top senders table": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display users table with data": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should display volume trends": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should expand burst card to show event details": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should filter events by type": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should have working date range filter": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should navigate between all admin tabs": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should search/filter users": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should show retention notice": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should sort event log columns": "skipped", + "firefox-gen|admin/admin-dashboard.spec.ts|should sort users by column": "skipped", + "firefox-gen|admin/admin-depth.spec.ts|/admin/messaging: every table scroller sits in a padded well": "expected", + "firefox-gen|admin/admin-depth.spec.ts|/admin/payments: every table scroller sits in a padded well": "expected", + "firefox-gen|admin/admin-depth.spec.ts|an admin route is reachable at all \u2014 the gate opens for a promoted user": "expected", + "firefox-gen|admin/admin-user-pagination.spec.ts|should disable Next on last page": "skipped", + "firefox-gen|admin/admin-user-pagination.spec.ts|should display pagination when more than PAGE_SIZE users exist": "skipped", + "firefox-gen|admin/admin-user-pagination.spec.ts|should navigate to page 2 and update table rows": "skipped", + "firefox-gen|admin/admin-user-pagination.spec.ts|should search users and reset to page 1": "skipped", + "firefox-gen|admin/admin-user-pagination.spec.ts|should search, page forward, and confirm results update at each step": "skipped", + "firefox-gen|auth/protected-routes.spec.ts|should allow authenticated users to access protected routes": "expected", + "firefox-gen|auth/protected-routes.spec.ts|should enforce RLS policies on payment access": "expected", + "firefox-gen|auth/protected-routes.spec.ts|should handle session expiration gracefully": "expected", + "firefox-gen|auth/protected-routes.spec.ts|should preserve session across page navigation": "expected", + "firefox-gen|auth/protected-routes.spec.ts|should redirect to intended URL after authentication": "expected", + "firefox-gen|auth/protected-routes.spec.ts|should redirect unauthenticated users to sign-in": "expected", + "firefox-gen|auth/protected-routes.spec.ts|should show email verification notice for unverified users": "expected", + "firefox-gen|auth/protected-routes.spec.ts|should verify cascade delete removes related records": "expected", + "firefox-gen|auth/session-persistence.spec.ts|should automatically refresh token before expiration": "expected", + "firefox-gen|auth/session-persistence.spec.ts|should clear session on sign out": "expected", + "firefox-gen|auth/session-persistence.spec.ts|should expire session after maximum duration": "expected", + "firefox-gen|auth/session-persistence.spec.ts|should extend session duration with Remember Me checked": "expected", + "firefox-gen|auth/session-persistence.spec.ts|should handle concurrent tab sessions correctly": "expected", + "firefox-gen|auth/session-persistence.spec.ts|should persist session across browser restarts": "expected", + "firefox-gen|auth/session-persistence.spec.ts|should refresh session automatically on page reload": "expected", + "firefox-gen|auth/session-persistence.spec.ts|should use short session without Remember Me": "expected", + "firefox-gen|auth/user-registration.spec.ts|should complete full registration flow from sign-up to protected access": "skipped", + "firefox-gen|auth/user-registration.spec.ts|should display OAuth buttons on sign-up page": "expected", + "firefox-gen|auth/user-registration.spec.ts|should navigate to sign-in from sign-up page": "expected", + "firefox-gen|auth/user-registration.spec.ts|should show error for password mismatch": "expected", + "firefox-gen|auth/user-registration.spec.ts|should show validation errors for invalid TLD email": "expected", + "firefox-gen|auth/user-registration.spec.ts|should show validation errors for weak password": "expected", + "firefox-gen|avatar/upload.spec.ts|Accessibility: Keyboard navigation": "skipped", + "firefox-gen|avatar/upload.spec.ts|Edge Case: Handle network interruption gracefully": "skipped", + "firefox-gen|avatar/upload.spec.ts|Edge Case: Reject invalid file format": "skipped", + "firefox-gen|avatar/upload.spec.ts|Edge Case: Reject oversized file": "skipped", + "firefox-gen|avatar/upload.spec.ts|US1.1 - Upload new avatar with crop interface": "skipped", + "firefox-gen|avatar/upload.spec.ts|US1.2 - Replace existing avatar": "skipped", + "firefox-gen|avatar/upload.spec.ts|US1.3 - Remove avatar": "skipped", + "firefox-gen|avatar/upload.spec.ts|US1.4 - Cancel crop without saving": "skipped", + "firefox-gen|avatar/upload.spec.ts|US1.5 - Avatar displays in both nav and account page (SC-005)": "skipped", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /__contrast-probe-unmatched-route__/": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /accessibility": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /account": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /account/audit": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/audit": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/email": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/messaging": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/payments": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/users": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/playable-city-chattanooga": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/seo": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/tags": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/tags/digital-twin": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /comment-policy": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /contact": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /cookies": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /docs": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /docs/install-and-first-run": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /forgot-password": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /game": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /game/3d": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /map": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages/new-group": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages/setup": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment-demo": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment-result": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /privacy": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /privacy-controls": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /profile": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /reset-password": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /schedule": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /sign-in": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /sign-up": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /status": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /themes": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /verify-email": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /wireframes": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /__contrast-probe-unmatched-route__/": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /accessibility": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /account": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /account/audit": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/audit": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/email": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/messaging": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/payments": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/users": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/playable-city-chattanooga": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/seo": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/tags": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/tags/digital-twin": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /comment-policy": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /contact": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /cookies": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /docs": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /docs/install-and-first-run": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /forgot-password": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /game": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /game/3d": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /map": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages/new-group": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages/setup": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment-demo": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment-result": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /privacy": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /privacy-controls": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /profile": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /reset-password": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /schedule": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /sign-in": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /sign-up": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /status": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /themes": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /verify-email": "expected", + "firefox-gen|color-contrast.spec.ts|scripthammer-light \u2014 /wireframes": "expected", + "firefox-gen|colorblind-fixed.spec.ts|a fixed element stays viewport-anchored on a scrolled page": "expected", + "firefox-gen|debug/capture-decryption-logs.spec.ts|capture console output from message exchange": "skipped", + "firefox-gen|embed-theme-contrast.spec.ts|acid \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|aqua \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|autumn \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|black \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|bumblebee \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|business \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|cmyk \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|coffee \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|corporate \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|cupcake \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|cyberpunk \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|dark \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|dim \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|dracula \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|emerald \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|fantasy \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|forest \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|garden \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|halloween \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|lemonade \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|light \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|lofi \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|luxury \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|night \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|nord \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|pastel \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|retro \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|scripthammer-dark \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|scripthammer-light \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|sunset \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|synthwave \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|valentine \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|winter \u2014 embed colors legible": "expected", + "firefox-gen|embed-theme-contrast.spec.ts|wireframe \u2014 embed colors legible": "expected", + "firefox-gen|form-label-grid.spec.ts|fields agree with their siblings at 1024px": "expected", + "firefox-gen|form-label-grid.spec.ts|fields agree with their siblings at 1280px": "expected", + "firefox-gen|form-label-grid.spec.ts|fields agree with their siblings at 320px": "expected", + "firefox-gen|form-label-grid.spec.ts|fields agree with their siblings at 390px": "expected", + "firefox-gen|form-label-grid.spec.ts|fields agree with their siblings at 768px": "expected", + "firefox-gen|game-3d.spec.ts|auto-orbit is active when reduced-motion is not set": "expected", + "firefox-gen|game-3d.spec.ts|auto-orbit is disabled when prefers-reduced-motion: reduce": "expected", + "firefox-gen|game-3d.spec.ts|canvas drag triggers a re-render (orbit controls active)": "skipped", + "firefox-gen|game-3d.spec.ts|clicking Retry re-runs the WebGL probe (stays in fallback if still unavailable)": "expected", + "firefox-gen|game-3d.spec.ts|mouse drag changes camera position": "skipped", + "firefox-gen|game-3d.spec.ts|mouse wheel zoom changes camera position": "skipped", + "firefox-gen|game-3d.spec.ts|navigating to /game/3d mounts a element": "skipped", + "firefox-gen|game-3d.spec.ts|no SSR errors: page reaches network idle without console.error": "expected", + "firefox-gen|game-3d.spec.ts|page heading and breadcrumb render": "expected", + "firefox-gen|game-3d.spec.ts|rendered content fills available width on mobile viewport without horizontal overflow": "expected", + "firefox-gen|game-3d.spec.ts|renders FallbackPanel when WebGL is unavailable (probe returns null)": "expected", + "firefox-gen|game-3d.spec.ts|switching data-theme on updates the scene mesh color": "expected", + "firefox-gen|game-3d.spec.ts|touch drag changes camera position": "skipped", + "firefox-gen|landmarks.spec.ts|/ has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/__landmark-probe-unmatched-route__/ has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/accessibility has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/account has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/account/audit has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/admin has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/admin/audit has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/admin/email has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/admin/messaging has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/admin/payments has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/admin/users has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/blog has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/blog/playable-city-chattanooga has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/blog/seo has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/blog/tags has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/blog/tags/digital-twin has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/comment-policy has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/contact has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/cookies has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/docs has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/docs/install-and-first-run has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/forgot-password has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/game has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/game/3d has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/map has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/messages has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/messages/new-group has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/messages/setup has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/payment has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/payment-demo has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/payment-result has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/privacy has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/privacy-controls has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/profile has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/reset-password has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/schedule has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/sign-in has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/sign-up has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/status has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/themes has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/verify-email has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|/wireframes has one
and a working skip link": "expected", + "firefox-gen|landmarks.spec.ts|the skip link is the first thing keyboard focus reaches, and moves focus into content": "expected", + "firefox-gen|landmarks.spec.ts|the sweep covers every enumerated route": "expected", + "firefox-gen|map.spec.ts|should be responsive on mobile": "expected", + "firefox-gen|map.spec.ts|should display accuracy circle when available": "expected", + "firefox-gen|map.spec.ts|should display custom markers": "expected", + "firefox-gen|map.spec.ts|should display location button when showUserLocation is enabled": "expected", + "firefox-gen|map.spec.ts|should get user location after accepting consent": "expected", + "firefox-gen|map.spec.ts|should handle accessibility requirements": "expected", + "firefox-gen|map.spec.ts|should handle dark mode theme": "expected", + "firefox-gen|map.spec.ts|should handle keyboard navigation": "expected", + "firefox-gen|map.spec.ts|should handle location permission denial": "expected", + "firefox-gen|map.spec.ts|should handle map pan gestures": "expected", + "firefox-gen|map.spec.ts|should handle map zoom controls": "expected", + "firefox-gen|map.spec.ts|should handle rapid location updates": "expected", + "firefox-gen|map.spec.ts|should load map page successfully": "expected", + "firefox-gen|map.spec.ts|should remember consent decision": "expected", + "firefox-gen|map.spec.ts|should show consent modal on first location request": "expected", + "firefox-gen|map.spec.ts|should show marker popups on click": "expected", + "firefox-gen|map.spec.ts|should work offline with cached tiles": "expected", + "firefox-gen|mobile-check.spec.ts|mobile status check": "expected", + "firefox-gen|mobile-dropdown-screenshot.spec.ts|should capture dropdown menu on mobile": "expected", + "firefox-gen|payment/01-stripe-onetime.spec.ts|should allow selecting different payment providers": "expected", + "firefox-gen|payment/01-stripe-onetime.spec.ts|should complete one-time payment successfully": "skipped", + "firefox-gen|payment/01-stripe-onetime.spec.ts|should display error for declined card": "skipped", + "firefox-gen|payment/01-stripe-onetime.spec.ts|should enforce payment consent requirement": "expected", + "firefox-gen|payment/01-stripe-onetime.spec.ts|should handle payment cancellation gracefully": "skipped", + "firefox-gen|payment/01-stripe-onetime.spec.ts|should redirect to subscription-mode Stripe Checkout": "skipped", + "firefox-gen|payment/01-stripe-onetime.spec.ts|should show offline queue indicator when offline": "skipped", + "firefox-gen|payment/01-stripe-onetime.spec.ts|should show payment options after granting consent": "expected", + "firefox-gen|payment/02-paypal-subscription.spec.ts|should allow subscription cancellation": "skipped", + "firefox-gen|payment/02-paypal-subscription.spec.ts|should create PayPal subscription successfully": "skipped", + "firefox-gen|payment/02-paypal-subscription.spec.ts|should handle failed payment retry logic": "skipped", + "firefox-gen|payment/02-paypal-subscription.spec.ts|should prevent duplicate subscriptions": "expected", + "firefox-gen|payment/02-paypal-subscription.spec.ts|should show PayPal payment button": "expected", + "firefox-gen|payment/02-paypal-subscription.spec.ts|should show PayPal provider tab": "expected", + "firefox-gen|payment/02-paypal-subscription.spec.ts|should show grace period warning": "expected", + "firefox-gen|payment/02-paypal-subscription.spec.ts|subscription management route renders for an authed user (#5)": "expected", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should display offline error banner when offline": "expected", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should display retry button for failed payment": "skipped", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should display user-friendly error messages": "skipped", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should expand recovery list at retry_count >= 2": "skipped", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should grant consent and show payment options": "expected", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should log error details for debugging": "skipped", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should mount SwitchProviderPanel when \"Use a different payment method\" is clicked": "skipped", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should offer + run a dunning retry for a past_due subscription": "expected", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should render payment result page with malformed ID": "expected", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should render payment result page with missing session": "expected", + "firefox-gen|payment/03-failed-payment-retry.spec.ts|should show payment demo page correctly": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should allow proceeding after consent": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should allow withdrawing payment consent (GDPR right to withdraw)": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should handle consent decline gracefully": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should have accessible consent buttons": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should not load payment scripts before consent": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should persist consent decision": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should remember consent across page reloads": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should show consent section on first visit": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should show payment options after consent granted": "expected", + "firefox-gen|payment/04-gdpr-consent.spec.ts|should show privacy information": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|queue management UI renders on the payment hub (#4)": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should clear the queue manually": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should drain the queue on Retry (needs live provider)": "skipped", + "firefox-gen|payment/05-offline-queue.spec.ts|should grant consent successfully": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should handle multiple queued payments": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should persist queue across page reloads": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should show Max-retries badge after max attempts": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should show payment demo page": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should show queued items and the Offline badge when offline": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should show retry count on queued items": "expected", + "firefox-gen|payment/05-offline-queue.spec.ts|should warn when device storage is near quota": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should coalesce a burst of updates into an \"N updates\" indicator": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should handle subscription status changes in real-time": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should load payment demo page": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should render a payment trend chart from the user's payments": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should show \"Reconnecting\u2026\" on a channel drop (unit-covered)": "skipped", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should show a realtime connection-status indicator": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should show live transaction counter": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should show payment history section after consent": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should show real-time payment status updates": "skipped", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should surface an error alert when a realtime payment fails": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should update payment list when new payment added": "expected", + "firefox-gen|payment/06-realtime-dashboard.spec.ts|should update webhook verification status in real-time": "skipped", + "firefox-gen|payment/07-performance.spec.ts|should grant consent within reasonable time": "expected", + "firefox-gen|payment/07-performance.spec.ts|should load payment demo page within reasonable time": "expected", + "firefox-gen|payment/08-subscription-lifecycle.spec.ts|cancel and resume round-trip through the deployed Edge Functions": "skipped", + "firefox-gen|security/oauth-csrf.spec.ts|OAuth buttons should be visible and enabled on sign-in page": "expected", + "firefox-gen|security/oauth-csrf.spec.ts|OAuth flow should include required OAuth parameters": "expected", + "firefox-gen|security/oauth-csrf.spec.ts|OAuth redirect should go to correct provider": "expected", + "firefox-gen|security/oauth-csrf.spec.ts|OAuth redirect should include state parameter for CSRF protection": "expected", + "firefox-gen|security/oauth-csrf.spec.ts|OAuth redirect_uri should point to Supabase callback": "expected", + "firefox-gen|security/oauth-csrf.spec.ts|OAuth state parameter should be unique per request": "expected", + "firefox-gen|security/oauth-csrf.spec.ts|different browser sessions should have isolated OAuth state": "expected", + "firefox-gen|security/payment-isolation.spec.ts|Payment buttons require GDPR consent": "expected", + "firefox-gen|security/payment-isolation.spec.ts|Payment history shows only own payments": "expected", + "firefox-gen|security/payment-isolation.spec.ts|Payment intent includes correct user association": "expected", + "firefox-gen|security/payment-isolation.spec.ts|Unauthenticated users see sign-in prompt on payment page": "expected", + "firefox-gen|security/payment-isolation.spec.ts|User A and User B have isolated payment sessions": "expected", + "firefox-gen|tests/accessibility.spec.ts|ARIA landmarks are present": "expected", + "firefox-gen|tests/accessibility.spec.ts|accessibility settings page passes automated checks": "expected", + "firefox-gen|tests/accessibility.spec.ts|all form inputs have labels": "expected", + "firefox-gen|tests/accessibility.spec.ts|all images have alt text": "expected", + "firefox-gen|tests/accessibility.spec.ts|color contrast advisory (axe-core executes successfully)": "expected", + "firefox-gen|tests/accessibility.spec.ts|error messages are associated with form fields": "expected", + "firefox-gen|tests/accessibility.spec.ts|focus indicators are visible": "expected", + "firefox-gen|tests/accessibility.spec.ts|font size controls actually resize text": "expected", + "firefox-gen|tests/accessibility.spec.ts|homepage passes automated accessibility checks": "expected", + "firefox-gen|tests/accessibility.spec.ts|keyboard navigation works throughout the site": "expected", + "firefox-gen|tests/accessibility.spec.ts|links have distinguishable text": "expected", + "firefox-gen|tests/accessibility.spec.ts|page has proper heading hierarchy": "expected", + "firefox-gen|tests/accessibility.spec.ts|reduced motion is respected": "expected", + "firefox-gen|tests/accessibility.spec.ts|sign-in page passes automated accessibility checks": "expected", + "firefox-gen|tests/accessibility.spec.ts|skip to main content link works": "expected", + "firefox-gen|tests/accessibility.spec.ts|themes page passes automated accessibility checks": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should allow code blocks to scroll internally": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should display SEO badge in top-right corner": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should display TOC button in top-right corner": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should display featured image without cropping important content": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should display footer at bottom of page": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should have readable text without zooming": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should have touch-friendly interactive elements": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should maintain layout when scrolling": "expected", + "firefox-gen|tests/blog-mobile-ux-iphone.spec.ts|should not have horizontal scroll on page": "expected", + "firefox-gen|tests/blog-mobile-ux-pixel.spec.ts|should display footer at bottom": "expected", + "firefox-gen|tests/blog-mobile-ux-pixel.spec.ts|should not have horizontal scroll": "expected", + "firefox-gen|tests/blog-touch-targets.spec.ts|Blog list cards have adequate touch targets (44x44px minimum)": "expected", + "firefox-gen|tests/blog-touch-targets.spec.ts|Blog post interactive elements meet 44x44px": "expected", + "firefox-gen|tests/broken-links.spec.ts|check all internal links for 404s": "skipped", + "firefox-gen|tests/broken-links.spec.ts|check meta tag images and resources": "expected", + "firefox-gen|tests/broken-links.spec.ts|check specific known problematic links": "expected", + "firefox-gen|tests/broken-links.spec.ts|validate sitemap entries": "expected", + "firefox-gen|tests/container-width.spec.ts|container fills the viewport at every width below the cap": "expected", + "firefox-gen|tests/container-width.spec.ts|container stops widening at the cap": "expected", + "firefox-gen|tests/container-width.spec.ts|widening the container introduces no horizontal overflow": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|404 page handles non-existent routes": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|active navigation item is highlighted": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|anchor links within pages work": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|breadcrumb navigation works if present": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|browser back/forward navigation works": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|deep linking works correctly": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|external links open in new tab": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|mobile navigation menu works": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|navigate through all main pages": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|navigation menu is consistent across pages": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|navigation menu is keyboard accessible": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|navigation preserves theme selection": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|page transitions are smooth": "expected", + "firefox-gen|tests/cross-page-navigation.spec.ts|scroll position resets on navigation": "expected", + "firefox-gen|tests/depth-tokens.spec.ts|a depth utility beats component styles on the default themes": "expected", + "firefox-gen|tests/depth-tokens.spec.ts|a plate reads as raised and a well as cut, on every theme": "expected", + "firefox-gen|tests/depth-tokens.spec.ts|depth primitives derive from theme colour, not literal black": "expected", + "firefox-gen|tests/depth-tokens.spec.ts|every theme renders depth with at least one visible ink": "expected", + "firefox-gen|tests/depth-tokens.spec.ts|the three depth utilities are emitted": "expected", + "firefox-gen|tests/form-submission.spec.ts|disabled fields cannot be edited": "expected", + "firefox-gen|tests/form-submission.spec.ts|error messages display correctly": "expected", + "firefox-gen|tests/form-submission.spec.ts|form data persists on page reload": "expected", + "firefox-gen|tests/form-submission.spec.ts|form fields have proper labels and ARIA attributes": "expected", + "firefox-gen|tests/form-submission.spec.ts|form fields maintain focus order": "expected", + "firefox-gen|tests/form-submission.spec.ts|form shows loading state during submission": "expected", + "firefox-gen|tests/form-submission.spec.ts|form submission with valid data": "expected", + "firefox-gen|tests/form-submission.spec.ts|form validation prevents submission with invalid data": "expected", + "firefox-gen|tests/form-submission.spec.ts|help text is properly associated with fields": "expected", + "firefox-gen|tests/form-submission.spec.ts|multi-step form navigation works correctly": "expected", + "firefox-gen|tests/form-submission.spec.ts|required fields show indicators": "expected", + "firefox-gen|tests/homepage.spec.ts|GitHub repository link opens in new tab": "skipped", + "firefox-gen|tests/homepage.spec.ts|homepage loads with correct title": "expected", + "firefox-gen|tests/homepage.spec.ts|navigate to game page": "expected", + "firefox-gen|tests/homepage.spec.ts|navigate to storybook page": "expected", + "firefox-gen|tests/homepage.spec.ts|navigate to themes page": "expected", + "firefox-gen|tests/homepage.spec.ts|navigation links in secondary nav work": "expected", + "firefox-gen|tests/homepage.spec.ts|skip to main content link works": "expected", + "firefox-gen|tests/homepage.spec.ts|the four modules are present and numbered": "expected", + "firefox-gen|tests/homepage.spec.ts|the install block shows the Docker path, never npx": "expected", + "firefox-gen|tests/mobile-buttons.spec.ts|All buttons meet 44x44px minimum on mobile": "expected", + "firefox-gen|tests/mobile-buttons.spec.ts|Buttons have 8px minimum spacing": "expected", + "firefox-gen|tests/mobile-card-layout.spec.ts|Cards fit within viewport at all mobile widths": "expected", + "firefox-gen|tests/mobile-card-layout.spec.ts|Cards stack vertically on mobile (320px-767px)": "expected", + "firefox-gen|tests/mobile-card-layout.spec.ts|Cards use grid layout on tablet (768px+)": "expected", + "firefox-gen|tests/mobile-footer.spec.ts|Footer fits within viewport": "expected", + "firefox-gen|tests/mobile-footer.spec.ts|Footer links meet touch target standards": "expected", + "firefox-gen|tests/mobile-footer.spec.ts|Footer links stack vertically on mobile": "expected", + "firefox-gen|tests/mobile-form-inputs.spec.ts|Form fields have adequate spacing": "expected", + "firefox-gen|tests/mobile-form-inputs.spec.ts|Form inputs meet 44px height minimum": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|Images do not cause horizontal overflow": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /accessibility": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /account": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /account/audit": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/audit": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/email": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/messaging": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/payments": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/users": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/playable-city-chattanooga": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/seo": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/tags": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/tags/digital-twin": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /chatt": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /comment-policy": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /contact": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /cookies": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /docs": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /docs/install-and-first-run": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /forgot-password": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /game": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /game/3d": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /map": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages/new-group": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages/setup": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment-demo": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment-result": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /privacy": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /privacy-controls": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /profile": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /reset-password": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /schedule": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /sign-in": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /sign-up": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /status": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /themes": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /verify-email": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /wireframes": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|Pre/code blocks are responsive": "expected", + "firefox-gen|tests/mobile-horizontal-scroll.spec.ts|Tables are responsive on mobile": "expected", + "firefox-gen|tests/mobile-images.spec.ts|Images fit within 320px viewport": "expected", + "firefox-gen|tests/mobile-images.spec.ts|Images fit within 390px viewport": "expected", + "firefox-gen|tests/mobile-images.spec.ts|Images fit within 428px viewport": "expected", + "firefox-gen|tests/mobile-images.spec.ts|Images use lazy loading": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Mobile menu toggle works on narrow viewports": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation adapts to orientation change": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation controls are all visible at 320px (narrowest mobile)": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation fits within Narrow Mobile (320px) viewport (320px)": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 12 Landscape viewport (844px)": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 12 viewport (390px)": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 13 viewport (390px)": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 Pro Max Landscape viewport (926px)": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 Pro Max viewport (428px)": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 viewport (390px)": "expected", + "firefox-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone SE viewport (375px)": "expected", + "firefox-gen|tests/mobile-orientation.spec.ts|Content adapts to orientation without breaking": "expected", + "firefox-gen|tests/mobile-orientation.spec.ts|Orientation change triggers responsive adjustments": "expected", + "firefox-gen|tests/mobile-orientation.spec.ts|Tablet landscape uses tablet/desktop layout": "expected", + "firefox-gen|tests/mobile-orientation.spec.ts|iPhone 12 landscape STAYS in mobile mode (critical test)": "expected", + "firefox-gen|tests/mobile-orientation.spec.ts|iPhone 12 portrait uses mobile styles": "expected", + "firefox-gen|tests/mobile-orientation.spec.ts|matchMedia detects orientation correctly": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|All interactive elements meet 44x44px minimum on iPhone 12": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|Form inputs meet touch target height standards": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|Links in content meet touch target standards": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|Navigation buttons meet touch target standards": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|Touch targets have adequate spacing (8px minimum)": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|Touch targets maintain size across mobile widths": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|desktop nav group menus expose 44px targets (#378)": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|the Demos menu is keyboard operable and Escape restores focus (#378)": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|the Display popover is reachable at every width and its controls meet 44px (#378)": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|the banner spacer reserves the banner\u2019s real height (#457)": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|the cookie banner's OWN controls meet 44px (#457)": "expected", + "firefox-gen|tests/mobile-touch-targets.spec.ts|the mobile menu's own items meet 44px (#378)": "expected", + "firefox-gen|tests/mobile-typography.spec.ts|Body text is readable without zoom (\u226514px minimum)": "expected", + "firefox-gen|tests/mobile-typography.spec.ts|Font sizes scale with viewport using fluid typography": "expected", + "firefox-gen|tests/mobile-typography.spec.ts|Headings scale appropriately on mobile": "expected", + "firefox-gen|tests/mobile-typography.spec.ts|Line height is comfortable (\u22651.5)": "expected", + "firefox-gen|tests/mobile-typography.spec.ts|Small text is avoided or has min-font-size": "expected", + "firefox-gen|tests/mobile-typography.spec.ts|Text does not overflow containers on mobile": "expected", + "firefox-gen|tests/mobile-typography.spec.ts|Text remains readable in landscape orientation": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|PWA install prompt component is present": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|app works offline after service worker activation": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|apple touch icons are present for iOS": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|install button shows on supported browsers": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|manifest contains required PWA fields": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|manifest file is linked correctly": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|maskable icon is provided for Android": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|service worker registers successfully": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|shortcuts are defined in manifest": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|theme color meta tags are valid": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|viewport meta tag is set for mobile": "expected", + "firefox-gen|tests/pwa-installation.spec.ts|web app is installable (Lighthouse PWA criteria)": "expected", + "firefox-gen|tests/theme-switching.spec.ts|all theme buttons are present": "expected", + "firefox-gen|tests/theme-switching.spec.ts|can switch to bumblebee theme": "expected", + "firefox-gen|tests/theme-switching.spec.ts|can switch to corporate theme": "expected", + "firefox-gen|tests/theme-switching.spec.ts|can switch to cupcake theme": "expected", + "firefox-gen|tests/theme-switching.spec.ts|can switch to emerald theme": "expected", + "firefox-gen|tests/theme-switching.spec.ts|can switch to light theme": "expected", + "firefox-gen|tests/theme-switching.spec.ts|localStorage stores theme preference": "expected", + "firefox-gen|tests/theme-switching.spec.ts|switch to dark theme and verify persistence": "expected", + "firefox-gen|tests/theme-switching.spec.ts|switch to light theme and verify persistence": "expected", + "firefox-gen|tests/theme-switching.spec.ts|theme applies to all pages consistently": "expected", + "firefox-gen|tests/theme-switching.spec.ts|theme preview shows correct colors": "expected", + "firefox-gen|tests/theme-switching.spec.ts|theme switcher is accessible from homepage": "expected", + "firefox-gen|tests/theme-switching.spec.ts|theme transition is smooth": "expected", + "firefox-gen|tests/type-scale-truth.spec.ts|a first-time visitor paints at the medium default, not 1": "expected", + "firefox-gen|tests/type-scale-truth.spec.ts|the /docs h1 uses text-5xl at/above sm and text-4xl below": "expected", + "firefox-gen|tests/type-scale-truth.spec.ts|the font scale is applied before hydration, including a stored preference": "expected", + "firefox-gen|tests/type-stack-truth.spec.ts|a stored font preference applies to headings before hydration": "expected", + "firefox-gen|tests/type-stack-truth.spec.ts|body, headings and code render the declared faces": "expected", + "firefox-gen|tests/type-stack-truth.spec.ts|choosing a font replaces the display face on headings": "expected", + "firefox-gen|tests/type-stack-truth.spec.ts|font utilities still override the base heading rule": "expected", + "firefox-gen|tests/type-stack-truth.spec.ts|font variables are declared on :root, not below it": "expected", + "firefox-gen|twin-glass-contrast.spec.ts|nav text clears AAA against ANY backdrop the scene can produce": "expected", + "firefox-gen|twin-glass-contrast.spec.ts|the glass is scoped to twin routes only": "expected", + "firefox-gen|twins.spec.ts|/twins/chatt/?diorama loads the baked manifest and shows the camera dock": "expected", + "firefox-gen|twins.spec.ts|?atlas remains a working alias for links shared before the flip": "expected", + "firefox-gen|twins.spec.ts|?diorama still reaches the exhibit": "expected", + "firefox-gen|twins.spec.ts|Top-down compare mode (#233): dock button + ?ortho render without errors": "skipped", + "firefox-gen|twins.spec.ts|exactly one contentinfo landmark, and it carries the real links (#301)": "expected", + "firefox-gen|twins.spec.ts|no unexpected console.error on load": "expected", + "firefox-gen|twins.spec.ts|the HUD is capped in width and wraps rather than clips (#307)": "expected", + "firefox-gen|twins.spec.ts|the R3F canvas mounts when WebGL is available": "skipped", + "firefox-gen|twins.spec.ts|the atlas MODULE mounts on /chatt (no WebGL needed)": "expected", + "firefox-gen|twins.spec.ts|the atlas SCENE initialises without erroring": "skipped", + "firefox-gen|twins.spec.ts|the atlas keeps its cookie banner and drops the PWA popup (#301)": "expected", + "firefox-gen|twins.spec.ts|the atlas reports a real building count, not an empty scene": "skipped", + "firefox-gen|twins.spec.ts|the diorama hides the cookie banner its dock sits under (#301)": "expected", + "firefox-gen|twins.spec.ts|the diorama wordmark is finally out from under the nav (#299)": "expected", + "firefox-gen|twins.spec.ts|the page cannot scroll, so the HUD cannot hide (#301)": "expected", + "firefox-gen|twins.spec.ts|the twin is reachable from normal navigation (homepage demo card)": "expected", + "firefox-gen|twins.spec.ts|the type chip is reachable, even after trying to scroll (#301)": "skipped", + "firefox-msg-iso|messaging/complete-user-workflow.spec.ts|Complete messaging workflow: send -> receive -> reply -> verify encryption": "expected", + "firefox-msg-iso|messaging/complete-user-workflow.spec.ts|should load conversations page within 5 seconds (SC-001)": "expected", + "firefox-msg-iso|messaging/complete-user-workflow.spec.ts|should show retry button on error state (FR-005)": "expected", + "firefox-msg-iso|messaging/cross-window-delivery.spec.ts|partner receives a message viewer sends, via the polling effect": "expected", + "firefox-msg-iso|messaging/encrypted-messaging.spec.ts|should load message history with pagination": "expected", + "firefox-msg-iso|messaging/encrypted-messaging.spec.ts|should never send private keys to server": "expected", + "firefox-msg-iso|messaging/encrypted-messaging.spec.ts|should send and receive encrypted message between two users": "expected", + "firefox-msg-iso|messaging/encrypted-messaging.spec.ts|should show delivery status indicators": "expected", + "firefox-msg-iso|messaging/encrypted-messaging.spec.ts|should verify zero-knowledge encryption in database": "expected", + "firefox-msg-iso|messaging/friend-requests.spec.ts|addressee can decline a friend request": "expected", + "firefox-msg-iso|messaging/friend-requests.spec.ts|connections page meets WCAG standards": "expected", + "firefox-msg-iso|messaging/friend-requests.spec.ts|duplicate requests are prevented": "expected", + "firefox-msg-iso|messaging/friend-requests.spec.ts|requester can cancel a sent pending request": "expected", + "firefox-msg-iso|messaging/friend-requests.spec.ts|requester sends friend request and addressee accepts": "expected", + "firefox-msg-iso|messaging/friend-requests.spec.ts|tab navigation works correctly": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should be keyboard navigable (T193)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should close modal on cancel button click (T192)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should delete account and redirect to sign-in (T192)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should export decrypted messages (T191)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should have ARIA live regions for status updates (T193)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should have accessible ARIA attributes (T192)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should open confirmation modal on delete button click (T192)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should require typing \"DELETE\" to enable deletion (T192)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should show account deletion button in account settings (T192)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should show data export button in account settings (T191)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should show error message on deletion failure (T192)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should show error on export failure (T191)": "expected", + "firefox-msg-iso|messaging/gdpr-compliance.spec.ts|should trigger data export download (T191)": "expected", + "firefox-msg-iso|messaging/group-chat-multiuser.spec.ts|contract - isolated connection helper is usable": "expected", + "firefox-msg-iso|messaging/group-chat-multiuser.spec.ts|member A sends an encrypted group message and member B decrypts it": "expected", + "firefox-msg-iso|messaging/group-chat-multiuser.spec.ts|sends and reads an encrypted message in a UI-created group (#182)": "skipped", + "firefox-msg-iso|messaging/group-chat-multiuser.spec.ts|should create group with connected users": "expected", + "firefox-msg-iso|messaging/group-chat-multiuser.spec.ts|should navigate back to messages when clicking back button": "expected", + "firefox-msg-iso|messaging/group-chat-multiuser.spec.ts|should navigate to new-group page and show connections": "expected", + "firefox-msg-iso|messaging/group-chat-multiuser.spec.ts|should show New Group link in sidebar": "expected", + "firefox-msg-iso|messaging/message-delete-placeholder.spec.ts|should show [Message deleted] placeholder and preserve adjacent messages": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|T115: should edit message within 15-minute window": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|T116: should delete message within 15-minute window": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|T117: should not show Edit/Delete buttons for messages older than 15 minutes": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|T130: edit mode should have proper ARIA labels": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|delete confirmation modal should be keyboard navigable": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|delete confirmation modal should have proper ARIA labels": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|should cancel deletion from confirmation modal": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|should cancel edit without saving": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|should disable Save button when content unchanged": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|should not allow editing empty message": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|should not show Edit/Delete buttons on deleted message": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|should not show Edit/Delete buttons on received messages": "expected", + "firefox-msg-iso|messaging/message-editing.spec.ts|should show Edit/Delete buttons only for own recent messages": "expected", + "firefox-msg-iso|messaging/oauth-setup-modal.spec.ts|US-1: OAuth user with no keys sees setup mode": "expected", + "firefox-msg-iso|messaging/oauth-setup-modal.spec.ts|US-2: returning OAuth user sees unlock mode with provider badge": "expected", + "firefox-msg-iso|messaging/oauth-setup-modal.spec.ts|US-3: email user sees unchanged unlock modal (regression)": "expected", + "firefox-msg-iso|messaging/offline-queue-sync.spec.ts|should queue a message offline and sync when reconnected": "expected", + "firefox-msg-iso|messaging/offline-queue.spec.ts|T146: should queue message when offline and send when online": "expected", + "firefox-msg-iso|messaging/offline-queue.spec.ts|T147: should queue multiple messages and sync all when reconnected": "expected", + "firefox-msg-iso|messaging/offline-queue.spec.ts|T148: should retry with exponential backoff on server failure": "expected", + "firefox-msg-iso|messaging/offline-queue.spec.ts|T149: should handle conflict resolution with server timestamp": "expected", + "firefox-msg-iso|messaging/offline-queue.spec.ts|should show failed status after max retries": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|Auto-scroll to bottom on new message": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|Jump to bottom button with smooth scroll": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|Performance monitoring logs for large conversations": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|Scroll position maintained during pagination": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|T166: Performance with 1000 messages - scrolling FPS": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|T167: Pagination loads next 50 messages": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|T169: Keyboard navigation through messages": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|T172b: Virtual scrolling activates at exactly 100 messages": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|Tab navigation to jump to bottom button": "expected", + "firefox-msg-iso|messaging/performance.spec.ts|Virtual scrolling maintains 60fps during rapid scrolling": "expected", + "firefox-msg-iso|messaging/real-time-delivery.spec.ts|should auto-expire typing indicator after 5 seconds": "expected", + "firefox-msg-iso|messaging/real-time-delivery.spec.ts|should deliver message in <500ms between two windows": "expected", + "firefox-msg-iso|messaging/real-time-delivery.spec.ts|should handle rapid message exchanges": "expected", + "firefox-msg-iso|messaging/real-time-delivery.spec.ts|should hide typing indicator when user stops typing": "expected", + "firefox-msg-iso|messaging/real-time-delivery.spec.ts|should remove typing indicator when message is sent": "expected", + "firefox-msg-iso|messaging/real-time-delivery.spec.ts|should show delivery status (sent \u2192 delivered \u2192 read)": "expected", + "firefox-msg-iso|messaging/real-time-delivery.spec.ts|should show multiple typing indicators correctly": "expected", + "firefox-msg-iso|messaging/real-time-delivery.spec.ts|should show typing indicator when user types": "expected", + "firefox-msg|messaging/messaging-scroll.spec.ts|T003: Message input visible on mobile viewport (375x667)": "expected", + "firefox-msg|messaging/messaging-scroll.spec.ts|T004: Message input visible on tablet viewport (768x1024)": "expected", + "firefox-msg|messaging/messaging-scroll.spec.ts|T005: Message input visible on desktop viewport (1280x800)": "expected", + "firefox-msg|messaging/messaging-scroll.spec.ts|T006: Scroll container constrained to MessageThread": "expected", + "firefox-msg|messaging/messaging-scroll.spec.ts|T007-T008: Jump button appears when scrolled and does not overlap input": "expected", + "firefox-msg|messaging/messaging-scroll.spec.ts|T009: Jump button click scrolls to bottom": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-001: Upload button meets touch target requirements": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-002: Upload button has descriptive ARIA label": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-003: Keyboard navigation - Tab to upload button": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-004: Keyboard navigation - Enter activates upload": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-005: Crop modal traps focus": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-006: Escape key closes crop modal": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-007: Focus restored after closing crop modal": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-008: Error messages announced via aria-live": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-009: Success messages announced via aria-live": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-010: Color contrast meets WCAG AA (4.5:1)": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-011: Remove button has descriptive ARIA label": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-012: Zoom slider has accessible label and value": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-013: Screen reader announces avatar status": "expected", + "webkit-gen|accessibility/avatar-upload.a11y.test.ts|A11y-014: Component has landmark roles": "expected", + "webkit-gen|accessibility/colorblind-toggle.spec.ts|should close dropdown when clicking outside": "expected", + "webkit-gen|accessibility/colorblind-toggle.spec.ts|should close dropdown with Escape key": "expected", + "webkit-gen|accessibility/colorblind-toggle.spec.ts|should maintain focus management in dropdown": "expected", + "webkit-gen|accessibility/colorblind-toggle.spec.ts|should persist selected mode across page navigation": "expected", + "webkit-gen|accessibility/colorblind-toggle.spec.ts|should show pattern toggle when colorblind mode is active": "expected", + "webkit-gen|accessibility/colorblind-toggle.spec.ts|should support keyboard navigation in dropdown": "expected", + "webkit-gen|accessibility/contact-form-keyboard.spec.ts|should allow form submission via keyboard (Enter key)": "expected", + "webkit-gen|accessibility/contact-form-keyboard.spec.ts|should be keyboard navigable with proper tab order": "expected", + "webkit-gen|accessibility/contact-form-keyboard.spec.ts|should maintain focus after validation errors": "expected", + "webkit-gen|accessibility/contact-form-keyboard.spec.ts|should support Shift+Tab for backwards navigation": "expected", + "webkit-gen|admin/admin-conversation-list.spec.ts|flags the seeded >30d conversation as stale, leaves fresh rows unflagged": "skipped", + "webkit-gen|admin/admin-conversation-list.spec.ts|renders all five metadata column headers": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display activity badges": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display anomaly alerts when failed logins exist": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display authentication statistics": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display burst detection cards": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display event log table with rows": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display messaging statistics": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display payment statistics": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display payment trend chart": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display provider breakdown table": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display sparkline trend charts": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display stat cards with non-zero values": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display top senders table": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display users table with data": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should display volume trends": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should expand burst card to show event details": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should filter events by type": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should have working date range filter": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should navigate between all admin tabs": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should search/filter users": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should show retention notice": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should sort event log columns": "skipped", + "webkit-gen|admin/admin-dashboard.spec.ts|should sort users by column": "skipped", + "webkit-gen|admin/admin-depth.spec.ts|/admin/messaging: every table scroller sits in a padded well": "expected", + "webkit-gen|admin/admin-depth.spec.ts|/admin/payments: every table scroller sits in a padded well": "expected", + "webkit-gen|admin/admin-depth.spec.ts|an admin route is reachable at all \u2014 the gate opens for a promoted user": "expected", + "webkit-gen|admin/admin-user-pagination.spec.ts|should disable Next on last page": "skipped", + "webkit-gen|admin/admin-user-pagination.spec.ts|should display pagination when more than PAGE_SIZE users exist": "skipped", + "webkit-gen|admin/admin-user-pagination.spec.ts|should navigate to page 2 and update table rows": "skipped", + "webkit-gen|admin/admin-user-pagination.spec.ts|should search users and reset to page 1": "skipped", + "webkit-gen|admin/admin-user-pagination.spec.ts|should search, page forward, and confirm results update at each step": "skipped", + "webkit-gen|auth/protected-routes.spec.ts|should allow authenticated users to access protected routes": "expected", + "webkit-gen|auth/protected-routes.spec.ts|should enforce RLS policies on payment access": "expected", + "webkit-gen|auth/protected-routes.spec.ts|should handle session expiration gracefully": "expected", + "webkit-gen|auth/protected-routes.spec.ts|should preserve session across page navigation": "expected", + "webkit-gen|auth/protected-routes.spec.ts|should redirect to intended URL after authentication": "expected", + "webkit-gen|auth/protected-routes.spec.ts|should redirect unauthenticated users to sign-in": "expected", + "webkit-gen|auth/protected-routes.spec.ts|should show email verification notice for unverified users": "expected", + "webkit-gen|auth/protected-routes.spec.ts|should verify cascade delete removes related records": "expected", + "webkit-gen|auth/session-persistence.spec.ts|should automatically refresh token before expiration": "expected", + "webkit-gen|auth/session-persistence.spec.ts|should clear session on sign out": "expected", + "webkit-gen|auth/session-persistence.spec.ts|should expire session after maximum duration": "expected", + "webkit-gen|auth/session-persistence.spec.ts|should extend session duration with Remember Me checked": "expected", + "webkit-gen|auth/session-persistence.spec.ts|should handle concurrent tab sessions correctly": "expected", + "webkit-gen|auth/session-persistence.spec.ts|should persist session across browser restarts": "expected", + "webkit-gen|auth/session-persistence.spec.ts|should refresh session automatically on page reload": "expected", + "webkit-gen|auth/session-persistence.spec.ts|should use short session without Remember Me": "expected", + "webkit-gen|auth/user-registration.spec.ts|should complete full registration flow from sign-up to protected access": "skipped", + "webkit-gen|auth/user-registration.spec.ts|should display OAuth buttons on sign-up page": "expected", + "webkit-gen|auth/user-registration.spec.ts|should navigate to sign-in from sign-up page": "expected", + "webkit-gen|auth/user-registration.spec.ts|should show error for password mismatch": "expected", + "webkit-gen|auth/user-registration.spec.ts|should show validation errors for invalid TLD email": "expected", + "webkit-gen|auth/user-registration.spec.ts|should show validation errors for weak password": "expected", + "webkit-gen|avatar/upload.spec.ts|Accessibility: Keyboard navigation": "skipped", + "webkit-gen|avatar/upload.spec.ts|Edge Case: Handle network interruption gracefully": "skipped", + "webkit-gen|avatar/upload.spec.ts|Edge Case: Reject invalid file format": "skipped", + "webkit-gen|avatar/upload.spec.ts|Edge Case: Reject oversized file": "skipped", + "webkit-gen|avatar/upload.spec.ts|US1.1 - Upload new avatar with crop interface": "skipped", + "webkit-gen|avatar/upload.spec.ts|US1.2 - Replace existing avatar": "skipped", + "webkit-gen|avatar/upload.spec.ts|US1.3 - Remove avatar": "skipped", + "webkit-gen|avatar/upload.spec.ts|US1.4 - Cancel crop without saving": "skipped", + "webkit-gen|avatar/upload.spec.ts|US1.5 - Avatar displays in both nav and account page (SC-005)": "skipped", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /__contrast-probe-unmatched-route__/": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /accessibility": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /account": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /account/audit": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/audit": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/email": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/messaging": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/payments": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /admin/users": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/playable-city-chattanooga": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/seo": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/tags": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /blog/tags/digital-twin": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /comment-policy": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /contact": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /cookies": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /docs": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /docs/install-and-first-run": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /forgot-password": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /game": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /game/3d": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /map": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages/new-group": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /messages/setup": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment-demo": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /payment-result": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /privacy": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /privacy-controls": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /profile": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /reset-password": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /schedule": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /sign-in": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /sign-up": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /status": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /themes": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /verify-email": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-dark \u2014 /wireframes": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /__contrast-probe-unmatched-route__/": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /accessibility": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /account": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /account/audit": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/audit": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/email": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/messaging": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/payments": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /admin/users": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/playable-city-chattanooga": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/seo": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/tags": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /blog/tags/digital-twin": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /comment-policy": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /contact": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /cookies": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /docs": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /docs/install-and-first-run": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /forgot-password": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /game": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /game/3d": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /map": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages/new-group": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /messages/setup": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment-demo": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /payment-result": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /privacy": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /privacy-controls": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /profile": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /reset-password": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /schedule": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /sign-in": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /sign-up": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /status": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /themes": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /verify-email": "expected", + "webkit-gen|color-contrast.spec.ts|scripthammer-light \u2014 /wireframes": "expected", + "webkit-gen|colorblind-fixed.spec.ts|a fixed element stays viewport-anchored on a scrolled page": "expected", + "webkit-gen|debug/capture-decryption-logs.spec.ts|capture console output from message exchange": "skipped", + "webkit-gen|embed-theme-contrast.spec.ts|acid \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|aqua \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|autumn \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|black \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|bumblebee \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|business \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|cmyk \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|coffee \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|corporate \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|cupcake \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|cyberpunk \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|dark \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|dim \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|dracula \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|emerald \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|fantasy \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|forest \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|garden \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|halloween \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|lemonade \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|light \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|lofi \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|luxury \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|night \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|nord \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|pastel \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|retro \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|scripthammer-dark \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|scripthammer-light \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|sunset \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|synthwave \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|valentine \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|winter \u2014 embed colors legible": "expected", + "webkit-gen|embed-theme-contrast.spec.ts|wireframe \u2014 embed colors legible": "expected", + "webkit-gen|form-label-grid.spec.ts|fields agree with their siblings at 1024px": "expected", + "webkit-gen|form-label-grid.spec.ts|fields agree with their siblings at 1280px": "expected", + "webkit-gen|form-label-grid.spec.ts|fields agree with their siblings at 320px": "expected", + "webkit-gen|form-label-grid.spec.ts|fields agree with their siblings at 390px": "expected", + "webkit-gen|form-label-grid.spec.ts|fields agree with their siblings at 768px": "expected", + "webkit-gen|game-3d.spec.ts|auto-orbit is active when reduced-motion is not set": "expected", + "webkit-gen|game-3d.spec.ts|auto-orbit is disabled when prefers-reduced-motion: reduce": "expected", + "webkit-gen|game-3d.spec.ts|canvas drag triggers a re-render (orbit controls active)": "expected", + "webkit-gen|game-3d.spec.ts|clicking Retry re-runs the WebGL probe (stays in fallback if still unavailable)": "expected", + "webkit-gen|game-3d.spec.ts|mouse drag changes camera position": "expected", + "webkit-gen|game-3d.spec.ts|mouse wheel zoom changes camera position": "expected", + "webkit-gen|game-3d.spec.ts|navigating to /game/3d mounts a element": "expected", + "webkit-gen|game-3d.spec.ts|no SSR errors: page reaches network idle without console.error": "expected", + "webkit-gen|game-3d.spec.ts|page heading and breadcrumb render": "expected", + "webkit-gen|game-3d.spec.ts|rendered content fills available width on mobile viewport without horizontal overflow": "expected", + "webkit-gen|game-3d.spec.ts|renders FallbackPanel when WebGL is unavailable (probe returns null)": "expected", + "webkit-gen|game-3d.spec.ts|switching data-theme on updates the scene mesh color": "expected", + "webkit-gen|game-3d.spec.ts|touch drag changes camera position": "expected", + "webkit-gen|landmarks.spec.ts|/ has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/__landmark-probe-unmatched-route__/ has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/accessibility has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/account has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/account/audit has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/admin has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/admin/audit has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/admin/email has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/admin/messaging has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/admin/payments has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/admin/users has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/blog has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/blog/playable-city-chattanooga has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/blog/seo has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/blog/tags has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/blog/tags/digital-twin has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/comment-policy has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/contact has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/cookies has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/docs has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/docs/install-and-first-run has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/forgot-password has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/game has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/game/3d has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/map has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/messages has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/messages/new-group has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/messages/setup has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/payment has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/payment-demo has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/payment-result has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/privacy has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/privacy-controls has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/profile has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/reset-password has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/schedule has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/sign-in has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/sign-up has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/status has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/themes has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/verify-email has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|/wireframes has one
and a working skip link": "expected", + "webkit-gen|landmarks.spec.ts|the skip link is the first thing keyboard focus reaches, and moves focus into content": "expected", + "webkit-gen|landmarks.spec.ts|the sweep covers every enumerated route": "expected", + "webkit-gen|map.spec.ts|should be responsive on mobile": "expected", + "webkit-gen|map.spec.ts|should display accuracy circle when available": "expected", + "webkit-gen|map.spec.ts|should display custom markers": "expected", + "webkit-gen|map.spec.ts|should display location button when showUserLocation is enabled": "expected", + "webkit-gen|map.spec.ts|should get user location after accepting consent": "expected", + "webkit-gen|map.spec.ts|should handle accessibility requirements": "expected", + "webkit-gen|map.spec.ts|should handle dark mode theme": "expected", + "webkit-gen|map.spec.ts|should handle keyboard navigation": "expected", + "webkit-gen|map.spec.ts|should handle location permission denial": "expected", + "webkit-gen|map.spec.ts|should handle map pan gestures": "expected", + "webkit-gen|map.spec.ts|should handle map zoom controls": "expected", + "webkit-gen|map.spec.ts|should handle rapid location updates": "expected", + "webkit-gen|map.spec.ts|should load map page successfully": "expected", + "webkit-gen|map.spec.ts|should remember consent decision": "expected", + "webkit-gen|map.spec.ts|should show consent modal on first location request": "expected", + "webkit-gen|map.spec.ts|should show marker popups on click": "expected", + "webkit-gen|map.spec.ts|should work offline with cached tiles": "expected", + "webkit-gen|mobile-check.spec.ts|mobile status check": "expected", + "webkit-gen|mobile-dropdown-screenshot.spec.ts|should capture dropdown menu on mobile": "expected", + "webkit-gen|payment/01-stripe-onetime.spec.ts|should allow selecting different payment providers": "expected", + "webkit-gen|payment/01-stripe-onetime.spec.ts|should complete one-time payment successfully": "skipped", + "webkit-gen|payment/01-stripe-onetime.spec.ts|should display error for declined card": "skipped", + "webkit-gen|payment/01-stripe-onetime.spec.ts|should enforce payment consent requirement": "expected", + "webkit-gen|payment/01-stripe-onetime.spec.ts|should handle payment cancellation gracefully": "skipped", + "webkit-gen|payment/01-stripe-onetime.spec.ts|should redirect to subscription-mode Stripe Checkout": "skipped", + "webkit-gen|payment/01-stripe-onetime.spec.ts|should show offline queue indicator when offline": "skipped", + "webkit-gen|payment/01-stripe-onetime.spec.ts|should show payment options after granting consent": "expected", + "webkit-gen|payment/02-paypal-subscription.spec.ts|should allow subscription cancellation": "skipped", + "webkit-gen|payment/02-paypal-subscription.spec.ts|should create PayPal subscription successfully": "skipped", + "webkit-gen|payment/02-paypal-subscription.spec.ts|should handle failed payment retry logic": "skipped", + "webkit-gen|payment/02-paypal-subscription.spec.ts|should prevent duplicate subscriptions": "expected", + "webkit-gen|payment/02-paypal-subscription.spec.ts|should show PayPal payment button": "expected", + "webkit-gen|payment/02-paypal-subscription.spec.ts|should show PayPal provider tab": "expected", + "webkit-gen|payment/02-paypal-subscription.spec.ts|should show grace period warning": "expected", + "webkit-gen|payment/02-paypal-subscription.spec.ts|subscription management route renders for an authed user (#5)": "expected", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should display offline error banner when offline": "expected", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should display retry button for failed payment": "skipped", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should display user-friendly error messages": "skipped", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should expand recovery list at retry_count >= 2": "skipped", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should grant consent and show payment options": "expected", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should log error details for debugging": "skipped", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should mount SwitchProviderPanel when \"Use a different payment method\" is clicked": "skipped", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should offer + run a dunning retry for a past_due subscription": "expected", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should render payment result page with malformed ID": "expected", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should render payment result page with missing session": "expected", + "webkit-gen|payment/03-failed-payment-retry.spec.ts|should show payment demo page correctly": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should allow proceeding after consent": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should allow withdrawing payment consent (GDPR right to withdraw)": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should handle consent decline gracefully": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should have accessible consent buttons": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should not load payment scripts before consent": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should persist consent decision": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should remember consent across page reloads": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should show consent section on first visit": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should show payment options after consent granted": "expected", + "webkit-gen|payment/04-gdpr-consent.spec.ts|should show privacy information": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|queue management UI renders on the payment hub (#4)": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should clear the queue manually": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should drain the queue on Retry (needs live provider)": "skipped", + "webkit-gen|payment/05-offline-queue.spec.ts|should grant consent successfully": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should handle multiple queued payments": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should persist queue across page reloads": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should show Max-retries badge after max attempts": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should show payment demo page": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should show queued items and the Offline badge when offline": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should show retry count on queued items": "expected", + "webkit-gen|payment/05-offline-queue.spec.ts|should warn when device storage is near quota": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should coalesce a burst of updates into an \"N updates\" indicator": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should handle subscription status changes in real-time": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should load payment demo page": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should render a payment trend chart from the user's payments": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should show \"Reconnecting\u2026\" on a channel drop (unit-covered)": "skipped", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should show a realtime connection-status indicator": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should show live transaction counter": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should show payment history section after consent": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should show real-time payment status updates": "skipped", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should surface an error alert when a realtime payment fails": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should update payment list when new payment added": "expected", + "webkit-gen|payment/06-realtime-dashboard.spec.ts|should update webhook verification status in real-time": "skipped", + "webkit-gen|payment/07-performance.spec.ts|should grant consent within reasonable time": "expected", + "webkit-gen|payment/07-performance.spec.ts|should load payment demo page within reasonable time": "expected", + "webkit-gen|payment/08-subscription-lifecycle.spec.ts|cancel and resume round-trip through the deployed Edge Functions": "skipped", + "webkit-gen|security/oauth-csrf.spec.ts|OAuth buttons should be visible and enabled on sign-in page": "expected", + "webkit-gen|security/oauth-csrf.spec.ts|OAuth flow should include required OAuth parameters": "expected", + "webkit-gen|security/oauth-csrf.spec.ts|OAuth redirect should go to correct provider": "expected", + "webkit-gen|security/oauth-csrf.spec.ts|OAuth redirect should include state parameter for CSRF protection": "expected", + "webkit-gen|security/oauth-csrf.spec.ts|OAuth redirect_uri should point to Supabase callback": "expected", + "webkit-gen|security/oauth-csrf.spec.ts|OAuth state parameter should be unique per request": "expected", + "webkit-gen|security/oauth-csrf.spec.ts|different browser sessions should have isolated OAuth state": "expected", + "webkit-gen|security/payment-isolation.spec.ts|Payment buttons require GDPR consent": "expected", + "webkit-gen|security/payment-isolation.spec.ts|Payment history shows only own payments": "expected", + "webkit-gen|security/payment-isolation.spec.ts|Payment intent includes correct user association": "expected", + "webkit-gen|security/payment-isolation.spec.ts|Unauthenticated users see sign-in prompt on payment page": "expected", + "webkit-gen|security/payment-isolation.spec.ts|User A and User B have isolated payment sessions": "expected", + "webkit-gen|tests/accessibility.spec.ts|ARIA landmarks are present": "expected", + "webkit-gen|tests/accessibility.spec.ts|accessibility settings page passes automated checks": "expected", + "webkit-gen|tests/accessibility.spec.ts|all form inputs have labels": "expected", + "webkit-gen|tests/accessibility.spec.ts|all images have alt text": "expected", + "webkit-gen|tests/accessibility.spec.ts|color contrast advisory (axe-core executes successfully)": "expected", + "webkit-gen|tests/accessibility.spec.ts|error messages are associated with form fields": "expected", + "webkit-gen|tests/accessibility.spec.ts|focus indicators are visible": "expected", + "webkit-gen|tests/accessibility.spec.ts|font size controls actually resize text": "expected", + "webkit-gen|tests/accessibility.spec.ts|homepage passes automated accessibility checks": "expected", + "webkit-gen|tests/accessibility.spec.ts|keyboard navigation works throughout the site": "expected", + "webkit-gen|tests/accessibility.spec.ts|links have distinguishable text": "expected", + "webkit-gen|tests/accessibility.spec.ts|page has proper heading hierarchy": "expected", + "webkit-gen|tests/accessibility.spec.ts|reduced motion is respected": "expected", + "webkit-gen|tests/accessibility.spec.ts|sign-in page passes automated accessibility checks": "expected", + "webkit-gen|tests/accessibility.spec.ts|skip to main content link works": "expected", + "webkit-gen|tests/accessibility.spec.ts|themes page passes automated accessibility checks": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should allow code blocks to scroll internally": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should display SEO badge in top-right corner": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should display TOC button in top-right corner": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should display featured image without cropping important content": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should display footer at bottom of page": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should have readable text without zooming": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should have touch-friendly interactive elements": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should maintain layout when scrolling": "expected", + "webkit-gen|tests/blog-mobile-ux-iphone.spec.ts|should not have horizontal scroll on page": "expected", + "webkit-gen|tests/blog-mobile-ux-pixel.spec.ts|should display footer at bottom": "expected", + "webkit-gen|tests/blog-mobile-ux-pixel.spec.ts|should not have horizontal scroll": "expected", + "webkit-gen|tests/blog-touch-targets.spec.ts|Blog list cards have adequate touch targets (44x44px minimum)": "expected", + "webkit-gen|tests/blog-touch-targets.spec.ts|Blog post interactive elements meet 44x44px": "expected", + "webkit-gen|tests/broken-links.spec.ts|check all internal links for 404s": "skipped", + "webkit-gen|tests/broken-links.spec.ts|check meta tag images and resources": "expected", + "webkit-gen|tests/broken-links.spec.ts|check specific known problematic links": "expected", + "webkit-gen|tests/broken-links.spec.ts|validate sitemap entries": "expected", + "webkit-gen|tests/container-width.spec.ts|container fills the viewport at every width below the cap": "expected", + "webkit-gen|tests/container-width.spec.ts|container stops widening at the cap": "expected", + "webkit-gen|tests/container-width.spec.ts|widening the container introduces no horizontal overflow": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|404 page handles non-existent routes": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|active navigation item is highlighted": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|anchor links within pages work": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|breadcrumb navigation works if present": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|browser back/forward navigation works": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|deep linking works correctly": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|external links open in new tab": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|mobile navigation menu works": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|navigate through all main pages": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|navigation menu is consistent across pages": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|navigation menu is keyboard accessible": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|navigation preserves theme selection": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|page transitions are smooth": "expected", + "webkit-gen|tests/cross-page-navigation.spec.ts|scroll position resets on navigation": "expected", + "webkit-gen|tests/depth-tokens.spec.ts|a depth utility beats component styles on the default themes": "expected", + "webkit-gen|tests/depth-tokens.spec.ts|a plate reads as raised and a well as cut, on every theme": "expected", + "webkit-gen|tests/depth-tokens.spec.ts|depth primitives derive from theme colour, not literal black": "expected", + "webkit-gen|tests/depth-tokens.spec.ts|every theme renders depth with at least one visible ink": "expected", + "webkit-gen|tests/depth-tokens.spec.ts|the three depth utilities are emitted": "expected", + "webkit-gen|tests/form-submission.spec.ts|disabled fields cannot be edited": "expected", + "webkit-gen|tests/form-submission.spec.ts|error messages display correctly": "expected", + "webkit-gen|tests/form-submission.spec.ts|form data persists on page reload": "expected", + "webkit-gen|tests/form-submission.spec.ts|form fields have proper labels and ARIA attributes": "expected", + "webkit-gen|tests/form-submission.spec.ts|form fields maintain focus order": "expected", + "webkit-gen|tests/form-submission.spec.ts|form shows loading state during submission": "expected", + "webkit-gen|tests/form-submission.spec.ts|form submission with valid data": "expected", + "webkit-gen|tests/form-submission.spec.ts|form validation prevents submission with invalid data": "expected", + "webkit-gen|tests/form-submission.spec.ts|help text is properly associated with fields": "expected", + "webkit-gen|tests/form-submission.spec.ts|multi-step form navigation works correctly": "expected", + "webkit-gen|tests/form-submission.spec.ts|required fields show indicators": "expected", + "webkit-gen|tests/homepage.spec.ts|GitHub repository link opens in new tab": "skipped", + "webkit-gen|tests/homepage.spec.ts|homepage loads with correct title": "expected", + "webkit-gen|tests/homepage.spec.ts|navigate to game page": "expected", + "webkit-gen|tests/homepage.spec.ts|navigate to storybook page": "expected", + "webkit-gen|tests/homepage.spec.ts|navigate to themes page": "expected", + "webkit-gen|tests/homepage.spec.ts|navigation links in secondary nav work": "expected", + "webkit-gen|tests/homepage.spec.ts|skip to main content link works": "expected", + "webkit-gen|tests/homepage.spec.ts|the four modules are present and numbered": "expected", + "webkit-gen|tests/homepage.spec.ts|the install block shows the Docker path, never npx": "expected", + "webkit-gen|tests/mobile-buttons.spec.ts|All buttons meet 44x44px minimum on mobile": "expected", + "webkit-gen|tests/mobile-buttons.spec.ts|Buttons have 8px minimum spacing": "expected", + "webkit-gen|tests/mobile-card-layout.spec.ts|Cards fit within viewport at all mobile widths": "expected", + "webkit-gen|tests/mobile-card-layout.spec.ts|Cards stack vertically on mobile (320px-767px)": "expected", + "webkit-gen|tests/mobile-card-layout.spec.ts|Cards use grid layout on tablet (768px+)": "expected", + "webkit-gen|tests/mobile-footer.spec.ts|Footer fits within viewport": "expected", + "webkit-gen|tests/mobile-footer.spec.ts|Footer links meet touch target standards": "expected", + "webkit-gen|tests/mobile-footer.spec.ts|Footer links stack vertically on mobile": "expected", + "webkit-gen|tests/mobile-form-inputs.spec.ts|Form fields have adequate spacing": "expected", + "webkit-gen|tests/mobile-form-inputs.spec.ts|Form inputs meet 44px height minimum": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|Images do not cause horizontal overflow": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /accessibility": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /account": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /account/audit": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/audit": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/email": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/messaging": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/payments": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /admin/users": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/playable-city-chattanooga": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/seo": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/tags": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /blog/tags/digital-twin": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /chatt": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /comment-policy": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /contact": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /cookies": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /docs": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /docs/install-and-first-run": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /forgot-password": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /game": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /game/3d": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /map": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages/new-group": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /messages/setup": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment-demo": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /payment-result": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /privacy": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /privacy-controls": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /profile": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /reset-password": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /schedule": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /sign-in": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /sign-up": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /status": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /themes": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /verify-email": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|No horizontal overflow on /wireframes": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|Pre/code blocks are responsive": "expected", + "webkit-gen|tests/mobile-horizontal-scroll.spec.ts|Tables are responsive on mobile": "expected", + "webkit-gen|tests/mobile-images.spec.ts|Images fit within 320px viewport": "expected", + "webkit-gen|tests/mobile-images.spec.ts|Images fit within 390px viewport": "expected", + "webkit-gen|tests/mobile-images.spec.ts|Images fit within 428px viewport": "expected", + "webkit-gen|tests/mobile-images.spec.ts|Images use lazy loading": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Mobile menu toggle works on narrow viewports": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation adapts to orientation change": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation controls are all visible at 320px (narrowest mobile)": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation fits within Narrow Mobile (320px) viewport (320px)": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 12 Landscape viewport (844px)": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 12 viewport (390px)": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 13 viewport (390px)": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 Pro Max Landscape viewport (926px)": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 Pro Max viewport (428px)": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone 14 viewport (390px)": "expected", + "webkit-gen|tests/mobile-navigation.spec.ts|Navigation fits within iPhone SE viewport (375px)": "expected", + "webkit-gen|tests/mobile-orientation.spec.ts|Content adapts to orientation without breaking": "expected", + "webkit-gen|tests/mobile-orientation.spec.ts|Orientation change triggers responsive adjustments": "expected", + "webkit-gen|tests/mobile-orientation.spec.ts|Tablet landscape uses tablet/desktop layout": "expected", + "webkit-gen|tests/mobile-orientation.spec.ts|iPhone 12 landscape STAYS in mobile mode (critical test)": "expected", + "webkit-gen|tests/mobile-orientation.spec.ts|iPhone 12 portrait uses mobile styles": "expected", + "webkit-gen|tests/mobile-orientation.spec.ts|matchMedia detects orientation correctly": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|All interactive elements meet 44x44px minimum on iPhone 12": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|Form inputs meet touch target height standards": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|Links in content meet touch target standards": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|Navigation buttons meet touch target standards": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|Touch targets have adequate spacing (8px minimum)": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|Touch targets maintain size across mobile widths": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|desktop nav group menus expose 44px targets (#378)": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|the Demos menu is keyboard operable and Escape restores focus (#378)": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|the Display popover is reachable at every width and its controls meet 44px (#378)": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|the banner spacer reserves the banner\u2019s real height (#457)": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|the cookie banner's OWN controls meet 44px (#457)": "expected", + "webkit-gen|tests/mobile-touch-targets.spec.ts|the mobile menu's own items meet 44px (#378)": "expected", + "webkit-gen|tests/mobile-typography.spec.ts|Body text is readable without zoom (\u226514px minimum)": "expected", + "webkit-gen|tests/mobile-typography.spec.ts|Font sizes scale with viewport using fluid typography": "expected", + "webkit-gen|tests/mobile-typography.spec.ts|Headings scale appropriately on mobile": "expected", + "webkit-gen|tests/mobile-typography.spec.ts|Line height is comfortable (\u22651.5)": "expected", + "webkit-gen|tests/mobile-typography.spec.ts|Small text is avoided or has min-font-size": "expected", + "webkit-gen|tests/mobile-typography.spec.ts|Text does not overflow containers on mobile": "expected", + "webkit-gen|tests/mobile-typography.spec.ts|Text remains readable in landscape orientation": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|PWA install prompt component is present": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|app works offline after service worker activation": "skipped", + "webkit-gen|tests/pwa-installation.spec.ts|apple touch icons are present for iOS": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|install button shows on supported browsers": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|manifest contains required PWA fields": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|manifest file is linked correctly": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|maskable icon is provided for Android": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|service worker registers successfully": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|shortcuts are defined in manifest": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|theme color meta tags are valid": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|viewport meta tag is set for mobile": "expected", + "webkit-gen|tests/pwa-installation.spec.ts|web app is installable (Lighthouse PWA criteria)": "expected", + "webkit-gen|tests/theme-switching.spec.ts|all theme buttons are present": "expected", + "webkit-gen|tests/theme-switching.spec.ts|can switch to bumblebee theme": "expected", + "webkit-gen|tests/theme-switching.spec.ts|can switch to corporate theme": "expected", + "webkit-gen|tests/theme-switching.spec.ts|can switch to cupcake theme": "expected", + "webkit-gen|tests/theme-switching.spec.ts|can switch to emerald theme": "expected", + "webkit-gen|tests/theme-switching.spec.ts|can switch to light theme": "expected", + "webkit-gen|tests/theme-switching.spec.ts|localStorage stores theme preference": "expected", + "webkit-gen|tests/theme-switching.spec.ts|switch to dark theme and verify persistence": "expected", + "webkit-gen|tests/theme-switching.spec.ts|switch to light theme and verify persistence": "expected", + "webkit-gen|tests/theme-switching.spec.ts|theme applies to all pages consistently": "expected", + "webkit-gen|tests/theme-switching.spec.ts|theme preview shows correct colors": "expected", + "webkit-gen|tests/theme-switching.spec.ts|theme switcher is accessible from homepage": "expected", + "webkit-gen|tests/theme-switching.spec.ts|theme transition is smooth": "expected", + "webkit-gen|tests/type-scale-truth.spec.ts|a first-time visitor paints at the medium default, not 1": "expected", + "webkit-gen|tests/type-scale-truth.spec.ts|the /docs h1 uses text-5xl at/above sm and text-4xl below": "expected", + "webkit-gen|tests/type-scale-truth.spec.ts|the font scale is applied before hydration, including a stored preference": "expected", + "webkit-gen|tests/type-stack-truth.spec.ts|a stored font preference applies to headings before hydration": "expected", + "webkit-gen|tests/type-stack-truth.spec.ts|body, headings and code render the declared faces": "expected", + "webkit-gen|tests/type-stack-truth.spec.ts|choosing a font replaces the display face on headings": "expected", + "webkit-gen|tests/type-stack-truth.spec.ts|font utilities still override the base heading rule": "expected", + "webkit-gen|tests/type-stack-truth.spec.ts|font variables are declared on :root, not below it": "expected", + "webkit-gen|twin-glass-contrast.spec.ts|nav text clears AAA against ANY backdrop the scene can produce": "expected", + "webkit-gen|twin-glass-contrast.spec.ts|the glass is scoped to twin routes only": "expected", + "webkit-gen|twins.spec.ts|/twins/chatt/?diorama loads the baked manifest and shows the camera dock": "expected", + "webkit-gen|twins.spec.ts|?atlas remains a working alias for links shared before the flip": "expected", + "webkit-gen|twins.spec.ts|?diorama still reaches the exhibit": "expected", + "webkit-gen|twins.spec.ts|Top-down compare mode (#233): dock button + ?ortho render without errors": "expected", + "webkit-gen|twins.spec.ts|exactly one contentinfo landmark, and it carries the real links (#301)": "expected", + "webkit-gen|twins.spec.ts|no unexpected console.error on load": "expected", + "webkit-gen|twins.spec.ts|the HUD is capped in width and wraps rather than clips (#307)": "expected", + "webkit-gen|twins.spec.ts|the R3F canvas mounts when WebGL is available": "expected", + "webkit-gen|twins.spec.ts|the atlas MODULE mounts on /chatt (no WebGL needed)": "expected", + "webkit-gen|twins.spec.ts|the atlas SCENE initialises without erroring": "expected", + "webkit-gen|twins.spec.ts|the atlas keeps its cookie banner and drops the PWA popup (#301)": "expected", + "webkit-gen|twins.spec.ts|the atlas reports a real building count, not an empty scene": "expected", + "webkit-gen|twins.spec.ts|the diorama hides the cookie banner its dock sits under (#301)": "expected", + "webkit-gen|twins.spec.ts|the diorama wordmark is finally out from under the nav (#299)": "expected", + "webkit-gen|twins.spec.ts|the page cannot scroll, so the HUD cannot hide (#301)": "expected", + "webkit-gen|twins.spec.ts|the twin is reachable from normal navigation (homepage demo card)": "expected", + "webkit-gen|twins.spec.ts|the type chip is reachable, even after trying to scroll (#301)": "expected", + "webkit-msg-iso|messaging/complete-user-workflow.spec.ts|Complete messaging workflow: send -> receive -> reply -> verify encryption": "expected", + "webkit-msg-iso|messaging/complete-user-workflow.spec.ts|should load conversations page within 5 seconds (SC-001)": "expected", + "webkit-msg-iso|messaging/complete-user-workflow.spec.ts|should show retry button on error state (FR-005)": "expected", + "webkit-msg-iso|messaging/cross-window-delivery.spec.ts|partner receives a message viewer sends, via the polling effect": "expected", + "webkit-msg-iso|messaging/encrypted-messaging.spec.ts|should load message history with pagination": "expected", + "webkit-msg-iso|messaging/encrypted-messaging.spec.ts|should never send private keys to server": "expected", + "webkit-msg-iso|messaging/encrypted-messaging.spec.ts|should send and receive encrypted message between two users": "expected", + "webkit-msg-iso|messaging/encrypted-messaging.spec.ts|should show delivery status indicators": "expected", + "webkit-msg-iso|messaging/encrypted-messaging.spec.ts|should verify zero-knowledge encryption in database": "expected", + "webkit-msg-iso|messaging/friend-requests.spec.ts|addressee can decline a friend request": "expected", + "webkit-msg-iso|messaging/friend-requests.spec.ts|connections page meets WCAG standards": "expected", + "webkit-msg-iso|messaging/friend-requests.spec.ts|duplicate requests are prevented": "expected", + "webkit-msg-iso|messaging/friend-requests.spec.ts|requester can cancel a sent pending request": "expected", + "webkit-msg-iso|messaging/friend-requests.spec.ts|requester sends friend request and addressee accepts": "expected", + "webkit-msg-iso|messaging/friend-requests.spec.ts|tab navigation works correctly": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should be keyboard navigable (T193)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should close modal on cancel button click (T192)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should delete account and redirect to sign-in (T192)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should export decrypted messages (T191)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should have ARIA live regions for status updates (T193)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should have accessible ARIA attributes (T192)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should open confirmation modal on delete button click (T192)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should require typing \"DELETE\" to enable deletion (T192)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should show account deletion button in account settings (T192)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should show data export button in account settings (T191)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should show error message on deletion failure (T192)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should show error on export failure (T191)": "expected", + "webkit-msg-iso|messaging/gdpr-compliance.spec.ts|should trigger data export download (T191)": "expected", + "webkit-msg-iso|messaging/group-chat-multiuser.spec.ts|contract - isolated connection helper is usable": "expected", + "webkit-msg-iso|messaging/group-chat-multiuser.spec.ts|member A sends an encrypted group message and member B decrypts it": "expected", + "webkit-msg-iso|messaging/group-chat-multiuser.spec.ts|sends and reads an encrypted message in a UI-created group (#182)": "skipped", + "webkit-msg-iso|messaging/group-chat-multiuser.spec.ts|should create group with connected users": "expected", + "webkit-msg-iso|messaging/group-chat-multiuser.spec.ts|should navigate back to messages when clicking back button": "expected", + "webkit-msg-iso|messaging/group-chat-multiuser.spec.ts|should navigate to new-group page and show connections": "expected", + "webkit-msg-iso|messaging/group-chat-multiuser.spec.ts|should show New Group link in sidebar": "expected", + "webkit-msg-iso|messaging/message-delete-placeholder.spec.ts|should show [Message deleted] placeholder and preserve adjacent messages": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|T115: should edit message within 15-minute window": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|T116: should delete message within 15-minute window": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|T117: should not show Edit/Delete buttons for messages older than 15 minutes": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|T130: edit mode should have proper ARIA labels": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|delete confirmation modal should be keyboard navigable": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|delete confirmation modal should have proper ARIA labels": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|should cancel deletion from confirmation modal": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|should cancel edit without saving": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|should disable Save button when content unchanged": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|should not allow editing empty message": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|should not show Edit/Delete buttons on deleted message": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|should not show Edit/Delete buttons on received messages": "expected", + "webkit-msg-iso|messaging/message-editing.spec.ts|should show Edit/Delete buttons only for own recent messages": "expected", + "webkit-msg-iso|messaging/oauth-setup-modal.spec.ts|US-1: OAuth user with no keys sees setup mode": "expected", + "webkit-msg-iso|messaging/oauth-setup-modal.spec.ts|US-2: returning OAuth user sees unlock mode with provider badge": "expected", + "webkit-msg-iso|messaging/oauth-setup-modal.spec.ts|US-3: email user sees unchanged unlock modal (regression)": "expected", + "webkit-msg-iso|messaging/offline-queue-sync.spec.ts|should queue a message offline and sync when reconnected": "expected", + "webkit-msg-iso|messaging/offline-queue.spec.ts|T146: should queue message when offline and send when online": "expected", + "webkit-msg-iso|messaging/offline-queue.spec.ts|T147: should queue multiple messages and sync all when reconnected": "expected", + "webkit-msg-iso|messaging/offline-queue.spec.ts|T148: should retry with exponential backoff on server failure": "expected", + "webkit-msg-iso|messaging/offline-queue.spec.ts|T149: should handle conflict resolution with server timestamp": "expected", + "webkit-msg-iso|messaging/offline-queue.spec.ts|should show failed status after max retries": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|Auto-scroll to bottom on new message": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|Jump to bottom button with smooth scroll": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|Performance monitoring logs for large conversations": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|Scroll position maintained during pagination": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|T166: Performance with 1000 messages - scrolling FPS": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|T167: Pagination loads next 50 messages": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|T169: Keyboard navigation through messages": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|T172b: Virtual scrolling activates at exactly 100 messages": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|Tab navigation to jump to bottom button": "expected", + "webkit-msg-iso|messaging/performance.spec.ts|Virtual scrolling maintains 60fps during rapid scrolling": "expected", + "webkit-msg-iso|messaging/real-time-delivery.spec.ts|should auto-expire typing indicator after 5 seconds": "expected", + "webkit-msg-iso|messaging/real-time-delivery.spec.ts|should deliver message in <500ms between two windows": "expected", + "webkit-msg-iso|messaging/real-time-delivery.spec.ts|should handle rapid message exchanges": "expected", + "webkit-msg-iso|messaging/real-time-delivery.spec.ts|should hide typing indicator when user stops typing": "expected", + "webkit-msg-iso|messaging/real-time-delivery.spec.ts|should remove typing indicator when message is sent": "expected", + "webkit-msg-iso|messaging/real-time-delivery.spec.ts|should show delivery status (sent \u2192 delivered \u2192 read)": "expected", + "webkit-msg-iso|messaging/real-time-delivery.spec.ts|should show multiple typing indicators correctly": "expected", + "webkit-msg-iso|messaging/real-time-delivery.spec.ts|should show typing indicator when user types": "expected", + "webkit-msg|messaging/messaging-scroll.spec.ts|T003: Message input visible on mobile viewport (375x667)": "expected", + "webkit-msg|messaging/messaging-scroll.spec.ts|T004: Message input visible on tablet viewport (768x1024)": "expected", + "webkit-msg|messaging/messaging-scroll.spec.ts|T005: Message input visible on desktop viewport (1280x800)": "expected", + "webkit-msg|messaging/messaging-scroll.spec.ts|T006: Scroll container constrained to MessageThread": "expected", + "webkit-msg|messaging/messaging-scroll.spec.ts|T007-T008: Jump button appears when scrolled and does not overlap input": "expected", + "webkit-msg|messaging/messaging-scroll.spec.ts|T009: Jump button click scrolls to bottom": "expected" + } +}