troubleshoot
Troubleshoot — Hypothesis-Driven Debugging & Fix
Systematic issue diagnosis with root cause tracing, validated fixes, and prevention guidance.
<essential_principles>
Serena Think Checkpoints (Mandatory)
Call the following Serena tools at the specified points. Never skip them.
| Checkpoint | Tool | When | Purpose |
|---|---|---|---|
| Adherence Gate | mcp__serena__think_about_task_adherence |
Before each code edit in Phase 4 (Fix) | Confirm fix aligns with identified root cause |
| Completion Gate | mcp__serena__think_about_whether_you_are_done |
Before exiting Phase 5 (Verify) | Confirm fix is verified with evidence |
After Phase 1 and again after Phase 2, do a short evidence sufficiency self-check in prose (repro steps, observed vs expected, hypotheses tied to concrete evidence). If gaps remain, collect more evidence before continuing—do not rely on a removed Serena tool.
Always Active
- Hypothesis before fix: Never guess-fix. Always form a hypothesis, gather evidence, then apply the fix. "🤔 I think X because Y" → verify → fix
- Introspection markers: Make debugging reasoning visible throughout:
- 🤔 Reasoning — "🤔 The stack trace points to a null ref in..."
- 🎯 Decision — "🎯 Root cause identified: missing null check at..."
- ⚡ Performance — "⚡ This N+1 query causes the slowdown"
- 📊 Quality — "📊 This fix also addresses the underlying design issue"
- 💡 Insight — "💡 This pattern is error-prone; consider refactoring"
- Validate every fix: Run lint/typecheck/test after each change. No unverified fixes
- Destructive changes require confirmation: Deleting files, resetting state, dropping data
- No project-specific rules: This skill works across all projects and AI agents
</essential_principles>
Phase 1: Reproduce
Understand and reproduce the issue before diagnosing.
- Parse the error description from user input
- 🤔 Identify the error type: bug / build / test / performance / deployment
- Collect evidence:
- Read error messages, stack traces, logs
- Run the failing command to see the actual output
- Check
git difforgit logfor recent changes that may have caused it
- Confirm reproduction: "I can reproduce this by running X → error Y"
If cannot reproduce: Ask user for more context before proceeding.
Tools: Bash, Read, Grep, Glob
- Reproduction evidence self-check — Confirm you have enough to proceed: exact command or steps, full error output, and environment hints if relevant. If reproduction is shaky or incomplete, gather more before Phase 2.
Phase 2: Hypothesize
Form hypotheses about the root cause — do not jump to fixing.
- 🤔 List 2-3 candidate hypotheses based on evidence:
🤔 Hypothesis A: Missing dependency after package update 🤔 Hypothesis B: Type mismatch from recent refactor 🤔 Hypothesis C: Environment variable not set - 🎯 Rank by likelihood based on evidence strength
- Start investigating the most likely hypothesis first
- Hypothesis grounding self-check — Each hypothesis should cite specific evidence (log line, code path, diff, measured behavior). Demote or drop guesses that are not tied to facts.
Phase 3: Investigate
Systematically verify or eliminate each hypothesis.
- Read the relevant source code (trace from error location outward)
- Follow the call chain: caller → function → dependencies
- Check external library behavior with Context7 if the issue involves a framework/library
- Narrow down to the root cause with evidence:
🎯 Root cause: X confirmed. Evidence: [specific line/behavior]
Tools: Read, Grep, Glob, mcp__serena__find_symbol, mcp__context7__query-docs
Phase 4: Fix
Apply the fix with adherence checks before each edit.
For each code change:
- 🔶
think_about_task_adherence— Is this edit aligned with the identified root cause? - 📊 Describe the fix approach before editing:
📊 Fix: Change X to Y in file:line because [reason] - Apply the minimal fix (don't refactor unrelated code)
- If fix requires destructive changes → confirm with user first
Tools: Edit, Write, Bash
Phase 5: Verify
Prove the fix works with concrete evidence. No fix is complete without verification.
Standard Verification (always)
- Re-run the reproduction: Execute the same command/action from Phase 1
- Confirm the error no longer occurs
- Record the output as evidence
- Quality checks — run in parallel where possible:
pnpm lint & pnpm typecheck & pnpm test & wait - Evidence collection — at least one of:
- Console/log output showing the fix works
- Test results (new or existing tests passing)
- Screenshot of corrected behavior
- User confirmation request ("Can you verify X now works?")
If any check fails → return to Phase 3 with new evidence.
--frontend-verify (when flag is provided)
Visual verification across platforms. Auto-detect platform from package.json:
| Dependency | Platform | Preflight | Verification Tool |
|---|---|---|---|
| (default) | Web | kill-port <port> && pnpm dev |
playwright-cli (open --headed, snapshot, screenshot) |
electron |
Electron | pnpm electron:dev |
/qa-electron skill (playwright-cli attached to Electron CDP) |
expo / react-native |
Mobile | mcp__ios-simulator__open_simulator |
iOS Simulator MCP (screenshot, ui_tap, ui_swipe) |
commander / inquirer / oclif |
CLI | shell session | Shellwright MCP (TUI/CLI operation and output verification) |
Frontend Verify Workflow:
- Pre-flight knowledge: invoke
/dndto load the drag-and-drop coordinate protocol. Ref-baseddragreports false success ondnd-kitand similar libraries — required before any Web or Electron interaction. - Preflight:
kill-port <port> && pnpm dev, confirmplaywright-cliis available (Web direct; Electron viaplaywright-cli attach --cdp=http://localhost:9222) - Before screenshot: Use
playwright-clito capture the broken state (if reproducible in UI) - After fix screenshot: Use
playwright-clito capture the corrected state - Compare: Present before/after to user for confirmation
- Judge: All pass → continue. Any fail → return to Phase 4
Authentication for Frontend Verify
When verifying authenticated apps (SaaS dashboards, admin panels, OAuth-protected pages), use playwright-cli's auth persistence:
| Strategy | Command | Use Case |
|---|---|---|
state-save / state-load |
playwright-cli state-save auth.json |
Session cookies + localStorage. Best for most web apps |
--profile <dir> |
playwright-cli open <url> --profile ./browser-data |
Full Chromium user data dir. Best for complex OAuth (Google, GitHub SSO) |
OAuth Flow:
playwright-cli open <login-url> --headed(must be headed for OAuth redirects)- Complete OAuth manually or via
snapshot+fill+click playwright-cli state-save auth.jsonto persist session- Future runs:
playwright-cli state-load auth.jsonbefore navigating to app
Security:
- Add
auth.json,browser-data/to.gitignore - State files contain session secrets — treat as credentials
- Use
--headedfor initial OAuth setup (redirects require visible browser)
Completion Gate
🔶 think_about_whether_you_are_done — Is the fix verified with evidence?
Phase 6: Report
Summarize findings for the user.
- Root Cause: What was wrong and why
- Fix Applied: What was changed (files, lines)
- Evidence: Verification results (logs, screenshots, test output)
- Prevention: 💡 How to avoid this in the future (optional, only if insightful)
Examples
/troubleshoot "TypeError: Cannot read properties of undefined"
/troubleshoot build is failing after upgrading React
/troubleshoot tests pass locally but fail in CI --frontend-verify
/troubleshoot API response time doubled since last deploy
Phase Flow Diagram
[Reproduce] → 🔶 info gate
↓
[Hypothesize] → 🔶 info gate
↓
[Investigate]
↓
[Fix] → 🔶 adherence gate (per edit)
↓
[Verify] → 🔶 completion gate
↓
[Report]
Boundaries
Will:
- Systematically trace root causes with evidence-based reasoning
- Apply minimal, validated fixes with hypothesis-driven debugging
- Verify fixes with concrete evidence (logs, screenshots, test results)
- Explain the debugging process transparently with introspection markers
Will Not:
- Apply fixes without understanding the root cause
- Make speculative changes hoping something works
- Mark a fix as complete without verification evidence
- Modify production systems without explicit user confirmation