Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Trace source-code change history from Memtrace's symbol-level temporal memory. Use when the user asks about change history, recent modifications, what changed since a date, symbol timeline, evolution, unexpected changes, or incident timelines. Do not use git log, git diff, Grep, or manual file search to reconstruct history. Do NOT use for current-state architecture overviews (use memtrace-codebase-exploration) or for replaying one commit/save's graph diff (use memtrace-episode-replay).
.claude/skills/syncable-dev-memtrace-evolution/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 265% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 214% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 846% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 66% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 111% | 0% |
Temporal analysis for "what changed in this repo between two points in time?" Works on both git commits and uncommitted working-tree saves.
get_evolution always requires repo_id and from. There is no days parameter.
| Parameter | Required | Type | Example | |---|---|---|---| | repo_id | yes | string | "memdb" | | from | yes | string | "90d ago", "2026-04-01T00:00:00Z", "yesterday" | | to | no | string | defaults to now; set to incident time when investigating | | mode | no | string | "recent" (default), "compound", "summary", "overview" | | target | no | string | symbol name or file path substring to scope results | | branch | no | string | branch filter |
> Parameter types: MCP parameters are strictly typed. Numbers (limit, cursor, etc.) must be JSON numbers — not strings. Use limit: 100, never limit: "100".
| Tool | Time param | Example | Notes | |---|---|---|---| | get_evolution | from (required) | "90d ago" | optional to; never pass days | | get_changes_since | since (required) | "2026-04-13T10:43:00Z" | optional until | | replay_history | days (optional) | 90 | re-walks git history — different tool entirely |
Common failure: MCP error -32602: missing field 'from' — you omitted from or passed days instead.
json// CORRECT — 90-day overview { "repo_id": "memdb", "from": "90d ago", "mode": "overview" } // WRONG — days is not a get_evolution parameter { "repo_id": "memdb", "days": 90, "mode": "overview" }
| Mode | What you get | Best for | |---|---|---| | recent | Per-episode list with nodes/edges added/removed; paginate with limit + cursor | Incident timelines, walking commit-by-commit | | compound | Totals plus top_changed_files and top_touched_symbols | "What changed?" when you need hotspots | | summary | Totals plus first_episode / last_episode metadata | Cheapest window check | | overview | Alias for summary | Same as summary |
Modes impact, novel, and directional are not implemented — calling them returns unknown mode.
recent mode filters (ignored by compound / summary)| Param | Purpose | |---|---| | file_path | substring match against episode touched_files | | kind | "git_commit" or "working_tree" | | limit | page size (default 100 episodes) | | cursor | pagination offset; follow next_cursor in response |
Full parameter spec for every Memtrace tool: references/mcp-parameters.md (bundled at the memtrace-skills plugin root).
repo_idlist_indexed_repositories()from — start (required). Relative strings work: "7d ago", "24 hours ago".to — end (optional, defaults to now). Set to the incident timestamp when investigating regressions.If resuming a session and you have a stored timestamp from last time, prefer get_changes_since(since=...) — see memtrace-session-continuity.
User wants...
├── per-commit / per-save changelog → recent
├── top changed files + symbols → compound
├── quick totals only → summary or overview
└── one symbol's full history → get_timeline (not get_evolution)json// General "what changed lately?" { "repo_id": "memdb", "from": "30d ago", "mode": "compound" } // Changes in one file last week { "repo_id": "memdb", "from": "7d ago", "mode": "recent", "file_path": "auth.ts", "limit": 50 } // Incident: 24h before failure until failure time { "repo_id": "memdb", "from": "2026-04-16T13:00:00Z", "to": "2026-04-17T13:00:00Z", "mode": "recent" }
recent mode — each entry in episodes[]:
episode — metadata (source_type, reference_time, touched_files, …)nodes_added, nodes_removed, edges_added, edges_removedcompound mode:
totals — aggregate countstop_changed_files — files with most activitytop_touched_symbols — symbols with most activitysummary / overview mode:
totals — episode and node/edge countsfirst_episode, last_episode — window boundaries| Need | Tool | |---|---| | Full history of one symbol | get_timeline(repo_id, scope_path, file_path) | | Blast radius of a suspect symbol | get_impact(repo_id, target) | | What a diff would affect | detect_changes(repo_id, diff=...) | | Behavioral coupling | get_cochange_context(repo_id, target=<symbol>) | | Sub-commit tried-and-reverted history | get_episode_replay |
Sample compound payload (per-mode field lists: step 5 above):
json{ "totals": { "episodes": 42, "nodes_added": 310, "nodes_removed": 95, "edges_added": 541, "edges_removed": 120 }, "top_changed_files": [ /* files ranked by activity */ ], "top_touched_symbols": [ /* symbols ranked by activity */ ] }
recent returns episodes[] + totals + page.next_cursor; summary/overview return totals + first_episode/last_episode.
| Mistake | Reality | |---|---| | Passing days: 90 | Use from: "90d ago" — days is only on replay_history | | Omitting from | Required — call fails with -32602 before any query runs | | Using mode: "novel" / "impact" / "directional" | Not implemented — use compound + get_impact + get_cochange_context instead | | Expecting by_module[] or significance scores | Not in current response shape — use top_changed_files from compound | | Using overview when you need file/symbol detail | overview/summary are totals only — switch to compound or recent | | Using get_evolution for one symbol's history | Use get_timeline | | Guessing timestamps when resuming work | Use get_changes_since(since=<stored time>) — see memtrace-session-continuity | | Applying file_path filter in compound mode | Filters are ignored in roll-up modes — use recent with file_path instead |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 27,763 | 6,474 | -77% | 1 | 1 | 0% | 4,760 | 2,247 | -53% | 0 | 0 | — |
case-02 | fail→fail | 9,033 | 3,307 | -63% | 1 | 1 | 0% | 944 | 2,091 | +122% | 0 | 0 | — |
case-03 | fail→fail | 10,845 | 5,613 | -48% | 1 | 1 | 0% | 1,192 | 2,220 | +86% | 0 | 0 | — |
case-04 | fail→pass | 4,162 | 3,643 | -12% | 1 | 1 | 0% | 719 | 2,621 | +265% | 0 | 0 | — |
case-05 | fail→pass | 5,124 | 4,101 | -20% | 1 | 1 | 0% | 826 | 2,596 | +214% | 0 | 0 | — |
case-06 | fail→pass | 6,215 | 5,058 | -19% | 1 | 1 | 0% | 293 | 2,771 | +846% | 0 | 0 | — |
case-07 | fail→pass | 11,082 | 6,750 | -39% | 1 | 1 | 0% | 1,890 | 3,132 | +66% | 0 | 0 | — |
case-08 | pass→fail | 5,010 | 7,719 | +54% | 1 | 1 | 0% | 851 | 2,527 | +197% | 0 | 0 | — |
case-09 | pass→pass | 8,828 | 4,068 | -54% | 1 | 1 | 0% | 1,772 | 2,707 | +53% | 0 | 0 | — |
case-10 | fail→pass | 7,291 | 3,208 | -56% | 1 | 1 | 0% | 1,174 | 2,475 | +111% | 0 | 0 | — |
case-11 | pass→pass | 5,791 | 2,274 | -61% | 1 | 1 | 0% | 907 | 2,300 | +154% | 0 | 0 | — |
case-12 | fail→pass | 9,608 | 3,847 | -60% | 1 | 1 | 0% | 1,645 | 2,605 | +58% | 0 | 0 | — |
case-13 | fail→pass | 5,486 | 2,643 | -52% | 1 | 1 | 0% | 963 | 2,372 | +146% | 0 | 0 | — |
case-14 | fail→pass | 4,540 | 2,457 | -46% | 1 | 1 | 0% | 803 | 2,289 | +185% | 0 | 0 | — |
case-15 | fail→pass | 5,623 | 3,846 | -32% | 1 | 1 | 0% | 888 | 2,560 | +188% | 0 | 0 | — |
case-16 | fail→fail | 11,902 | 6,186 | -48% | 1 | 1 | 0% | 2,160 | 2,289 | +6% | 0 | 0 | — |
case-17 | fail→pass | 5,267 | 3,101 | -41% | 1 | 1 | 0% | 1,010 | 2,432 | +141% | 0 | 0 | — |
case-18 | fail→pass | 6,892 | 2,529 | -63% | 1 | 1 | 0% | 1,164 | 2,360 | +103% | 0 | 0 | — |
case-19 | fail→pass | 3,757 | 3,395 | -10% | 1 | 1 | 0% | 607 | 2,386 | +293% | 0 | 0 | — |
case-20 | fail→pass | 10,850 | 2,896 | -73% | 1 | 1 | 0% | 1,615 | 2,297 | +42% | 0 | 0 | — |
case-21 | fail→pass | 3,141 | 3,774 | +20% | 1 | 1 | 0% | 564 | 2,584 | +358% | 0 | 0 | — |
case-22 | fail→fail | 5,449 | 2,832 | -48% | 1 | 1 | 0% | 803 | 2,416 | +201% | 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 16 counted toward the lift figure. The other 6 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 +59 percentage points is the difference between those two pass rates over the 16 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.