Repository navigation
Memtrace v1.2.7
Memtrace v1.2.7
The graph comes back, and your agents stop colliding
Fixed
- Picking a point on the timeline shows the graph as it was at that moment again. Since 1.1.4 the dashboard had no way to build a historical picture: the change that stopped Memtrace from re-scanning the whole store on every dashboard load also removed the only code path that answered a time-travel request, so every point on the timeline came back as an empty graph marked “Graph view is materializing”. The chosen time is kept in the page address, so a reload brought the empty picture straight back, and the only way out was to switch to a single repository and back to all of them. Historical views are now built on request from the store — for one repository or for all of them — and are never written over the live graph's cache. The live graph is unchanged: it is still served from cache and a dashboard load still never triggers a store scan.
- While a new picture is loading — after a timeline scrub, a branch switch or a repository switch — the graph already on screen stays put with the refresh indicator on, instead of being replaced by the “materializing” overlay until the next answer lands. A historical picture is a live walk of the store, so that gap is seconds, and it no longer blanks the view.
- The graph no longer sits on “Graph view is materializing” after a reload. When the first answer for a view is still warming up or empty, the dashboard now keeps asking every couple of seconds until a drawable graph lands, then stops and goes back to push-driven updates. Before, it waited for a refresh signal that had already fired, so an empty first answer stayed empty until you switched repositories and back. A graph that is already on screen is never re-fetched on a timer, so the flicker fixed earlier does not come back.
- Stale copies of edited functions no longer hang on the outer ring of the graph. When a function moves to a different line, Memtrace records the moved version as a new symbol and retires the old one; on some stores the old version's connections were retired but the symbol itself was written back as live, so it survived with no connections at all and the layout parked it on the ring reserved for unconnected nodes — on a nine-repository workspace that was about 1,200 ghost Rust functions, each with a connected twin of the same name in the same file. The graph now drops a symbol that has no connections when a connected symbol with the same name exists in the same file. Nothing else on that ring changes: files with no symbols (READMEs, empty init.py files) and symbols whose file has no entry of its own are real and stay. The ghosts leave the picture the next time a repository is indexed; run
memtrace indexto apply it to an existing store in one step. - An MCP session attached to a store that does not hold the repository you ask about now gets its answer from the running Memtrace that does hold it. Tools such as get_codebase_briefing, find_central_symbols, list_processes, find_code and find_symbol used to answer “0 symbols” or empty results from the wrong store while the Memtrace holding the repository sat idle; they now hand the same call to that runtime and return its answer, marked under _meta.answered_by so you can see who answered. When no running Memtrace holds the repository, or it cannot answer, the call is refused with a diagnostic naming this session's store, its members, where the repository lives and why it was not routed — never a silent empty. Only reads are routed; nothing is ever written to another store. A routed call counts once against your query quota, and a refused one not at all.
- Running
memtrace startormemtrace indexin a terminal when a newer version is available no longer prints the update twice. The background version check printed its notice card — the versions, the release notes link, the upgrade command — and the interactive “Upgrade now?” offer printed the same card again right underneath it. The notice now yields to the offer. It still prints on its own for commands that never ask, and when the version check finishes too late for the prompt to have asked. - A store started from a workspace manifest or a named workspace now remembers who declared its member list, and a plain
memtrace startrun from the folder above it — or an MCP session Cursor or Claude spawned there while the daemon was down — can no longer widen that list to every repository it finds in the folder. Before, either would silently rewrite the store's scope to the whole folder, and the nextmemtrace start --workspace-filerefused to open the store because its declared members no longer matched the manifest. A folder-walked start over an owned store is now refused up front with the manifest or workspace name and the command that may change the members; an MCP session opens the store's declared members as they are and never rewrites the scope of an existing store (it may still create the scope of a brand-new one). Every change to a store's member list now keeps the previous file beside it and appends one line to a journal naming the process, its arguments and working folder, so a surprise rewrite is answerable in seconds instead of hours. - On a machine running more than one Memtrace — a workspace on port 3030 and a second store that fell back to 3031 — a tool call routed to the other daemon now reaches it. The runtime registry advertised the port each daemon was configured with, not the one it actually bound after the fallback, so the call went to whichever daemon held the configured port and was refused there. The registry now records the bound port, and the router reads the port from the daemon's own published state first.
- Session-ledger rows no longer fuse when two Memtrace sessions write at the same moment. A row was written as two pieces — the JSON, then its newline — so simultaneous sessions could interleave and produce a line holding two records, which the ledger readers then dropped. Each row is now written in one piece.
- Cleaning up one project can no longer stop another one's Memtrace.
memtrace stopandmemtrace doctor --fixnow require proof that whatever they are about to terminate belongs to the workspace being cleaned — the process must name that workspace's data directory itself, or be the daemon that workspace published, and still be the same process it was when it was inspected. Anything that cannot be identified is left running and the reason is printed instead of being silently skipped. Before, freeing a port terminated whichever process held it under a name match, and because a Memtrace whose port is busy moves to the next free one, that was routinely another project's healthy daemon. - A Memtrace session no longer waits on another session to read. A session that is not changing which repositories a workspace holds now takes no workspace lock at all. Before, the lock was held for the whole time a store was being opened, so an editor's session could sit for thirty seconds behind another one's startup and then fail outright with a lock timeout — on a large workspace that was every editor reload.
- An editor-spawned Memtrace session can no longer change which repositories a workspace holds, under any flag — including when the editor's configuration passes a workspace file. It may set up a brand-new workspace and nothing more. Changing an existing one means editing the manifest and starting Memtrace with it, which is now the only path and is named in the refusal.
- A tool call whose Memtrace goes away underneath it — a daemon that crashed, or one replaced by a newly started owner — now waits for the workspace's Memtrace to come back and answers, instead of failing after two quick retries. The wait is bounded at a minute, so a call never hangs waiting for something that is not coming. A store whose Memtrace you stopped on purpose is deliberately not waited for: that call fails straight away and says the owner exited.
- The retrieval hook agents use now asks the Memtrace that owns the folder it ran in, rather than assuming the dashboard is on port 3030. On a machine running more than one project, port 3030 belongs to whichever project started first, so the hook could answer from a different project's graph with nothing in the answer to say so. When no Memtrace owns the folder, the hook now says so instead of guessing.
Improved
- The GitHub badge in the top bar says what it counts. “5/6” now reads “GitHub 5/6 connected”, and its tooltip explains that it counts the repositories in this workspace that have a GitHub remote — not every repository — so a nine-repository workspace with six GitHub remotes no longer looks like a mistake.
- The session ledger now records failed tool calls, not only answered ones, and every row names the runtime that answered: its store, owner process, endpoint, role (owner, attached, pending or standalone), working folder and workspace root, the repository you asked for and whether this store holds it. When a
memtrace mcpsession starts it prints one line with the same facts. After the demo incident it took an hour of log forensics to establish which store had answered a call; that is now one line in the ledger. - One project's heavy query no longer blocks everyone else's. Graph work that reads a whole repository still runs one at a time — that is a memory limit — but a call that cannot start within its budget now comes back as a retryable
busyanswer naming what is holding the lane and for how long, instead of queueing behind it indefinitely. Questions routed from another workspace get their own narrower lane, so a neighbour's work cannot crowd out the session in front of you. - Every running Memtrace is now reachable by the others. Each one opens a small loopback port and publishes it, so a question can be routed to a workspace whose Memtrace was started by an editor rather than from a terminal. Before, such a workspace had no reachable address and the question was refused even though the answer existed on the same machine.
- The Memtrace skills no longer tell an agent to re-index when a repository looks missing. A repository that is indexed in a different workspace now produces a refusal naming where it lives, and the guidance an agent reads treats that as a routing answer rather than a coverage problem — following the old advice built a second copy of the repository in the wrong workspace.
Install
npm install -g memtrace