4.7.1 At-scale Scrum fixture — sprint-shaped large seed (active sprint + points) + helpers
Estimate: 25m · Depends on: 3.5.1, 4.1, 4.3.3
The harness the two journey specs build on — a sprint-shaped large dataset (a large active sprint holding board-shaped issues with a point spread) plus the reused test-only env seam over the load-model bounds, so the at-scale Scrum states are reachable deterministically and cheaply. Test infrastructure only (a dev seed extension + e2e helpers) — it changes NO UI, so the design gate does not fire.
Sprint-shaped large seed. seedLargeBoard (3.5.1, scripts/seedLargeBoard.ts, driven by SEED_SHAPE=board) spreads issues across every status (column), many assignees, every priority, several epics, and a Done-age spread — but its issues are NOT associated with a sprint, so the Scrum projection (4.5.2) returns sprint: null over it. Add a SEED_SHAPE=scrum mode (a sibling seedLargeScrumSprint the script calls, composing the existing board-shaped distribution — keep it idempotent + service-routed like the original, NO raw inserts that skip the kind-parent triggers) that, on top of the board-shaped spread, (a) creates an active sprint in the BIG project (via the shipped sprint service/repo from Story 4.1 — start it, or DB-set state=active + the window in the fixture the way 4.5.4 sets active-sprint state directly, since the lifecycle UI is Story 4.4); (b) associates a large bounded set of the board-shaped issues with that sprint (sprintId) so the Scrum board is at scale — spanning every column (incl. the tall one), every group-by lane, and the Done-age spread; (c) leaves a slice of issues OUTSIDE the sprint (still in the backlog) so a scope test can assert they are absent from the Scrum board; (d) gives the sprint issues a story-point spread (storyPoints via the 4.3.3 field — some estimated, some NULL) so the header committed/completed/remaining + per-column point pills are at scale and the unestimated-→0 path is covered; and (e) creates a planned carry-over target sprint in the same project (the 4.7.3 complete-with-carry-over journey needs a non-backlog target). Tunable via the existing SEED_* envs (e.g. SEED_SPRINT_ISSUE_COUNT).
Cap + Done-age test seam (reused). The BOARD_ISSUE_CAP (5,000) / DONE_AGE_WINDOW_DAYS (14) env seam already exists from 3.5.1 (resolved at the boardsService boundary, falling back to the shipped constants when unset, wired only into the Playwright webServer / vitest env). The Scrum projection scopes the SAME getBoard to the sprint, so the seam governs the sprint-scoped board unchanged — this subtask REUSES it (no new seam), and a unit test confirms the unset-env default is still the shipped 5,000 / 14.
E2E helper extensions. Extend tests/e2e/_helpers/board.ts (the 3.5.1 at-scale helpers) with the Scrum-specific helpers the journey specs need (sign in as the sprint-seed owner, open the project's Scrum board, read the sprint header points + per-column point pill, assert an issue is/ isn't in the active sprint scope) — additive, no change to the existing 3.5.1/4.5.4 helpers.
Acceptance criteria
SEED_SHAPE=scrum pnpm db:seed:largeseeds theBIGproject with a largeactivesprint whose issues span every column (one tall enough to virtualize), every group-by lane + catch-all, a Done-age spread in the terminal column, and a story-point spread (some NULL); a slice of issues stays OUTSIDE the sprint; a planned carry-over target sprint exists in the same project. Idempotent + routed through the shipped sprint/work-item services (no raw inserts), refusing to run underNODE_ENV=productionlike the original.- The fixture REUSES the 3.5.1 cap + Done-age env seam (no new seam); a vitest test asserts the unset-env default still equals the shipped
BOARD_ISSUE_CAP(5,000) /DONE_AGE_WINDOW_DAYS(14) (no production behaviour change). tests/e2e/_helpers/board.tsgains the Scrum at-scale helpers (sprint-seed sign-in, Scrum-board open, sprint-header points read, in-sprint-scope assertion) without altering the existing helpers; a focused vitest asserts the sprint-shaped seed yields the documented active-sprint / column / lane / Done-age / point distribution and that the Scrum projection (getBoard) over it returns the sprint summary + the scoped set.- No migration, no UI change, no new product surface — dev seed extension + reused seam + test helpers only.
Context refs
scripts/seedLargeBoard.ts(3.5.1) +scripts/seed-large.ts(SEED_SHAPEswitch, 2.5.16/3.5.1) — the board-shaped seed + itsSEED_*knobs + idempotent service-routed pattern to extend with the sprint dimensionlib/services/sprintsService.ts+lib/repositories/sprintRepository.ts(Story 4.1 — sprint entity + issue→sprint association) + theworkItem.sprintIdfield;storyPoints(4.3.3) — the model the seed associates + estimateslib/services/boardsService.ts—BOARD_ISSUE_CAP/DONE_AGE_WINDOW_DAYS/ the 3.5.1 env seam + the 4.5.2 scrum-scopedgetBoardthe seed feedstests/e2e/_helpers/board.ts(3.5.1 at-scale helpers) +tests/e2e/_helpers/{workflow,shell-session,db-reset}.ts;tests/helpers/db.ts;motir-core/CLAUDE.md(real Postgres, no mocks, service-routed seeds)