Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Find files that historically co-change with a target symbol or file, ranked by co-occurrence across git episodes. Use when the user asks about historical coupling, co-change, what changes with this, hidden dependencies, or what else needs to move for source code. Do not use git log, git diff, Grep, or manual file search to correlate changes; Memtrace queries co-change and temporal graph data directly.
.claude/skills/syncable-dev-memtrace-cochange/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | -14% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -26% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 20% | 0% |
Find files that historically co-change with a target symbol or file path — ranked by co-occurrence frequency across git episodes. Surfaces behavioral coupling the static call graph cannot see.
get_impact answers "who calls this?" (structural). get_cochange_context answers "what files always move when this moves?" (historical, file-level).
They are complementary. A file with no call-graph edges to the target can still be a strong cochange partner if it's always modified alongside it in every commit.
> Parameter types: Numbers (limit, window_days, etc.) must be JSON numbers — not strings.
| Parameter | Required | Default | Notes | |---|---|---|---| | repo_id | yes | — | | | target | yes | — | Symbol name or file path substring — not symbol | | limit | no | 10 | Max cochanged files returned | | window_days | no | 30 | Lookback from as_of | | as_of | no | now | Window anchor | | branch | no | any branch | |
json{ "repo_id": "memdb", "target": "execute", "limit": 10, "window_days": 30 }
Full parameter spec for every Memtrace tool: references/mcp-parameters.md (bundled at the memtrace-skills plugin root).
json{ "cochanged_files": [ { "file_path": "src/order/types.rs", "cochange_count": 8, "last_cochanged_at": "2026-04-13T10:43:00Z" } ], "target_files": ["src/order/service.rs"] }
There is no cochanges[] with symbol names — results are file-level.
Use find_symbol if needed. Pass the symbol name or a file_path as target.
get_cochange_contextSee required parameters above.
High cochange_count on a file → strong historical coupling. When you modify the target, review those files too — even without direct call-graph edges.
For symbols in cochanged files, optionally run get_impact(target=...):
| Structural coupling | Historical coupling | Interpretation | |---|---|---| | Yes | Yes | Core dependency — highest risk | | No | Yes | Hidden coupling — history-only | | Yes | No | Called often but changed independently |
get_impact showsget_impact doesn't explain the blast radius, check cochange history| Mistake | Reality | |---------|---------| | Only using get_impact for blast radius | Structural coupling misses behavioral coupling — always pair with cochange | | Ignoring cochanged files with no call-graph edges | A rarely-called file with high cochange_count is a strong coupling signal | | Using cochange as a dependency map | It's a change correlation, not a dependency graph — files can cochange without any direct relationship | | Passing symbol: | Required param is target | | Expecting cochanges[] with symbol names | Response is cochanged_files[] (file paths) | | Using limit: 20 as default | API default is 10 | | Empty results with 0 git episodes | Run replay_history during indexing to populate co-change data |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 8,309 | 5,032 | -39% | 1 | 1 | 0% | 1,381 | 1,165 | -16% | 0 | 0 | — |
case-02 | fail→fail | 14,859 | 5,528 | -63% | 1 | 1 | 0% | 2,203 | 1,203 | -45% | 0 | 0 | — |
case-03 | fail→fail | 8,478 | 5,409 | -36% | 1 | 1 | 0% | 1,584 | 1,152 | -27% | 0 | 0 | — |
case-04 | fail→pass | 10,171 | 3,460 | -66% | 1 | 1 | 0% | 1,714 | 1,472 | -14% | 0 | 0 | — |
case-05 | pass→pass | 5,640 | 2,490 | -56% | 1 | 1 | 0% | 823 | 1,361 | +65% | 0 | 0 | — |
case-06 | pass→pass | 8,172 | 1,459 | -82% | 1 | 1 | 0% | 942 | 1,133 | +20% | 0 | 0 | — |
case-07 | fail→pass | 16,281 | 1,467 | -91% | 1 | 1 | 0% | 1,128 | 1,088 | -4% | 0 | 0 | — |
case-08 | fail→pass | 6,816 | 2,793 | -59% | 1 | 1 | 0% | 1,065 | 1,413 | +33% | 0 | 0 | — |
case-09 | pass→pass | 11,724 | 5,777 | -51% | 1 | 1 | 0% | 1,782 | 1,802 | +1% | 0 | 0 | — |
case-10 | fail→pass | 10,175 | 1,816 | -82% | 1 | 1 | 0% | 1,617 | 1,202 | -26% | 0 | 0 | — |
case-15 | pass→pass | 11,462 | 2,433 | -79% | 1 | 1 | 0% | 1,743 | 1,301 | -25% | 0 | 0 | — |
case-11 | pass→pass | 12,933 | 2,667 | -79% | 1 | 1 | 0% | 2,057 | 1,319 | -36% | 0 | 0 | — |
case-12 | pass→pass | 7,236 | 4,507 | -38% | 1 | 1 | 0% | 1,102 | 1,641 | +49% | 0 | 0 | — |
case-13 | pass→pass | 7,813 | 5,694 | -27% | 1 | 1 | 0% | 1,298 | 1,736 | +34% | 0 | 0 | — |
case-14 | fail→pass | 7,858 | 3,498 | -55% | 1 | 1 | 0% | 1,253 | 1,508 | +20% | 0 | 0 | — |
case-16 | pass→pass | 13,542 | 2,276 | -83% | 1 | 1 | 0% | 2,510 | 1,325 | -47% | 0 | 0 | — |
case-17 | pass→pass | 19,345 | 7,499 | -61% | 1 | 1 | 0% | 2,132 | 2,130 | -0% | 0 | 0 | — |
case-18 | pass→pass | 13,598 | 8,097 | -40% | 1 | 1 | 0% | 2,094 | 2,190 | +5% | 0 | 0 | — |
case-19 | pass→pass | 4,867 | 4,065 | -16% | 1 | 1 | 0% | 766 | 1,524 | +99% | 0 | 0 | — |
case-20 | pass→pass | 5,457 | 4,996 | -8% | 1 | 1 | 0% | 1,106 | 1,789 | +62% | 0 | 0 | — |
case-21 | pass→pass | 6,993 | 4,095 | -41% | 1 | 1 | 0% | 1,108 | 1,615 | +46% | 0 | 0 | — |
case-22 | pass→pass | 13,198 | 7,163 | -46% | 1 | 1 | 0% | 1,951 | 1,903 | -2% | 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 18 counted toward the lift figure. The other 4 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 +23 percentage points is the difference between those two pass rates over the 18 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.