Fix release for 1.1.1: the minimal path end to end, engine commands that run on Godot, Unity and Unreal, hook warnings you can see, and verdicts that say when they could not check. Details in CHANGELOG.md; upgrade steps in UPGRADING.md (v1.1.1 → v1.1.2). Fixes #67 Fixes #131 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WuJn2FdynEybfL5KC697nJ
13 KiB
Skill Test Spec: /milestone-review
Skill Summary
/milestone-review reviews a milestone's progress from its definition in
production/milestones/ (when one exists) and the sprint reports in
production/sprints/: feature completeness, quality metrics, code health, risk,
velocity, scope recommendations and a Go/No-Go recommendation (NOT ASSESSED /
GO / CONDITIONAL GO / NO-GO). Blocked stories and their blockers come from
production/sprint-status.yaml and the story files, open bugs from
production/qa/bugs/. Before producing any report it records each input as
FOUND or ABSENT; a section whose inputs are absent reads
NOT ASSESSED — NO DATA, and if every required input is absent it stops with
that as the whole verdict. In full review mode it spawns producer with the
PR-MILESTONE gate before the Go/No-Go recommendation is generated; the
producer's verdict (ON TRACK / AT RISK / OFF TRACK) is shown inline, and AT RISK
or OFF TRACK raises an AskUserQuestion on how to frame the recommendation. In
lean and solo modes the gate is skipped with a note. The skill asks "May I write
this to production/milestones/[milestone-name]-review.md?" before persisting.
Verdicts: COMPLETE (review saved), BLOCKED (write declined), or
NOT ASSESSED — NO DATA (no inputs at all).
Static Assertions (Structural)
Checked against the SKILL.md by /skill-test spec — no fixture needed.
- Has required frontmatter fields:
name,description,argument-hint,user-invocable,allowed-tools - Has ≥2 phase headings
- Contains verdict keywords: COMPLETE, BLOCKED, NOT ASSESSED
- Contains Go/No-Go recommendation values: GO, CONDITIONAL GO, NO-GO
- Contains "May I write" language (skill writes review document)
- Has a next-step handoff (
/gate-check,/sprint-plan)
Director Gate Checks
| Gate ID | Trigger condition | Mode guard |
|---|---|---|
| PR-MILESTONE | Before the Go/No-Go recommendation is generated | full only (not lean/solo) |
PR-MILESTONE verdicts: ON TRACK / AT RISK / OFF TRACK — or NOT ASSESSED
[missing input] (.claude/docs/director-gates.md), on which the skill never
recommends GO.
Test Cases
Case 1: Happy Path — Nearly complete milestone with one deferred feature
Fixture:
production/milestones/milestone-03.mdexists (milestone-definition template) with 8 features in its Feature List- 7 features have
Status: Complete - 1 feature has
Status: Deferred(deferred to milestone-04) production/sprints/sprint-007.mdthroughsprint-009.mdexist with the headings/sprint-planwrites- The features' stories exist under
production/epics/; none isBlocked project.yamlsetsmodes.review_mode: full- The producer returns ON TRACK
Input: /milestone-review milestone-03
Expected behavior:
- Skill reads
milestone-03.md, globs the sprint reports (N = 3) and greps their sections, then greps the story files for Blocked statuses (none) - Skill compiles the review: 7 features under Fully Complete; the deferred feature is not counted as complete
- Skill spawns
producerwith PR-MILESTONE, passing milestone name and target date, completion percentage, blocked story count (0), velocity data and cut candidates - The producer's ON TRACK verdict is shown inline in the Go/No-Go section; no framing question is asked
- Skill presents the review and asks "May I write this to
production/milestones/milestone-03-review.md?" - User approves; file is written; verdict COMPLETE
Assertions:
- The deferred feature is not listed under Fully Complete and is not counted as complete in the completion percentage (7 of 8)
- PR-MILESTONE is spawned in full mode before the Go/No-Go recommendation, with completion percentage and blocked story count passed
- The producer's ON TRACK verdict appears inline in the Go/No-Go section, and no framing
AskUserQuestionis raised (only AT RISK and OFF TRACK raise one) - Skill asks "May I write" before writing, naming
production/milestones/milestone-03-review.md - Verdict is COMPLETE after the write
Case 2: Blocked Milestone — Producer returns OFF TRACK
Fixture:
production/milestones/milestone-03.mdlists 5 features- 2 features have
Status: Complete - 3 features have
Status: Blocked; each has one story underproduction/epics/[its epic]/whose file carries> **Status**: Blockedand aBLOCKED:note naming its blocker - Sprint reports exist in
production/sprints/; they name no blockers project.yamlsetsmodes.review_mode: full- The producer returns OFF TRACK
Input: /milestone-review milestone-03
Expected behavior:
- Skill reads the milestone and sprint reports, then greps the story files for
Blockedstatuses andBLOCKED:notes; compiles the 3 blocked features in the Blocked table with their blockers - Skill spawns PR-MILESTONE, passing a completion percentage of 40% and a blocked story count of 3
- On OFF TRACK, skill asks via
AskUserQuestion: "Producer verdict: OFF TRACK. The milestone is in jeopardy. This review will recommend NO-GO. How do you want to proceed?" with [A] Accept NO-GO, [B] Override to CONDITIONAL GO, [C] Stop - User selects [A]; the Go/No-Go recommendation is NO-GO
- Skill presents the review, asks "May I write", and writes on approval
Assertions:
- Each blocked feature is named in the Blocked table with its blocker, taken from its story's
BLOCKED:note — the sprint reports carry none, so a blocker not read from the story files is invented - PR-MILESTONE receives the blocked story count (3), counted from the story files
- OFF TRACK raises the
AskUserQuestionwith Accept NO-GO / Override to CONDITIONAL GO / Stop before the recommendation is generated - After [A], the recommendation is NO-GO — the skill does not issue GO against an OFF TRACK verdict
- "May I write" prompt still appears before the file is written
Case 3: Full Mode — PR-MILESTONE returns AT RISK over scope drift
Fixture:
production/milestones/milestone-03.mdlists 6 complete features, 2 of which were not in the original definition (added mid-milestone)- Sprint reports exist in
production/sprints/ project.yamlsetsmodes.review_mode: full- The producer returns AT RISK, citing the 2 added features as scope drift and listing mitigations
Input: /milestone-review milestone-03
Expected behavior:
- Skill compiles the review
- PR-MILESTONE returns AT RISK with mitigations
- Skill asks via
AskUserQuestion: "Producer verdict: AT RISK. Milestone may slip. How should the Go/No-Go section be framed?" with [A] CONDITIONAL GO, [B] NO-GO, [C] GO - User selects [A]; the Go/No-Go section reads CONDITIONAL GO and lists the producer's conditions
- Skill presents the review, asks "May I write", and writes on approval
Assertions:
- The producer's AT RISK assessment, including its scope-drift finding, is shown inline in the Go/No-Go section — not suppressed
- AT RISK raises the
AskUserQuestionwith CONDITIONAL GO / NO-GO / GO before the file is written - After [A], the recommendation is CONDITIONAL GO and its Conditions list carries the producer's conditions
- The review is written only after "May I write" is approved
Case 4: Edge Case — No milestone definition and no sprint data
Fixture:
production/milestones/does not existproduction/sprints/does not existproduction/risk-register/does not exist- No source files exist under the code root
- No story files, no
production/sprint-status.yamland noproduction/qa/bugs/ project.yamlsetsmodes.review_mode: full
Input: /milestone-review current
Expected behavior:
- Skill lists its inputs and records each as FOUND or ABSENT
- Every required input is ABSENT, so the skill stops and reports
NOT ASSESSED — NO DATAas the whole verdict - The report names what was missing and where it comes from: sprint reports
are written by
/sprint-plan; milestone definitions are authored by hand from.claude/docs/templates/milestone-definition.md - No milestone definition is fabricated, no gate is spawned, no file is written
Assertions:
- Skill does not crash and does not fill the review template with estimated values
- Verdict is
NOT ASSESSED — NO DATA— not GO and not COMPLETE - Output names the missing inputs and where each comes from (
/sprint-planfor sprint reports; the milestone-definition template for milestones) - PR-MILESTONE is not spawned and no "May I write" prompt appears
Case 5: Lean/Solo Mode — PR-MILESTONE gate skipped
Fixture:
production/milestones/milestone-03.mdlists 5 features, allStatus: Complete- Sprint reports exist in
production/sprints/ production/qa/bugs/does not exist — no bug has been filed with/bug-reportproject.yamlsetsmodes.review_mode: solo
Input: /milestone-review milestone-03
Expected behavior:
- Skill reads
review_modefrom the injected config block —solo - Skill compiles the review; with no bug files, the Quality Metrics bug lines
read
NOT ASSESSED — NO DATA - PR-MILESTONE is skipped; output notes "PR-MILESTONE skipped — Solo mode."
- The Go/No-Go section is presented without a producer verdict
- Skill asks "May I write this to
production/milestones/milestone-03-review.md?" - User approves; review file is written; verdict COMPLETE
Assertions:
- PR-MILESTONE gate is NOT invoked in solo mode
- Output contains "PR-MILESTONE skipped — Solo mode."
- The Go/No-Go section carries no producer verdict (no ON TRACK / AT RISK / OFF TRACK attributed to the producer)
- The Quality Metrics bug lines read
NOT ASSESSED — NO DATA— not "0" — while the sections that have inputs are still produced - User approval is still required before the write
- Verdict is COMPLETE after the write
Case 6: Lean Mode from Rigor — PR-MILESTONE skipped with the Lean note
Fixture:
production/milestones/milestone-03.mdlists 4 features, allStatus: Complete- Sprint reports exist in
production/sprints/ project.yamlsetsmodes.rigor: standardand pins no review mode, so the injected block readsreview_mode: lean (rigor:standard)
Input: /milestone-review milestone-03
Expected behavior:
- Skill reads
review_modefrom the injected config block —lean - Skill compiles the review
- PR-MILESTONE is skipped; output notes "PR-MILESTONE skipped — Lean mode."
- The Go/No-Go section is presented without a producer verdict
- Skill asks "May I write", writes on approval; verdict COMPLETE
Assertions:
- PR-MILESTONE gate is NOT invoked in lean mode
- Output contains "PR-MILESTONE skipped — Lean mode." — not the Solo note
- The Go/No-Go section carries no producer verdict
- User approval is still required before the write, and the verdict is COMPLETE after it
Case 7: Gate returns NOT ASSESSED — Never GO
Fixture:
production/milestones/milestone-03.mdlists 5 features, allStatus: Complete, but gives no Target Date- Sprint reports exist in
production/sprints/; the stories exist underproduction/epics/and none isBlocked project.yamlsetsmodes.review_mode: full- The producer returns NOT ASSESSED — no target date to judge against
- Asked for the date, the user has none to give
Input: /milestone-review milestone-03
Expected behavior:
- Skill compiles the review and spawns PR-MILESTONE; it returns NOT ASSESSED
- Skill names the missing input (the target date) and treats the result as neither ON TRACK nor a reason to recommend GO
- Nothing in the review's own findings calls for CONDITIONAL GO or NO-GO, so the Go/No-Go recommendation reads NOT ASSESSED, naming the missing target date
- Skill asks "May I write", writes on approval; verdict COMPLETE
Assertions:
- The Go/No-Go recommendation is NOT ASSESSED — never GO — although every feature is Complete
- The missing target date is named in the Go/No-Go section
- The AT RISK and OFF TRACK framing questions are not raised for NOT ASSESSED
- "May I write" still appears before the file is written
Protocol Compliance
- Records each input as FOUND or ABSENT before producing a report; reports
NOT ASSESSED — NO DATAwhen every required input is absent, and for any single section whose inputs are absent - In full mode, spawns PR-MILESTONE before generating the Go/No-Go recommendation, and presents the complete review before asking to write
- Always asks "May I write" before writing the review document
- PR-MILESTONE gate only runs in full mode; the skip message appears in lean and solo output
- Verdict is stated clearly — COMPLETE, BLOCKED (write declined) or
NOT ASSESSED — NO DATA— and the Go/No-Go recommendation is one of NOT ASSESSED / GO / CONDITIONAL GO / NO-GO
Coverage Notes
production/milestones/absent while sprint reports exist (the skill says so and reviews against the sprint reports alone) is not tested.currentselection skipping files that end-review.mdis not tested.- The declined-write path (verdict BLOCKED) is not tested.
- Velocity calculation specifics (story points vs. story count) are not verified here; they are implementation details of the review compilation phase.