bmad-planning-orchestrator/skills/bmad-handoff/SKILL.md
Emits a dev-tool-agnostic handoff manifest from ready-for-dev stories so an external dev plugin or runner can pick up and execute the work. Use when the user says "generate a handoff", "create handoff manifest", "export stories for dev", "hand off to dev tool", "produce handoff manifest", "ready to hand off", "prepare handoff for external tool", "export ready-for-dev stories", or "create the handoff package". Also trigger when the user asks "what stories are ready for dev?" and wants an exportable artifact rather than a status report. Produces: handoff-manifest.json listing all ready-for-dev stories with id, story file path, status, owned file/module scope, wave/parallel_set, dependencies, acceptance-criteria summary, locked-sections note, and a schemaVersion field. See REFERENCE.md (bundled) for the full manifest schema and adapter notes for git-worktree parallel development and autonomous dependency-graph orchestrators.
npx skillsauth add aj-geddes/claude-code-bmad-skills bmad-handoffInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Purpose: Scan the planning output folder for all stories at status ready-for-dev,
compile them into a single handoff-manifest.json, and leave it where any downstream
dev tool can read it — without coupling to any specific runner.
This is the last artifact the planning plugin produces. What happens next is owned by the external dev tool, not by this skill.
Run this skill after the story-writing phase is complete and you (or the user) have
confirmed that at least one story carries status ready-for-dev. The manifest is a
point-in-time snapshot; re-run the skill to refresh it.
Use TodoWrite to track progress through these steps.
Look for bmad-output/project-context.md (the default output folder) or ask the
user for the output folder. Default: bmad-output/.
Glob for **/{epic}.{story}.*.story.md under the output folder.
Accept alternative flat layouts (stories/*.story.md) if the glob turns up nothing.
Read the **Status:** header field of each story file (in the story header block, not a
## Status heading). Include only stories whose status value is exactly ready-for-dev.
If none are found, report which statuses were seen and stop — do not produce an empty manifest.
For each qualifying story file, extract:
| Field | Source in story file |
|---|---|
| id | Filename stem or ## Story heading ID |
| storyFilePath | Relative path from project root |
| status | **Status:** header field value |
| epic | First segment of filename, e.g. "2" in 2.1.stripe.story.md |
| storyNumber | Second segment, e.g. "1" |
| title | First H1 or ## Story heading text |
| ownedScope | ## Owned File/Module Scope — list every path verbatim |
| wave | ## Dependency Maps → wave/parallel_set annotation (integer or null) |
| parallelSet | Same section — parallel set label if present (string or null) |
| dependencies | ## Dependency Maps → blocked-by story IDs (array, may be empty) |
| acceptanceCriteriaSummary | First 3 AC items from ## Acceptance Criteria, each ≤120 chars |
| lockedSectionsNote | Static string — see schema |
| devAgentRecord | Static null — placeholder for the dev tool to populate |
If stories do not already carry explicit wave annotations:
dependencies arrays are wave 1.wave value; leave parallelSet null when not annotated.Write to {outputFolder}/handoff-manifest.json.
Use the schema from
${CLAUDE_PLUGIN_ROOT}/skills/bmad-handoff/templates/handoff-manifest.schema.json
as the structural contract. Populate schemaVersion: "1.0".
Sort stories by wave ascending, then by id ascending within each wave.
Print a compact summary:
Handoff manifest written → bmad-output/handoff-manifest.json
schemaVersion : 1.0
stories : <N> ready-for-dev
waves : <W> (wave 1 has <X> stories, can start immediately)
output path : bmad-output/handoff-manifest.json
If any story was missing required sections (e.g. no ## Owned File/Module Scope),
list those as warnings — do not silently omit or fabricate data.
See REFERENCE.md for the full schema narrative and adapter notes.
| Field | Type | Required | Notes |
|---|---|---|---|
| schemaVersion | string | yes | Semver string; current = "1.0" |
| generatedAt | string | yes | ISO-8601 UTC timestamp |
| projectName | string | yes | From project-context.md or user input |
| outputFolder | string | yes | Relative path used to find stories |
| stories | array | yes | One object per ready-for-dev story |
| stories[].id | string | yes | Unique story identifier |
| stories[].storyFilePath | string | yes | Relative path to the .story.md file |
| stories[].status | string | yes | Always "ready-for-dev" in this manifest |
| stories[].epic | string | yes | Epic identifier |
| stories[].storyNumber | string | yes | Story number within epic |
| stories[].title | string | yes | Human-readable story title |
| stories[].ownedScope | array | yes | File/module paths this story may modify |
| stories[].wave | integer | yes | Execution wave (1 = no dependencies) |
| stories[].parallelSet | string|null | no | Label if explicitly grouped |
| stories[].dependencies | array | yes | Story IDs that must complete first |
| stories[].acceptanceCriteriaSummary | array | yes | First 3 AC items, ≤120 chars each |
| stories[].lockedSectionsNote | string | yes | Instruction to dev tools |
| stories[].devAgentRecord | null | yes | Dev tool populates; always null at emit time |
lockedSectionsNote is always the string:
"Sections Acceptance Criteria, Dev Notes, and Testing are LOCKED. External dev tools must not edit them. Populate only the Dev Agent Record section."
For small backlogs (≤15 stories), this skill runs single-threaded — the extraction loop is fast and context fits in one session.
For large backlogs (16+ stories), fan out story extraction in parallel:
| Agent | Task | |---|---| | Agent 1…N | Read story files in their assigned slice; extract fields; return JSON fragment | | Coordinator | Merge fragments; compute wave order; write manifest |
Each agent receives the list of file paths for its slice plus the field extraction table above. It returns a JSON array of story objects (no wave field yet). The coordinator merges, computes waves, sorts, and writes the manifest.
null
and add a warning to the summary.ownedScope is critical for parallel-conflict safety; never collapse or summarize it.schemaVersion (as a
separate schema revision, not within this run) before adding or removing fields.ready-for-dev status —
dependency resolution is the dev tool's job.
Part of the BMAD Planning & Orchestrator plugin — a Claude Code harness for the BMAD Method by the BMAD Code Organization (https://github.com/bmad-code-org/BMAD-METHOD). Implements the spirit of
bmad-handoff. All methodology credit belongs to the BMAD Code Organization.
testing
Solutioning-phase UX planning skill (optional; activate when the project has a UI). Produces TWO planning documents: DESIGN.md (the visual system — design tokens, color palette, typography, spacing, component specs, WCAG 2.1 AA contract) and EXPERIENCE.md (user journeys, flow diagrams, screen states, error/empty/loading handling). Use when the user says "design the UX", "create UX planning docs", "define the design system", "map the user flows", "UX for this feature", "wireframe the flows", "what are the user journeys", "accessibility design", "WCAG compliance", "design tokens", "responsive design plan", "mobile-first design", or "create DESIGN.md / EXPERIENCE.md". Runs after architecture is drafted and before stories are created. Supports Create / Update / Validate intents.
testing
Quick Flow lightweight technical specification for small-scope work (1-15 stories). Replaces the full PRD + architecture pair when scope is small and requirements are clear. Produces bmad-output/tech-spec.md as the single planning artifact before story creation. Use when the user says: "write a tech spec", "create a technical specification", "I need a tech spec for this feature", "quick spec", "small project spec", "we don't need a full PRD", "just a tech spec", "spec out this change", "document this feature". QUICK FLOW TRACK ONLY (1-15 stories). If scope grows beyond ~15 stories or involves multiple teams / external integrations at scale, stop and redirect to bmad-prd + bmad-architecture instead — those skills are built for that complexity. Supports three intents: Create (new spec), Update (revise an existing tech-spec.md), Validate (review a draft for completeness against BMAD criteria).
tools
Orchestration handoff bridge: emits and maintains sprint-status.yaml as the project's sequencing system-of-record. Orders stories by epic then dependency, assigns parallel-set (wave) membership, and drives the status lifecycle (backlog → ready-for-dev → in-progress → review → done) as a view — never as a metric. Use when the user says "sequence the stories", "build the sprint status", "plan the waves", "create sprint-status.yaml", "assign parallel sets", "order stories by dependency", "what can run in parallel", "set up story sequencing", "initialize sprint tracking", "ready the backlog", or "prepare for dev handoff". Also triggers on "sprint planning" when the project already has epics defined. SCOPE: SEQUENCING AND ORCHESTRATION ONLY. No velocity, no burndown, no committed points, no coverage metrics. Capacity is expressed as wave width (concurrent story count), not points. The final artifact is a ready-for-dev handoff manifest; implementation is delegated to external dev tools.
development
Distills ANY messy input — brain dump, transcript, long PRD, stakeholder notes, feature request, voice memo — into a tight five-field SPEC.md kernel that any downstream planning skill can consume. The five fields are: Problem, Capabilities, Constraints, Non-Goals, Success Metrics. Use when the user says "create a spec", "write a spec for", "distill this into a spec", "I have a brain dump", "turn this into something structured", "clean up these notes", "make a SPEC from", "I want to define the problem", "help me scope this", "summarize what we're building", "I have a PRD but need a kernel", "what are we actually solving?", or drops raw text/transcript and asks for structure. Also use when starting any new initiative and a clean shared definition is missing.