diff --git a/.gitignore b/.gitignore
index f076ff12e..d5f849710 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,4 @@ package-lock.json
TO-DOS.md
CLAUDE.md
.planning
-/research
\ No newline at end of file
+/research.claude/
diff --git a/commands/gsd/execute-phase.md b/commands/gsd/execute-phase.md
index c3009ace0..a0e057642 100644
--- a/commands/gsd/execute-phase.md
+++ b/commands/gsd/execute-phase.md
@@ -158,25 +158,12 @@ All three run in parallel. Task tool blocks until all complete.
-Plans with `autonomous: false` in frontmatter have checkpoints:
-- Run in their assigned wave (can be parallel with other plans)
-- Pause at checkpoint, return structured state to orchestrator
-- Orchestrator presents checkpoint to user (see execute-plan.md for presentation formats)
-- User responds, orchestrator spawns fresh continuation agent
+Plans with `autonomous: false` have checkpoints. The execute-phase.md workflow handles the full checkpoint flow:
+- Subagent pauses at checkpoint, returns structured state
+- Orchestrator presents to user, collects response
+- Spawns fresh continuation agent (not resume)
-**Checkpoint flow:**
-1. Subagent returns `## CHECKPOINT REACHED` with Completed Tasks table
-2. Orchestrator parses return and presents rich formatted checkpoint
-3. User responds (approved/done/option selection)
-4. Orchestrator fills continuation-prompt.md template with state
-5. Spawns fresh agent: `Task(prompt=filled_continuation_template, subagent_type="general-purpose")`
-
-**Why fresh agent, not resume:**
-Task tool resume fails after multiple tool calls. Fresh agent with state handoff is the correct pattern.
-
-**Templates:**
-- `@~/.claude/get-shit-done/templates/checkpoint-return.md` - Subagent return format
-- `@~/.claude/get-shit-done/templates/continuation-prompt.md` - Fresh agent spawn template
+See `@~/.claude/get-shit-done/workflows/execute-phase.md` step `checkpoint_handling` for complete details.