From jira-sprint-workflow
Design a feature end-to-end in Jira — brainstorm, write spec, write implementation plan, and create a fully-loaded set of self-contained Jira subtasks that a teammate or sub-agent can execute without any local files. Use whenever the user wants to design, plan, brainstorm, break down, flesh out, turn a Jira Task into subtasks, or prepare any Jira intake ticket for execution. Also use when the user says "let's plan this", "let's design this feature", "create the subtasks", "break this down for the team", or asks for implementation planning on a Jira task. Do not skip this skill and improvise — the workflow here enforces brainstorming, plan writing, and self-contained subtasks that the team relies on.
How this skill is triggered — by the user, by Claude, or both
Slash command
/jira-sprint-workflow:jira-story-designThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill orchestrates end-to-end Phase 1 of a sprint workflow: taking a one-line intake Task in Jira and turning it into a fully-designed set of 15 execution subtasks that any teammate or sub-agent can pick up and run.
This skill orchestrates end-to-end Phase 1 of a sprint workflow: taking a one-line intake Task in Jira and turning it into a fully-designed set of 15 execution subtasks that any teammate or sub-agent can pick up and run.
A teammate must be able to pick up ANY subtask and execute it using ONLY the Jira issue content. They should never need to open a docs folder, grep the repo, or message the designer for context.
Concretely:
${user_config.plans_directory}) are the source of truth for sub-agent execution; Jira content mirrors them as much as fits within size limits.This is the single most important rule. Everything else supports it.
This skill reads values from the plugin's user config — values you set when you installed the plugin.
Config gate (run this first, every invocation): read ~/.claude/settings.json and check that pluginConfigs["jira-sprint-workflow@jira-sprint-workflow"].options contains non-empty values for all of jira_url, jira_username, jira_api_token, project_key, default_owner_account_id, components, plans_directory, specs_directory. If any are missing or empty:
jira-setup skill (via the Skill tool).Do not try to work around missing config by asking the user values inline — the setup skill handles validation and persistence correctly in one place.
| Config key | Purpose |
|---|---|
jira_url | Your Jira Cloud base URL (e.g. https://myteam.atlassian.net) |
jira_username | Your Jira account email |
jira_api_token | API token for REST fallback (keychain-stored) |
project_key | Project where Tasks live (e.g. WFR, ENG) |
default_owner_account_id | Default assignee for parent Tasks + Subtask 7 |
components | Comma-separated product areas |
plans_directory | Where plans are saved in the repo |
specs_directory | Where specs are saved in the repo |
Placeholders in this skill reference them as ${user_config.<key>}.
Typical prompts that trigger this skill:
<TASK-KEY>"<TASK-KEY> into subtasks"If the user hasn't told you which Jira task, ask. You need a specific parent Task key before proceeding.
1. Confirm intake Task exists (<TASK-KEY>) ────► if not, create it first
2. Invoke superpowers:brainstorming ──────► produces a shared design understanding
3. Write the spec into Jira parent Task ──► full markdown in the Task description
4. Invoke superpowers:writing-plans ──────► produces plans and test-plan files
5. Run plan-document-reviewer loop ───────► fix issues per chunk, re-review until clean
6. Confirm assignee ──────────────────────► default from user_config; confirm if different
7. Create 15 self-contained subtasks ─────► 0, 1, 1b, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
8. Wire "is blocked by" chain links ──────► enforce execution order in Jira
9. Transition parent Task to "Selected for Development" (or your team's equivalent)
10. Verify the board looks right ─────────► every subtask has content, links, assignee
0 Setup Branch & Worktree
1 Implement Feature ┐
1b Plan Functional Test Cases ┘ (parallel with 1)
2 Code Review ┐
3 Fix Code Review ┘ (loop, cap 3)
4 UI Testing ┐
5 Fix UI Testing ┘ (loop, cap 3)
6 Deploy to Local Docker (automated smoke — no human)
7 Senior Architect Review ┐
8 Fix Architect Review ┘ (loop, cap 3)
9 Deploy to Sandbox
10 Sandbox Manual Testing ✋ ┐ (HUMAN gate #1)
11 Fix Sandbox Issues ┘ (loop, cap 3 cycling 11→9→10)
12 Merge to Sandbox Branch ✋ (HUMAN gate #2 — approval to join release train)
13 Push to Prod (sandbox → main PR)
14 Prod Sanity Test
Each step has enforcement rules in the next sections.
Use mcp__claude_ai_Atlassian_Rovo__getJiraIssue against ${user_config.jira_url}. Confirm it's in ${user_config.project_key} and is a Task (or Story — either works; see "Issue type" note below). If missing, ask the user what they want to design and create the Task first.
If the user says "skip brainstorming, just make the tasks" or "I already know what I want, just write it up", push back. Brainstorming surfaces constraints, trade-offs, and edge cases that you cannot recover later without expensive rework. The five minutes saved upfront costs two hours later.
Invoke the superpowers:brainstorming skill. Let it run fully — don't truncate it. It will produce a design narrative that you'll use in step 3.
Once brainstorming is done, edit the parent Task's description using mcp__claude_ai_Atlassian_Rovo__editJiraIssue with contentFormat: "markdown". Use the template in references/story-description-template.md.
The description must contain full content, not summaries. If the brainstorm produced a 2000-word design, the Jira description has 2000 words.
Invoke the superpowers:writing-plans skill. It produces two files:
${user_config.plans_directory}/YYYY-MM-DD-<feature>.md — full implementation plan, chunk-by-chunk with actual code${user_config.plans_directory}/YYYY-MM-DD-<feature>-test-plan.md — functional test cases (automated + manual)These are the source of truth for sub-agent execution in subtask 1 and test execution in subtasks 4, 7, 10.
Dispatch plan-document-reviewer agents in parallel per chunk. Fix issues they flag. Re-review until all chunks are clean. Commit the plan files.
The parent Task stays assigned to the human-in-the-loop owner. The two human-gate subtasks (#10 Sandbox Manual Test, #12 Merge to Sandbox Branch) get the SAME assignee as the parent. Everything else is unassigned (Sub Agent).
Default: parent Task + subtask 10 + subtask 12 all assigned to ${user_config.default_owner_account_id}.
Only ask the user if the owner is different this time (e.g., a teammate is taking this Story).
Read references/subtask-templates.md for the role description, instructions, and acceptance criteria for each of the 15 subtasks. For each subtask:
mcp__claude_ai_Atlassian_Rovo__createJiraIssue with parent: "<TASK-KEY>" and issueTypeName: "Sub-task" (or Subtask — verify with getJiraProjectIssueTypesMetadata)references/subtask-templates.md.[!warning] Jira inherits the parent's assignee on subtask creation If you don't pass
assignee_account_idexplicitly, the new subtask will be assigned to whoever owns the parent. Since our convention has only TWO human-assigned subtasks (#10 Sandbox Manual Test, #12 Merge to Sandbox Branch), this is a trap — all other subtasks end up incorrectly owned. Either:
- Pass
assignee_account_id: nullon every Sub Agent subtask's create call, OR- After creation, PUT
/rest/api/3/issue/<key>/assigneewith{accountId: null}for each Sub Agent subtask.After all creations, always re-fetch every subtask to verify
assigneematches your intent. Do not trust that the create call obeyed you.
Use mcp__claude_ai_Atlassian_Rovo__createIssueLink (or raw REST POST /rest/api/3/issueLink) to create "is blocked by" relationships:
0 → (nothing; first subtask)
1 → blocked by 0
1b → blocked by 0 (parallel with 1)
2 → blocked by 1
3 → blocked by 2
4 → blocked by 3 AND 1b
5 → blocked by 4
6 → blocked by 5
7 → blocked by 6 (Architect Review)
8 → blocked by 7 (Fix Architect)
9 → blocked by 7 (Deploy to Sandbox — after architect clears, may follow 7 directly or after 8 if a fix cycle ran)
10 → blocked by 9 (Sandbox Manual Test — HUMAN)
11 → blocked by 10 (Fix Sandbox — only used if subtask 10 reports issues)
12 → blocked by 10 (Merge to Sandbox Branch — HUMAN approval)
13 → blocked by 12 (Push to Prod)
14 → blocked by 13 (Prod Sanity)
[!note] Subtask 9's predecessor depends on whether the architect-review loop fired Wire
9 ← 7at creation time. If the orchestrator loops through 8 → 7 (fix cycle), the link still gates correctly because 7 must reach Done before 9 starts. Don't wire9 ← 8— that breaks the no-fix-needed happy path where 8 never runs.Same pattern: wire
12 ← 10and13 ← 12at creation; 11 is only inserted into the chain when 10 reports issues (orchestrator handles the loop dynamically).
If createIssueLink rejects a link type name, check with getIssueLinkTypes.
[!warning] createIssueLink direction is counterintuitive The REST v3 API for
issueLinkwith typeBlocksaccepts{type, inwardIssue, outwardIssue}. In the behavior we've verified:
inwardIssue= the issue that does the blocking (the predecessor)outwardIssue= the issue being blocked (the follower)To express "subtask 0 blocks subtask 1":
inwardIssue: <subtask-0-key>, outwardIssue: <subtask-1-key>.Verify on the first link you create by fetching a follower subtask:
GET /rest/api/3/issue/<follower-key>?fields=issuelinksThe response's
issuelinks[]should contain an entry withinwardIssuepointing at the predecessor andtype.inward === "is blocked by". If the direction looks flipped, swap inwardIssue/outwardIssue for all remaining calls (delete the wrong ones viaDELETE /rest/api/3/issueLink/:id).Jira instances may behave differently — verify once per project.
Use mcp__claude_ai_Atlassian_Rovo__getTransitionsForJiraIssue to find the transition ID for "Selected for Development" (or your team's equivalent — e.g., "Ready for Dev", "To Do", "Up Next") and apply it with transitionJiraIssue.
Before reporting success:
getJiraIssueTwo human checkpoints in the chain. Everything else is Sub Agent work.
| Issue | Assignee |
|---|---|
| Parent Task | The human-in-the-loop owner of the Story (default: ${user_config.default_owner_account_id}) |
| Subtask 10 (Sandbox Manual Testing) | Same as the parent Task's assignee |
| Subtask 12 (Merge to Sandbox Branch) | Same as the parent Task's assignee |
| All other subtasks (0, 1, 1b, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14) | Unassigned (= Sub Agent) |
Unassigned means "Sub Agent picks it up autonomously." It's not a bug, it's the signal.
Subtask 7 (Architect Review) is Sub Agent-driven via jira-architect-review (preferred — right-sizes the review) or superpowers:code-reviewer as a fallback. The sub-agent plays a senior enterprise architect reviewing for shipping risk. The architect review runs BEFORE sandbox deploy — it gates whether the diff is even worth deploying to sandbox.
Subtask 10 (Sandbox Manual Test) is the integration gate — the human reviewer validates the feature on a real-deployed sandbox environment using the structured manual test cases (What / Preconditions / How / Expected / Pass criteria) that subtask 1b produced.
Subtask 12 (Merge to Sandbox Branch) is the release-train approval gate — the human's explicit Approved — merge to sandbox branch comment authorizes the sub-agent to PR feature → sandbox and merge.
Components (use instead of labels for product area). Set to one of your team's configured values from ${user_config.components}. Create components in Jira via Project Settings → Components if they don't exist yet.
Priority: Highest (critical/blocker), High (important), Medium (nice to have), Low (someday). Never put [P1] in the summary — set the field.
The parent ticket can be Task or Story — Jira lets both types have subtasks. Our convention favors leaving intake as Task (what most users file tickets as) and skipping a Task→Story conversion. The issue type is just a label; the subtask structure + content is what matters.
If your team's workflow requires Stories specifically, you can convert via editJiraIssue with issueTypeName: "Story" at Step 3, but it's not required.
see plans/... in a subtask description without also embedding the content. Jira content must stand alone within size limits.createJiraIssue to respect your intent — Jira silently inherits parent fields (assignee especially). Always re-fetch and verify every field.createIssueLink calls without verifying direction on the first one.Jira Cloud enforces a practical description limit of ~32KB. A full implementation plan for a framework-level feature can exceed this. Pragmatic strategy:
<sandbox-url> placeholder substituted with the actual URL from subtask 9's comment. This is the only subtask with embedded human-readable test steps.If a description exceeds the limit, the API returns 400 with a body-size error. When that happens, trim the plan outline (drop code snippets) rather than sacrificing structure.
createJiraIssue occasional Cloudflare 403 during heavy batch creates. Fall back to raw REST with the bearer token from ${user_config.jira_api_token} (keychain).\[ \] instead of [ ] in checkboxes). Review the created issue's rendered description and edit if needed.{type: "doc", version: 1, content: [...]} ADF objects before POSTing.references/story-description-template.md — parent Task description markdown templatereferences/subtask-templates.md — role, instructions, and acceptance criteria for each of the 15 subtasksreferences/jira-api-patterns.md — example MCP tool calls for create, edit, link, transition, and REST fallback patternsRead these when you reach the relevant step. Don't load them up-front.
superpowers:brainstorming — invoke in step 2superpowers:writing-plans — invoke in step 4plan-document-reviewer — dispatch in step 5superpowers:using-git-worktrees — referenced by subtask 0's execution (runs in Phase 2, not here)superpowers:subagent-driven-development — referenced by subtask 1's executionjira-architect-review — preferred sub-agent for subtask 7's execution (right-sizes the review)superpowers:code-reviewer — fallback for subtask 7's execution if jira-architect-review is unavailableThis skill handles Phase 1 (design). Phase 2 (execute) and per-subtask execution are separate skills (see the plugin's other skills if added).
npx claudepluginhub harsh1210/jira-sprint-workflow --plugin jira-sprint-workflowGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.