3.5.1 At-scale board fixture + cap/Done-age test seam
Estimate: 25m · Depends on: 2.5.16, 3.3.4, 3.8.2
The harness the two journey specs build on — a board-shaped large dataset plus a test-only env seam over the load-model bounds, so the at-scale board states are reachable deterministically and cheaply. Test infrastructure only (a dev seed script + a few-line, production-inert service seam) — it changes NO UI, so the design gate does not fire.
Board-shaped large seed. db:seed:large (Subtask 2.5.16, scripts/seed-large.ts) today builds a tree/list-shaped tenant to make finding-#57 List/Tree pagination visible — its issues are NOT spread across the board's statuses, assignees, priorities, or epics, so a board over it would pile every card into one column with no lanes. Extend it (a new SEED_SHAPE=board mode, or a sibling seedLargeBoard the script calls — keep it idempotent + service-routed like the original, NO raw inserts that skip the kind-parent triggers) so the BIG project's issues spread across: every workflow status (so each board column is populated, including a tall one for virtualization), many distinct assignees + every priority + several epics (so group-by Assignee/Epic/Priority each produce many lanes + a catch-all), and a Done-age spread in the terminal status (some resolvedAt inside the 14-day window, some well outside) so the Done-age trim is observable. Tunable via the existing SEED_* envs.
Cap + Done-age test seam. BOARD_ISSUE_CAP (5,000) and DONE_AGE_WINDOW_DAYS (14) are hardcoded export consts in lib/services/boardsService.ts; triggering the over-cap banner would otherwise need 5,000+ materialized rows. Add a minimal seam: resolve the cap (and, if useful, the Done-age window) from an env override (e.g. BOARD_ISSUE_CAP_OVERRIDE / DONE_AGE_WINDOW_DAYS_OVERRIDE) when set, falling back to the shipped constant otherwise — read once at the service boundary, kept as the single source the projection and the cap/truncated DTO fields already use (3.8.2). The override is wired ONLY into the Playwright webServer env (playwright.config.ts) / the vitest setup; with the env unset, production behaviour is byte-for-byte the shipped 5,000 / 14 — VERIFIED by a unit test, so this is a test seam, not a behaviour change.
E2E helper extensions. Extend tests/e2e/_helpers/board.ts with the at-scale helpers the journey specs need (resolve a column's rendered card count vs. its total badge, assert no "Load more" affordance exists, read the over-cap banner, sign in as the board-seed owner) — additive, no change to the existing 3.1.7/3.6.4 helpers.
Acceptance criteria
pnpm db:seed:large(board mode) seeds theBIGproject so its default board has every column populated (one tall enough to virtualize), many assignee/epic/priority lanes + a catch-all under each group-by, and a Done-age spread in the terminal column; idempotent and routed through the shipped services (no raw inserts), refusing to run underNODE_ENV=productionlike the original.- The cap + Done-age seam reads an env override when set and falls back to the shipped
BOARD_ISSUE_CAP(5,000) /DONE_AGE_WINDOW_DAYS(14) when unset, with the override wired only into the testwebServer/ vitest env; a vitest test asserts the unset-env default equals the shipped constants (no production behaviour change). tests/e2e/_helpers/board.tsgains the at-scale helpers (rendered-vs-total count, "no Load more", over-cap banner read, board-seed sign-in) without altering the existing helpers; a focused vitest asserts the board-shaped seed yields the documented column/lane/Done-age distribution.- No migration, no UI change, no new product surface — dev script + service seam + test helpers only.
Context refs
scripts/seed-large.ts(2.5.16, finding #57) — the existing large seed + itsSEED_*env knobs + idempotent service-routed pattern to extendlib/services/boardsService.ts—BOARD_ISSUE_CAP/DONE_AGE_WINDOW_DAYS/doneSince()+getBoard(thecap/truncatedprojection, 3.8.2) the seam feedstests/e2e/_helpers/board.ts(getBoard/moveCard/columnByStatus/cardIdsIn) +tests/e2e/_helpers/{workflow,shell-session,db-reset}.ts;tests/helpers/db.tslib/repositories/workItemRepository.ts(the bounded board read, 3.8.2) — the distribution the seed must populate;motir-core/CLAUDE.md(real Postgres, no mocks)