Manage time-boxed sprints with MoSCoW prioritization. Part of the Plot workflow. Use on /plot-sprint.
Sprints are not plans. Plans track what to build; sprints track when to ship it. Sprint files live in docs/sprints/, committed directly to main — no PR, no review gate. Principle 2 ("Plans merge before implementation") does not apply to sprints.
Input: $ARGUMENTS determines the subcommand.
| Form | Action |
|---|---|
/plot-sprint | Status (infer slug or list all) |
/plot-sprint <slug> | Status of slug (or create if not found) |
/plot-sprint <slug> commit | Lock sprint contents |
/plot-sprint <slug> start | Begin the sprint |
/plot-sprint <slug> close | End timebox, capture retro |
/plot-sprint <slug> add/remove/reprio | Change sprint scope (see Scope Change) |
/plot-sprint <slug>: <goal> | Create slug with goal |
=
<!-- keep in sync with plot/SKILL.md Setup -->$ARGUMENTS[<slug>] [<subcommand>] [<args>]$ARGUMENTS[0] → slug (first word, if present)$ARGUMENTS[1] → subcommand: commit, start, close: in slug token (e.g. week-1: Ship auth)docs/sprints/active/ — one active sprint → use it, multiple → list and ask, none → offer to createAdd a ## Plot Config section to the adopting project's CLAUDE.md:
## Plot Config
<!-- Optional: uncomment if using a GitHub Projects board -->
<!-- - **Project board:** owner/number (e.g. eins78/5) -->
- **Branch prefixes:** idea/, feature/, bug/, docs/, infra/
- **Plan directory:** docs/plans/
- **Active index:** docs/plans/active/
- **Delivered index:** docs/plans/delivered/
- **Sprint directory:** docs/sprints/
| Steps | Min. Tier | Notes |
|---|---|---|
| Create, commit, start, status | Small | Git commands, templates, file ops |
| Close | Mid | Checkbox parsing + reading plan files to check delivery status of [slug] refs |
All sprint operations are structural (Small or Mid). No Frontier needed.
User interaction: Use
AskUserQuestion(Claude Code) /ask_question(Cursor) for all questions, proposals, and confirmations.
flowchart LR
A["/plot-sprint<br/><slug>: <goal>"] -->|"⏸ drafting"| B["Planning"]
B -->|"⏳ /plot-sprint commit"| C["Committed"]
C -->|"⚡ /plot-sprint start"| D["Active"]
D -->|"⏳ /plot-sprint close"| E["Closed"]
Legend: ⚡ automate ASAP · ⏸ natural pause · ⏳ human-paced
Sprint files must not contain ## Design or ## Approach sections. If detected, warn: "This looks like a plan, not a sprint. Use /plot-idea for plans."
/plot-sprint <slug>: <goal>Create a new sprint in Planning phase.
Pacing: ⏸ natural pause (drafting)
Extract <slug> (before the colon) and <goal> (after the colon). Both are required.
If no colon or missing parts: "Usage: /plot-sprint <slug>: <goal>"
Derive the ISO week prefix from today's date for the filename:
WEEK_PREFIX=$(date -u +%Y-W%V)
The sprint file will be named docs/sprints/${WEEK_PREFIX}-<slug>.md.
ls docs/sprints/${WEEK_PREFIX}-<slug>.md 2>/dev/null
If file exists: "Sprint <slug> already exists for week ${WEEK_PREFIX}."
List active plans so the user can add them to the sprint:
ls docs/plans/active/ 2>/dev/null
If plans exist, present: "Found N active plans. Add any to this sprint?" List them and let the user select which to include (or none). Selected plans are added as [slug] items under the appropriate MoSCoW tier.
mkdir -p docs/sprints
Write docs/sprints/${WEEK_PREFIX}-<slug>.md using the template from skills/plot/templates/sprint.md, substituting <title> and <sprint goal>.
Item format: - [ ] [slug] description (plan reference) or - [ ] description (lightweight task).
Plan-backed items carry HTML comment annotations for automation tracking:
- [ ] [slug] description <!-- pr: #N, status: draft, branch: feature/slug -->
| Field | Set by | Values |
|---|---|---|
pr | /plot-approve | PR number (#N) or none |
status | /plot-approve, /plot-deliver, /plot-reject | not-started, draft, open, merged, delivered, rejected |
branch | /plot-approve | Implementation branch name |
reviewed_at | Review tracking | ISO 8601 timestamp |
review_sha | Review tracking | HEAD SHA at time of review |
Annotations are created by /plot-approve and updated by /plot-deliver. The status subcommand reads them for enriched output.
The review_sha annotation enables skip-if-unchanged review:
review_sha in the annotationmerged → never needs reviewUse skills/plot/scripts/plot-review-status.sh <sprint-slug> to get review freshness for all sprint items as JSON.
Leave Start/End dates as placeholders — the user fills them during the Planning phase.
For each plan-backed item ([slug]) added in step 4, update the referenced plan file to record sprint membership:
docs/plans/active/<slug>.md- **Sprint:** <sprint-slug> to its ## Status section (after the Phase line)This enables sprint awareness in /plot-approve and /plot-deliver.
Sprint files are committed directly to main (include any updated plan files):
git add docs/sprints/${WEEK_PREFIX}-<slug>.md docs/plans/
git commit -m "sprint: create <slug>"
git push
Print:
docs/sprints/${WEEK_PREFIX}-<slug>.md[*] Planning > [ ] Committed > [ ] Active > [ ] Closed/plot-sprint <slug> commit when ready/plot-sprint <slug> commitLock sprint contents. Team has agreed on what's in scope.
Pacing: ⏳ human-paced (team agreement)
ls docs/sprints/*-<slug>.md 2>/dev/null
If not found: "No sprint found for <slug>."
Read the sprint file. Check Phase field:
Planning: "Sprint is in <phase> phase, not Planning. Cannot commit."Check that the **End:** field has a real date (not the placeholder YYYY-MM-DD).
If missing or placeholder: "Set an end date before committing. Edit the sprint file directly."
Change **Phase:** Planning → **Phase:** Committed
git add docs/sprints/*-<slug>.md
git commit -m "sprint: commit <slug>"
git push
Print:
<slug>[ ] Planning > [x] Committed > [ ] Active > [ ] Closed<end date>/plot-sprint <slug> start when the sprint begins/plot-sprint <slug> startBegin the sprint. Creates the active symlink.
Pacing: ⚡ automate ASAP (mechanical transition)
Find sprint file, check Phase is Committed.
mkdir -p docs/sprints/active
ln -s ../${WEEK_PREFIX}-<slug>.md docs/sprints/active/<slug>.md
Change **Phase:** Committed → **Phase:** Active
git add docs/sprints/*-<slug>.md docs/sprints/active/<slug>.md
git commit -m "sprint: start <slug>"
git push
Print:
<slug>[ ] Planning > [ ] Committed > [x] Active > [ ] Closed<end date>docs/sprints/active/<slug>.md/plot-sprint <slug> close/plot-sprint <slug> closeEnd the timebox. Check MoSCoW completeness and capture retrospective.
Pacing: ⏳ human-paced (retrospective)
Find sprint file, check Phase is Active.
Parse the sprint file for checkbox items in each tier:
- [x] vs unchecked - [ ] items per tier[slug]), check if the referenced plan is delivered (exists in docs/plans/delivered/)Present results:
Must Have: 2/4 complete
Should Have: 1/2 complete
Could Have: 0/1 complete
If must-haves are incomplete, present three options:
- [ ] line from ### Must Have to ### Deferred, preserving the original textAsk the user: "Add a retrospective? (optional)"
If yes, prompt for:
Fill the ## Retrospective section using the template from skills/plot/templates/retrospective.md. Include the Metrics subsection with actual counts from step 2.
Change **Phase:** Active → **Phase:** Closed
git rm docs/sprints/active/<slug>.md
git add docs/sprints/*-<slug>.md
git commit -m "sprint: close <slug>"
git push
Print:
<slug>[ ] Planning > [ ] Committed > [ ] Active > [x] Closed/plot-sprint <new-slug>: <goal>/plot-release to cut a releaseScope changes are allowed during Active (or Committed) sprints. All changes are logged in the sprint file's ## Notes > ### Scope Changes section for traceability.
Adding items mid-sprint:
- [ ] item to the appropriate MoSCoW tier- YYYY-MM-DD: Added [slug] to Must/Should/Could — <reason>[slug]), update the plan's Sprint fieldRemoving or deferring items:
### Deferred section (do not delete — preserve history)- YYYY-MM-DD: Deferred [slug] from Must — <reason>Changing MoSCoW tier:
- YYYY-MM-DD: Reprioritized [slug] Must → Should — <reason>Commit scope changes directly to main with message: sprint: scope change <slug>.
/plot-sprint or /plot-sprint <slug>Show sprint status.
If slug provided ($ARGUMENTS[0] present, no subcommand):
ls docs/sprints/*-<slug>.md 2>/dev/null<slug> found. Create it with /plot-sprint <slug>: <goal>"If no arguments:
ls docs/sprints/active/ 2>/dev/null/plot-sprint <slug>: <goal>"Read the sprint file and display:
## Active Sprints
- `<slug>` — "<goal>" | [*] Active | 3 days remaining | Must: 2/4 | Should: 1/2 | Could: 0/1