Estimate: 15m · Depends on: 2.5.3, 2.5.4, 2.5.5, 2.5.8, 2.5.12, 2.5.14, 2.5.15, 2.5.16
The Story-closing Playwright spec that drives the real stack through the whole surface, plus the a11y gate. tests/e2e/issue-list-flow.spec.ts: seed a project with a multi-level tree (epic → story → task → sub-task + a bug), then assert — the tree renders project-scoped and nested (indent + identifiers + status pills); expand/collapse shows/hides descendants; filter by kind / status / assignee / text narrows the tree while keeping ancestors; an inline status change (legal) persists + an illegal one is rejected; an inline reassign + unassign persists; the empty state renders for a fresh project; a row click navigates to /issues/[key]; and cross-workspace isolation — a workspace-A user never sees workspace-B issues at /issues.
View-switcher (2.5.8). The spec also drives the [Tree ▾] control: switch Tree → List (the tree flattens, indentation/chevrons gone) and back; the choice round-trips through the URL (?view=) on reload/share; in List, clicking a sortable header re-orders the rows and updates ?sort= (asc↔desc) with the active-sort indicator; the whole-row link still navigates in both views. (Per-row property columns — priority/assignee/reporter/due/estimate — render in both.)
A11y. Add BOTH /issues views (populated Tree AND List) to the STRICT shell-a11y axe sweep — the treegrid semantics from 2.5.2 and the List's sortable-header aria-sort (2.5.8) must hold on the real route. Reuse the shipped E2E helpers (shell-session.ts, workflow.ts) and the create flow to build fixtures.
?view= (reload/share-safe); List sort by a column header round-trips through ?sort= (asc↔desc) and re-orders rows; the row link navigates in both views./issues views (populated Tree AND List) join the strict shell-a11y sweep with zero violations — treegrid roles/levels (2.5.2) + the List's aria-sort headers (2.5.8) correct.pnpm db:seed:large (2.5.16): on the seeded large project, the spec asserts the List paginates (page 1 shows the page size not all rows; Next/Prev/page-jump change ?page= and the visible range) and the Tree lazy-loads + virtualizes (a collapsed parent's children are NOT in the DOM until expanded; expanding fetches them; "Load more children" appears on a >page-size parent; the DOM row count stays bounded even with deep expansion). This is the verification that the finding-#57 scale work actually holds at real size — not just on a 7-node fixture.tests/e2e/_helpers/shell-session.ts (1.5.6) + workflow.ts (2.2.7) + issue-create-edit-flow.spec.ts (2.3.8) — fixtures + conventions to mirrorpnpm db:seed:large (the 2.5.16 dev seed) — the large project the pagination + lazy-load/virtualization scale assertions run againsttests/e2e/shell-a11y.spec.ts — the strict sweep to extend (BOTH Tree + List views); the 2.5.3 route + 2.5.2 data-testid hooksIssueListToolbar / the [Tree ▾] menu + the List view + the ?view=/?sort= URL contract — the switcher behaviour to driveplaywright.config.ts webServer block