Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Investigate source-code bugs, incidents, regressions, production issues, and failures to root cause with Memtrace symbol search, impact, call graph, and temporal history. Use when the user asks about root cause analysis, what broke, or what changed when debugging a failure. Do not start with Grep, Glob, rg, find, or manual file search for code causes. For plain what-changed questions without a failure, use memtrace-evolution.
.claude/skills/syncable-dev-memtrace-incident-investigation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 105% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 85% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 67% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 24% | 0% |
Root cause investigation workflow for incidents, regressions, and production issues. Uses get_evolution to list changes near the incident time, then traces blast radius and execution flows to identify the likely cause.
Determine:
to parameter)list_indexed_repositories to get repo_ids.Call get_evolution:
json{ "repo_id": "<affected-repo>", "from": "<incident_time minus lookback, e.g. 24h before>", "to": "<incident_time ISO-8601>", "mode": "recent", "limit": 100 }
Why recent mode? Returns a chronological per-episode changelog. Focus on episodes whose reference_time is closest to the incident — especially those with high nodes_added + nodes_removed or that touch files in the failure area.
Paginate with cursor if next_cursor is present in the response.
Success criteria: A list of episodes in the window, with touched files and change counts for each.
Call get_evolution again on the same window with mode: "compound":
json{ "repo_id": "<affected-repo>", "from": "<same as step 2>", "to": "<same as step 2>", "mode": "compound" }
Review top_changed_files and top_touched_symbols. Cross-reference with the failure area (endpoint, module, error stack).
Decision: Prioritize symbols/files that appear in both the recent episode list (step 2) and the compound hotspots (step 3).
For hotspot symbols from step 3, resolve each with find_symbol:
json{ "repo_id": "<affected-repo>", "name": "<symbol>", "limit": 10 }
Then call get_timeline — stable code that suddenly changed is suspect:
json{ "repo_id": "<affected-repo>", "scope_path": "<from find_symbol>", "file_path": "<from find_symbol>" }
For the top 3–5 symbols, call get_impact:
json{ "repo_id": "<affected-repo>", "target": "<symbol>", "direction": "upstream" }
Decision: Prioritize symbols where the blast radius overlaps with the reported failure area.
Use get_symbol_context on the top suspects to see which processes (HTTP handlers, background jobs, etc.) they participate in.
Decision: If the incident is in a specific endpoint/flow, focus on suspects that are members of that process.
Once you have a primary suspect, call get_timeline with repo_id, scope_path, and file_path:
From the step 2 recent response, inspect each episode's nodes_added and nodes_removed:
nodes_added — new code introduced (potential new bugs)nodes_removed — deleted code (potential missing functionality)For the primary suspect, call get_cochange_context:
json{ "repo_id": "<affected-repo>", "target": "<symbol>", "limit": 10 }
get_impact doesn't explain the failure area, check cochange partners — the coupling may be behavioral, not structural.Decision: If a cochange partner is in the failure area but has no direct call relationship to the suspect, it's a hidden dependency — investigate both.
If the suspect's episode isn't clear, call get_episode_replay:
json{ "repo_id": "<affected-repo>", "episode_index": 0, "symbol": "<suspect>", "mode": "graph_summary" }
attempted_and_reverted hints — approaches tried and rolled back within the episode often explain why the committed state looks the way it does.| Phase | Tool / mode | Why | |---|---|---| | Initial triage | get_evolution recent | Per-episode changelog near the incident | | Hotspot identification | get_evolution compound | Top changed files and symbols in the window | | Scope assessment | get_impact | Blast radius of suspect symbols | | Hidden coupling | get_cochange_context | Behavioral coupling not in the call graph | | Symbol history | get_timeline | Full version history of a suspect | | Sub-commit intent | get_episode_replay | What was tried before the committed state | | Quick window check | get_evolution overview | Totals only — use before narrowing the window |
Full parameter spec for every Memtrace tool: references/mcp-parameters.md (bundled at the memtrace-skills plugin root).
The deliverable is the RCA report above. Abridged example (3 of 6 sections filled):
2026-07-01T14:22Z modified AuthService::validateToken; upstream blast radius reaches the failing /api/login processtoken_cache.rs changed in the same window despite no call edge| Mistake | Reality | |---|---| | Omitting from or passing days | Always pass from (e.g. "24 hours ago") — never days | | Using mode: "novel" or "directional" | Not implemented — use compound + get_timeline + get_cochange_context | | Only looking at the most recent commit | The root cause may be from an earlier episode whose effects were delayed | | Not checking blast radius overlap | A change is only a suspect if its blast radius reaches the failure area | | Stopping at call graph analysis | get_cochange_context finds hidden coupling — symbols that move together without calling each other | | Reading only committed code | get_episode_replay reveals tried-and-reverted approaches that explain the current implementation |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 4,425 | 4,419 | -0% | 1 | 1 | 0% | 293 | 2,253 | +669% | 0 | 0 | — |
case-02 | fail→fail | 6,817 | 9,079 | +33% | 1 | 1 | 0% | 224 | 2,097 | +836% | 0 | 0 | — |
case-03 | fail→fail | 5,799 | 4,400 | -24% | 1 | 1 | 0% | 274 | 2,244 | +719% | 0 | 0 | — |
case-04 | pass→fail | 9,472 | 3,127 | -67% | 1 | 1 | 0% | 1,933 | 1,984 | +3% | 0 | 0 | — |
case-05 | pass→pass | 8,306 | 13,004 | +57% | 1 | 1 | 0% | 1,546 | 3,865 | +150% | 0 | 0 | — |
case-06 | pass→pass | 17,596 | 15,926 | -9% | 1 | 1 | 0% | 2,731 | 4,328 | +58% | 0 | 0 | — |
case-07 | fail→pass | 7,166 | 4,148 | -42% | 1 | 1 | 0% | 1,248 | 2,561 | +105% | 0 | 0 | — |
case-12 | fail→pass | 7,628 | 2,376 | -69% | 1 | 1 | 0% | 1,179 | 2,182 | +85% | 0 | 0 | — |
case-08 | fail→pass | 19,800 | 2,522 | -87% | 1 | 1 | 0% | 1,219 | 2,297 | +88% | 0 | 0 | — |
case-09 | fail→pass | 7,549 | 4,521 | -40% | 1 | 1 | 0% | 1,268 | 2,113 | +67% | 0 | 0 | — |
case-10 | pass→pass | 12,450 | 5,181 | -58% | 1 | 1 | 0% | 1,850 | 2,576 | +39% | 0 | 0 | — |
case-11 | fail→pass | 10,851 | 2,534 | -77% | 1 | 1 | 0% | 1,798 | 2,226 | +24% | 0 | 0 | — |
case-21 | fail→pass | 13,744 | 2,313 | -83% | 1 | 1 | 0% | 2,240 | 2,106 | -6% | 0 | 0 | — |
case-13 | fail→pass | 9,832 | 1,483 | -85% | 1 | 1 | 0% | 1,641 | 2,001 | +22% | 0 | 0 | — |
case-14 | pass→pass | 10,095 | 1,719 | -83% | 1 | 1 | 0% | 1,505 | 2,066 | +37% | 0 | 0 | — |
case-15 | fail→fail | 10,025 | 2,675 | -73% | 1 | 1 | 0% | 1,407 | 2,207 | +57% | 0 | 0 | — |
case-16 | fail→pass | 8,570 | 2,770 | -68% | 1 | 1 | 0% | 1,402 | 2,229 | +59% | 0 | 0 | — |
case-17 | fail→pass | 12,191 | 5,005 | -59% | 1 | 1 | 0% | 1,821 | 2,775 | +52% | 0 | 0 | — |
case-18 | fail→pass | 7,086 | 2,070 | -71% | 1 | 1 | 0% | 1,170 | 2,127 | +82% | 0 | 0 | — |
case-19 | pass→pass | 10,081 | 5,300 | -47% | 1 | 1 | 0% | 1,419 | 2,564 | +81% | 0 | 0 | — |
case-20 | fail→pass | 12,378 | 2,630 | -79% | 1 | 1 | 0% | 1,801 | 2,145 | +19% | 0 | 0 | — |
case-22 | fail→pass | 7,026 | 1,601 | -77% | 1 | 1 | 0% | 1,109 | 2,028 | +83% | 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 17 counted toward the lift figure. The other 5 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 +50 percentage points is the difference between those two pass rates over the 17 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
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.