Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use during root-cause investigation of any bug in a project that has graphify-out/graph.json — surfaces related code before grepping, flags likely duplicates of existing KNOWN_ISSUES.md entries before filing a new one, and when a match lands on a resolved entry surfaces its recorded fix so a known-good fix can be reused. No-op in any project without a built graph.
.claude/skills/ccplugins-graphify-recurring-bugs/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 56% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -35% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 193% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 14% | 0% |
A stack trace shows where a bug surfaced, not everywhere its root cause reaches. Grepping around the crash site misses related call sites that share the same underlying problem — which is exactly how the same root cause gets logged as three unrelated "new" bugs over time. graphify already builds a queryable structural map of a codebase; this skill puts that map to work specifically during bug investigation, not just general code Q&A.
Core principle: a recurring bug should be recognized as recurring — and its known-good fix reused — not re-discovered as new. graphify is the linker that recalls the past occurrence; KNOWN_ISSUES.md is where the fix that worked is actually recorded.
Check for graphify-out/graph.json at the project root before doing anything else in this skill.
(that's a real side effect — leave it to /craftsman:init's ask-first note, or to the user deciding to run graphify . themselves). Proceed with normal root-cause investigation.
This slots into the evidence-gathering step of root-cause investigation (Phase 1 of the superpowers systematic-debugging skill, where that plugin is installed) — run this before falling back to raw grep:
graphify query "<symptom or affected function/file>" — get a scoped subgraph of related code.This is both cheaper in tokens than grepping the whole codebase and more thorough than reading only the stack trace, since it surfaces callers/dependents that share the same code path.
treat them as suspects too — a bug in a shared helper usually isn't confined to the one call site that happened to trigger it first.
Don't file blind. For each existing entry in the project's KNOWN_ISSUES.md — open and resolved — check for a structural link:
graphify path "<new bug's file/symbol>" "<existing entry's file/symbol>" — a short path(direct call, shared callee, same module) is a signal the new bug may be the same root cause resurfacing at a different call site.
<date> — same root cause via <path>, not a new issue." Let the user or the fix decide whether to merge, not an automatic merge — this is a heuristic signal, not a certainty.
known-good fix for this recurrence — surface it and reuse it rather than re-deriving the fix from scratch. (graphify recalls which past issue is relevant; the fix text itself lives in KNOWN_ISSUES.md, not the graph.)
Run graphify update . (incremental, AST-only extraction — no LLM cost) so the graph reflects the fix for the next investigation. This mirrors the same rule some projects already keep in their own CLAUDE.md; this skill makes it apply everywhere a graph exists, not just one project.
user action (graphify <path>), never triggered implicitly by a bug investigation.
not a substitute for establishing the cause before fixing.
KNOWN_ISSUES.md entries — it only surfaces a possiblerelationship for a human (or the coder agent, with the user's judgment) to confirm.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 5,491 | 7,623 | +39% | 1 | 1 | 0% | 250 | 1,338 | +435% | 0 | 0 | — |
case-02 | fail→fail | 5,093 | 7,535 | +48% | 1 | 1 | 0% | 247 | 1,224 | +396% | 0 | 0 | — |
case-03 | fail→fail | 5,051 | 6,380 | +26% | 1 | 1 | 0% | 400 | 1,262 | +215% | 0 | 0 | — |
case-04 | pass→pass | 7,773 | 5,016 | -35% | 1 | 1 | 0% | 1,055 | 1,599 | +52% | 0 | 0 | — |
case-05 | pass→pass | 12,306 | 7,044 | -43% | 1 | 1 | 0% | 1,616 | 2,030 | +26% | 0 | 0 | — |
case-06 | pass→pass | 14,276 | 7,023 | -51% | 1 | 1 | 0% | 1,715 | 1,970 | +15% | 0 | 0 | — |
case-07 | fail→pass | 5,996 | 4,968 | -17% | 1 | 1 | 0% | 1,042 | 1,631 | +57% | 0 | 0 | — |
case-08 | pass→pass | 9,288 | 3,114 | -66% | 1 | 1 | 0% | 1,470 | 1,431 | -3% | 0 | 0 | — |
case-09 | fail→pass | 9,590 | 5,814 | -39% | 1 | 1 | 0% | 1,133 | 1,766 | +56% | 0 | 0 | — |
case-10 | pass→pass | 10,094 | 8,268 | -18% | 1 | 1 | 0% | 1,582 | 2,232 | +41% | 0 | 0 | — |
case-11 | pass→pass | 10,628 | 4,451 | -58% | 1 | 1 | 0% | 1,390 | 1,529 | +10% | 0 | 0 | — |
case-12 | pass→pass | 12,804 | 8,008 | -37% | 1 | 1 | 0% | 1,836 | 2,122 | +16% | 0 | 0 | — |
case-13 | pass→pass | 4,754 | 4,389 | -8% | 1 | 1 | 0% | 704 | 1,645 | +134% | 0 | 0 | — |
case-14 | fail→pass | 13,133 | 2,525 | -81% | 1 | 1 | 0% | 1,953 | 1,271 | -35% | 0 | 0 | — |
case-15 | fail→pass | 5,107 | 5,596 | +10% | 1 | 1 | 0% | 619 | 1,816 | +193% | 0 | 0 | — |
case-16 | fail→pass | 13,845 | 8,501 | -39% | 1 | 1 | 0% | 1,886 | 2,150 | +14% | 0 | 0 | — |
case-17 | pass→pass | 15,439 | 5,132 | -67% | 1 | 1 | 0% | 2,015 | 1,736 | -14% | 0 | 0 | — |
case-18 | fail→pass | 15,093 | 3,208 | -79% | 1 | 1 | 0% | 2,211 | 1,338 | -39% | 0 | 0 | — |
case-19 | pass→pass | 11,421 | 7,657 | -33% | 1 | 1 | 0% | 1,561 | 1,983 | +27% | 0 | 0 | — |
case-20 | fail→pass | 19,944 | 2,360 | -88% | 1 | 1 | 0% | 2,800 | 1,228 | -56% | 0 | 0 | — |
case-21 | fail→pass | 18,370 | 11,349 | -38% | 1 | 1 | 0% | 1,318 | 1,418 | +8% | 0 | 0 | — |
case-22 | fail→pass | 9,116 | 3,072 | -66% | 1 | 1 | 0% | 1,436 | 1,439 | +0% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +41 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.