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-258Done

4.7.2 At-scale Scrum load-model + scope + header E2E — sprint-scoped bounded load, virtualization, over-cap banner, Done-age window, header points

Estimate: 22m · Depends on: 4.7.1, 4.5.2, 4.5.3

The Playwright spec (tests/e2e/board-scrum-at-scale.spec.ts) that proves the Story-3.8 load model holds on the Scrum board at scale, scoped to the active sprint — the sprint-scoped analogue of Story 3.5.2. Runs against the sprint-shaped large seed (4.7.1) over the real stack.

Sprint scope at scale. Open the BIG project's Scrum board: every rendered card belongs to the active sprint; an issue left OUTSIDE the sprint (4.7.1 slice) is absent from the board — assert the scope filter (4.5.2) holds over a large set, never falling back to the unscoped backlog.

Bounded whole-set load, no "Load more" (flat). The sprint-scoped columns render their cards with NO per-column "Load more" button and NO scroll-sentinel footer anywhere (the 3.8.3 retirement the Scrum board inherits) — assert the affordance is absent flat AND in swimlanes. Each column's count badge shows its full sprint-scoped totalCount.

Virtualization keeps the DOM bounded. A tall sprint column (seeded past the row window) renders far fewer card DOM nodes than its total; scrolling reveals later cards while the rendered node count stays bounded (useRowWindow) — assert rendered-count ≪ total, and that a card deep in the list becomes reachable by scrolling (not by paging).

Over-cap "refine your filter" banner. With the cap lowered below the seeded sprint total (the 4.7.1/3.5.1 env seam), the OverCapBanner shows above the Scrum board — text names the cap, paired with the alert-triangle (not colour-alone, finding #35), role="status" — for both flat AND swimlane layouts. Raise the cap above the total: the banner is absent (truncated === false).

Done-age window. The terminal (Done) column shows only issues resolved within the Done-age window (the seed places some inside, some outside); older resolved issues are absent from the rendered column while the count badge shows the full total. Shrinking the window via the seam trims more — proving the window is age-based (3.8.2), not count-based.

Sprint header at scale (bounded aggregates, not page sums). The SprintHeader (4.5.3) shows name/goal/dates/time-remaining and the committed/completed/remaining points + the per-column point pills (4.5.2 SprintSummaryDto / columnPoints). Assert these come from the aggregate queries and reflect the WHOLE sprint (they exceed any single loaded page's sum), that NULL-estimate issues contribute 0 (no NaN), and that an overdue sprint shows "Ended" (daysRemaining floored at 0).

No active sprint. Against a project whose sprint is completed/none, the Scrum board area shows the "No active sprint" empty state + the Backlog CTA, not an empty six-column board (the 4.5.2 sprint: null path) — proven once here at the integration layer.

Acceptance criteria

  • pnpm test:e2e --grep board-scrum-at-scale (this spec) is green: against the sprint-shaped large seed, the Scrum board renders ONLY active-sprint issues (an out-of-sprint issue is absent), loads the whole bounded set with NO "Load more"/sentinel (flat + swimlane), and a tall column renders a bounded DOM node count that grows by scrolling (not paging).
  • The over-cap "refine your filter" banner shows above the Scrum board (flat AND swimlane) when the seeded sprint total exceeds the (lowered) cap and is absent when under it; it pairs hue with the alert-triangle + copy (not colour-alone) and is announced (role="status").
  • The Done column shows only issues resolved inside the Done-age window while its count badge shows the full total; shrinking the window trims more (age-based, not count-based).
  • The sprint header shows committed/completed/remaining points + per-column pills from bounded aggregates (exceeding a single page sum), NULL estimates contribute 0, and an overdue sprint shows "Ended"; the no-active-sprint empty state + Backlog CTA renders for a completed/none sprint.
  • The spec asserts NO per-column cursor/"Load more" affordance or route call anywhere on the Scrum board; reuses the 4.7.1 helpers + the real-Postgres/Playwright harness; does NOT duplicate 4.5.4's small-scale scrum E2E or 3.5.2's Kanban load-model spec.

Context refs

  • Story 4.7.1 — the sprint-shaped large seed + reused cap/Done-age seam + Scrum at-scale helpers this consumes
  • app/(authed)/boards/_components/{BoardContainer,BoardColumn,SwimlaneBoard,LaneCell,OverCapBanner}.tsx (3.8.3/3.8.4/3.8.5) + the SprintHeader (4.5.3) + components/ui/useRowWindow.ts — the surfaces under test
  • lib/services/boardsService.ts (getBoard scrum scope + cap/truncated/Done-age + the SprintSummaryDto/columnPoints aggregates, 4.5.2) + lib/dto/boards.ts — the load-model + scope + summary contract being verified
  • tests/e2e/board-scrum.spec.ts (4.5.4) — the small-scale scrum E2E this extends to scale (do not duplicate); tests/e2e/board-at-scale.spec.ts (3.5.2) — the Kanban analogue pattern; design/boards/{scrum,board-scale}.mock.html (4.5.1/3.8.1) — the design under test