vestige/apps/dashboard/playwright.config.ts
Sam Valladares e60e568160 fix(dashboard): audit pass — clickable field cells, empty-data substrate, reduced-motion
Full multi-team audit of the living-field work (adversarial fleet + fresh-eyes
pass + foundation deep-dive). 11 real bugs found and fixed; 7 false positives
adversarially refuted. All re-verified live on the real brain.

Pick contract: field cells were unclickable in intentions/schedule/memory-prs/
importance — the click handlers read the old text-item id off a node payload.
Read the id from either shape; importance now also picks the field pass;
intentions gets a dedicated filter toggle instead of flipping the filter on every
click. RouteStage now picks passes top-down (front-rendered text before
back-rendered field) so a background cell can't steal a foreground control's
click. Proven live: cell clicks fire real promote/act with real memory ids.

Empty data: /patterns went black when the cross-project set is empty (it is
recomputed). Seeded a real memory-pool substrate it falls back to, like
contradictions — alive at zero patterns.

Correctness: memories unsuppress now honors UnsuppressResult.stillSuppressed
(compounded suppression stays scarred). LivingFieldPass no longer writes the
shared params[2] node_count lane (was corrupting the co-resident scene renderer
on graph/observatory/memories). Finite-guard every value reaching the GPU buffer
so a bad mapper can't NaN-out the field. blackbox selected-cell highlight tracks
selectedRunId. graph nulls its field handle when leaving field mode.

Accessibility: /memories and /importance (direct ObservatoryCanvas mounts) now
honor prefers-reduced-motion via engine.setPaused — the field freezes for
reduce-motion users. Gate pins reducedMotion:'no-preference' so the motion
assertion is stable.

Gates green: check 0/0, build ok, palace-launch-gate 22/22 + curated tour,
all-routes-smoke 20/20, ChangelogResponse gains totalEvents.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 06:57:19 +07:00

31 lines
842 B
TypeScript

import { defineConfig } from '@playwright/test';
const PORT = 5199;
export default defineConfig({
testDir: './e2e',
timeout: 60_000,
expect: { timeout: 10_000 },
fullyParallel: false,
retries: 0,
reporter: [['list'], ['html', { open: 'never' }]],
use: {
baseURL: `http://localhost:${PORT}`,
screenshot: 'on',
video: 'retain-on-failure',
trace: 'retain-on-failure',
// Pin motion ON so the living-field motion assertions (isAnimating) are
// stable: a CI/host that reports prefers-reduced-motion would otherwise
// freeze every field and false-fail the "field is moving" gate.
reducedMotion: 'no-preference',
launchOptions: {
args: ['--use-gl=angle', '--ignore-gpu-blocklist'],
},
},
webServer: {
command: `npx vite dev --port ${PORT}`,
port: PORT,
reuseExistingServer: true,
timeout: 30_000,
},
});