| Unit | Vitest | Parsers against real fixtures, layer resolution, stat calculations, API key hashing. 90% line floor. |
| Contract | Vitest | The shared GitHub Action every project reports through, run against a local server. Runs in the unit job; counted as Unit. |
| Component | VitestTesting Library | Each component built from the design, rendered in jsdom: its words, states and links, and its stylesheet against the design’s values. |
| Integration | Vitestlocal Supabase | The ingestion endpoint end to end against local Supabase: idempotent retries, transactions and rollups, and row-level security checked with the anonymous client, so private projects stay hidden. |
| E2E | Playwright | A seeded database behind the landing, project, run and test-history pages; visibility rules in the rendered UI; every public page again with JavaScript turned off. |
| Accessibility | axePlaywrightcontrast script | axe on every public page, counted with E2E. A script in the unit job checks the contrast of the design’s token pairs in both themes. |
| Visual | Playwright | Snapshots of each page at desktop and phone widths, light and dark, compared inside a pinned container image so rendering can’t drift. Counted with E2E. |
| Leak sweep | Playwright | Walks every page that can show a private project as a visitor and fails if any private project’s failure text, stack trace or source link appears anywhere. Counted with E2E. |