Enumerate ticket acceptance criteria before code changes — fetches ticket via Jira/GitHub MCP, extracts AC bullets/sub-tasks/checkboxes, emits a checklist to restate after each commit. Use when: user mentions a Jira/GitHub ticket ID (NAPP-1234, PROJ-456, gh issue), asks 'what's the scope of NAPP-X', references 'acceptance criteria', starts /etk:fix-bug, /etk:develop, or /etk:review-mr against a ticketed task. Triggers on: ticket ID, NAPP-, PROJ-, acceptance criteria, scope of ticket, AC for, ...
Scanned 9/6/2026
Install to Claude Code
npx -y skills add ArieGoldkin/claude-forge --skill scope-check --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Scope Check?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/ariegoldkin-scope-check)More formats (shields.io, HTML) on the badges page.
---
name: scope-check
description: "Enumerate ticket acceptance criteria before code changes — fetches ticket via Jira/GitHub MCP, extracts AC bullets/sub-tasks/checkboxes, emits a checklist to restate after each commit. Use when: user mentions a Jira/GitHub ticket ID (NAPP-1234, PROJ-456, gh issue), asks 'what's the scope of NAPP-X', references 'acceptance criteria', starts /etk:fix-bug, /etk:develop, or /etk:review-mr against a ticketed task. Triggers on: ticket ID, NAPP-, PROJ-, acceptance criteria, scope of ticket, AC for, what does ticket cover, scope check"
effort: medium
paths: []
context: fork
keep-coding-instructions: true
---
# Scope Check
Enumerate a ticket's acceptance criteria into a checklist BEFORE any code is written, then re-state the checklist after each commit until every box is ticked or explicitly deferred.
## When this skill activates
This skill is **auto-loaded by description match**, not by a typed slash command. Claude loads it when:
- The user mentions a ticket ID (`NAPP-1234`, `PROJ-456`, `#123`)
- The user asks "what's the scope of X" / "what does ticket Y cover"
- The user references "acceptance criteria" or "AC"
- A parent skill (`/etk:fix-bug`, `/etk:develop`, `/etk:review-mr`) delegates to it as Phase 0
There is no `/etk:scope-check` slash command on purpose — invisible enrichment is the contract.
## Why this exists
Recurring `/insights` friction:
- **Narrower than intended** — "you only fixed one of three findings"; "shipped login events when the ticket covered login + reset + help"
- **Wider than intended** — "you refactored adjacent code without asking"
A 60-second AC enumeration up front catches both classes. The checklist becomes the contract Claude is held to, not the user's recollection of the ticket.
## Workflow
### Step 1: Detect the ticket source
Inspect the conversation and working directory:
| Signal | Source |
|---|---|
| Ticket ID matches `^[A-Z]+-\d+$` (e.g., `NAPP-3589`, `PROJ-12`) | Jira |
| Reference like `#123`, `gh issue 123`, `github.com/.../issues/123` | GitHub |
| Branch name embeds a ticket ID (e.g., `feat/NAPP-3589-login-redesign`) | Jira (derive from branch) |
| Recent MR/PR description mentions a ticket | Use that ID |
If multiple tickets are referenced, ask the user which one(s) are in scope before proceeding.
### Step 2: Fetch the ticket
**Jira (atlassian MCP)** — Call `mcp__atlassian__getJiraIssue` with the ticket key. Required field: `cloudId` (fetch via `mcp__atlassian__getAccessibleAtlassianResources` first if unknown).
**GitHub** — Use `Bash(gh issue view <id> --json title,body,labels,assignees)` or, when the ticket lives in a different repo, `gh issue view <id> --repo <owner>/<repo>`.
**No MCP / no gh** — Ask the user to paste the ticket body. Don't guess.
### Step 3: Extract acceptance criteria
Scan the ticket description for, in priority order:
1. **An "Acceptance Criteria" / "AC" heading** followed by a list — use those items verbatim.
2. **Checkbox lines** (`- [ ]` or `- [x]`) — treat each as an AC bullet.
3. **A "Definition of Done" / "Requirements" / "Tasks" heading** — same treatment as #1.
4. **Sub-tasks linked from the parent ticket** (Jira "issuelinks" with type `Sub-task`) — fetch each sub-task summary.
5. **Numbered or bulleted lists in the description** — fall back to these if nothing structured exists.
6. **Nothing structured** — paraphrase the description into ~3-5 implicit AC bullets and explicitly mark them as inferred. Do not proceed without confirming with the user.
### Step 4: Emit the checklist
Output a single block in this exact shape:
```
SCOPE CHECK for <TICKET-ID> — <Ticket title>
Source: <Jira | GitHub | user-pasted>
Acceptance criteria:
[ ] <AC bullet 1>
[ ] <AC bullet 2>
[ ] <AC bullet 3>
…
Out of scope (explicit):
- <anything the ticket explicitly excludes, if mentioned>
Contract:
Re-state this checklist after each commit. Do not declare DONE until
every box is ticked or explicitly deferred with user agreement.
```
When called as Phase 0 of a parent skill, this block becomes the parent's working contract for the rest of the task.
### Step 5: Confirm before code
If any AC is ambiguous, paraphrase your interpretation and ask the user one tight question (yes/no or A-vs-B) before any `Edit` / `Write` / `Bash(git commit*)`. Save the round-trip cost compared to discovering ambiguity at MR review.
## Integration with parent skills
| Parent | When scope-check runs | What it produces |
|---|---|---|
| `/etk:fix-bug` | Before "Observation-Driven Debugging" begins | AC checklist scoped to the bug ticket — bounds the fix |
| `/etk:develop` | As part of Phase 0 (Erotetic-Lite Gating) | AC checklist scoped to the feature ticket — feeds Phase 1 design |
| `/etk:review-mr` | Before the agent fan-out | AC checklist scoped to the MR's linked ticket — Agent #N can flag MRs that don't cover all AC |
When a parent skill calls scope-check, the parent should NOT also re-prompt for the same information; trust the checklist this skill produces.
## What this skill is NOT
- **Not** a project planner — it doesn't decompose work into tasks, estimate effort, or sequence dependencies. That's `/etk:develop`'s job.
- **Not** a test generator — `/etk:cover` writes tests against the AC; scope-check just enumerates the AC.
- **Not** a substitute for talking to the PM/reporter — if AC is genuinely missing from the ticket, the answer is to ask the ticket reporter, not to invent AC.
## Reference
- Subagent Scope Restate protocol — root `CLAUDE.md` § "Subagent Scope Restate"
- Atlassian MCP tool reference — `/etk:atlassian-integration`
- Business invariants (parallel concern, but distinct) — `.claude/business-invariants.md`
## Compliance
### Iron Laws
**IRON LAW: Do not invent acceptance criteria. If the ticket has none, ask the user before proceeding.**
**IRON LAW: After each commit, re-state the checklist and tick the boxes covered by that commit. Don't drift silently.**
### Red Flags
| If You're Thinking... | Required Action |
|---|---|
| "The ticket is clear enough, I can skip this" | STOP. Enumerate anyway. 30 seconds of upfront work beats a 30-minute re-scope. |
| "I'll figure out the AC as I go" | STOP. Implicit AC = silent drift. Enumerate first. |
| "I'll skip the un-checkable AC" | STOP. Either tick it explicitly or defer it explicitly with user agreement. Silent skip = partial delivery. |
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!