aj-geddes/bmad-correct-course
| CROSS-PHASE mid-stream scope correction. Re-enters planning when requirements, features, architecture, or constraints change after planning has started. Re-shards affected epics/stories, re-sequences sprint-status.yaml, appends rationale to decision-log.md. Routes to bmad-epics-and-stories, bmad-sprint-planning, or bmad-parallel-plan as needed. Changes the PLAN, never code. "we're dropping feature X", "we need to pivot", "re-plan after the change", "requirements changed mid-sprint", "correct course", "architecture changed", "re-scope the backlog", "update epics after feedback", "cancel story X", "add epic for Y", "change the plan", "we got new constraints", or when stories are split/merged/reordered due to a decision not in the original plan. sprint-status.yaml, new decision-log.md entry. NEVER writes code or runs tests.
npx skills add https://github.com/aj-geddes/claude-code-bmad-skills --skill bmad-correct-course
Role: Cross-phase re-entry point for mid-stream planning changes.
When reality diverges from the plan — a stakeholder pivots, a constraint
surfaces, a feature is cut — this skill re-enters the planning phase, makes
the minimum-necessary plan changes, and routes forward to the appropriate
downstream skill. It changes the plan, never the code.
Persona flavor: Mary (Analyst) surfaces the impact; John (PM) scopes the
delta; Winston (Architect) re-shards affected epics.
Lightweight flavor only — this is a workflow.
This skill PLANS. It NEVER writes application code, runs tests, lints,
checks coverage, builds, or reviews diffs. If tempted to "fix the code" or
"run the suite" — STOP. Plan the change and hand it off.
The latest artifact this skill may produce is a story file marked
ready-for-dev, an updated sprint-status.yaml, or a routing directive
to a downstream planning skill.
Trigger when ANY of the following is true:
artifact (PRD, architecture, epics.md, or stories) was produced.
not captured in the existing plan.
declarations in existing stories.
decision-log.mdbefore proceeding.
| File | Why |
|------|-----|
| bmad-output/project-context.md | Project constitution — load every run |
| bmad-output/decision-log.md | Threaded decisions; append here |
| bmad-output/epics.md | Existing epic map to diff against |
| bmad-output/prd.md | Source of truth for requirements |
| bmad-output/architecture.md | Tech boundaries (if architecture changed) |
| bmad-output/sprint-status.yaml | Current sequencing state |
| bmad-output/stories/*.story.md | In-flight and backlog stories |
Output folder default: bmad-output/. Honor any user-configured override
from bmad-output/config.yaml.
| Intent | When to use |
|--------|-------------|
| Scope Change | A feature is added, dropped, or reshaped — re-shard affected epics and re-sequence. |
| Architecture Change | Module boundaries, stack, or integrations shift — update Owned Scope declarations in impacted stories. |
| Record Only | The change is already reflected in planning artifacts; write the decision-log entry and confirm consistency. |
State the intent explicitly before proceeding. When unclear, ask the user
which scenario applies rather than assuming.
Use TodoWrite to track progress through these steps.
is altered, and why (ask the user if unclear).
Identify the minimum blast radius:
invalidated Owned Scope)
in-progress stories touched bythe change need special care — flag them; do not silently move them.)
sprint-status.yaml need re-sequencing?Present the triage to the user and confirm before editing.
Apply only the minimum-necessary changes.
# COURSE-CORRECTION annotation and the date.status: cancelled — do not delete; preserve history.For any epic that changed scope, invoke the story-sharding workflow:
> Route to bmad-epics-and-stories (intent: Update or Create)
> Provide the updated epic definition and a list of story IDs to add,
> drop, or revise. The sharding skill owns the story context-object
> contract; do not reproduce it here.
status: cancelled in the story file headerand in sprint-status.yaml. Do not delete files.
status: backlog.A LOCKED section (Acceptance Criteria, Dev Notes, Testing) may only change
with explicit user confirmation; record the change in decision-log.md.
After all story changes are settled, route to bmad-sprint-planning to
re-derive wave assignments:
> Route to bmad-sprint-planning (intent: Update)
> Pass the full list of changed story IDs and their new statuses.
> Ask it to recompute the dependency graph and re-assign parallel sets.
Alternatively, if the change is confined to a single story swap (a
pure add-one / drop-one with no dependency ripple), you may edit
sprint-status.yaml directly:
# Validate current sprint-status.yaml before editing
bash "${CLAUDE_PLUGIN_ROOT}/scripts/scope-conflict-check.sh" bmad-output/stories/
If Owned File/Module Scope declarations changed or new stories were added
to the backlog, re-plan the wave assignment:
> Route to bmad-parallel-plan (intent: Update)
> Pass the updated story list and note which scopes changed.
> Ask it to rebuild the dependency DAG and emit a revised
> parallelization-plan.md.
Only invoke this if the project was previously using parallel waves. If
the project is on Quick Flow or sequential delivery, skip this step.
Every course-correction MUST produce a decision-log entry. Use this
format (append newest-first):
### YYYY-MM-DD — Course Correction: <short title>
- **Decision:** <what changed in the plan>
- **Rationale:** <why the change was necessary; alternatives considered>
- **Impact:** <epics added/dropped, stories added/dropped/re-scoped,
status changes in sprint-status.yaml>
- **In-progress stories affected:** <list, or "none">
- **Made by:** bmad-correct-course
- **Supersedes:** <link to prior entry, if any>
Append to bmad-output/decision-log.md using the template at
templates/course-correction.template.md.
After all updates are applied, report:
Course correction applied.
Decision log : entry appended → bmad-output/decision-log.md
Epics changed : <list>
Stories added : <list>
Stories dropped/cancelled : <list>
Stories re-scoped : <list>
sprint-status.yaml : re-sequenced (wave assignments updated)
Next step : <route taken — epics-and-stories / sprint-planning / parallel-plan>
Do NOT implement. The plan is ready; external dev tools pick it up.
annotation and a decision-log entry. History is a first-class concern.
Untouched epics, stories, and wave assignments must not be regenerated.
in-progress orreview, flag it to the user and wait for explicit confirmation before
altering scope or cancelling it. Do not silently mutate live work.
and Testing in an existing story are LOCKED. Changing them requires the
user to explicitly authorize the change; record the authorization in
decision-log.md.
step. Delivery tracking is count-based: stories remaining and completion
rate. Never introduce points fields into sprint-status.yaml.
bmad-epics-and-stories. Wave math belongs to bmad-sprint-planning and
bmad-parallel-plan. Route rather than duplicating their logic.
| Downstream skill | When to route |
|-----------------|---------------|
| bmad-epics-and-stories (Update or Create) | Epic scope changed; stories need to be re-sharded or new ones compiled |
| bmad-sprint-planning (Update) | Dependency graph or wave assignments need recomputation |
| bmad-parallel-plan (Update) | Owned File/Module Scope changed; parallel waves need to be rebuilt |
You may route to more than one downstream skill in sequence. Always update
decision-log.md before routing.
backlog → ready-for-dev → in-progress → review → done
↑
cancelled (set here on drop; never deleted) ────
cancelled is a terminal state. Cancelled stories remain in
sprint-status.yaml with status: cancelled so the history is preserved.
Pattern: parallel impact analysis, sequential application.
For large backlogs (15+ stories, 3+ affected epics), fan out analysis:
| Agent | Task | Output |
|-------|------|--------|
| Agent 1 | Diff epics.md against the change statement; list affected epic IDs | bmad-output/context/affected-epics.md |
| Agent 2 | Scan all story files; identify stories whose Owned Scope or dependencies are invalidated | bmad-output/context/affected-stories.yaml |
| Agent 3 | Read sprint-status.yaml; identify dependency ripple from cancelled/added stories | bmad-output/context/ripple-analysis.yaml |
Coordinator (main context): merge outputs, confirm triage with the user,
then apply changes and route to downstream skills.
Example subagent prompt:
Task: Identify stories affected by the scope change.
Context: Read all *.story.md files under bmad-output/stories/.
Change statement: <paste change here>
Objective: For each story, determine if its Owned File/Module Scope,
dependencies, or Acceptance Criteria are invalidated by the change.
Output: Write YAML list to bmad-output/context/affected-stories.yaml
Format:
- id: "2.1.stripe-integration"
affected: true
reason: "owned scope includes src/payments/ which moves to new module"
status: "ready-for-dev"
bmad-output/decision-log.md — append here; never overwrite prior entries.${CLAUDE_PLUGIN_ROOT}/scripts/scope-conflict-check.sh — validate Owned Scope after story changes.bmad-epics-and-stories, bmad-sprint-planning, bmad-parallel-plan.> ---
> 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-correct-course. All methodology credit belongs to the BMAD Code Organization.
Take aj-geddes/bmad-correct-course from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.