deep-fix
Structured debugging for non-obvious bugs — reproduces, isolates root cause, verifies hypothesis before fixing, and adds regression tests. Prevents the shotgun-fix pattern where agents edit randomly until tests pass. Use when stuck on a bug, facing a cryptic error, or when a previous fix attempt failed. Manual via /deep-fix.
- License 许可
- MIT
- 所属仓库
- cj-ways/arcana
- 最近更新
- 2026-04-27
- Stars
- ★ 0
- Forks
- 0
01 前言 Front Matter
- name
- deep-fix
- phase
- fix
- effort
- high
- description
- Structured debugging for non-obvious bugs — reproduces, isolates root cause, verifies hypothesis before fixing, and adds regression tests. Prevents the shotgun-fix pattern where agents edit randomly until tests pass. Use when stuck on a bug, facing a cryptic error, or when a previous fix attempt failed. Manual via /deep-fix.
- allowed-tools
- Bash, Read, Grep, Glob, Edit, Write, Agent, WebSearch
- argument-hint
- <error-message, file, or bug description>
- catalog-order
- 50
- feedback-profile
- execution
- disable-model-invocation
- true
03 SKILL.md 正文
Deep Fix — Structured Debugging
A disciplined debugging workflow that prevents the most common AI agent failure mode: looping on failed fixes without understanding the root cause. Every fix must be preceded by a verified hypothesis.
Input: $ARGUMENTS (error message, file path, bug description, or test failure)
Gotchas
- Editing code before understanding the bug. The #1 failure mode. If the fix attempt fails, the agent makes another guess, creating a loop of random edits. NEVER edit code until Step 3 (Hypothesize) produces a concrete, testable hypothesis.
- Reading the error message without reading the stack trace. The error message says WHAT failed. The stack trace says WHERE. Read the full trace — the root cause is usually 3-5 frames deep, not at the top.
- Fixing the symptom instead of the cause. Adding a null check to silence a TypeError is a patch, not a fix. Ask: WHY is this value null? Trace the data flow backward to the source.
- Not reproducing before fixing. If the bug can't be reproduced, the fix can't be verified. A fix without reproduction evidence is a guess.
- Declaring victory without a regression test. A fix that passes existing tests but adds no new test will break again. Every fix gets a test that would have caught the original bug.
Step 1: Reproduce
Establish that the bug exists and is reproducible.
- Parse the input: Extract the error message, stack trace, failing test, or behavioral description from
$ARGUMENTS - Reproduce the failure:
- If a test fails: run it —
npm test,pytest,go test, etc. - If a runtime error: identify the trigger and execute it
- If a behavioral bug: identify the minimal steps to observe it
- If a test fails: run it —
- Record the reproduction:
- Exact command that triggers the failure
- Full error output (not truncated)
- Environment details if relevant (Node version, OS, etc.)
If the bug cannot be reproduced, stop. Report: "Could not reproduce. Here is what was tried: [list]. Possible intermittent issue — check for race conditions, timing dependencies, or environment-specific factors."
If the bug is reproduced, state: "Reproduced. Trigger: [command]. Error: [one-line summary]." Proceed to Step 2.
Step 2: Isolate
Narrow down exactly where the failure occurs.
- Read the stack trace — identify the deepest application frame (skip framework/library frames)
- Read the source file at the failing line and 50 lines of surrounding context
- Trace the data flow:
- What inputs reach the failing line?
- Where do those inputs come from? (function arguments, API responses, database queries, config)
- At what point does the data become incorrect?
- Check recent changes:
git log --oneline -10 <file>andgit diff HEAD~5 <file>— did a recent change introduce this? - Check sibling context: Read the calling function, the module's imports, and any middleware/decorators
Produce an isolation statement: "The failure occurs at file:line because [variable/value] is [actual] when it should be [expected]. The incorrect value originates from [source]."
Step 3: Hypothesize
Form a concrete, testable hypothesis about the root cause.
Hypothesis format: "The bug is caused by [specific mechanism] in [specific location]. This can be verified by [specific test]."
Hypothesis quality check — reject and re-investigate if:
- The hypothesis is vague ("something is wrong with the data")
- The hypothesis blames external code without evidence ("the library must have a bug")
- The verification step is "apply the fix and see if tests pass" — that is guessing, not verifying
Common root cause patterns (check each against the evidence):
- Missing null/undefined check after a lookup that can return empty
- Async operation not awaited — data used before it's available
- Stale closure capturing an old value
- Off-by-one in loop bounds or array indexing
- Type coercion producing unexpected results
- Race condition between concurrent operations
- Config/environment difference between where it works and where it fails
- Import order or circular dependency causing undefined at load time
Step 4: Verify Hypothesis
Confirm the hypothesis is correct BEFORE writing the fix.
Verification methods (use at least one):
- Add a temporary
console.log/print/fmt.Printlnat the suspected point — does the output confirm the hypothesis? - Write a minimal failing test that isolates the exact condition the hypothesis describes
- Use
git bisectif the bug was introduced by a specific commit - Check if the same pattern exists elsewhere in the codebase — if so, does it fail there too?
If verification confirms the hypothesis: state "Hypothesis confirmed: [evidence]." Proceed to Step 5.
If verification disproves the hypothesis: state "Hypothesis disproved: [evidence]. Returning to isolation." Go back to Step 2 with the new information.
Step 5: Fix
Apply the minimal fix that addresses the root cause.
Fix principles:
- Fix the cause, not the symptom. If a value is null, fix WHY it's null — don't just add
?? defaultValue - Minimal change. Only modify what is necessary. Do not refactor, clean up, or "improve" surrounding code
- Match existing patterns. If the codebase handles similar cases with a specific pattern, use the same pattern
- Remove temporary debug code (console.log, print statements) added during verification
After applying the fix:
- Run the original reproduction command — does the error stop?
- Run the full test suite — does anything else break?
- If tests fail, the fix is wrong or incomplete. Do NOT layer another fix on top. Return to Step 3.
Step 6: Regression Test
Write a test that would have caught the original bug.
- The test must fail without the fix and pass with the fix
- The test must target the root cause, not the surface symptom
- Name the test descriptively:
"handles null response from API"not"fix bug #123" - Follow existing test patterns — detect framework, match style (same rules as generate-tests)
Run the test to confirm it passes with the fix applied.
Step 7: Report
Present the debugging results:
## Deep Fix Report
**Bug:** [one-line description]
**Root cause:** [what was actually wrong and why]
**Fix:** [what was changed, file:line references]
**Regression test:** [test name and file]
**Confidence:** high / medium (medium if hypothesis verification was indirect)
### Debug trace
1. Reproduced: [command and error]
2. Isolated to: [file:line, data flow]
3. Hypothesis: [what was suspected]
4. Verified by: [how hypothesis was confirmed]
5. Fixed: [minimal change description]
6. Tested: [test name, pass/fail status]
If the bug could not be fixed, report honestly:
- What was tried
- What was learned
- Remaining hypotheses to investigate
- Suggest
/deep-reviewif the issue may be architectural
If the fix revealed related issues, mention: "Consider running /generate-tests to cover similar patterns in the codebase."
Rules
- NEVER edit code before completing Step 3 (Hypothesize)
- NEVER declare a fix without reproduction evidence (Step 1) and a regression test (Step 6)
- NEVER layer fix attempts — if a fix doesn't work, return to hypothesis, don't add another patch
- If 3 hypotheses fail in sequence, step back and re-read the full module from scratch
- Remove all temporary debug code before reporting
- Match existing code style and test patterns
04 同仓库更多 Skills
v0-design
Generates optimized v0.dev prompts for UI design — full pages, single components, design systems, or redesigns. Analyzes the project, adapts questions to context, researches user-specified design references, and outputs ready-to-copy prompts following Vercel's three-part framework. Manual via /v0-design.
skill-scout
Scouts major skill providers for skills that match the current project — fetches catalogs, analyzes the codebase, cross-matches, and recommends with evidence. Critical assessment, not a dump of everything available. Manual via /skill-scout.
security-check
Quick security scan — hardcoded secrets, common vulnerabilities, dependency issues. Use when the user asks to check security, scan for secrets, or audit for vulnerabilities. Manual via /security-check.
release-check
Analyzes branch diff to generate deploy checklists — env vars, migrations, new services, dependencies, schema changes, breaking changes. Works across any tech stack. Manual via /release-check [source] [target].
refactor-plan
Plans and executes safe multi-file refactoring — maps dependency graph, batches changes into atomic commits, runs tests between batches. Prevents the cascading-breakage pattern where agents make sweeping changes that fail halfway. Use for renames, extractions, moves, or structural changes across multiple files. Manual via /refactor-plan.
quick-review
Fast single-pass code review with strong false-positive suppression. Reviews git diff for runtime errors, data corruption, security breaches, operational incidents. Use for PR reviews and quick change validation. Manual via /quick-review.