# Skill Test Spec: /scope-check ## Skill Summary `/scope-check` is a Haiku-tier read-only skill that analyzes a feature, sprint, or story for scope creep risk. It reads sprint and story files and compares them against the active milestone goals. It is designed for fast, low-cost checks before or during planning. No director gates are invoked. No files are written. Verdicts: ON SCOPE, CONCERNS, or SCOPE CREEP DETECTED. --- ## 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: ON SCOPE, CONCERNS, SCOPE CREEP DETECTED - [ ] Does NOT require "May I write" language (read-only skill) - [ ] Has a next-step handoff (what to do based on verdict) --- ## Director Gate Checks None. Scope check is a read-only advisory skill; no gates are invoked. --- ## Test Cases ### Case 1: Happy Path — Sprint stories align with milestone goals **Fixture:** - `production/milestones/milestone-03.md` lists 3 goals: combat system, enemy AI, level loading - `production/sprints/sprint-006.md` contains 5 stories, all tagged to one of the 3 goals - `production/session-state/active.md` references milestone-03 as the active milestone **Input:** `/scope-check` **Expected behavior:** 1. Skill reads active milestone goals from milestone-03 2. Skill reads sprint-006 stories and checks each against milestone goals 3. All 5 stories map to one of the 3 goals 4. Skill outputs a mapping table: story → milestone goal 5. Verdict is ON SCOPE **Assertions:** - [ ] Each story is mapped to a milestone goal in the output - [ ] Verdict is ON SCOPE when all stories map to milestone goals - [ ] No files are written - [ ] Skill does not modify sprint or milestone files --- ### Case 2: Scope Creep Detected — Stories introducing systems not in milestone **Fixture:** - `production/milestones/milestone-03.md` goals: combat, enemy AI, level loading - `production/sprints/sprint-006.md` contains 5 stories: - 3 stories map to milestone goals - 2 stories reference "online leaderboard" and "achievement system" (not in milestone-03) **Input:** `/scope-check` **Expected behavior:** 1. Skill reads milestone goals and sprint stories 2. Skill identifies 2 stories with no matching milestone goal 3. Skill names the out-of-scope stories: "Online Leaderboard Feature", "Achievement System Setup" 4. Verdict is SCOPE CREEP DETECTED **Assertions:** - [ ] Out-of-scope stories are named explicitly in the output - [ ] Verdict is SCOPE CREEP DETECTED when any story has no milestone goal match - [ ] Skill does not automatically remove the stories — findings are advisory - [ ] Output recommends deferring the out-of-scope stories to a later milestone --- ### Case 3: No Milestone Defined — CONCERNS; scope cannot be validated **Fixture:** - `production/session-state/active.md` has no milestone reference - `production/milestones/` directory exists but is empty - `production/sprints/sprint-006.md` has 4 stories **Input:** `/scope-check` **Expected behavior:** 1. Skill reads active.md — finds no milestone reference 2. Skill checks `production/milestones/` — no milestone files found 3. Skill outputs: "No active milestone defined — scope cannot be validated" 4. Verdict is CONCERNS **Assertions:** - [ ] Skill does not error when no milestone is defined - [ ] Output explicitly states that scope validation requires a milestone reference - [ ] Verdict is CONCERNS (not ON SCOPE or SCOPE CREEP DETECTED without data) - [ ] Output suggests running `/milestone-review` or creating a milestone --- ### Case 4: Single Story Check — Evaluated against its parent epic **Fixture:** - User targets a single story: `production/epics/combat/story-parry-timing.md` - Story references parent epic: `epic-combat.md` - `production/epics/combat/epic-combat.md` has scope: "melee combat mechanics" - Story title: "Implement parry timing window" — matches epic scope **Input:** `/scope-check production/epics/combat/story-parry-timing.md` **Expected behavior:** 1. Skill reads the specified story file 2. Skill reads the parent epic to get scope definition 3. Skill evaluates story against epic scope — "parry timing" matches "melee combat" 4. Verdict is ON SCOPE **Assertions:** - [ ] Single-file argument is accepted (story path, not sprint) - [ ] Skill reads the parent epic referenced in the story file - [ ] Story is evaluated against epic scope (not milestone scope) in single-story mode - [ ] Verdict is ON SCOPE when story matches epic scope --- ### Case 5: Gate Compliance — No gate; PR may be consulted separately **Fixture:** - Sprint has 2 SCOPE CREEP stories and 3 ON SCOPE stories - `review-mode.txt` contains `full` **Input:** `/scope-check` **Expected behavior:** 1. Skill reads milestone and sprint; identifies 2 scope creep items 2. No director gate is invoked regardless of review mode 3. Skill presents findings with SCOPE CREEP DETECTED verdict 4. Output notes: "Consider raising scope concerns with the Producer before sprint begins" 5. Skill ends without writing any files **Assertions:** - [ ] No director gate is invoked in any review mode - [ ] Producer consultation is suggested (not mandated) - [ ] No files are written - [ ] Verdict is SCOPE CREEP DETECTED --- ## Protocol Compliance - [ ] Reads milestone goals and sprint/story files before analysis - [ ] Maps each story to a milestone goal (or flags as unmapped) - [ ] Does not write any files - [ ] No director gates are invoked - [ ] Runs on Haiku model tier (fast, low-cost) - [ ] Verdict is one of: ON SCOPE, CONCERNS, SCOPE CREEP DETECTED --- ## Coverage Notes - The case where the sprint file itself does not exist is not tested; the skill would output a CONCERNS verdict with a message about missing sprint data. - Partial scope overlap (story touches a milestone goal but also introduces new scope) is not explicitly tested; implementation may classify this as CONCERNS rather than SCOPE CREEP DETECTED.