Patch release. 108 merges since v2.3.7, most of them fixes from community reports.
Watch mode stops going quiet
watch was the weakest surface in 2.3.7, and three separate failures could leave the daemon reporting ok while the graph stopped updating:
- OS watches are no longer registered inside ignored trees, so a Maven
target/or a largenode_modulescannot exhaust the inotify budget (#811). - Deleting and recreating a watched directory (
rm -rf src && mkdir src, or two ordinarygit checkouts) is recognized as a replaced directory rather than a dead watcher, on filesystems that change the inode and on those that hand the same one straight back. - A repository reached through a symlinked path is watched and indexed instead of silently dropping every event, through both
watch --repoandserve --auto-watch(#892).
One graph per repository, however you spell the root
Every path-valued --repo is canonicalized at the CLI boundary, and the full build, incremental update and watch entry points each resolve their root. ., a relative path, a trailing slash, a symlinked path and an absolute path no longer split the graph or reconcile each other away. A run whose stored File nodes all belong to a different root is now refused with a clear error instead of emptying the graph file by file (#889).
Token budgets that hold
#849 found get_affected_flows returning roughly 247k tokens inside a workflow documented as "5 tool calls, 800 tokens total". Measuring all 30 registered tools against a real 5.6k-node graph found the same shape in ten more places. Every response list now carries a hard ceiling, keeps its untruncated total, and reports "showing N of M", so a short answer is distinguishable from a truncated one (#849, #853, #887). Four query tools remain and are tracked in #888.
Honest empty results
Empty results from query_graph, get_impact_radius and semantic_search_nodes now carry a one-sentence confidence field saying why the count is zero — never indexed, graph behind the working tree, a known static-analysis gap for that language, or a verified real absence. Responses that carry results are byte-identical to before (#314, #819, #850, #851).
Also in this release
code-review-graph forget PATH ...drops already-parsed files without a full rebuild.uninstall --platform NAMEunbinds a single platform and leaves the rest intact.- A Voyage AI embedding provider, and embeddings persisted after every batch so an interrupted cloud run keeps its progress (#783).
- Language fixes: C# receiver calls and namespace imports, Swift initializers and subscripts, Java method names, Kotlin import comments, Go generic receivers, Python module-suffix import resolution,
jsconfig.jsonpath aliases. visualize --serveworks offline, andstatusno longer reports phantom languages.
Full detail in CHANGELOG.md.