Sprint
Create a new sprint or advance to the next one.
Usage
sprint [description] - Create new sprint from feature description
sprint next - Advance to next sprint from roadmap
Creating from Description
- Parse $ARGUMENTS as feature description
- Generate epic prefix from description
- Create/update prd.json with new sprint
- Generate 10-20 stories via TaskCreate with full metadata (see core skill for schema):
TaskCreate({
subject: "[verb] [specific deliverable]",
description: "## What\n[Exactly what to build]\n\n## Acceptance Criteria\n- [ ] [Testable outcome]\n- [ ] Build passes\n- [ ] No type errors\n\n## Files\n- `src/path/file.ts` - [what to change]",
activeForm: "[Building|Adding] [short desc]",
metadata: {
sid: "[PREFIX]-[NNN]",
sprint: currentSprint,
epic: "[epic name]",
priority: [1-3],
category: "[auth|ui|perf|security|qa|infra]",
type: "feature",
passes: null,
verified: null
}
})
- Include file paths, patterns to follow
- Set dependencies between stories
- Report sprint summary
Advancing (sprint next)
- Read prd.json
- Mark current sprint as "done"
- Find next unscheduled roadmap epic(s)
- Create new sprint with stories from those epics
- Update prd.json
Auto-Archive Check
Before creating a new sprint, check if prd.json needs archiving:
# Count completed sprints. Object.values() handles stories as the id-keyed OBJECT
# core documents as well as an array — .every on an object threw, the catch ate it,
# and this printed nothing at all.
# "complete" = no agent-actionable story left (prd-states.js isActionable): needs-setup is blocked on a HUMAN, not on this sprint's engineering, and archive-prd's keep-list retains those stories — so one credential-blocked leftover must not stop the archive suggestion from ever firing.
node -e "try{const p=require('./prd.json');const sprints=p.sprints||[];const done=sprints.filter(s=>{const st=Object.values(s.stories||{});return s.passes===true||(st.length>0&&st.every(x=>x.passes===true||x.passes==='deferred'||x.passes==='needs-setup'))});console.log('completed:',done.length,'total:',sprints.length,'lines:',JSON.stringify(p).split(',').length)}catch(e){console.log(e.code==='MODULE_NOT_FOUND'?'no prd.json yet - nothing to archive':'archive check failed: '+e.message)}"
| Condition |
Action |
| 3+ completed sprints in prd.json |
Suggest archive before creating new sprint |
| prd.json > 500 lines |
Warn: "prd.json is large, consider archive first" |
Large prd.json wastes tokens on every request. Run the check.
Rules
- HARD CAP: 20 stories per sprint
- Stories must be detailed enough to implement without guessing
- Every story must be testable
- If user asks to "expand", explain roadmap and offer
sprint next
1---2name: sprint3description: Creates or advances sprints in prd.json. Use when starting new work cycles or closing completed sprints.4when_to_use: "Invoked when the user says \"sprint\"."5allowed-tools: Read, Write, Edit6model: opus7user-invocable: true8argument-hint: "[new|advance|close]"9---1011# Sprint1213Create a new sprint or advance to the next one.1415## Usage1617- `sprint [description]` - Create new sprint from feature description18- `sprint next` - Advance to next sprint from roadmap1920## Creating from Description21221. Parse $ARGUMENTS as feature description232. Generate epic prefix from description243. Create/update prd.json with new sprint254. Generate 10-20 stories via TaskCreate with full metadata (see core skill for schema):26 ```27 TaskCreate({28 subject: "[verb] [specific deliverable]",29 description: "## What\n[Exactly what to build]\n\n## Acceptance Criteria\n- [ ] [Testable outcome]\n- [ ] Build passes\n- [ ] No type errors\n\n## Files\n- `src/path/file.ts` - [what to change]",30 activeForm: "[Building|Adding] [short desc]",31 metadata: {32 sid: "[PREFIX]-[NNN]",33 sprint: currentSprint,34 epic: "[epic name]",35 priority: [1-3],36 category: "[auth|ui|perf|security|qa|infra]",37 type: "feature",38 passes: null,39 verified: null40 }41 })42 ```43 - Include file paths, patterns to follow44 - Set dependencies between stories455. Report sprint summary4647## Advancing (sprint next)48491. Read prd.json502. Mark current sprint as "done"513. Find next unscheduled roadmap epic(s)524. Create new sprint with stories from those epics535. Update prd.json5455## Auto-Archive Check5657Before creating a new sprint, check if prd.json needs archiving:5859```bash60# Count completed sprints. Object.values() handles stories as the id-keyed OBJECT61# core documents as well as an array — .every on an object threw, the catch ate it,62# and this printed nothing at all.63# "complete" = no agent-actionable story left (prd-states.js isActionable): needs-setup is blocked on a HUMAN, not on this sprint's engineering, and archive-prd's keep-list retains those stories — so one credential-blocked leftover must not stop the archive suggestion from ever firing.64node -e "try{const p=require('./prd.json');const sprints=p.sprints||[];const done=sprints.filter(s=>{const st=Object.values(s.stories||{});return s.passes===true||(st.length>0&&st.every(x=>x.passes===true||x.passes==='deferred'||x.passes==='needs-setup'))});console.log('completed:',done.length,'total:',sprints.length,'lines:',JSON.stringify(p).split(',').length)}catch(e){console.log(e.code==='MODULE_NOT_FOUND'?'no prd.json yet - nothing to archive':'archive check failed: '+e.message)}"65```6667| Condition | Action |68|-----------|--------|69| 3+ completed sprints in prd.json | Suggest `archive` before creating new sprint |70| prd.json > 500 lines | Warn: "prd.json is large, consider `archive` first" |7172Large prd.json wastes tokens on every request. Run the check.7374## Rules75- HARD CAP: 20 stories per sprint76- Stories must be detailed enough to implement without guessing77- Every story must be testable78- If user asks to "expand", explain roadmap and offer `sprint next`