/bugfix — Guided Bug-Fix Workflow
Guard rail for the #1 bug-fix failure: fixing before a failing test exists.
This skill walks workflow-bugfix.md (the
single source of truth) and adds one hard, non-skippable gate — Phase 3 must
produce a test that fails on the current code before any fix is written.
Why this exists: the rule alone was repeatedly skipped. This skill makes the
order explicit and the gate blocking. Read workflow-bugfix.md for the full
rationale; this file is the executable checklist.
The non-negotiable sequence
Reproduce → Root-Cause Analysis → FAILING TEST → Fix → Verify → Review → Commit
Each phase finishes before the next starts. The only way past Phase 3 is a
test that you have run and watched fail for the right reason.
Phase 1 — Reproduce (no guessing)
- State the exact wrong behavior: command, input, observed vs expected.
- Find the surface: which entry point(s)? CLI command, TUI path, library seam?
A bug often lives on more than one surface (e.g. a CLI path AND its TUI twin);
list every one that shares the broken code.
- Confirm it actually reproduces. If you can't reproduce it, keep digging —
no speculative fixes.
Write a one-line repro: "<cmd/inputs> → <observed>; expected <expected>".
Phase 2 — Root-Cause Analysis (write it down)
Trace the symptom to the line and the condition that made it fire.
Output a root-cause statement in this exact shape — no "error on line N":
X happens because Y, introduced by/located at Z.
Single bug or a pattern? Grep for the same defect elsewhere (sibling call
sites, the other surface from Phase 1). If it's a pattern, the fix covers all
instances.
If the real cause needs an architectural change, stop and escalate to the
feature workflow with a plan artifact — don't paper over it.
Phase 3 — Failing test FIRST 🚧 GATE
Do not edit any production code until this phase is done.
- Write the test that exercises the Phase-1 repro and targets the Phase-2 root
cause (not just the symptom).
- Acceptance-level →
test/tests/test_*.py (real binary + registry).
- Unit-level → inline
#[cfg(test)] in the affected module.
- Run it. Paste the red output. It must fail, and fail for the bug's
reason (assertion on the wrong behavior) — not a compile error, typo, or
missing fixture.
- If an existing test encodes the buggy behavior (it asserts the wrong
thing the user is now reporting), that test is part of the bug — note it; it
will be corrected in the fix, with the reason recorded.
Gate to pass Phase 3 — all three true:
If you cannot make a test fail, you have not reproduced or understood the bug —
return to Phase 1/2. Skipping this gate is the failure mode this skill prevents.
Phase 4 — Fix (minimal, root-cause)
- Smallest change that addresses the Phase-2 cause. No drive-by refactor, no
"while I'm here" cleanup (separate commit, separate type).
- Fix every instance the Phase-2 pattern search found.
- Correct any existing test that encoded the wrong behavior — state why in the
diff/commit (user intent / corrected contract supersedes the old assumption).
Phase 5 — Verify (evidence, not vibes)
- The Phase-3 test now passes (show it).
- Run the subsystem gate for the changed area (e.g.
task rust:verify),
then cache-bust + re-run unit tests if Rust (touch the edited files so a
stale cache can't mask a failure).
- Manually confirm the Phase-1 repro no longer reproduces.
- Final gate before commit:
task --force verify (fmt + clippy + build + unit +
acceptance). Verify it yourself — do not trust "should pass".
Phase 6 — Review-Fix Loop (+ optional Codex)
Apply the canonical Review-Fix Loop from workflow-bugfix.md (correctness vs
root cause, regression risk to other callers, minimality, test adequacy). For a
non-trivial fix, run one Codex adversarial pass over the diff as the cross-model
gate; fix real findings, re-verify, then converge.
Phase 7 — Commit
fix: conventional commit; body names the root cause and the regression test.
- Reference the issue (
fixes #N) when one exists.
- Never push — the human decides (see
workflow-git.md).
Anti-rationalizations (stop if you think these)
| Thought |
Reality |
Do this |
| "I know the cause, I'll just fix it." |
No Phase-2 statement written. |
Write the root-cause line first. |
| "The test is trivial, I'll add it after." |
A test added after the fix never proved it caught the bug. |
Write it first, watch it fail. |
| "Existing tests cover this area." |
They may encode the buggy behavior. |
Add a test for the exact broken path. |
| "Clippy/format nit nearby, I'll fix too." |
Scope creep. |
Separate chore:/refactor: commit. |
References
1---2name: bugfix3description: Use when a bug is reported, something is broken, an error or crash needs fixing, a wrong output appears, or a regression shows up — guides Grimoire's Reproduce → Root-Cause → failing-test-FIRST → Fix → Verify discipline and will not let the fix begin until a failing regression test is recorded. Use also when the user says "bugfix", "/bugfix", "fix this bug", or "something is broken".4---56# /bugfix — Guided Bug-Fix Workflow78Guard rail for the #1 bug-fix failure: **fixing before a failing test exists.**9This skill walks [`workflow-bugfix.md`](../../rules/workflow-bugfix.md) (the10single source of truth) and adds one hard, non-skippable gate — **Phase 3 must11produce a test that fails on the current code before any fix is written.**1213> Why this exists: the rule alone was repeatedly skipped. This skill makes the14> order explicit and the gate blocking. Read `workflow-bugfix.md` for the full15> rationale; this file is the executable checklist.1617## The non-negotiable sequence1819```20Reproduce → Root-Cause Analysis → FAILING TEST → Fix → Verify → Review → Commit21```2223Each phase finishes before the next starts. The **only** way past Phase 3 is a24test that you have **run** and **watched fail** for the right reason.2526## Phase 1 — Reproduce (no guessing)2728- State the exact wrong behavior: command, input, observed vs expected.29- Find the surface: which entry point(s)? CLI command, TUI path, library seam?30 A bug often lives on more than one surface (e.g. a CLI path AND its TUI twin);31 list every one that shares the broken code.32- Confirm it actually reproduces. If you can't reproduce it, keep digging —33 **no speculative fixes.**3435Write a one-line repro: `"<cmd/inputs> → <observed>; expected <expected>"`.3637## Phase 2 — Root-Cause Analysis (write it down)3839- Trace the symptom to the line **and** the condition that made it fire.40- Output a root-cause statement in this exact shape — no "error on line N":4142 > **X happens because Y, introduced by/located at Z.**4344- Single bug or a pattern? Grep for the same defect elsewhere (sibling call45 sites, the other surface from Phase 1). If it's a pattern, the fix covers all46 instances.47- If the real cause needs an architectural change, stop and escalate to the48 feature workflow with a plan artifact — don't paper over it.4950## Phase 3 — Failing test FIRST 🚧 GATE5152**Do not edit any production code until this phase is done.**53541. Write the test that exercises the Phase-1 repro and targets the Phase-2 root55 cause (not just the symptom).56 - Acceptance-level → `test/tests/test_*.py` (real binary + registry).57 - Unit-level → inline `#[cfg(test)]` in the affected module.582. **Run it. Paste the red output.** It must fail, and fail for the *bug's*59 reason (assertion on the wrong behavior) — not a compile error, typo, or60 missing fixture.613. If an **existing** test encodes the buggy behavior (it asserts the wrong62 thing the user is now reporting), that test is part of the bug — note it; it63 will be corrected in the fix, with the reason recorded.6465**Gate to pass Phase 3 — all three true:**66- [ ] A test exists that exercises the repro.67- [ ] You ran it and it **failed** (output shown).68- [ ] The failure is the bug, not test scaffolding.6970If you cannot make a test fail, you have not reproduced or understood the bug —71return to Phase 1/2. Skipping this gate is the failure mode this skill prevents.7273## Phase 4 — Fix (minimal, root-cause)7475- Smallest change that addresses the Phase-2 cause. No drive-by refactor, no76 "while I'm here" cleanup (separate commit, separate type).77- Fix **every** instance the Phase-2 pattern search found.78- Correct any existing test that encoded the wrong behavior — state *why* in the79 diff/commit (user intent / corrected contract supersedes the old assumption).8081## Phase 5 — Verify (evidence, not vibes)8283- The Phase-3 test now **passes** (show it).84- Run the **subsystem** gate for the changed area (e.g. `task rust:verify`),85 then cache-bust + re-run unit tests if Rust (`touch` the edited files so a86 stale cache can't mask a failure).87- Manually confirm the Phase-1 repro no longer reproduces.88- Final gate before commit: `task --force verify` (fmt + clippy + build + unit +89 acceptance). Verify it yourself — do not trust "should pass".9091## Phase 6 — Review-Fix Loop (+ optional Codex)9293Apply the canonical Review-Fix Loop from `workflow-bugfix.md` (correctness vs94root cause, regression risk to other callers, minimality, test adequacy). For a95non-trivial fix, run one Codex adversarial pass over the diff as the cross-model96gate; fix real findings, re-verify, then converge.9798## Phase 7 — Commit99100- `fix:` conventional commit; body names the root cause and the regression test.101- Reference the issue (`fixes #N`) when one exists.102- Never push — the human decides (see [`workflow-git.md`](../../rules/workflow-git.md)).103104## Anti-rationalizations (stop if you think these)105106| Thought | Reality | Do this |107|---|---|---|108| "I know the cause, I'll just fix it." | No Phase-2 statement written. | Write the root-cause line first. |109| "The test is trivial, I'll add it after." | A test added after the fix never proved it caught the bug. | Write it first, watch it fail. |110| "Existing tests cover this area." | They may encode the *buggy* behavior. | Add a test for the *exact* broken path. |111| "Clippy/format nit nearby, I'll fix too." | Scope creep. | Separate `chore:`/`refactor:` commit. |112113## References114115- [`workflow-bugfix.md`](../../rules/workflow-bugfix.md) — full workflow + gates (source of truth)116- [`workflow-intent.md`](../../rules/workflow-intent.md) — work-type routing117- [`quality-core.md`](../../rules/quality-core.md) — verification honesty, review checklist118- [`workflow-git.md`](../../rules/workflow-git.md) — `fix:` commits, never push