GitHub
Concept

Sprints

Time-boxed iterations scoped to a single team — three statuses, one active sprint per team, automatic carryover prompts on completion.

A sprint is a time-boxed batch of issues belonging to a single team. ProxifAI supports the basics — start/end dates, a goal, an issue list — without forcing scrum ceremony on you. Source: type Sprint struct in models.go.

Anatomy of a sprint

FieldTypeNotes
namestring”Sprint 12”, “Q2 W3”, or whatever convention you prefer
goalnullableOne-line outcome the team’s driving toward
statusenumplanning · active · complete (only three)
startDate, endDatenullable dates
teamIdrequiredSprints belong to exactly one team — there are no org-wide sprints
taskscomputedIssues with sprintId set to this sprint

Status

Three statuses, defined as SprintStatus:

StatusMeaning
planningSprint is being scoped — issues can be added/removed freely
activeSprint is in flight — at most one per team at any time
completeEnded — read-only except for moving leftover issues

Activate a planning sprint when ready; complete it when the end date passes (the UI prompts you).

One active sprint per team is enforced — activating a new sprint while one is already active will fail. To run parallel workstreams, create separate teams or use labels within a single sprint.

Creating a sprint

From the UI

Plan → Sprints → New (or per-team Sprints tab). Name + start + end dates. Goal is optional but useful — it prints on every standup view.

From the CLI

pfai sprint create "Sprint 12" \
  --team backend \
  --start 2026-05-12 --end 2026-05-26 \
  --goal "Ship OIDC login GA"

Adding issues

Three paths, all writing the same sprintId field on the issue:

  • Drag-and-drop from the backlog onto the sprint board
  • Set the sprint property on individual issues (Sprint: dropdown) or in batch from the issue list
  • CLI: pfai sprint add-task sprint_42 BACK-100 BACK-101

Issues can be removed the same way (pfai sprint remove-task or just unset the field).

Activating and completing

pfai sprint update sprint_42 --status active     # only one active per team
pfai sprint update sprint_42 --status complete   # close it out

When you complete a sprint with open issues remaining, the UI offers per-issue:

  • Move to next planning sprint (if one exists)
  • Send back to backlog
  • Leave as-is (sprint stays as the issue’s sprintId, but the sprint is complete)

Nothing is silently dropped.

Progress

While a sprint is active, the detail page shows:

  • Completion bardone / total non-cancelled
  • Issue breakdown by status — counts across all six issue statuses (incl. in_review)
  • Burndown — daily snapshot of remaining (non-done) issues vs. an ideal-line projection
  • Daily delta — issues added or removed each day, surfacing scope creep

After completion, pfai sprint stats sprint_42 (or the UI’s Stats tab) gives:

  • Velocity — issues (or estimate-summed points) completed
  • Carry-over — count moved to the next sprint
  • Cycle time — average in_progressdone duration
  • Scope change — issues added after start

Team scoping

Sprints belong to exactly one team. In multi-team orgs:

  • Each team maintains its own cadence
  • The sprint board shows only issues assigned to team members
  • Project dashboards aggregate sprint data across teams that contribute issues to the project

A single project can therefore have several concurrent sprints — one per contributing team.

REST endpoints

Method · PathPurpose
GET /api/v1/sprints?team=&status=List
POST /api/v1/sprintsCreate
GET /api/v1/sprints/{id}Read (with embedded tasks[])
PATCH /api/v1/sprints/{id}Update name/goal/status/dates
DELETE /api/v1/sprints/{id}Soft-delete
POST /api/v1/sprints/{id}/tasksAdd issues
DELETE /api/v1/sprints/{id}/tasks/{issueId}Remove an issue
GET /api/v1/sprints/{id}/statsVelocity, carry-over, cycle time, scope change

See also