feat(debug): subagent isolation for investigation with checkpoint support

- Debug command now orchestrates: gather symptoms in main context, spawn
  investigation subagent with fresh 200k context
- Subagent template unified for both /gsd:debug (find_and_fix) and
  diagnose-issues (find_root_cause_only) flows via goal flag
- Checkpoint behavior enables subagent to pause for user input
  (human-verify, human-action, decision) with continuation agents
- Structured return formats: ROOT CAUSE FOUND, DEBUG COMPLETE,
  INVESTIGATION INCONCLUSIVE, CHECKPOINT REACHED
- diagnose-issues updated to match new template placeholders and returns

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Lex Christopherson
2026-01-14 10:59:59 -06:00
parent b1066c1f3c
commit 00208b71af
3 changed files with 448 additions and 100 deletions

View File

@@ -9,19 +9,22 @@ allowed-tools:
- Bash
- Grep
- Glob
- Task
- AskUserQuestion
---
<objective>
Debug issues using scientific method with a persistent debug document that survives `/clear`.
Debug issues using scientific method with subagent isolation for investigation.
If resuming (no arguments and active session exists): pick up where you left off.
If starting new: gather symptoms, then investigate autonomously.
**Orchestrator role:** Gather symptoms interactively, spawn investigation subagent, handle checkpoints, spawn continuation agents as needed.
**Why subagent:** Investigation burns context fast (reading files, forming hypotheses, testing). Fresh 200k context per investigation attempt. Main context stays lean for user interaction.
</objective>
<execution_context>
@~/.claude/get-shit-done/workflows/debug.md
@~/.claude/get-shit-done/templates/DEBUG.md
@~/.claude/get-shit-done/templates/debug-subagent-prompt.md
</execution_context>
<context>
@@ -29,30 +32,170 @@ User's issue: $ARGUMENTS
Check for active debug sessions:
```bash
ls .planning/debug/*.md 2>/dev/null | head -5
ls .planning/debug/*.md 2>/dev/null | grep -v resolved | head -5
```
</context>
<process>
Follow the workflow in @~/.claude/get-shit-done/workflows/debug.md
**Quick reference:**
## 1. Check Active Sessions
1. **Check for active sessions** - Offer to resume or start new
2. **Gather symptoms** - What happened? What should happen? Errors? When?
3. **Create DEBUG.md** - Document symptoms in `.planning/debug/[slug].md`
4. **Investigate** - Evidence → Hypothesis → Test → Eliminate or Confirm
5. **Fix and verify** - Minimal fix, verify against original symptoms
6. **Archive** - Move to `.planning/debug/resolved/`
If active sessions exist AND no $ARGUMENTS:
- List sessions with status, hypothesis, next action
- User picks number to resume OR describes new issue
If $ARGUMENTS provided OR user describes new issue:
- Continue to symptom gathering
## 2. Gather Symptoms (Main Context)
Use AskUserQuestion for each:
1. **Expected behavior** - What should happen?
2. **Actual behavior** - What happens instead?
3. **Error messages** - Any errors? (paste or describe)
4. **Timeline** - When did this start? Ever worked?
5. **Reproduction** - How do you trigger it?
After each answer, note it. After all gathered, confirm ready to investigate.
## 3. Create Debug File
```bash
mkdir -p .planning/debug
```
Create `.planning/debug/{slug}.md` with:
- status: investigating
- trigger: user's original description
- Symptoms section filled from gathering
- Empty Evidence, Eliminated, Resolution sections
## 4. Spawn Investigation Subagent
Fill debug-subagent-prompt template with:
- `{slug}`: Generated slug
- `{trigger}`: Original issue description
- `{expected}`: From symptom gathering
- `{actual}`: From symptom gathering
- `{errors}`: From symptom gathering
- `{reproduction}`: From symptom gathering
- `{timeline}`: From symptom gathering
```
Task(
prompt=filled_debug_subagent_prompt,
subagent_type="general-purpose",
description="Debug {slug}"
)
```
## 5. Handle Subagent Return
**If `## ROOT CAUSE FOUND`:**
- Display root cause and evidence summary
- Offer options:
- "Fix now" → spawn fix subagent
- "Plan fix" → suggest /gsd:plan-fix
- "Manual fix" → done
**If `## CHECKPOINT REACHED`:**
- Present checkpoint details to user
- Get user response
- Spawn continuation agent (see step 6)
**If `## INVESTIGATION INCONCLUSIVE`:**
- Show what was checked and eliminated
- Offer options:
- "Continue investigating" → spawn new agent with additional context
- "Manual investigation" → done
- "Add more context" → gather more symptoms, spawn again
## 6. Spawn Continuation Agent (After Checkpoint)
When user responds to checkpoint, spawn fresh agent:
```markdown
<objective>
Continue debugging {slug}.
**DO NOT REDO** previous investigation. Evidence is in the debug file.
</objective>
<prior_state>
Debug file: @.planning/debug/{slug}.md
Read this file - it contains all evidence gathered so far.
</prior_state>
<checkpoint_response>
**Checkpoint was:** {checkpoint_type}
**User response:** {user_response}
{interpretation based on checkpoint type}
</checkpoint_response>
<execution_context>
@~/.claude/get-shit-done/workflows/debug.md
@~/.claude/get-shit-done/templates/DEBUG.md
</execution_context>
<instructions>
1. Read the debug file to understand current state
2. Incorporate user's checkpoint response
3. Continue investigation from Current Focus
4. Update debug file continuously
5. Return with ROOT CAUSE FOUND, CHECKPOINT REACHED, or INVESTIGATION INCONCLUSIVE
</instructions>
```
## 7. Fix (Optional)
If user chooses "Fix now" after root cause found:
```markdown
<objective>
Fix the root cause identified in {slug} debug session.
</objective>
<context>
Debug file: @.planning/debug/{slug}.md
Root cause: {root_cause}
Files involved: {files}
</context>
<instructions>
1. Implement minimal fix addressing root cause
2. Verify fix against original symptoms
3. Update debug file Resolution section
4. Commit with message referencing debug session
5. Archive to .planning/debug/resolved/
</instructions>
```
**Key principle:** The DEBUG.md is your memory. Update it constantly. It survives `/clear`.
</process>
<checkpoint_types>
Subagent may return checkpoints for:
**human-verify:** "Can you confirm you see X when you do Y?"
- Present verification request
- User responds with confirmation or what they see instead
**human-action:** "I need you to run this command / check this thing"
- Present action request
- User responds "done" or with results
**decision:** "Should I investigate path A or path B?"
- Present options with context
- User picks direction
</checkpoint_types>
<success_criteria>
- [ ] Active sessions checked before starting new
- [ ] Symptoms gathered through AskUserQuestion (not inline questions)
- [ ] DEBUG.md tracks all investigation state
- [ ] Scientific method followed (not random fixes)
- [ ] Symptoms gathered interactively in main context
- [ ] Investigation runs in subagent (fresh context)
- [ ] Debug file tracks all state across agent boundaries
- [ ] Checkpoints handled via continuation agents
- [ ] Root cause confirmed with evidence before fixing
- [ ] Fix verified and session archived
</success_criteria>

View File

@@ -1,6 +1,10 @@
# Debug Subagent Prompt Template
Template for spawning debug agents from diagnose-issues workflow. Each agent investigates one UAT issue with symptoms pre-filled.
Template for spawning debug investigation agents. Used by:
- `/gsd:debug` — Interactive debugging (find and offer to fix)
- `diagnose-issues` — UAT parallel diagnosis (find root cause only)
The `goal` flag determines behavior after root cause is found.
---
@@ -8,13 +12,12 @@ Template for spawning debug agents from diagnose-issues workflow. Each agent inv
```markdown
<objective>
Investigate UAT issue and find root cause. Do NOT fix - only diagnose.
Investigate issue and find root cause.
**Issue:** {issue_id}
**Summary:** {issue_summary}
**Severity:** {severity}
Symptoms are pre-filled from UAT testing. Skip symptom gathering, start investigating immediately.
Symptoms are pre-filled. Skip symptom gathering, start investigating immediately.
</objective>
<execution_context>
@@ -25,16 +28,15 @@ Symptoms are pre-filled from UAT testing. Skip symptom gathering, start investig
@~/.claude/get-shit-done/references/debugging/investigation-techniques.md
</execution_context>
<context>
**Symptoms (from UAT):**
- expected: {expected}
- actual: {reported}
- severity: {severity}
- reproduction: Test {test_num} in UAT
<symptoms>
**Pre-filled from orchestrator:**
@.planning/STATE.md
@.planning/phases/{phase_dir}/{phase}-UAT.md
</context>
- expected: {expected}
- actual: {actual}
- errors: {errors}
- reproduction: {reproduction}
- timeline: {timeline}
</symptoms>
<mode>
**symptoms_prefilled: true**
@@ -42,88 +44,228 @@ Symptoms are pre-filled from UAT testing. Skip symptom gathering, start investig
Skip the symptom_gathering step entirely. Symptoms section is already filled.
Start directly at investigation_loop.
**goal: find_root_cause_only**
**goal: {goal}**
Do NOT apply fixes. Your job is to:
1. Investigate the issue
2. Form and test hypotheses
3. Find the root cause with evidence
4. Return the diagnosis
The fix will be planned and applied separately by /gsd:plan-fix.
- `find_root_cause_only` — Diagnose but do NOT fix. Return root cause to orchestrator. Used by UAT diagnosis flow where plan-fix handles the fix.
- `find_and_fix` — Find root cause, then fix and verify. Used by interactive /gsd:debug where user wants immediate resolution.
</mode>
<debug_file>
**Path constant:** DEBUG_DIR=.planning/debug
**Path:** .planning/debug/{slug}.md
Create: `${DEBUG_DIR}/{slug}.md`
Create debug file immediately with symptoms pre-filled:
Generate slug from issue summary (same as regular /gsd:debug).
Example: `.planning/debug/comment-not-refreshing.md`
Pre-fill Symptoms section:
```markdown
---
status: investigating
trigger: "{issue_summary}"
created: [ISO timestamp]
updated: [ISO timestamp]
---
## Current Focus
hypothesis: gathering initial evidence
test: examining error context and relevant code
expecting: clues about failure point
next_action: search for error text in codebase
## Symptoms
expected: {expected}
actual: {reported}
errors: [investigate to find]
reproduction: Test {test_num} - {test_name}
started: discovered during UAT
actual: {actual}
errors: {errors}
reproduction: {reproduction}
started: {timeline}
## Eliminated
[none yet]
## Evidence
[none yet]
## Resolution
root_cause:
fix:
verification:
files_changed: []
```
The debug file is identical to a regular debug session. The only difference is symptoms are pre-filled. UAT.md tracks the link via `debug_session` field.
Then proceed with investigation.
**Update continuously.** The debug file is your memory. Before every action, update Current Focus. After every finding, append to Evidence.
</debug_file>
<return_format>
When root cause is confirmed, return:
<checkpoint_behavior>
**When you need user input during investigation:**
If you cannot proceed without user action or verification:
1. Update debug file with current state
2. Return structured checkpoint instead of completing
**Checkpoint format:**
```markdown
## CHECKPOINT REACHED
**Type:** [human-verify | human-action | decision]
**Debug Session:** .planning/debug/{slug}.md
**Progress:** {evidence_count} evidence entries, {eliminated_count} hypotheses eliminated
### Investigation State
**Current Hypothesis:** {from Current Focus}
**Evidence So Far:**
- {key finding 1}
- {key finding 2}
### Checkpoint Details
[Type-specific content]
### Awaiting
[What you need from user]
```
## DEBUG COMPLETE: {issue_id}
**Checkpoint types:**
**human-verify** — Need user to confirm something you can't observe:
- What to check, how to check it, what to report back
**human-action** — Need user to do something (auth, physical action):
- What action, why you can't do it, steps to complete
**decision** — Need user to choose investigation direction:
- What's being decided, options with implications
**After checkpoint:** Orchestrator gets user response, spawns fresh continuation agent. You will NOT be resumed.
</checkpoint_behavior>
<return_formats>
**Return ONE of these when done:**
---
**Root cause found (goal: find_root_cause_only):**
```markdown
## ROOT CAUSE FOUND
**Debug Session:** .planning/debug/{slug}.md
**Root Cause:** [specific cause with evidence]
**Evidence:**
**Evidence Summary:**
- [key finding 1]
- [key finding 2]
- [key finding 3]
**Files Involved:**
- [file1.ts]: [what's wrong]
- [file2.ts]: [related issue]
**Debug Session:** ${DEBUG_DIR}/{slug}.md
- [file1]: [what's wrong]
- [file2]: [related issue]
**Suggested Fix Direction:** [brief hint for plan-fix, not implementation]
```
If unable to determine root cause after thorough investigation:
---
**Root cause found (goal: find_and_fix):**
After finding root cause, proceed to fix_and_verify step per workflow.
When complete:
```markdown
## DEBUG COMPLETE
**Debug Session:** .planning/debug/resolved/{slug}.md
**Root Cause:** [what was wrong]
**Fix Applied:** [what was changed]
**Verification:** [how verified]
**Files Changed:**
- [file1]: [change]
- [file2]: [change]
**Commit:** [hash]
```
## DEBUG INCONCLUSIVE: {issue_id}
**Investigation Summary:**
- [what was checked]
- [what was eliminated]
---
**Hypotheses Remaining:**
- [possible cause 1]
- [possible cause 2]
**Investigation inconclusive:**
**Recommendation:** Manual review needed
```markdown
## INVESTIGATION INCONCLUSIVE
**Debug Session:** ${DEBUG_DIR}/{slug}.md
**Debug Session:** .planning/debug/{slug}.md
**What Was Checked:**
- [area 1]: [finding]
- [area 2]: [finding]
**Hypotheses Eliminated:**
- [hypothesis 1]: [why eliminated]
- [hypothesis 2]: [why eliminated]
**Remaining Possibilities:**
- [possibility 1]
- [possibility 2]
**Recommendation:** [next steps or manual review needed]
```
</return_format>
</return_formats>
<investigation_protocol>
**Phase 1: Gather initial evidence**
1. If errors in symptoms → search codebase for error text
2. Identify relevant code area from symptoms
3. Read relevant files COMPLETELY (don't skim)
4. Run app/tests to observe behavior firsthand
After EACH finding → append to Evidence with timestamp, what was checked, what was found, implication.
**Phase 2: Form hypothesis**
Based on evidence, form SPECIFIC, FALSIFIABLE hypothesis.
Update Current Focus:
- hypothesis: [specific theory]
- test: [how you'll test it]
- expecting: [what proves/disproves it]
- next_action: [immediate next step]
**Phase 3: Test hypothesis**
Execute ONE test at a time. Append result to Evidence.
**Phase 4: Evaluate**
If CONFIRMED:
- Update Resolution.root_cause with evidence
- If goal is find_root_cause_only → return ROOT CAUSE FOUND
- If goal is find_and_fix → proceed to fix_and_verify
If ELIMINATED:
- Append to Eliminated section with evidence
- Form new hypothesis based on evidence
- Return to Phase 2
**If stuck:** Consider checkpoint to ask user for more context or verification.
</investigation_protocol>
<success_criteria>
- [ ] Debug file created with symptoms pre-filled
- [ ] Investigation completed (evidence gathered, hypotheses tested)
- [ ] Root cause identified with supporting evidence
- [ ] Debug session file updated throughout
- [ ] Clear return format for orchestrator
- [ ] Current Focus updated before every action
- [ ] Evidence appended after every finding
- [ ] Hypotheses tested one at a time
- [ ] Root cause confirmed with evidence
- [ ] Appropriate return format based on goal
- [ ] Debug file reflects final state
</success_criteria>
```
@@ -133,28 +275,80 @@ If unable to determine root cause after thorough investigation:
| Placeholder | Source | Example |
|-------------|--------|---------|
| `{issue_id}` | UAT issue ID | `UAT-001` |
| `{issue_summary}` | Brief description | `Comment doesn't appear until refresh` |
| `{expected}` | From UAT test | `Submit comment, appears in list` |
| `{reported}` | User's description | `works but doesn't show until refresh` |
| `{severity}` | blocker/major/minor/cosmetic | `major` |
| `{test_num}` | Test number in UAT | `2` |
| `{test_name}` | Test name | `Create Top-Level Comment` |
| `{phase}` | Phase number | `04` |
| `{phase_dir}` | Phase directory name | `04-comments` |
| `{slug}` | Generated from summary | `comment-not-refreshing` |
| `{issue_id}` | Orchestrator-assigned | `auth-screen-dark` or `UAT-001` |
| `{issue_summary}` | User description or UAT | `Auth screen is too dark` |
| `{expected}` | From symptoms | `See logo and form clearly` |
| `{actual}` | From symptoms | `Screen is dark, logo not visible` |
| `{errors}` | From symptoms | `None in console` |
| `{reproduction}` | From symptoms | `Open /auth page` |
| `{timeline}` | From symptoms | `After recent deploy` |
| `{goal}` | Orchestrator sets | `find_and_fix` or `find_root_cause_only` |
| `{slug}` | Generated from summary | `auth-screen-dark` |
---
## Usage
## Usage by Orchestrator
Orchestrator (diagnose-issues.md) fills placeholders and spawns:
**From /gsd:debug (interactive):**
```python
# Spawn all debug agents in parallel
Task(prompt=filled_template_001, subagent_type="general-purpose", description="Debug UAT-001")
Task(prompt=filled_template_002, subagent_type="general-purpose", description="Debug UAT-002")
Task(prompt=filled_template_003, subagent_type="general-purpose", description="Debug UAT-003")
Task(
prompt=filled_template, # goal: find_and_fix
subagent_type="general-purpose",
description="Debug {slug}"
)
```
All agents run simultaneously. Each returns with root cause or inconclusive result.
**From diagnose-issues (UAT parallel):**
```python
# Spawn all in parallel
Task(prompt=template_001, subagent_type="general-purpose", description="Debug UAT-001") # goal: find_root_cause_only
Task(prompt=template_002, subagent_type="general-purpose", description="Debug UAT-002")
Task(prompt=template_003, subagent_type="general-purpose", description="Debug UAT-003")
```
---
## Continuation Agent
When orchestrator spawns fresh agent after checkpoint:
```markdown
<objective>
Continue debugging {slug}.
**DO NOT REDO** previous investigation. Evidence is in the debug file.
</objective>
<prior_state>
Debug file: @.planning/debug/{slug}.md
Read this file first - it contains all evidence gathered so far.
</prior_state>
<checkpoint_response>
**Checkpoint was:** {checkpoint_type}
**User response:** {user_response}
{interpretation based on checkpoint type}
</checkpoint_response>
<mode>
**goal: {goal}**
</mode>
<execution_context>
@~/.claude/get-shit-done/workflows/debug.md
@~/.claude/get-shit-done/templates/DEBUG.md
@~/.claude/get-shit-done/references/debugging/debugging-mindset.md
</execution_context>
<instructions>
1. Read debug file to understand current state
2. Incorporate user's checkpoint response into investigation
3. Continue from Current Focus
4. Update debug file continuously
5. Return with ROOT CAUSE FOUND, DEBUG COMPLETE, CHECKPOINT REACHED, or INVESTIGATION INCONCLUSIVE
</instructions>
```

View File

@@ -90,10 +90,12 @@ Template placeholders:
- `{issue_id}`: UAT-001, UAT-002, etc.
- `{issue_summary}`: Brief description
- `{expected}`: From UAT test
- `{reported}`: Verbatim user description
- `{severity}`: blocker/major/minor/cosmetic
- `{phase}`: Phase being tested
- `{phase_dir}`: Path to phase directory
- `{actual}`: Verbatim user description (what actually happened)
- `{errors}`: Any error messages from UAT (or "None reported")
- `{reproduction}`: "Test {test_num} in UAT"
- `{timeline}`: "Discovered during UAT"
- `{goal}`: `find_root_cause_only` (UAT flow - plan-fix handles fixes)
- `{slug}`: Generated from issue_summary
</step>
<step name="collect_results">
@@ -101,25 +103,34 @@ Template placeholders:
Each agent returns with:
```
## DEBUG COMPLETE: UAT-{NNN}
## ROOT CAUSE FOUND
**Debug Session:** ${DEBUG_DIR}/{slug}.md
**Root Cause:** {specific cause with evidence}
**Files Involved:** {list of files}
**Debug Session:** ${DEBUG_DIR}/{slug}.md
**Evidence Summary:**
- {key finding 1}
- {key finding 2}
- {key finding 3}
**Files Involved:**
- {file1}: {what's wrong}
- {file2}: {related issue}
**Suggested Fix Direction:** {brief hint for plan-fix}
```
Parse each return to extract:
- root_cause: The diagnosed cause
- files: Files involved
- debug_path: Path to debug session file (standard debug location)
- debug_path: Path to debug session file
- suggested_fix: Hint for plan-fix
If agent fails or can't determine root cause:
If agent returns `## INVESTIGATION INCONCLUSIVE`:
- root_cause: "Investigation inconclusive - manual review needed"
- Note which issue needs manual attention
- Include remaining possibilities from agent return
</step>
<step name="update_uat">