178 lines
6.3 KiB
Markdown
178 lines
6.3 KiB
Markdown
# Skill Test Spec: /sprint-plan
|
|
|
|
## Skill Summary
|
|
|
|
`/sprint-plan` reads the current milestone file and backlog stories, then
|
|
generates a new numbered sprint with stories prioritized by implementation layer
|
|
and priority score. In full mode the PR-SPRINT director gate runs after the
|
|
sprint draft is compiled (producer reviews the plan). In lean and solo modes
|
|
the gate is skipped. The skill asks "May I write to `production/sprints/sprint-NNN.md`?"
|
|
before persisting. Verdicts: COMPLETE (sprint generated and written) or
|
|
BLOCKED (cannot proceed due to missing data or gate failure).
|
|
|
|
---
|
|
|
|
## Static Assertions (Structural)
|
|
|
|
Verified automatically by `/skill-test static` — no fixture needed.
|
|
|
|
- [ ] Has required frontmatter fields: `name`, `description`, `argument-hint`, `user-invocable`, `allowed-tools`
|
|
- [ ] Has ≥2 phase headings
|
|
- [ ] Contains verdict keywords: COMPLETE, BLOCKED
|
|
- [ ] Contains "May I write" language (skill writes sprint file)
|
|
- [ ] Has a next-step handoff (what to do after sprint is written)
|
|
|
|
---
|
|
|
|
## Director Gate Checks
|
|
|
|
| Gate ID | Trigger condition | Mode guard |
|
|
|-----------|--------------------------|--------------------|
|
|
| PR-SPRINT | After sprint draft built | full only (not lean/solo) |
|
|
|
|
---
|
|
|
|
## Test Cases
|
|
|
|
### Case 1: Happy Path — Backlog with stories generates sprint
|
|
|
|
**Fixture:**
|
|
- `production/milestones/milestone-02.md` exists with capacity `10 story points`
|
|
- Backlog contains 5 unstarted stories across 2 epics, mixed priorities
|
|
- `production/session-state/review-mode.txt` contains `full`
|
|
- Next sprint number is `003` (sprints 001 and 002 already exist)
|
|
|
|
**Input:** `/sprint-plan`
|
|
|
|
**Expected behavior:**
|
|
1. Skill reads current milestone to obtain capacity and goals
|
|
2. Skill reads all unstarted stories from backlog; sorts by layer + priority
|
|
3. Skill drafts sprint-003 with stories fitting within capacity
|
|
4. Skill presents draft to user before invoking gate
|
|
5. Skill invokes PR-SPRINT gate (full mode); producer approves
|
|
6. Skill asks "May I write to `production/sprints/sprint-003.md`?"
|
|
7. User approves; file is written
|
|
|
|
**Assertions:**
|
|
- [ ] Stories are sorted by implementation layer before priority
|
|
- [ ] Sprint draft is shown before any write or gate invocation
|
|
- [ ] PR-SPRINT gate is invoked in full mode after draft is ready
|
|
- [ ] Skill asks "May I write" before writing the sprint file
|
|
- [ ] Written file path matches `production/sprints/sprint-003.md`
|
|
- [ ] Verdict is COMPLETE after successful write
|
|
|
|
---
|
|
|
|
### Case 2: Blocked Path — Backlog is empty
|
|
|
|
**Fixture:**
|
|
- `production/milestones/milestone-02.md` exists
|
|
- No unstarted stories exist in any epic backlog
|
|
|
|
**Input:** `/sprint-plan`
|
|
|
|
**Expected behavior:**
|
|
1. Skill reads backlog — finds no unstarted stories
|
|
2. Skill outputs "No unstarted stories in backlog"
|
|
3. Skill suggests running `/create-stories` to populate the backlog
|
|
4. No gate is invoked; no file is written
|
|
|
|
**Assertions:**
|
|
- [ ] Verdict is BLOCKED
|
|
- [ ] Output contains "No unstarted stories" or equivalent message
|
|
- [ ] Output recommends `/create-stories`
|
|
- [ ] PR-SPRINT gate is NOT invoked
|
|
- [ ] No write tool is called
|
|
|
|
---
|
|
|
|
### Case 3: Gate returns CONCERNS — Sprint overloaded, revised before write
|
|
|
|
**Fixture:**
|
|
- Backlog has 8 stories totalling 16 points; milestone capacity is 10 points
|
|
- `review-mode.txt` contains `full`
|
|
|
|
**Input:** `/sprint-plan`
|
|
|
|
**Expected behavior:**
|
|
1. Skill drafts sprint with all 8 stories (over capacity)
|
|
2. PR-SPRINT gate runs; producer returns CONCERNS: sprint is overloaded
|
|
3. Skill presents concern to user and asks which stories to defer
|
|
4. User selects 3 stories to defer; sprint is revised to 5 stories / 10 points
|
|
5. Skill asks "May I write" with revised sprint; writes on approval
|
|
|
|
**Assertions:**
|
|
- [ ] CONCERNS from PR-SPRINT gate surfaces to user before any write
|
|
- [ ] Skill allows sprint to be revised after gate feedback
|
|
- [ ] Revised sprint (not original) is written to file
|
|
- [ ] Verdict is COMPLETE after revision and write
|
|
|
|
---
|
|
|
|
### Case 4: Lean Mode — PR-SPRINT gate skipped
|
|
|
|
**Fixture:**
|
|
- Backlog has 4 stories; milestone capacity is 8 points
|
|
- `review-mode.txt` contains `lean`
|
|
|
|
**Input:** `/sprint-plan`
|
|
|
|
**Expected behavior:**
|
|
1. Skill reads review mode — determines `lean`
|
|
2. Skill drafts sprint and presents it to user
|
|
3. PR-SPRINT gate is skipped; output notes "[PR-SPRINT] skipped — Lean mode"
|
|
4. Skill asks user for direct approval of the sprint
|
|
5. User approves; sprint file is written
|
|
|
|
**Assertions:**
|
|
- [ ] PR-SPRINT gate is NOT invoked in lean mode
|
|
- [ ] Skip is explicitly noted in output
|
|
- [ ] User approval is still required before write (gate skip ≠ approval skip)
|
|
- [ ] Verdict is COMPLETE after write
|
|
|
|
---
|
|
|
|
### Case 5: Edge Case — Previous sprint still has open stories
|
|
|
|
**Fixture:**
|
|
- `production/sprints/sprint-002.md` exists with 2 stories still `Status: In Progress`
|
|
- Backlog has 5 new unstarted stories
|
|
- `review-mode.txt` contains `full`
|
|
|
|
**Input:** `/sprint-plan`
|
|
|
|
**Expected behavior:**
|
|
1. Skill reads sprint-002 and detects 2 open (in-progress) stories
|
|
2. Skill flags: "Sprint 002 has 2 open stories — confirm carry-over before planning sprint 003"
|
|
3. Skill presents user with choice: carry stories over, defer them, or cancel
|
|
4. User confirms carry-over; carried stories are prepended to new sprint with `[CARRY]` tag
|
|
5. Sprint draft is built; PR-SPRINT gate runs; sprint is written on approval
|
|
|
|
**Assertions:**
|
|
- [ ] Skill checks the most recent sprint file for open stories
|
|
- [ ] User is asked to confirm carry-over before sprint planning continues
|
|
- [ ] Carried stories appear in the new sprint draft with a distinguishing label
|
|
- [ ] Skill does not silently ignore open stories from the previous sprint
|
|
|
|
---
|
|
|
|
## Protocol Compliance
|
|
|
|
- [ ] Shows draft sprint before invoking PR-SPRINT gate or asking to write
|
|
- [ ] Always asks "May I write" before writing sprint file
|
|
- [ ] PR-SPRINT gate only runs in full mode
|
|
- [ ] Skip message appears in lean and solo mode output
|
|
- [ ] Verdict is clearly stated at the end of the skill output
|
|
|
|
---
|
|
|
|
## Coverage Notes
|
|
|
|
- The case where no milestone file exists is not explicitly tested; behavior
|
|
follows the BLOCKED pattern with a suggestion to run `/gate-check` for
|
|
milestone progression.
|
|
- Solo mode behavior is equivalent to lean (gate skipped, user approval
|
|
required) and is not separately tested.
|
|
- Parallel story selection algorithms are not tested here; those are unit
|
|
concerns for the sprint-plan subagent.
|