Execute all plans in a phase using wave-based parallel execution. Orchestrator stays lean by delegating plan execution to subagents.
The orchestrator's job is coordination, not execution. Each subagent loads the full execute-plan context itself. Orchestrator discovers plans, analyzes dependencies, groups into waves, spawns agents, collects results.
Confirm phase exists and has plans:
```bash
PHASE_DIR=$(ls -d .planning/phases/${PHASE_ARG}* 2>/dev/null | head -1)
if [ -z "$PHASE_DIR" ]; then
echo "ERROR: No phase directory matching '${PHASE_ARG}'"
exit 1
fi
PLAN_COUNT=$(ls -1 "$PHASE_DIR"/*-PLAN.md 2>/dev/null | wc -l | tr -d ' ')
if [ "$PLAN_COUNT" -eq 0 ]; then
echo "ERROR: No plans found in $PHASE_DIR"
exit 1
fi
```
Report: "Found {N} plans in {phase_dir}"
List all plans and their completion status:
```bash
# Get all plans
ls -1 "$PHASE_DIR"/*-PLAN.md 2>/dev/null | sort
# Get completed plans (have SUMMARY.md)
ls -1 "$PHASE_DIR"/*-SUMMARY.md 2>/dev/null | sort
```
Build plan inventory:
- Plan path
- Plan number (extracted from filename)
- Completion status (SUMMARY exists = complete)
Skip completed plans. If all complete, report "Phase already executed" and exit.
For each incomplete plan, check if it depends on outputs from other plans.
**Read each plan's `` section:**
- Look for @-references to files that other plans create
- Look for explicit `requires:` in frontmatter
**Dependency patterns:**
- Plan references `@.planning/phases/.../XX-YY-SUMMARY.md` → depends on plan XX-YY
- Plan references files created by earlier plan → depends on that plan
- No cross-references → independent, can run in parallel
**Build dependency graph:**
```
plan-01: [] # no dependencies
plan-02: [] # no dependencies
plan-03: [plan-01] # depends on plan-01 outputs
plan-04: [plan-02] # depends on plan-02 outputs
plan-05: [plan-03, plan-04] # depends on both
```
Group plans into execution waves based on dependencies:
**Wave assignment algorithm:**
1. Wave 1: All plans with no dependencies
2. Wave 2: Plans whose dependencies are all in Wave 1
3. Wave N: Plans whose dependencies are all in earlier waves
**Example:**
```
Wave 1: [plan-01, plan-02] # parallel - no dependencies
Wave 2: [plan-03, plan-04] # parallel - depend only on Wave 1
Wave 3: [plan-05] # sequential - depends on Wave 2
```
Report wave structure to user:
```
Execution Plan:
Wave 1 (parallel): plan-01, plan-02
Wave 2 (parallel): plan-03, plan-04
Wave 3: plan-05
Total: 5 plans in 3 waves
```
Execute each wave in sequence. Plans within a wave run in parallel.
**For each wave:**
1. **Spawn all agents in wave simultaneously:**
Use Task tool with multiple parallel calls. Each agent gets prompt from subagent-task-prompt template:
```
Execute plan {plan_number} of phase {phase_number}-{phase_name}.
Commit each task atomically. Create SUMMARY.md. Update STATE.md.
@~/.claude/get-shit-done/workflows/execute-plan.md
@~/.claude/get-shit-done/templates/summary.md
@~/.claude/get-shit-done/references/checkpoints.md
@~/.claude/get-shit-done/references/tdd.md
Plan: @{plan_path}
Project state: @.planning/STATE.md
Config: @.planning/config.json (if exists)
- [ ] All tasks executed
- [ ] Each task committed individually
- [ ] SUMMARY.md created in plan directory
- [ ] STATE.md updated with position and decisions
```
2. **Wait for all agents in wave to complete:**
Task tool blocks until each agent finishes. All parallel agents return together.
3. **Collect results from wave:**
For each completed agent:
- Verify SUMMARY.md exists at expected path
- Note any issues reported
- Record completion
4. **Handle failures:**
If any agent in wave fails:
- Report which plan failed and why
- Ask user: "Continue with remaining waves?" or "Stop execution?"
- If continue: proceed to next wave (dependent plans may also fail)
- If stop: exit with partial completion report
5. **Proceed to next wave**
After all waves complete, aggregate results:
```markdown
## Phase {X}: {Name} Execution Complete
**Waves executed:** {N}
**Plans completed:** {M} of {total}
### Wave Summary
| Wave | Plans | Status |
|------|-------|--------|
| 1 | plan-01, plan-02 | ✓ Complete |
| 2 | plan-03, plan-04 | ✓ Complete |
| 3 | plan-05 | ✓ Complete |
### Plan Details
1. **plan-01**: [one-liner from SUMMARY.md]
2. **plan-02**: [one-liner from SUMMARY.md]
...
### Issues Encountered
[Aggregate from all SUMMARYs, or "None"]
```
Update ROADMAP.md to reflect phase completion:
```bash
# Mark phase complete
# Update completion date
# Update status
```
Commit roadmap update:
```bash
git add .planning/ROADMAP.md
git commit -m "docs(phase-{X}): complete phase execution"
```
Present next steps based on milestone status:
**If more phases remain:**
```
## ▶ Next Up
**Phase {X+1}: {Name}** — {Goal}
`/gsd:plan-phase {X+1}`
`/clear` first → fresh context window
```
**If milestone complete:**
```
🎉 MILESTONE COMPLETE!
All {N} phases executed.
`/gsd:complete-milestone`
```
**Why this works:**
Orchestrator context usage: ~10-15%
- Read plan files (small)
- Analyze dependencies (logic, no heavy reads)
- Fill template strings
- Spawn Task calls
- Collect results
Each subagent: Fresh 200k context
- Loads full execute-plan workflow
- Loads templates, references
- Executes plan with full capacity
- Creates SUMMARY, commits
**No polling.** Task tool blocks until completion. No TaskOutput loops.
**No context bleed.** Orchestrator never reads workflow internals. Just paths and results.
**Subagent fails mid-plan:**
- SUMMARY.md won't exist
- Orchestrator detects missing SUMMARY
- Reports failure, asks user how to proceed
**Dependency chain breaks:**
- Wave 1 plan fails
- Wave 2 plans depending on it will likely fail
- Orchestrator can still attempt them (user choice)
- Or skip dependent plans entirely
**All agents in wave fail:**
- Something systemic (git issues, permissions, etc.)
- Stop execution
- Report for manual investigation
Plans with checkpoints require user interaction. These cannot run fully autonomous.
**Detection:** Scan plan for `type="checkpoint` before spawning.
**If checkpoints found:**
- Don't include in parallel wave
- Execute after wave completes, in main context
- Or spawn as single agent and wait (user interaction flows through)
**Checkpoint-heavy plans:** Execute sequentially in main context rather than subagent.