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

4.4.9 Bug — start-sprint committed summary shows the issue count only, not "· N points" (no pre-start points source) (finding #69)

Estimate: 20m · Depends on: 4.4.5

Type: bug (UI gap) · Parent: Story 4.4 (sprint lifecycle) · Code surface owned by: the committed-points SEAM (the SprintContainer slot, attributed to Story 4.3) crossed with Story 4.4.5 (the StartSprintDialog committed summary) · Status: open · Reported by: the planner during the 4.4.5 build · Source: PRODECT_FINDINGS #69.

The design's committed summary reads "8 issues · 21 points committed at start" (panel 1). SprintDto.issueCount is available client-side, but committedPoints is null until startSprint stamps it, and there is no route exposing the live pre-start points roll-up — estimationService.rollupForSprint (4.3.3, done) is only consumed internally. The SprintContainer committed-points slot is itself still a labelled SEAM (Story 4.3). So 4.4.5 renders the committed summary with the issue count only ("{n} issues committed at start"), omitting the live points figure — under-delivering to the mockup's ceiling (mistake #26), but deliberately, to avoid doing another story's work / a cross-surface collision. The authoritative committedPoints baseline is still computed + stored server-side at start (4.4.2) and read back by the 4.4.6 report; only the pre-start PREVIEW figure is missing.

Fix. Expose a small bounded read — GET /api/sprints/[id]/points (HTTP-only, one service call) over the shipped estimationService.rollupForSprint(sprintId)SprintPointsDto ({ committed, completed, remaining }, already bounded, finding-#57-safe, tenant-gated). Then wire committed into BOTH consumers: the SprintContainer committed-points SEAM (replace the — pts placeholder) AND the StartSprintDialog committed summary ("{n} issues · {p} points committed at start"; "—" when wholly unestimated — the 4.5.2 pattern, never NaN). This is the Story-4.3 / estimation-display follow-up the SEAM was reserved for; doing it once serves both surfaces.

Acceptance criteria

  • GET /api/sprints/[id]/points returns the SprintPointsDto from rollupForSprint (HTTP-only, one service call; the finding-#26 workspaceId gate covers the read); a wholly unestimated sprint returns { 0, 0, 0 } (the DTO stays total).
  • The StartSprintDialog committed summary shows "{n} issues · {p} points committed at start", rendering "—" for points when the sprint is unestimated (no NaN); the figure refreshes if the duration/dates change but the issue set does not (points are issue-set-derived, not window-derived).
  • The SprintContainer committed-points SEAM renders the live committed points (the — pts placeholder + the "reserved, not computed" comment are removed); the velocity SEAM (Story 4.6) is left untouched.
  • Component tests assert the points render (incl. the unestimated "—"); pnpm test:coverage keeps any changed gated file ≥90% branch/fn/line.

Context refs

  • lib/services/estimationService.ts rollupForSprint + lib/dto/estimation.ts SprintPointsDto (Story 4.3.3) — the bounded aggregate to expose; no re-summing
  • app/(authed)/backlog/_components/SprintContainer.tsx (the committed-points SEAM) + app/(authed)/backlog/_components/StartSprintDialog.tsx (4.4.5 committed summary) — the two display consumers
  • the 4.5.2 sprint-header "—"-when-unestimated pattern (the UI owns the "—", the DTO stays total); finding #57 (bounded aggregate, not load-all); PRODECT_FINDINGS #69; motir-core/CLAUDE.md (4-layer: route is HTTP-only; --el-* + element-shape tokens)