Estimate: 30m · Depends on: 6.3.5, 6.3.6
The story-closing verification (Principle #18; the epic-wide journey stays Story 6.7).
Vitest (integration, real Postgres): the bucket matrix (day/week/month × cumulative × reopen-nets × window edges, against seeded revisions at known dates; large-seed boundedness assertions); the statistic matrix driven FROM the registry (every entry incl. dynamic CF entries — a new entry without a case fails, the totality-guard pattern); filter-results/issues-list parity; the permission matrix (owner / member / non-member × private / workspace × project-sourced / filter-sourced → data / 404 / no-access, route-level); stale-referent matrix (deleted filter / project / statistic referent); widget CRUD + move ordering properties; the registry enumeration guards (widget types + statistic types).
Playwright E2E (tests/e2e/dashboards.spec.ts): the recipe journey — create a dashboard, add all three widget types (filter + project sourced), configure each, switch layout, drag a widget across columns, reload (persistence), share-to-workspace + verify the second user's read-only + no-access states, delete the backing filter → stale state. (tests/e2e/reports.spec.ts): the hub → both report pages → configure → resolve + reopen an issue → the created-vs-resolved bucket nets; the distribution donut tracks a status change. a11y: the strict sweep over the grid (edit mode, a config panel open, every widget state visible) + both report pages.
pnpm test:coverage keeps all 6.3 files ≥90%.tests/e2e/ harness + selector memories (prodect-e2e-selector-gotchas, board-e2e-dnd-at-scale-gotchas — the dnd drag step)