Skip to content

moooon

Motir

Vibe your whole project. Bring an idea — Motir's three AI layers plan it, track it, and ship it, end to end. You're looking at Motir, built in Motir.

  • Vibe Project
  • Open Source
  • AI Agent
  • AI Loop
1
requests
0
upvotes
145
planned
1,361
shipped

Motir · Work items

MOTIR-256Done

4.7 Tests — the cross-cutting Scrum journey at scale (sprint-scoped load · drag · swimlanes · WIP · complete + carry-over)

The Epic-4 integration test story: the COMBINED Scrum journey — bounded sprint-scoped load → virtualized render → drag-as-transition → swimlanes → WIP → complete-sprint carry-over → report — exercised end-to-end against a large active sprint, the cross-cutting case every per-story Epic-4 test explicitly defers here. It is the Scrum analogue of Story 3.5 (the at-scale Kanban journey).

Why a separate story (not more per-story tests). Each Epic-4 story already ships its own closing test subtask covering its surface in isolation: 4.1.5 (sprint entity + one-active guard + bounded reads), 4.2.6 (backlog groom/rank/assign + the Start entry point), 4.3.7 (estimate write + config + bounded sprint/epic roll-ups + the statistic switch + estimate-a-story E2E), 4.4.7 (the sprint lifecycle state machine — start/complete/carry-over/provisioning/report — + a focused plan→start→move→complete→report E2E), 4.5.4 (sprint-scope projection + summary + header + no-active-sprint), and Story 4.6 will own its own chart tests when it expands. What NONE of them owns — and each one defers to 4.7 by name — is the combined journey at real-team scale, where virtualization, the over-cap bound, the Done-age window, the sprint scope, the interaction surfaces, and the complete-sprint carry-over all have to hold at once on a large active sprint. That is this story, and only that; it does not re-test what an owning story already proves with a handful of rows.

It MUST reflect the Story-3.8 load model, scoped to the sprint (the headline mandate). The Scrum board is the SAME getBoard projection (4.5.2) scoped to its active sprint, so it inherits the post-3.8 model: the board loads its sprint-scoped set bounded by BOARD_ISSUE_CAP (5,000), virtualizes the render via useRowWindow, windows terminal columns to DONE_AGE_WINDOW_DAYS (14 days), and shows the over-cap "refine your filter" banner (OverCapBanner, truncated === true) past the cap — with NO per-column "Load more" anywhere. 4.7's at-scale specs assert exactly this shape on the Scrum board (no "Load more" flat OR in swimlanes; the over-cap banner present past the cap and absent under it; the Done-age window trimming the Done column with the full count on the badge) — never a retired cursor. (4.5.2's prose still names the retired loadColumnCards cursor; the Scrum board ships on the cursor-free post-3.8 getBoard, so 4.7 asserts the cursor-free shape and would catch a regression — finding-grade, surfaced in the header comment.)

The fixture + seam this story builds first (4.7.1). The at-scale Scrum journey needs a large active sprint and a cheap way to reach the over-cap / Done-age states. The board-shaped large seed (seedLargeBoard, 3.5.1) spreads issues across columns / assignees / priorities / epics / Done-age but does NOT associate them with a sprint, so a Scrum board over it shows "no active sprint". So 4.7.1 ships a sprint-shaped large seed (a new SEED_SHAPE=scrum mode that builds the board-shaped distribution AND associates a large bounded set of it with an active sprint, with a story-point spread + a planned carry-over target sprint) and reuses the test-only, production-inert env seam over the cap + Done-age window (3.5.1) so the banner and the Done-age trim are reachable with tens — not thousands — of rows. The journey specs (4.7.2 load model + scope + header, 4.7.3 interaction + complete) build on that harness.

Out of scope. The Kanban at-scale journey (Story 3.5 — done); the per-surface unit coverage owned by 4.1.5 / 4.2.6 / 4.3.7 / 4.4.7 / 4.5.4 (the sprint state machine, the roll-up math, the projection units — consumed here, not re-tested); the velocity + burndown chart math + render (Story 4.6 — its own future closing test subtask; 4.7 asserts only the numeric sprint-health figures the header already shows, never the chart series); the focused single-sprint lifecycle E2E (Story 4.4.7 — 4.7 runs the AT-SCALE version of that journey, with a large carry-over). 4.7 is the cross-cutting E2E layer over the real stack; per-method unit coverage stays in the owning stories.

Verification

  • Pull the Story branch, pnpm install, pnpm prisma generate (NO migration — pure tests + a dev seed extension + the reused test-only env seam over the Story-3.8/4.5 schema/services).
  • SEED_SHAPE=scrum pnpm db:seed:large (the sprint-shaped variant from 4.7.1) seeds the BIG project so it has a large active sprint; sign in as the seed owner and open the project's Scrum board to eyeball it (thousands of sprint cards across the columns, columns scroll smoothly, the sprint header shows committed/completed/remaining points, no "Load more" anywhere).
  • pnpm test — the at-scale fixture/harness unit checks from 4.7.1 (the sprint-shaped seed produces the documented active-sprint / column / lane / Done-age / point distribution; the cap + Done-age env seam flexes under the test env and falls back to the shipped 5,000 / 14 constants when unset).
  • pnpm test:e2e --grep board-scrum-at-scale — Playwright over the real stack against the sprint-shaped large seed:
    • Load model + scope + header (4.7.2): the Scrum board renders ONLY the active sprint's issues, the whole bounded set with NO per-column "Load more" (flat AND swimlane); scrolling a tall column keeps the rendered DOM bounded (virtualization); with the cap lowered below the seeded sprint total the over-cap "refine your filter" banner shows (and is absent when under the cap); the Done column shows only issues resolved inside the Done-age window while its count badge shows the full total; the sprint header shows committed/completed/remaining points + per-column point pills computed from aggregates (not page sums); a project with the sprint completed shows the no-active-sprint empty state + Backlog CTA, not an empty board.
    • Interaction + complete at scale (4.7.3): drag a card across columns deep in a virtualized sprint column → the transition applies (optimistic, reconciled) and the card stays in the sprint; an illegal cross-column move snaps back (409); switch group-by to Assignee/Epic/Priority → the sprint board re-lays into many lanes + catch-all (still bounded, still no "Load more"); a cross-lane drag reassigns the grouped field (sprint + status unchanged); a column over its WIP limit shows the soft n/limit warning yet still accepts the drop; then Complete sprint with a large set of unfinished issues moves them all to the backlog (or a planned sprint) in ONE bounded transaction and shows the sprint report (committed/completed points + scope-change from aggregates, lists paginated — not a dump).
  • All of the above reuse the real-Postgres + Playwright harness (tests/helpers/db.ts, tests/e2e/_helpers/{db-reset,board,workflow,shell-session}.ts + the 3.5.1 at-scale helpers) and DO NOT duplicate the single-surface journeys owned by 4.4.7 / 4.5.4 or the Kanban-at-scale journey owned by 3.5.