Works with
Generated from Layer 2 conformance test runs. This matrix is the source of truth — do not hand-edit it. Re-run npm run conformance:matrix after adding a scenario or harness.
Last updated: 2026-04-11 · 92 tests across 10 frameworks
Per-framework coverage
| Framework | Passing | Total |
|---|---|---|
| alpine ✓ | 10 | 10 |
| astro ✓ | 11 | 11 |
| hotwire ✓ | 8 | 8 |
| htmx ✓ | 7 | 7 |
| liveview ✓ | 8 | 8 |
| livewire ✓ | 8 | 8 |
| react ✓ | 10 | 10 |
| solid ✓ | 10 | 10 |
| svelte ✓ | 10 | 10 |
| vue3 ✓ | 10 | 10 |
Scenario coverage
| Scenario | alpine | astro | hotwire | htmx | liveview | livewire | react | solid | svelte | vue3 |
|---|---|---|---|---|---|---|---|---|---|---|
actions/log-updated |
✓ | ✓ | ○ | ○ | ○ | ○ | ✓ | ✓ | ✓ | ✓ |
guide/advance-after-add |
✓ | ✓ | ○ | ○ | ○ | ○ | ✓ | ✓ | ✓ | ✓ |
hydration/island-mount |
○ | ✓ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
layout/empty-state-shown |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
layout/title-visible |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
morph/status-flip |
○ | ○ | ✓ | ○ | ✓ | ✓ | ○ | ○ | ○ | ○ |
todos/add-item |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
todos/char-count-updated |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
todos/count-updated |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
todos/edit-item |
✓ | ✓ | ○ | ○ | ○ | ○ | ✓ | ✓ | ✓ | ✓ |
todos/remove-item |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
todos/toggle-complete |
✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Legend: ✓ passing · ✗ failing · ○ not exercised by this harness
Mutation-pattern (PAT-NN) coverage
Layer 1 locks every PAT in synthetically via the jsdom conformance suite under tests/conformance/. The table below shows which PATs each framework additionally exercises empirically through its Layer 2 harness — the more ✓ cells here, the more real-framework evidence backs up the Layer 1 regression lock. An empty row means no scenario in any harness currently exercises that pattern empirically.
| Pattern | alpine | astro | hotwire | htmx | liveview | livewire | react | solid | svelte | vue3 |
|---|---|---|---|---|---|---|---|---|---|---|
| PAT-01 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| PAT-02 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| PAT-03 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| PAT-04 | ○ | ○ | ✓ | ○ | ✓ | ✓ | ○ | ○ | ○ | ○ |
| PAT-05 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| PAT-06 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| PAT-07 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| PAT-08 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| PAT-09 | ○ | ✓ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
| PAT-10 | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
Legend: ✓ empirically exercised by this harness · ○ not exercised at Layer 2 (Layer 1 still covers it)
How to add a framework to this matrix
- Scaffold a minimal harness under
conformance/<framework>/following an existing example (react / vue3 / svelte / solid for CSR SPAs, hotwire / htmx for server-rendered HTML, alpine for directive-only, astro for SSR + hydration). - Add a Playwright project +
webServerentry inconformance/playwright.config.ts. - Write
conformance/drivers/<framework>.spec.tsusing the shared runners inconformance/shared/runners.ts. Declare aHarnessConfig, register onetest()per supported scenario, and delegate the body torunners[scenarioKey]. Framework-specific variance (toggle selector, expected assertion type, settle wait) lives in the config, not in duplicated test bodies. - Run
npm run conformance:matrix— the generator updates this file automatically from the new results. - If your harness exercises a new mutation pattern not in the catalog, add a
PAT-NNtest undertests/conformance/first, then register the scenario (with its PAT ids) inconformance/shared/scenarios.js— the single source of truth for scenario → PAT mappings, shared by this generator and the TypeScript drivers.