Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/rijkvanzanten-debug
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: testing
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/debug
What's inside
- Skill name
debug- Description
- Systematically find root causes and fix bugs. Use when debugging errors, investigating test failures, reproducing bugs from issue trackers (GitHub, Linear, Jira), or when stuck on a problem after failed fix attempts. Also use when the user says 'debug this', 'why is this failing', 'fix this bug', 'trace this error', or pastes stack traces, error messages, or issue references.
- License
- MIT
- Instructions
- 242 lines in SKILL.md · view on GitHub
Files (5)
- SKILL.md
- openai.yaml · agents/
- anti-patterns.md · references/
- defense-in-depth.md · references/
- investigation-techniques.md · references/
SKILL.md (first lines)
# Debug and Fix
Find root causes, then fix them. This skill investigates bugs systematically — tracing the full causal chain before proposing a fix — and optionally implements the fix with test-first discipline.
<bug_description> #$ARGUMENTS </bug_description>
## Core Principles
1. **Investigate before fixing.** Do not propose a fix until you can explain the full causal chain from trigger to symptom with no gaps. "Somehow X leads to Y" is a gap.
2. **Predictions for uncertain links.** When the causal chain has uncertain or non-obvious links, form a prediction — something in a different code path or scenario that must also be true. If the prediction is wrong but a fix "works," you found a symptom, not the cause. When the chain is obvious (missing import, clear null reference), the chain explanation itself is sufficient.
3. **One change at a time.** Test one hypothesis, change one thing. If you're changing multiple things to "see if it helps," stop — that is shotgun debugging.
4. **When stuck, diagnose why — don't just try harder.**
## Execution Flow
| Phase | Name | Purpose |
|-------|------|---------|
| 0 | Triage | Parse input, fetch issue if referenced, proceed to investigation |
| 1 | Investigate | Reproduce the bug, trace the code path |
| 2 | Root Cause | Form hypotheses with predictions for uncertain links, test them, **causal chain gate**, smart escalation |
| 3 | Fix | Only if user chose to fix. Test-first fix with workspace safety checks |
| 4 | Handoff | Structured summary, then prompt the user for the next action |
Beyond the trivial-bug fast-path in Phase 0, no further phase skipping — complex bugs simply spend more time in each phase naturally. No further complexity tiers.
---
### Phase 0: Triage
Parse the input and reach a clear problem statement.
**If the input references an issue tracker**, fetch it:
- GitHub (`#123`, `org/repo#123`, github.com URL): Parse the issue reference from `<bug_description>` and fetch with `gh issue view <number> --json title,body,comments,labels`. For URLs, pass the URL directly to `gh`.
- Other trackers (Linear URL/ID, Jira URL/key, any tracker URL): Attempt to fetch using available MCP tools or by fetching the URL content. If the fetch fails — auth, missing tool, non-public page — ask the user to paste the relevant issue content. Ensure the fetch includes the full comment thread, not just the opening description.
Read the full conversation — the original description AND every comment, with particular attention to the latest ones. Comments frequently contain updated reproduction steps, narrowed scope, prior failed attempts, additional stack traces, or a pivot to a different suspected root cause; treating the opening post as the whole picture often sends the investigation in the wrong direction. Extract reported symptoms, expected behavior, reproduction steps, and environment details from the combined thread. Then proceed to Phase 1.
**Everything else** (stack traces, test paths, error messages, descriptions of broken behavior): the problem statement is the input itself.
**Trivial-bug fast-path:** Once the problem is clear, decide whether the framework is needed at all. If the cause is immediately readable from the input (single-file typo, missing import, obvious null deref or off-by-one with a one-line fix) and verification doesn't require deep tracing, present the cause and the proposed one-line fix and run Phase 2's **Fix it now / Diagnosis only** user-choice gate before editing — the fast-path saves investigation ceremony, not the user's choice over whether to apply a fix. If the user picks fix, run Phase 3's **Workspace and branch check** (uncommitted-work confirmation and default-branch branch-creation prompt), apply the fix, leave a one-line note explaining the cause, and skip to Phase 4's structured summary. If diagnosis only, write the summary and stop. When in doubt, run the full framework; getting the wrong root cause costs more than the few minutes of ceremony.
**Otherwise**, proceed to Phase 1.
**Questions:**
- Do not ask questions by default — investigate first (read code, run tests, trace errors)
- Only ask when a genuine ambiguity blocks investigation and cannot be resolved by reading code or running tests
- When asking, ask one specific question
**Prior-attempt awareness:** If the user indicates prior failed attempts ("I've been trying", "keeps failing", "stuck"), ask what they have already tried before investigating. This avoids repeating failed approaches and is one of the few cases where asking first is the right call.
---
### Phase 1: Investigate
#### 1.1 Reproduce the bug
Confirm the bug exists and understand its behavior. Run the test, trigger the error, follow reported reproduction steps — whatever matches the input.
- **Browser bugs:** Prefer the active Codex Browser/browser-use tools when available. Otherwise use whatever works — browser MCP tools, Playwright, direct URL testing, screenshot capture, etc.
- **Manual setup required:** If reproduction needs specific conditions the agent cannot create alone (data states, user roles, external services, environment config), document the exact setup steps and guide the user through them. Clear step-by-step instructions save significant time even when the process is fully manual.
- **Does not reproduce after 2-3 attempts:** Read `references/investigation-techniques.md` for intermittent-bug techniques.
- **Cannot reproduce at all in this environment:** Document what was tried and what conditions appear to be missing.
- **Writing the reproduction test:** If the project has testing-conventions guidance — a dedicated testing skill, an `AGENTS.md`/`CLAUDE.md` testing section, or a clear style across existing tests — apply it when authoring the failing test. Otherwise write a minimal isolated test that fails on the current bug and passes once the corrected behavior lands; name it descriptively so the failure message itself explains the bug.
#### 1.2 Verify environment sanity
Before deep code tracing, confirm the environment is what you think it is:
- Correct branch checked out; no unintended uncommitted changes
- Dependencies installed and up to date (`bun install`, `npm install`, `bundle install`, etc.) — stale `node_modules`/`vendor` is a frequent false lead
- Expected interpreter or runtime version (check `.tool-versions`, `.nvmrc`, `Gemfile`, etc. against what's actually active)
- Required env vars present and non-empty
- No stale build artifacts (`dist/`, `.next/`, compiled binaries from an earlier branch)
- Dependent local services (database, cache, queue) running at expected versions *when the bug plausibly involves them*
#### 1.3 Trace the code path
Trace data flow backward from the symptom to where valid state first became invalid. Read code-shape to form a hypothesis, then verify with observed values — do not theorize from code alone.
Concrete recipe:
1. Read the stack trace bottom-to-top, opening each frame's source. The bottom frame is the symptom; the root cause is somewhere upstream.
2. Identify the first frame where the input data is already invalid — that's the upper bound on where to look.
3. Instrument the boundaries around that frame: targeted log/print statements, debugger breakpoints, or test assertions that capture *actual* values at function entry/exit. Assumed values lie; observed values don't.
4. Walk the boundaries until valid input becomes invalid output. That transition is the root cause site.
Do not stop at the first function that looks wrong — the root cause is where bad state originates, not where it is first observed.
As you trace:
- Check recent changes in files you are reading: `git log --oneline -10 -- [file]`
- If the bug looks like a regression ("it worked before"), use `git bisect` (see `references/investigation-techniques.md`)
- Check the project's observability tools for additional evidence:
- Error trackers (Sentry, AppSignal, Datadog, BetterStack, Bugsnag)
- Application logs
- Browser console output
- Database state
- Each project has different systems available; use whatever gives a more complete picture
---
### Phase 2: Root Cause
*Reminder: investigate before fixing. Do not propose a fix until you can explain the full causal chain from trigger to symptom with no gaps.*
Read `references/anti-patterns.md` before forming hypotheses. As a load-time preview of the rationalizations it covers, stop and re-examine if the internal monologue contains any of these:
- "Quick fix for now, investigate later"
- "This should work" (without a tested prediction)
- "Let me just try..." (without a hypothesis)
These phrases mark mode-drift toward symptom patches, not progress on the root cause. ("One more attempt" after a failed fix and "works on my machine" are covered at the points they fire — Phase 3's invalidation step and the Smart Escalation table below.)
**Assumption audit (before hypothesis formation):** List the concrete "this must be true" beliefs your understanding depends on — the framework behaves as expected here, this function returns what its name implies, the config loads before this runs, the caller passes a non-null value, the database is in the state the test implies. For each, mark *verified* (you read the code, checked state, or ran it) or *assumed*. Assumptions are the most common source of stuck debugging. Many "wrong hypotheses" are actually correct hypotheses tested against a wrong assumption.
**Form hypotheses** ranked by likelihood. For each, state:
- What is wrong and where (file:line)
- **At least one concrete observation that supports it** — a runtime variable value, a log line, an instrumented boundary capture, a behavior delta against a working comparison case, or a specific code reference. "X seems off" is not evidence; "X equals null at line 42 because Y was never initialized in the constructor path that runs under condition Z" is. Hypotheses without grounding observations are theorizing — go back to Phase 1 and instrument.
- The causal chain: how the trigger leads to the observed symptom, step by step
- **For uncertain links in the chain**: a prediction — something in a different code path or scenario that must also be true if this link is correctFrom rijkvanzanten/rolling-wave-engineering, MIT.
More from rijkvanzanten/rolling-wave-engineering
- 0.601score
grill-me
rijkvanzanten
Pressure-test an existing plan or design artifact until it is coherent enough for the next workflow step or plainly blocked.
SkillBFreshness: B★ 13Claude Code +9 - 0.601score
implement-slice
rijkvanzanten
Implement a ready rolling-wave slice without locking it down with broad tests yet.
SkillBFreshness: B★ 13Claude Code +9 - 0.601score
finalize-slice
rijkvanzanten
Finalize an implemented rolling-wave slice for user review.
SkillBFreshness: B★ 13Claude Code +9 - 0.596score
exec-summary
rijkvanzanten
Produce a short executive summary for the current rolling-wave project.
SkillBFreshness: B★ 13Claude Code +9 - 0.596score
shape-project
rijkvanzanten
Shape or update a rolling-wave engineering project before slice preparation.
SkillBFreshness: B★ 13Claude Code +9 - 0.596score
prepare-next-slice
rijkvanzanten
Prepare and risk-check the next rolling-wave slice for implementation.
SkillBFreshness: B★ 13Claude Code +9 - 0.596score
complete-slice
rijkvanzanten
Mark a rolling-wave slice done on explicit user authority, regardless of its current lifecycle status or missing implementation, finalization, review…
SkillBFreshness: B★ 13Claude Code +9 - 0.596score
deliver-slice
rijkvanzanten
Implement and finalize one ready rolling-wave slice in one invocation while preserving the lifecycle boundary between implementation and independent review.
SkillBFreshness: B★ 13Claude Code +9 - 0.593score
rolling-wave-common
rijkvanzanten
Shared support references for the rolling-wave engineering skill set.
SkillBFreshness: B★ 13Claude Code +9 - 0.546score
code-simplify
rijkvanzanten
Review changed code for YAGNI, removable over-complexity, reuse, code quality, and efficiency, then apply worthwhile simplifications.
SkillCFreshness: C★ 13Claude Code +9 - 0.546score
pr-description
rijkvanzanten
Draft a pull request description from the current branch diff plus rolling-wave project context.
SkillCFreshness: C★ 13Claude Code +9 - 0.546score
code-review
rijkvanzanten
Review local git changes before opening a PR or merging.
SkillCFreshness: C★ 13Claude Code +9
Signals
- Stars
- 13
- Forks
- 0
- Open issues
- 1
- Last commit (this folder)
- May 13, 2026 (5 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from rijkvanzanten
- 0.601score
grill-me
rijkvanzanten
Pressure-test an existing plan or design artifact until it is coherent enough for the next workflow step or plainly blocked.
SkillBFreshness: B★ 13Claude Code +9 - 0.601score
implement-slice
rijkvanzanten
Implement a ready rolling-wave slice without locking it down with broad tests yet.
SkillBFreshness: B★ 13Claude Code +9 - 0.601score
finalize-slice
rijkvanzanten
Finalize an implemented rolling-wave slice for user review.
SkillBFreshness: B★ 13Claude Code +9 - 0.596score
exec-summary
rijkvanzanten
Produce a short executive summary for the current rolling-wave project.
SkillBFreshness: B★ 13Claude Code +9 - 0.596score
shape-project
rijkvanzanten
Shape or update a rolling-wave engineering project before slice preparation.
SkillBFreshness: B★ 13Claude Code +9 - 0.596score
prepare-next-slice
rijkvanzanten
Prepare and risk-check the next rolling-wave slice for implementation.
SkillBFreshness: B★ 13Claude Code +9
Cite this page
debug skill. Agent Mart. https://agentmart.dev/skills/rijkvanzanten-debug (last updated 2026-10-24)