Child of PAR-190. Team/project-level time-boxed iterations.
Scope:
sprint (tenant-scoped: id, name, team_id or project_id, start/end dates, state active/closed) + issue.sprint_id.sprints feature toggle (PAR-189).Completed on develop (fb32fb3). The UI already gates all sprint affordances (picker on new/edit, sprint badge) on settings.sprints and reads sprints via lib/sql/sprints, so the "no list endpoint" point was moot (reads come from the mirror). The real gap was server-side enforcement: WorkspaceAdminService.createSprint now refuses when the workspace's sprints toggle is off (WorkspaceSettingsService.sprintsEnabled), and I aligned the backend default to off/opt-in to match the UI (lib/sql/settings.ts). Test added (sprint creation gated by the toggle). Team/project scoping remains deferred per the original ticket. Acceptance met.
Verification: partial — keeping open. Done:
sprinttable (V23) +issue.sprint_id, sprint CRUD gated on settings.manage, tag/untag on create/update, exposed on detail + filterable, MCP accepts a sprint. Gaps vs acceptance: (1) thesprintsfeature toggle (PAR-189 substrate) is not enforced — sprints are always surfaced; (2) there is no list-sprints (GET) endpoint — only create/patch/delete; (3) team/project scoping is deferred (table comment). Address these before Done.