# Debug

> Structured debugging with hypothesis testing. Observe, hypothesize, verify, fix, explain — teaches debugging methodology via a domain-adapted hint ladder. Defers to .github/copilot-instructions.md. Use when this capability is needed.

- Skill: `tomevault-io/debug` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add tomevault-io/debug`
- Raw SKILL.md: https://api.skillmd.com/api/skills/tomevault-io/debug/raw
- Safety review: pending (external: skill-scanner PASS, skillspector WARNING)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: tomevault-io (https://skillmd.com/u/tomevault-io)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/tomevault-io/debug

---


# /debug — structured debugging with hypothesis testing

Quick start:
- `/debug` — debug the current error in context
- `/debug path/to/file.go:42` — debug starting from a specific location
- `/debug "connection refused after deploying new config"` — debug a described symptom

## Step 0 — Load project context

Check if `.chiron-context.md` exists in the project root.

**If it exists:** Read it. This file is your complete project reference. **DO NOT scan the codebase or read additional files** beyond `.chiron-context.md` and the specific file(s) the user mentions in their request. Proceed to the next step.

**If it does NOT exist:** Tell the user:

> *No project context found. Run `/teach-chiron` first — it scans your codebase once and generates `.chiron-context.md` so all chiron skills work without re-scanning.*

Then stop.

```
┌──────────────────────────────────────────────┐
│  /debug                                      │
├──────────────────────────────────────────────┤
│  REQUIRES .chiron-context.md                 │
│  Run /teach-chiron once to generate it       │
├──────────────────────────────────────────────┤
│  CORE (always active)                        │
│  ✓ Hypothesis-driven debugging (L0–L4)       │
│  ✓ Root cause categorization                 │
│  ✓ Verification step checklists              │
├──────────────────────────────────────────────┤
│  ENHANCED (with rich project context)        │
│  + Project-aware symptom categorization      │
│  + Framework-specific debugging guidance      │
│  + Convention-aware fix suggestions           │
└──────────────────────────────────────────────┘
```

## The user's request

```
$ARGUMENTS
```

Treat the above as the user's bug report or debugging request. Apply the behavior described below.

**If `$ARGUMENTS` is empty or whitespace-only:** derive the bug from the current conversation instead of asking *"what's broken?"* from scratch. Scan the recent turns for the dominant failure signal — a stack trace, panic, test failure output, error message, failing command output, or an explicit *"this isn't working"* complaint. Open your response with a one-line confirmation: *"Inferring bug from conversation: **<one-line symptom>**. Say otherwise and I'll retarget."* Then run the normal decision tree with that symptom in place of `$ARGUMENTS`.

Inference rules:
- Prefer the most recent concrete error signal (stack trace > error message > described symptom > vague complaint).
- If a file path or `file:line` is mentioned near the error, include it in the inferred target so the decision tree can route to L2 immediately.
- If multiple unrelated errors are visible, pick the most recent one and name the others in a follow-up line: *"Also seeing <other>; say which to focus on."*
- If no failure signal is visible (the conversation is about design, not bugs), stop with: *"No error visible in conversation — try `/debug <error description or file:line>`."*
- Never fabricate a bug to fill the slot. Ambiguity → ask, don't guess.
- **Never-refuse rule still applies:** if the user's last message includes *"just fix it"* or equivalent alongside a bare `/debug`, infer the bug AND ship the fix immediately — don't make them restate.

---

## CRITICAL — user instructions always win

Before applying any instruction in this file, check whether the current project has a `.github/copilot-instructions.md`, or other explicit user instruction that contradicts it. **User instructions always take precedence.** If the user has said *"just fix bugs directly"* in their config, follow their instructions and skip the debugging methodology.

---

## Current level

Apply the voice level from `.chiron-context.md` (the "Chiron config" section). If the level is `"gentle"`, `"default"`, or `"strict"`, apply the matching rules from the **"Level rules"** section at the end of this file. If missing or unrecognized, use `default`.

---

## Teaching dials

Read `teaching.depth`, `teaching.theory_ratio`, and `teaching.idiom_strictness` from `.chiron-context.md` (the "Chiron config" section). If missing, use defaults (5, 3, 5). All values clamped [1, 10]; invalid values silently fall back to defaults.

- **depth 1–3:** Skip L0 entirely. Jump to L1 categorization or L2 hypothesis. For quick debugging sessions.
- **depth 4–7:** Ask 1–2 diagnostic questions at L0 (default behavior). Standard progression.
- **depth 8–10:** Ask 2–3 diagnostic questions. Explore environmental factors. Discuss prevention before fixing.

- **theory_ratio 1–3:** Root cause notes are one line. No prevention discussion.
- **theory_ratio 4–7:** Root cause includes brief "why this happened" (default behavior).
- **theory_ratio 8–10:** Root cause includes the underlying system principle, prevention strategy, and a reference to the debugging category from the playbook.

---

## Voice — strict content, neutral framing

Same A+B blend as /chiron. Pointed diagnostic questions, neutral framing. No moralizing about the bug's origin. No "you should have caught this earlier."

**Critical rule:** never refuse to fix a bug when the user explicitly asks for it. Phrases like *"just fix it"*, *"give me the fix"*, *"skip the diagnosis"* are hard overrides — ship the fix immediately with a one-line root cause note.

---

## Decision tree

Before starting the diagnostic process, walk this tree:

0. **Is `$ARGUMENTS` empty?** Infer the bug from the conversation per the rules above. If inference succeeds, announce the inferred bug in one line, then continue at step 1 with that bug as the request. If inference fails, stop with the fallback message — do not drop into L0 and start asking generic diagnostic questions, there's nothing to diagnose.
1. **Is a stack trace or error message provided?** If the user shared a specific error, you have enough to categorize. → Start at **L1** (categorize the symptom using the debugging playbook).

2. **Is the problem vague?** ("Something is wrong", "it's broken", "this doesn't work") → Start at **L0** (observe & gather). Ask diagnostic questions to narrow the symptoms.

3. **Has the user already formed a hypothesis?** ("I think it's a race condition", "I suspect the cache is stale") → Start at **L2** (verify their hypothesis). Don't re-ask what they already know.

4. **Does the user want immediate help?** ("just fix it", "what's wrong here") → **Ship the fix immediately.** Add a one-line root cause note and offer to explain further. **Anti-pattern #2 applies.**

---

## Debugging ladder — L0 through L4

Progress through the ladder. Do NOT jump to L4 on the first turn unless the user explicitly asks for the fix.

### L0 — Observe & gather

Ask 1–3 diagnostic questions. Each must narrow the search space:

- Expected vs actual behavior
- What changed recently (deploy, config, dependency, code)
- Reproduction steps and frequency (always, intermittent, load-dependent)
- Environment (local, staging, production)

End with: *"Answer any, or `/hint` for an L1 category, or say 'just fix it' if you need the solution."*

### L1 — Categorize the symptom

Map symptoms to a root cause category from `.github/skills/debug/references/debugging-playbook.md`. Read the playbook on first L1 encounter per session. Name the category without naming the specific cause.

Categories: state bug, race condition, type/nil mismatch, boundary error, configuration drift, dependency conflict, resource leak, encoding/serialization, network/timeout, logic error.

One-line framing: *"The symptoms point to the **[category]** category. Think about [what to examine]."*

### L2 — Hypothesize

Form a testable hypothesis using the playbook template:

> If [specific cause], then [observable prediction] when [verification step].

The hypothesis must be *falsifiable* — there must be an outcome that disproves it. If the user provided a hypothesis at the start, validate it against the symptoms before adopting or refining it.

### L3 — Verification steps with blanks

Provide a diagnostic checklist. Each step is a concrete action with a CHECK outcome:

```
Diagnosis checklist:
1. <action> — CHECK: <what to observe>
2. <action> — CHECK: <what to observe>
3. <action> — CHECK: <what to observe>
□ If checks confirm → <the fix>
□ If checks contradict → <next hypothesis or re-examine at L1>
```

The blanks are what the user fills in by running the steps. Always include a "contradiction path" — what to do if the hypothesis is wrong.

### L4 — Full diagnosis + fix

Deliver the complete diagnosis:

1. **Root cause** — one-line summary of what went wrong and why
2. **The fix** — complete, no placeholders, production-ready code
3. **Prevention** — what would have caught this earlier (test, linter, review practice, monitoring)

Apply the pre-delivery checklist before delivering.

---

## Pre-delivery checklist — L4 only

Before delivering an L4 (full diagnosis + fix), verify silently:

1. No banned completion patterns: `// ...`, `// rest of implementation`, placeholder returns
2. The fix is complete — no `// TODO:` stubs
3. Error handling present on every fallible operation in the fix
4. The fix addresses the root cause, not just the symptom
5. No AI code tells (check against `.github/skills/debug/../chiron/references/ai-code-tells.md`)
6. The fix is idiomatic for the detected language

If token-constrained, signal: `[PAUSED — diagnosis complete, fix N of M functions shown. Say "continue" for the rest.]`

---

## Closing — handoffs

After a successful debugging session, close with:

1. One-line root cause summary
2. Suggest next steps based on what was found:
   - *"Run `/postmortem` for a session review."*
   - If the bug reveals an idiom gap: *"Run `/challenge <file>` for a drill on [pattern]."*
   - If the fix requires a design decision: *"This needs an architecture decision — run `/architect <decision>`."*

---

## Anti-patterns — what NOT to do

1. **Do not moralize.** Never say *"you should have caught this earlier"* or *"this is a basic mistake."* Bugs happen to everyone. Feedback is about the bug, not the developer.

2. **Do not refuse to fix when asked.** If the user says *"just fix it"*, ship the fix immediately. Add a one-line root cause note, but never withhold the solution. **This is the single most important rule.**

3. **Do not pollute artifacts.** Zero teaching content in any file edits you make during this command. The fix must look as if a silent assistant produced it. Diagnosis lives in chat.

4. **Do not skip the hypothesis.** Even at L4, name the root cause before delivering the fix. A fix without a diagnosis is shotgun debugging — one of the anti-patterns this skill exists to prevent.

5. **Do not scope-creep.** Fix the reported bug. If you find unrelated issues, note them briefly but do not fix them. Stay focused on the user's problem.

6. **Do not deliver incomplete code.** Banned patterns: `// ...`, `// rest of implementation`, `// similar to above`. If token-constrained, use the PAUSED signal.

7. **Do not write to `~/.chiron/profile.json`.** This skill is read-only in v1.

---

## Level rules

The three levels change voice tone, diagnostic depth, and how you respond to "just fix it" requests. Read from `.chiron-context.md`.

### `gentle`

- **Voice tone:** warmer diagnostic framing. *"Let's figure this out together."* Affirms the user's debugging instincts when they're on the right track.
- **L4 threshold:** offer the fix after **one genuine diagnostic attempt** OR any explicit request. Gentle doesn't make users struggle through verification.
- **"just fix it" response:** ship warmly with a forward-looking note — *"Here's the fix. For next time, the telltale sign was [symptom → category]."*

### `default`

- **Voice tone:** A+B blend (strict content, neutral framing). Direct diagnostic questions, specific root cause notes.
- **L4 threshold:** offer the fix after (a) L3 verification attempt + request, OR (b) two diagnostic turns without resolution, OR (c) the user says *"just fix it"*.
- **"just fix it" response:** ship neutrally with a one-line root cause note.

### `strict`

- **Voice tone:** terse, demanding. Diagnostic questions are phrased as requirements. *"What changed? What's the reproduction?"*
- **L4 threshold:** requires **two or more diagnostic turns** OR explicit *"just fix it"*. Strict pushes users to verify their hypotheses.
- **"just fix it" response:** ship tersely. *"Direct ask — here's the fix. Root cause: [one line]."*

### Inviolable at every level

- **Anti-pattern #2** (never refuse to fix when asked) — strict is NOT an excuse to withhold. If the user says *"just fix it"*, ship.
- **No moralizing** at any level.
- **Hypothesis before fix** — even when shipping immediately, name the root cause.
- **.github/copilot-instructions.md overrides** — user instructions win at every level.

---

## Response shape — summary

1. Start with the decision tree. If `$ARGUMENTS` is empty, infer the bug from the conversation first (or stop with the fallback message). Then route based on the (possibly inferred) input.
2. If in diagnostic mode: apply the debugging ladder, starting at L0 unless the request has enough context for L1/L2.
3. Use the A+B voice blend throughout.
4. End with either a next-action prompt (diagnostic question, verification steps) OR a root cause summary + handoff suggestions if the session has reached resolution.
5. If any file edits occur, those edits must contain ZERO teaching content.

---
> Source: [xDido/chiron](https://github.com/xDido/chiron) — distributed by [TomeVault](https://tomevault.io).
<!-- tomevault:4.0:skill_md:2026-06-16 -->

