$ cd apps/site && ZOEN_DEV_PAGES=1 pnpm exec next build && ZOEN_DEV_PAGES=1 pnpm exec playwright test tests/e2e/home.spec.ts tests/e2e/chronicle.spec.ts tests/e2e/shell.spec.ts --grep-invert "@signup|@clip|@revalidate" # cwd /Users/king/Desktop/Workspace/SRO/zoen # exit 1 ▲ Next.js 16.3.8 (Turbopack) - Environments: .env.local ✓ Running next.config.ts took 280ms - Cache Components enabled - Experiments (use with caution): · serverActions Creating an optimized production build ... ✓ Compiled successfully in 52s Running TypeScript ... Finished TypeScript in 2.2min ... Collecting page data using 7 workers ... Generating static pages using 7 workers (0/76) ... Generating static pages using 7 workers (19/76) Generating static pages using 7 workers (38/76) Generating static pages using 7 workers (57/76) ✓ Generating static pages using 7 workers (76/76) in 22.9s Finalizing page optimization ... Route (app) Revalidate Expire ┌ ○ / 2m 15m ├ ○ /_not-found 2m 15m ├ ○ /alpha 2m 15m ├ ƒ /api/e ├ ƒ /api/revalidate ├ ○ /apple-icon.png ├ ○ /community 2m 15m ├ ○ /cookies 2m 15m ├ ○ /dev/directions 2m 15m ├ ○ /dev/directions/a 2m 15m ├ ○ /dev/directions/b 2m 15m ├ ○ /dev/directions/c 2m 15m ├ ○ /dev/kit 2m 15m ├ ○ /download 2m 15m ├ ○ /faq 2m 15m ├ ○ /game 2m 15m ├ ○ /game/builds 2m 15m ├ /game/builds/[slug] 2m 15m │ ├ ◐ /game/builds/[slug] 2m 15m │ ├ ○ /game/builds/ravager 2m 15m │ ├ ○ /game/builds/warblade 2m 15m │ └ ◐ [+16 more paths] ├ ƒ /game/builds/[slug]/opengraph-image ├ ○ /game/world 2m 15m ├ ○ /how-to-play 2m 15m ├ ○ /icon.png ├ ○ /maintenance 2m 15m ├ ○ /manifest.webmanifest ├ ○ /media 2m 15m ├ ○ /news 2m 15m ├ /news/[slug] 2m 15m │ └ ◐ /news/[slug] 2m 15m ├ ƒ /opengraph-image ├ ○ /patch-notes 2m 15m ├ ○ /play 2m 15m ├ ◐ /preregister/confirm 2m 15m ├ ○ /privacy 2m 15m ├ ○ /roadmap 2m 15m ├ ○ /robots.txt ├ ○ /sitemap.xml 2m 15m ├ ◐ /status 2m 15m ├ ○ /support 2m 15m ├ ○ /terms 2m 15m └ ◐ /unsubscribe 2m 15m ƒ Proxy (Middleware) ○ (Static) prerendered as static content ◐ (Partial Prerender) prerendered as static HTML with dynamic server-streamed content ƒ (Dynamic) server-rendered on demand Running 39 tests using 2 workers ✓ 1 [desktop] › tests/e2e/chronicle.spec.ts:9:3 › chronicle › @fx the hero art is a real image; the WebGL layer joins it only on wide screens with WebGL 2 (21.6s) ✓ 3 [desktop] › tests/e2e/chronicle.spec.ts:23:3 › chronicle › @fx reduced motion gets the static site: no WebGL layers start (16.7s) ✓ 2 [desktop] › tests/e2e/home.spec.ts:11:3 › home › @home every section renders; the chain fires; paths switch; clips load on click (53.8s) ✓ 5 [desktop] › tests/e2e/shell.spec.ts:9:1 › @shell header, footer and security headers; the site sets no cookies (9.7s) ✓ 6 [desktop] › tests/e2e/shell.spec.ts:32:1 › @shell 404 page is themed and has a way home (10.1s) ✘ 4 [desktop] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows (36.3s) ✓ 7 [tablet] › tests/e2e/chronicle.spec.ts:9:3 › chronicle › @fx the hero art is a real image; the WebGL layer joins it only on wide screens with WebGL 2 (17.1s) - 9 [tablet] › tests/e2e/chronicle.spec.ts:23:3 › chronicle › @fx reduced motion gets the static site: no WebGL layers start ✓ 8 [desktop] › tests/e2e/chronicle.spec.ts:49:3 › chronicle › @world the basin card follows the chosen area; wide screens with WebGL 2 get the 3D diorama (22.5s) ✓ 11 [desktop] › tests/e2e/chronicle.spec.ts:66:3 › chronicle › @loot rolling a drop changes the item or its rarity; the popup names both (28.8s) ✓ 12 [desktop] › tests/e2e/chronicle.spec.ts:75:3 › chronicle › @shelf the field guide pages with its buttons, which disable at the ends (23.8s) ✓ 13 [desktop] › tests/e2e/chronicle.spec.ts:85:3 › chronicle › @media the gallery opens a viewer that steps with the arrow keys and closes with Escape (13.9s) ✘ 10 [tablet] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows (42.6s) ✓ 14 [desktop] › tests/e2e/chronicle.spec.ts:100:3 › chronicle › @rail the scroll rail replaces the native bar on every screen and marks the chapter on screen (19.1s) ✓ 15 [tablet] › tests/e2e/chronicle.spec.ts:49:3 › chronicle › @world the basin card follows the chosen area; wide screens with WebGL 2 get the 3D diorama (28.4s) ✓ 16 [desktop] › tests/e2e/chronicle.spec.ts:114:3 › chronicle › @seo the home page has its own share card (43.7s) ✓ 17 [tablet] › tests/e2e/chronicle.spec.ts:66:3 › chronicle › @loot rolling a drop changes the item or its rarity; the popup names both (15.1s) ✓ 19 [tablet] › tests/e2e/chronicle.spec.ts:75:3 › chronicle › @shelf the field guide pages with its buttons, which disable at the ends (14.1s) ✓ 20 [tablet] › tests/e2e/chronicle.spec.ts:85:3 › chronicle › @media the gallery opens a viewer that steps with the arrow keys and closes with Escape (10.8s) ✘ 21 [tablet] › tests/e2e/chronicle.spec.ts:100:3 › chronicle › @rail the scroll rail replaces the native bar on every screen and marks the chapter on screen (25.2s) ✘ 18 [desktop] › tests/e2e/chronicle.spec.ts:123:3 › chronicle › @pages the new chronicle pages are clean on every screen size (34.0s) - 22 [tablet] › tests/e2e/chronicle.spec.ts:114:3 › chronicle › @seo the home page has its own share card ✓ 24 [tablet] › tests/e2e/home.spec.ts:11:3 › home › @home every section renders; the chain fires; paths switch; clips load on click (1.2m) ✓ 23 [tablet] › tests/e2e/chronicle.spec.ts:123:3 › chronicle › @pages the new chronicle pages are clean on every screen size (1.7m) ✓ 25 [tablet] › tests/e2e/shell.spec.ts:9:1 › @shell header, footer and security headers; the site sets no cookies (16.2s) ✓ 26 [tablet] › tests/e2e/shell.spec.ts:32:1 › @shell 404 page is themed and has a way home (14.4s) ✓ 27 [mobile] › tests/e2e/chronicle.spec.ts:9:3 › chronicle › @fx the hero art is a real image; the WebGL layer joins it only on wide screens with WebGL 2 (4.9s) - 28 [mobile] › tests/e2e/chronicle.spec.ts:23:3 › chronicle › @fx reduced motion gets the static site: no WebGL layers start ✓ 30 [mobile] › tests/e2e/home.spec.ts:11:3 › home › @home every section renders; the chain fires; paths switch; clips load on click (41.7s) ✘ 29 [mobile] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows (27.8s) ✓ 31 [mobile] › tests/e2e/shell.spec.ts:9:1 › @shell header, footer and security headers; the site sets no cookies (16.2s) ✓ 32 [mobile] › tests/e2e/shell.spec.ts:32:1 › @shell 404 page is themed and has a way home (14.8s) ✓ 33 [mobile] › tests/e2e/chronicle.spec.ts:49:3 › chronicle › @world the basin card follows the chosen area; wide screens with WebGL 2 get the 3D diorama (18.5s) ✓ 34 [mobile] › tests/e2e/chronicle.spec.ts:66:3 › chronicle › @loot rolling a drop changes the item or its rarity; the popup names both (13.3s) ✓ 35 [mobile] › tests/e2e/chronicle.spec.ts:75:3 › chronicle › @shelf the field guide pages with its buttons, which disable at the ends (17.1s) ✓ 36 [mobile] › tests/e2e/chronicle.spec.ts:85:3 › chronicle › @media the gallery opens a viewer that steps with the arrow keys and closes with Escape (10.1s) ✓ 37 [mobile] › tests/e2e/chronicle.spec.ts:100:3 › chronicle › @rail the scroll rail replaces the native bar on every screen and marks the chapter on screen (14.9s) - 38 [mobile] › tests/e2e/chronicle.spec.ts:114:3 › chronicle › @seo the home page has its own share card ✘ 39 [mobile] › tests/e2e/chronicle.spec.ts:123:3 › chronicle › @pages the new chronicle pages are clean on every screen size (1.3m) 1) [desktop] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows Error: expect(locator).toHaveAttribute(expected) failed Locator: getByRole('link', { name: /Open the build: Frostweaver/ }) Expected: "/game/builds/frostweaver" Timeout: 10000ms Error: element(s) not found Call log: - Expect "toHaveAttribute" getByRole('link', { name: /Open the build: Frostweaver/ }) with timeout 10000ms - waiting for getByRole('link', { name: /Open the build: Frostweaver/ }) 41 | await panel.getByRole('button', { name: 'Frostweaver' }).click(); 42 | await expect(panel.getByRole('button', { name: 'Frostweaver' })).toHaveAttribute('aria-pressed', 'true'); > 43 | await expect(page.getByRole('link', { name: /Open the build: Frostweaver/ })).toHaveAttribute('href', '/game/builds/frostweaver'); | ^ 44 | await page.getByRole('tab', { name: 'Iron', exact: true }).focus(); 45 | await page.keyboard.press('Enter'); 46 | await expect(page.getByRole('link', { name: /Open the build: Ravager/ })).toBeVisible(); at /Users/king/Desktop/Workspace/SRO/zoen/apps/site/tests/e2e/chronicle.spec.ts:43:83 Error Context: ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-desktop/error-context.md attachment #2: trace (application/zip) ───────────────────────────────────────────────────────── ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-desktop/trace.zip Usage: pnpm exec playwright show-trace ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-desktop/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 2) [desktop] › tests/e2e/chronicle.spec.ts:123:3 › chronicle › @pages the new chronicle pages are clean on every screen size Error: expect(received).toEqual(expected) // deep equality - Expected - 1 + Received + 3 - Array [] + Array [ + "target-size: All touch targets must be 24px large, or leave sufficient space (2) — a[href$=\"#plays\"] [Target has insufficient size because it is partially obscured (smallest space is 24px by 19px, should be at least 24px b] | a[href$=\"#combo\"] [Target has insufficient size because it is partially obscured (smallest space is 24px by 2px, should be at least 24px by]", + ] at helpers.ts:42 40 | const result = await axe.analyze(); 41 | const bad = result.violations.filter((v) => v.impact === 'serious' || v.impact === 'critical'); > 42 | expect(bad.map((v) => `${v.id}: ${v.help} (${v.nodes.length}) — ${v.nodes.slice(0, 4).map((n) => `${n.target.join(' ')} [${(n.any[0]?.message ?? '').slice(0, 120)}]`).join(' | ')}`)).toEqual([]); | ^ 43 | } 44 | 45 | // Pages still being built (W3): link prefetches of these 404 until they land. Shrinks to []. at expectNoSeriousA11y (/Users/king/Desktop/Workspace/SRO/zoen/apps/site/tests/e2e/helpers.ts:42:186) at /Users/king/Desktop/Workspace/SRO/zoen/apps/site/tests/e2e/chronicle.spec.ts:128:7 Error Context: ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-pages--ab100--clean-on-every-screen-size-desktop/error-context.md attachment #2: trace (application/zip) ───────────────────────────────────────────────────────── ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-pages--ab100--clean-on-every-screen-size-desktop/trace.zip Usage: pnpm exec playwright show-trace ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-pages--ab100--clean-on-every-screen-size-desktop/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 3) [tablet] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows Error: expect(locator).toHaveAttribute(expected) failed Locator: getByRole('link', { name: /Open the build: Frostweaver/ }) Expected: "/game/builds/frostweaver" Timeout: 10000ms Error: element(s) not found Call log: - Expect "toHaveAttribute" getByRole('link', { name: /Open the build: Frostweaver/ }) with timeout 10000ms - waiting for getByRole('link', { name: /Open the build: Frostweaver/ }) 41 | await panel.getByRole('button', { name: 'Frostweaver' }).click(); 42 | await expect(panel.getByRole('button', { name: 'Frostweaver' })).toHaveAttribute('aria-pressed', 'true'); > 43 | await expect(page.getByRole('link', { name: /Open the build: Frostweaver/ })).toHaveAttribute('href', '/game/builds/frostweaver'); | ^ 44 | await page.getByRole('tab', { name: 'Iron', exact: true }).focus(); 45 | await page.keyboard.press('Enter'); 46 | await expect(page.getByRole('link', { name: /Open the build: Ravager/ })).toBeVisible(); at /Users/king/Desktop/Workspace/SRO/zoen/apps/site/tests/e2e/chronicle.spec.ts:43:83 Error Context: ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-tablet/error-context.md attachment #2: trace (application/zip) ───────────────────────────────────────────────────────── ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-tablet/trace.zip Usage: pnpm exec playwright show-trace ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-tablet/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 4) [tablet] › tests/e2e/chronicle.spec.ts:100:3 › chronicle › @rail the scroll rail replaces the native bar on every screen and marks the chapter on screen Error: expect(received).toBeLessThan(expected) Expected: < 140 Received: 199 Call Log: - Timeout 10000ms exceeded while waiting on the predicate 108 | // a chapter post glides its chapter under the header 109 | await chapters.getByRole('link', { name: /Spoils/ }).click(); > 110 | await expect.poll(() => page.evaluate(() => Math.round(document.getElementById('spoils')!.getBoundingClientRect().top)), { timeout: 10_000 }).toBeLessThan(140); | ^ 111 | await expectNoHorizontalOverflow(page); 112 | }); 113 | at /Users/king/Desktop/Workspace/SRO/zoen/apps/site/tests/e2e/chronicle.spec.ts:110:147 Error Context: ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-rail-t-24202-marks-the-chapter-on-screen-tablet/error-context.md attachment #2: trace (application/zip) ───────────────────────────────────────────────────────── ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-rail-t-24202-marks-the-chapter-on-screen-tablet/trace.zip Usage: pnpm exec playwright show-trace ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-rail-t-24202-marks-the-chapter-on-screen-tablet/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 5) [mobile] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows Error: expect(locator).toHaveAttribute(expected) failed Locator: getByRole('link', { name: /Open the build: Frostweaver/ }) Expected: "/game/builds/frostweaver" Timeout: 10000ms Error: element(s) not found Call log: - Expect "toHaveAttribute" getByRole('link', { name: /Open the build: Frostweaver/ }) with timeout 10000ms - waiting for getByRole('link', { name: /Open the build: Frostweaver/ }) 41 | await panel.getByRole('button', { name: 'Frostweaver' }).click(); 42 | await expect(panel.getByRole('button', { name: 'Frostweaver' })).toHaveAttribute('aria-pressed', 'true'); > 43 | await expect(page.getByRole('link', { name: /Open the build: Frostweaver/ })).toHaveAttribute('href', '/game/builds/frostweaver'); | ^ 44 | await page.getByRole('tab', { name: 'Iron', exact: true }).focus(); 45 | await page.keyboard.press('Enter'); 46 | await expect(page.getByRole('link', { name: /Open the build: Ravager/ })).toBeVisible(); at /Users/king/Desktop/Workspace/SRO/zoen/apps/site/tests/e2e/chronicle.spec.ts:43:83 Error Context: ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-mobile/error-context.md attachment #2: trace (application/zip) ───────────────────────────────────────────────────────── ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-mobile/trace.zip Usage: pnpm exec playwright show-trace ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-stage--5c1a9-tage-the-build-link-follows-mobile/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 6) [mobile] › tests/e2e/chronicle.spec.ts:123:3 › chronicle › @pages the new chronicle pages are clean on every screen size Error: expect(received).toEqual(expected) // deep equality - Expected - 1 + Received + 3 - Array [] + Array [ + "target-size: All touch targets must be 24px large, or leave sufficient space (3) — a[href$=\"#walls\"] [Target has insufficient size (22px by 22px, should be at least 24px by 24px)] | a[href$=\"#previz\"] [Target has insufficient size (22px by 22px, should be at least 24px by 24px)] | a[href$=\"#g-key_art\"] [Target has insufficient size (22px by 22px, should be at least 24px by 24px)]", + ] at helpers.ts:42 40 | const result = await axe.analyze(); 41 | const bad = result.violations.filter((v) => v.impact === 'serious' || v.impact === 'critical'); > 42 | expect(bad.map((v) => `${v.id}: ${v.help} (${v.nodes.length}) — ${v.nodes.slice(0, 4).map((n) => `${n.target.join(' ')} [${(n.any[0]?.message ?? '').slice(0, 120)}]`).join(' | ')}`)).toEqual([]); | ^ 43 | } 44 | 45 | // Pages still being built (W3): link prefetches of these 404 until they land. Shrinks to []. at expectNoSeriousA11y (/Users/king/Desktop/Workspace/SRO/zoen/apps/site/tests/e2e/helpers.ts:42:186) at /Users/king/Desktop/Workspace/SRO/zoen/apps/site/tests/e2e/chronicle.spec.ts:128:7 Error Context: ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-pages--ab100--clean-on-every-screen-size-mobile/error-context.md attachment #2: trace (application/zip) ───────────────────────────────────────────────────────── ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-pages--ab100--clean-on-every-screen-size-mobile/trace.zip Usage: pnpm exec playwright show-trace ../../logs/evidence/pw-artifacts/site/chronicle-chronicle-pages--ab100--clean-on-every-screen-size-mobile/trace.zip ──────────────────────────────────────────────────────────────────────────────────────────────── 6 failed [desktop] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows [desktop] › tests/e2e/chronicle.spec.ts:123:3 › chronicle › @pages the new chronicle pages are clean on every screen size [tablet] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows [tablet] › tests/e2e/chronicle.spec.ts:100:3 › chronicle › @rail the scroll rail replaces the native bar on every screen and marks the chapter on screen [mobile] › tests/e2e/chronicle.spec.ts:36:3 › chronicle › @stage choosing a path and a build changes the stage; the build link follows [mobile] › tests/e2e/chronicle.spec.ts:123:3 › chronicle › @pages the new chronicle pages are clean on every screen size 4 skipped 29 passed (13.1m)