Skill v1.0.2
currentAutomated scan100/1001 files
version: "1.0.2" name: memtrace-cochange description: "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."
Overview
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.
Required parameters
| 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 |
{"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).
Output
{"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.
Steps
1. Identify the target
Use find_symbol if needed. Pass the symbol `name` or a `file_path` as target.
2. Call get_cochange_context
See required parameters above.
3. Interpret results
High cochange_count on a file → strong historical coupling. When you modify the target, review those files too — even without direct call-graph edges.
4. Cross-reference with call graph
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 |
Use Cases
- Before modifying a symbol — get blast awareness beyond what
get_impactshows - Incident investigation — when
get_impactdoesn't explain the blast radius, check cochange history - Code review — verify that a PR touched all historically-coupled partners
- Refactoring — discover implicit coupling before extracting a module
Common Mistakes
| 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 |