6.2.6 Story tests — permission/visibility matrix + persist→resolve properties + the save→share→subscribe E2E + a11y sweep
Estimate: 30m · Depends on: 6.2.3, 6.2.4, 6.2.5
The story-closing verification (Principle #18; the epic-wide journey stays Story 6.7).
Vitest (integration, real Postgres): the (role × visibility × action) matrix driven from a table so a new action without a matrix row fails (the totality-guard pattern); the persist→resolve property suite (every generated AST round-trips; malformed + future-versioned envelopes recover typed; stale referents degrade per field/option/label/component); name-uniqueness collisions; star aggregation; built-in immutability; subscription due-ness (frozen clock) + the as-subscriber resolution paths; the delete-dependents enumeration + cascade.
Playwright E2E (tests/e2e/saved-filters.spec.ts): the recipe journey — build → Save as (Project) → applied chip → edit a row → dirty → Save → second user applies + stars + edits → Save-as-only → directory rename / visibility flip / admin change-owner → subscribe → delete with the dependents warning → the private filter invisible to the second user throughout its private phase. a11y: the strict axe sweep over the save dialog, dropdown (all groups), directory, and subscription editor.
Acceptance criteria
- The matrix + property + scheduler suites are green and registry/table-driven (adding an action or AST node without coverage fails); fuzz reuses the 6.1.6 generators against the STORED path.
- The E2E journey passes green in CI's Playwright lane; the sweep reports zero violations.
- The Story 6.2 verification recipe runs clean top to bottom;
pnpm test:coveragekeeps all 6.2 files ≥90%.
Context refs
- The 6.1.6 generator/fuzz suites (reused against persistence); the totality-guard pattern (5.5.1/6.1.1)
tests/integration/+tests/e2e/conventions; the harness/selector memories- The Story 6.2 verification recipe — the checklist this automates
- Story 6.7 (the epic-wide remainder — do not duplicate)