with one click
debug
Systematic debugging with hypothesis testing. Persistent across sessions.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Systematic debugging with hypothesis testing. Persistent across sessions.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Run multiple phases hands-free. Chains discuss, plan, build, and verify automatically.
Start a new project. Deep questioning, research, requirements, and roadmap.
Execute all plans in a phase. Spawns agents to build in parallel, commits atomically.
Configure settings: depth, model profiles, features, git, and gates.
Execute the next logical step automatically. No prompts, no decisions — just do it.
Explore ideas, think through approaches, and route insights to the right artifacts.
| name | debug |
| description | Systematic debugging with hypothesis testing. Persistent across sessions. |
| allowed-tools | Read, Write, Edit, Bash, Glob, Grep, Task, AskUserQuestion |
| argument-hint | [issue description] |
STOP — DO NOT READ THIS FILE. You are already reading it. This prompt was injected into your context by Claude Code's plugin system. Using the Read tool on this SKILL.md file wastes ~7,600 tokens. Begin executing Step 1 immediately.
Before ANY tool calls, display this banner:
╔══════════════════════════════════════════════════════════════╗
║ PLAN-BUILD-RUN ► DEBUGGING ║
╚══════════════════════════════════════════════════════════════╝
Then proceed to Step 1.
You are running the debug skill. Your job is to run a structured, hypothesis-driven debugging session that persists across conversations. You track every hypothesis, test, and finding in a debug file so work is never lost.
This skill spawns Task(subagent_type: "pbr:debugger") for investigation work.
references/questioning.md — Investigation questioning patterns: progressive depth, exploratory questions, concrete options (not open-ended)references/ui-brand.md — Status symbols, banners, error boxes for issue reportingReference: skills/shared/context-budget.md for the universal orchestrator rules.
Reference: skills/shared/agent-type-resolution.md for agent type fallback when spawning Task() subagents.
Additionally for this skill:
Debug systematically, not randomly. Every investigation step must have a hypothesis, a test, and a recorded result. No "let me just try this" — every action has a reason and is documented.
CRITICAL (no hook) -- DO NOT SKIP: Create debug directory before any file writes.
Before any file operations, ensure both directories exist by running:
mkdir -p .planning/debug
This handles the case where neither .planning/ nor .planning/debug/ exist yet (debug can be run before other skills that create .planning/). Do NOT skip this step — writing files to a non-existent directory will fail.
Load depth profile: Run pbr-tools config resolve-depth to get debug.max_hypothesis_rounds. If the command fails (no config.json or CLI error), default to 5 rounds. Initialize a round counter at 0. This counter increments each time a continuation debugger is spawned.
Scan .planning/debug/ for existing debug files:
.planning/debug/
{NNN}-{slug}.md # Each debug session is a file
Read each file's frontmatter to check status:
status: gathering — collecting symptoms from userstatus: investigating — testing hypothesesstatus: fixing — applying fixstatus: verifying — confirming fix worksstatus: resolved — session completeIf active sessions found:
CRITICAL -- DO NOT SKIP: Present the following choice to the user via AskUserQuestion before proceeding:
Use the debug-session-select pattern from skills/shared/gate-prompts.md:
question: "Found active debug sessions. Which would you like?"
Generate options dynamically from active sessions:
Handle responses:
If no active sessions found:
Trigger: If $ARGUMENTS contains --from-uat, OR if no arguments provided and UAT.md gaps exist for the current phase.
When triggered:
status: gaps_found in frontmatterIf --from-uat is specified but no gaps exist:
If $ARGUMENTS is provided and descriptive:
If $ARGUMENTS is empty or minimal:
Symptom gathering questions (ask as plain text — these are freeform, do NOT use AskUserQuestion):
Optional follow-ups (ask if relevant):
.planning/debug/ for existing filespbr-tools slug-generate "{issue title}"
Parse the JSON output to get the slug field.CRITICAL (no hook) -- DO NOT SKIP: Write debug session file to disk.
Create .planning/debug/{NNN}-{slug}.md:
---
id: "{NNN}"
title: "{issue title}"
status: gathering
created: "{ISO date}"
updated: "{ISO date}"
severity: "{critical|high|medium|low}"
category: "{runtime|build|test|config|integration|unknown}"
---
# Debug Session: {title}
## Symptoms
**Expected:** {expected behavior}
**Actual:** {actual behavior}
**Reproduction:** {steps}
**Onset:** {when it started}
**Scope:** {affected areas}
## Environment
- OS: {detected or reported}
- Runtime: {node version, python version, etc.}
- Relevant config: {any config that matters}
## Investigation Log
### Round 1 (automated)
{This section is filled by debugger}
## Hypotheses
| # | Hypothesis | Status | Evidence |
|---|-----------|--------|----------|
| 1 | {hypothesis} | {testing/confirmed/rejected} | {evidence} |
## Root Cause
{Filled when found}
## Fix Applied
{Filled when fixed}
## Timeline
- {ISO date}: Session created
Display to the user: ◆ Spawning debugger...
Spawn Task(subagent_type: "pbr:debugger") with the prompt template.
Read ${CLAUDE_SKILL_DIR}/templates/initial-investigation-prompt.md.tmpl for the spawn prompt. Fill in the {NNN}, {slug}, and symptom placeholders with values from the debug file created above.
Resuming debug session #{NNN}: {title}
Last state:
- Hypotheses tested: {N}
- Confirmed: {list or "none yet"}
- Rejected: {list}
- Current lead: {most promising hypothesis}
Continuing investigation...
Increment the round counter (resuming counts as a new round). Display to the user: ◆ Spawning debugger (resuming session #{NNN}, round {N})...
Spawn Task(subagent_type: "pbr:debugger") with the continuation prompt template.
Read ${CLAUDE_SKILL_DIR}/templates/continuation-prompt.md.tmpl for the spawn prompt. Fill in the {NNN}, {slug}, and {paste investigation log...} placeholders with data from the debug file.
When the debugger agent completes, first check for completion markers in the Task() output before routing:
| Marker in Task() Output | Route To |
|---|---|
## DEBUG COMPLETE | ROOT CAUSE FOUND + FIX path |
## ROOT CAUSE FOUND | ROOT CAUSE FOUND (no fix) path |
## DEBUG SESSION PAUSED | CHECKPOINT path |
| No marker found | INCONCLUSIVE path |
Spot-check: Before routing, verify .planning/debug/{NNN}-{slug}.md exists and was recently updated (modified timestamp is newer than the Task() spawn time). If the debug file was not updated, warn: ⚠ Debug file not updated by agent — results may be incomplete.
Memory capture: Reference skills/shared/memory-capture.md — check debugger output for <memory_suggestion> blocks and save any reusable knowledge discovered during debugging.
Display: ✓ Debug session complete — {N} hypotheses tested (read the hypothesis count from the debug file's Hypotheses table).
The debugger returns one of four outcomes:
Root cause identified: {cause}
Fix applied: {description}
Commit: {hash}
Actions:
status: resolved╔══════════════════════════════════════════════════════════════╗
║ PLAN-BUILD-RUN ► BUG RESOLVED ✓ ║
╚══════════════════════════════════════════════════════════════╝
**Session #{NNN}:** {title}
**Root cause:** {cause}
**Fix:** {description}
**Commit:** {hash}
╔══════════════════════════════════════════════════════════════╗
║ ▶ NEXT UP ║
╚══════════════════════════════════════════════════════════════╝
**Continue your workflow** — the bug is fixed
`/pbr:progress`
<sub>`/clear` first → fresh context window</sub>
**Also available:**
- `/pbr:continue` — execute next logical step
- `/pbr:verify-work {N}` — verify the current phase
Used when the debugger was invoked with find_root_cause_only or when the fix is too complex for auto-application.
Root cause identified: {cause}
Suggested fix: {approach}
Actions:
status: resolved
╔══════════════════════════════════════════════════════════════╗
║ ▶ NEXT UP ║
╚══════════════════════════════════════════════════════════════╝
**Apply the fix** — root cause identified, fix needed
`/pbr:quick {fix description}`
<sub>`/clear` first → fresh context window</sub>
**Also available:**
- `/pbr:plan-phase` — for complex fixes that need planning
- `/pbr:progress` — see project status
The debugger found something but needs user input or more investigation.
Investigation progress:
- Tested: {hypotheses tested}
- Found: {key finding}
- Need: {what's needed to continue}
Actions:
skills/shared/gate-prompts.md:
question: "Investigation has reached a checkpoint. How should we proceed?"Handle responses:
◆ Spawning debugger (continuing investigation, round {N})... and spawn another Task(subagent_type: "pbr:debugger") with updated context from the debug fileThe debugger exhausted its hypotheses without finding the root cause.
Investigation exhausted:
- Tested: {all hypotheses}
- Rejected: {list}
- Remaining unknowns: {list}
Actions:
The debugger agent follows this protocol internally:
1. OBSERVE: Read error messages, logs, code around the failure point
2. HYPOTHESIZE: "The most likely cause is X because Y"
3. PREDICT: "If X is the cause, then test Z should show W"
4. TEST: Execute test Z
5. EVALUATE:
- Result matches prediction → hypothesis supported → investigate deeper
- Result contradicts → hypothesis rejected → try next hypothesis
- Result is unexpected → new information → form new hypothesis
| Technique | When to Use |
|---|---|
| Stack trace analysis | Error with stack trace available |
| Code path tracing | Logic error, wrong behavior |
| Log injection | Need to see runtime values |
| Binary search | Know it worked before, need to find when it broke |
| Isolation | Complex system, need to narrow scope |
| Comparison | Works in one case, fails in another |
| Dependency audit | Recent dependency changes |
| Config diff | Works in one environment, not another |
| Quality | Description | Action |
|---|---|---|
| Strong | Directly proves/disproves hypothesis | Record and move on |
| Moderate | Suggests but doesn't prove | Record, seek corroboration |
| Weak | Tangentially related | Note but don't base decisions on it |
| Misleading | Red herring | Record as eliminated, explain why |
The maximum number of investigation rounds is controlled by the depth profile's debug.max_hypothesis_rounds setting:
quick: 3 rounds (fast, surface-level investigation)standard: 5 rounds (default)comprehensive: 10 rounds (deep investigation)The orchestrator tracks the round count. Before spawning each continuation debugger (Step 4 "CHECKPOINT" -> "Continue"), increment the round counter. If the counter reaches the limit:
Use AskUserQuestion: question: "Reached {N}-round hypothesis limit. How should we proceed?" header: "Debug Limit" options: - label: "Extend" description: "Allow {N} more rounds (doubles the limit)" - label: "Wrap up" description: "Record findings so far and close the session" - label: "Escalate" description: "Save context for manual debugging"
status: resolved with resolution: abandoned, record all findings, suggest next stepsgathering → investigating → fixing → verifying → resolved
(any non-resolved) → resolved (with resolution: abandoned, if 7+ days stale)
(any non-resolved) → (same) (resumed after pause)
When scanning for active sessions, check the updated date. If more than 7 days old:
status: resolved with resolution: abandoned in frontmatterOld resolved debug files can accumulate. They serve as a knowledge base for similar issues. Do NOT auto-delete them.
Update STATE.md Debug Sessions section (create if needed):
### Debug Sessions
| # | Issue | Status | Root Cause |
|---|-------|--------|------------|
| 001 | Login timeout | resolved | DB connection pool exhausted |
| 002 | CSS not loading | active | investigating |
Reference: skills/shared/commit-planning-docs.md for the standard commit pattern.
If planning.commit_docs: true in config.json:
docs(planning): open debug session {NNN} - {slug}docs(planning): resolve debug session {NNN} - {root cause summary}fix({scope}): {description}Reference: skills/shared/error-reporting.md for branded error output patterns.
If the debugger Task() fails or returns an error, display:
╔══════════════════════════════════════════════════════════════╗
║ ERROR ║
╚══════════════════════════════════════════════════════════════╝
Debugger agent failed for session #{NNN}.
**To fix:**
- Check the debug file at `.planning/debug/{NNN}-{slug}.md` for partial findings
- Re-run with `/pbr:debug` to resume the session
- If the issue persists, try a fresh session with different symptom details
debug.max_hypothesis_rounds limit without user confirmation (default: 5 for standard mode)