Release notes

Changelog

Newest first · update an existing install with recon update
Update an existing install with recon update. Versions are tagged on git; release artefacts are signed and verifiable with cosign.

v0.5.7

2026-05-19
Passive update notices · reindex purge · serve file gate · OAuth fix

Added.

Fixed.

Changed.

v0.5.6

2026-05-12
Per-repo calibration · session restore fix · Windows paths

Added.

Fixed.

Changed.

v0.5.5

2026-05-02
Hosted embeddings fix

v0.5.4

2026-05-02
Telemetry credibility pass

Measured baselines, sampled response BPE, persisted dedup.

Also: watcher test timeouts bumped for self-hosted CI runners; CI release matrix timeout raised 30→45 min for cold Windows builds.

v0.5.3

2026-04-30
Cold-index performance + hosted semantic search

A performance-focused release targeting cold-index latency and steady-state query throughput.

v0.5.2

2026-04-30
Startup handshake fix — repo_map pre-warm no longer blocks the MCP initialize

v0.5.1 was unusable on any repository large enough to take more than a few seconds to compute its repo_map: ReconServer::index_repo() ran the PageRank-based pre-warm of the repo_map cache inline, before the rmcp stdio transport opened. On a 511,561-symbol corpus that was a 55-second block — well past every IDE's MCP handshake timeout (Claude Code, Cursor, Windsurf, OpenCode all hung up after ~10–30 s). The server was alive and responsive once it finally got around to reading stdin; by then the IDE had marked the connection failed and stopped trying.

The pre-warm is now spawned via tokio::task::spawn_blocking. index_repo() returns within milliseconds of finishing tree-sitter parsing and the Tantivy commit, regardless of corpus size. The first code_repo_map call computes the answer cold-path if the spawn hasn't finished yet — same result, no startup wedge. New regression test (index_repo_does_not_block_on_repo_map_prewarm) seeds 1,600 synthetic symbols and asserts index_repo() returns in under 5 s, well below any inline-PageRank wall time on that corpus.

v0.5.1

2026-04-30
Honest savings — kill the per-call double-count

The tokens_saved headline was a per-call upper bound — every tool call credited the full Read+Grep alternative even when the agent had already seen the file or run the query in the same conversation. On hot sessions that drove a ~3.5× over-statement (one user reported 2.83M saved across 160 calls; the honest figure was around 800K).

v0.5.1 adds process-scoped baseline dedupe (closes #25). The first call against a (tool, dedup_key) pair credits the full Read+Grep alternative; subsequent calls credit 0 (call counts and latency still accrue). Per-tool keys: file path for code_outline / code_skeleton / code_read_symbol; symbol identifier for code_find_symbol / find_refs / callers / callees / impact / context; mode|query for code_search; kind|pattern for code_find_strings; sorted patterns for code_multi_find; (src, dst) for code_path; focus-files set for code_repo_map; subsystem id for code_subsystem; singleton for code_subsystems.

Process-scoped is the v0.5.1 simplification. For stdio MCP transport (Claude Code, Cursor, Windsurf, OpenCode all spawn one recon serve per conversation) this is identical to session-scoped. Streamable HTTP multiplexes many sessions through one process and will under-count until v0.5.2 plumbs the rmcp RequestContext session id through.

Schema unchanged. Past rollups stay at the v0.5.0 calculation; only fresh pushes use deduped values. Numbers will visibly shrink after upgrade — that's the honesty pass. recon savings show gains a footer note clarifying the dedupe window and that provider prompt-cache absorption (Anthropic / OpenAI / Gemini / vLLM) shaves more on top at billing time.

Dashboard dollar conversion (closes #21). Pick your model on the Savings tab and the headline gains a clay-coloured $X.XX in <model> input cost tile alongside the tokens-saved figure. The picker ships a 20-row curated short list (Anthropic / OpenAI / Google / DeepSeek / Mistral / Together / Cohere) plus a "Browse all 1,945 models →" button that opens a search modal over the full litellm catalog (snapshot 2026-04-30, lazy-loaded as a 165 KB JSON, served from /js/model-prices.json). A "Self-hosted / not sure" option hides the dollar tile entirely — we don't pretend there's a number when there isn't one. Choice persists in localStorage (catalog picks cache id + label + rate so the rate survives reloads); tooltip discloses the exact rate used. recon stays model-agnostic on the backend — the conversion is pure dashboard JS, no provider-side state.

Forward-compat hardening, two of two from the v0.5.0 audit plan that hadn't shipped yet.

v0.5.0

2026-04-30
Multi-repo MCP + canonical Hits envelope + session receipt + latency savings

Multi-repo MCP, the canonical Hits envelope, a session-end savings receipt to stderr, latency savings alongside token savings on the dashboard, plus seven hot-path / hygiene fixes from a 4-axis promise audit. Wire-format hard-cut at this release: bundled CLI version-locks against the server, so there is no in-the-wild consumer mismatch.

Multi-repo MCP service. The RepoRouter infrastructure that has been quietly enforcing tier limits in the CLI is now exposed to agents as two new MCP tools, with session persistence so agents do not re-activate after every restart.

Canonical Hits output envelope for the 5 row-oriented tools. ARCHITECTURE.md §3 promised every tool emits exactly one of the canonical shapes; five tools were shipping bare Vec<Value> arrays. This release closes that gap with a sixth canonical variant (Hits) used by code_find_symbol, code_search, code_list, code_find_strings, code_multi_find. Wire shape: {shape:"Hits", kind, count, hits, truncated?}. Net wire-overhead per response is ≈40 bytes — well under 1 % of typical row-oriented payloads. The truncated flag is omitted when the result was not capped.

Audit-driven fixes. Three runtime bugs surfaced by a 4-axis promise audit (output discipline, privacy, performance, license/schema):

Session-end savings receipt to stderr (closes #19). At the end of every recon serve session — IDE close, signal, or license revocation — recon prints a one-block summary to stderr. The IDE's MCP debug log captures stderr, so the headline reaches Claude Code / Cursor / Windsurf / OpenCode users without having to remember recon savings show or open the dashboard:

recon · session ended
  18 tool calls · saved 47,200 tokens · ~9.4s faster than Read+Grep loop
  top: code_outline (12,400 tok, 1.6s)  code_search (9,800, 0.8s)  code_read_symbol (8,100, 0.6s)
  dashboard: https://mcprecon.pages.dev/dashboard

Suppressed when the session had zero tool calls (no "0 tokens saved" noise on a fresh recon serve nobody connected to). Honour RECON_QUIET=1/true/yes/on for CI / scripted runs. Failures are silent skips, never a blocker on shutdown.

Latency savings alongside token savings (closes #20). Tokens are one number; users feel time more than tokens. Baseline now carries a per-tool baseline_latency_ms alongside baseline_tokens — a conservative estimate of the wall-time the Read+Grep alternative loop would have taken (e.g. code_outline 200 ms, code_list 2 s, code_repo_map 5 s). The session receipt and the dashboard headline both surface this:

312,400 tokens saved · ~6m 12s faster than Read+Grep loop

Hybrid telemetry flush — count OR timer (closes #13). Pure count-based flushing left bursty agentic flows fine but stranded idle sessions: an IDE window with 3 calls/hr never persisted any telemetry, so recon savings show reported "no counters" after a real session. Lower FLUSH_THRESHOLD from 50 → 10 so even moderately active sessions persist quickly; add FLUSH_INTERVAL_SECS = 60 with a periodic flush task that covers the long tail. Override via RECON_TELEMETRY_FLUSH_SECS (clamped to [10, 3600]; 0 disables the timer entirely).

Hot-path performance — three caches and one O(1) lookup along the dispatcher and search paths:

Hygiene + audit-driven fixes (rolled up):

Out of scope for this release (documented as the natural follow-up): an optional repo: Option<String> parameter on every stateful tool to override the active dispatch on a per-call basis. The current shape covers ≥99 % of agent flows (activate-then-query); the per-call override is niche convenience for cross-repo queries within a single conversation. The dashboard dollar conversion (#21, v0.5.0 milestone) ships in a follow-up — token-savings stays the headline; the picker UX is worth its own polish pass.

v0.4.1

2026-04-29
Patch — measured baselines for the common search paths

Two correctness bugs in the v0.4.0 measured pipeline plus one CI annoyance.

No schema changes. CLI ↔ worker wire compatibility unchanged. Dashboard numbers will go up for users running code_search in default mode and code_list; the underlying static estimates documented in BASELINES are now closer to what those tools actually save.

v0.4.0

2026-04-29
Measured token-savings + tighter MCP surface

Two changes that move the savings dashboard from a defensible estimate to an auditable measurement, and trim two operator-only tools off the agent's MCP surface.

Measured per-call baselines. Eight tools now compute their "what Read+grep would have cost" figure from real bytes touched on the call, not a hard-coded constant. The dashboard sums those measurements into the per-day rollup; recon savings show reflects the same numbers locally.

Honest dashboard numbers. Pre-v0.4 static baselines were conservative-by-design over-estimates. The measured numbers will be smaller for narrow / cheap calls and larger for wide regex queries — closer to what the agent's alternative actually would have cost. Disclaimer copy on the Savings tab updated to reflect which tools are measured vs estimated.

MCP surface trimmed: 20 → 18 tools. code_stats and code_savings dropped their #[tool(...)] registrations — they're operator diagnostics, not exploration tools, and exposing them via MCP encouraged agents to introspect their own savings instead of doing the user's task. Both are still reachable via recon stats and recon savings show in the CLI; the dashboard surfaces the same data for end users.

Schema simplification. The dual-baseline machinery from the v0.3.x telemetry code shrunk to two columns (static_baseline_tokens, measured_baseline_tokens); each call accrues exactly one. The legacy baseline_tokens column was renamed in migration 0011_usage_rollups_measured.sql; CLI/worker/dashboard ship in lockstep, no back-compat shims.

Tests: 8 new per-tool integration assertions (every migrated tool credits the measured counter, static stays at 0); static_only_tools_stay_on_static_baseline proves the unmigrated 10 keep their static credit; bench in crates/recon-search/benches/search_bench.rs demonstrates the byte-budget mitigation bounds the worst-case latency.

Browse the 18-tool surface →

v0.3.1

2026-04-28
Multi-language parity + token-savings telemetry

The two blockers between v0.3.0 and "I'll buy this" closed in one release: multi-language parser parity and visible token-savings telemetry.

Multi-language parity. All five non-Rust extractors now walk function/method/class/struct bodies and emit identifier refs from a proper identifier arm. The reference graph is now meaningfully populated for every supported language; code_path, code_callers, code_callees, code_context, code_impact, and code_subsystems all work cross-language.

Token-savings counter. recon now tracks per-tool calls, response token estimates, and a baseline "what Read+Grep would have cost" figure. The difference is the tokens-saved number you see in code_savings and the telemetry block on code_stats.

Tests: 482 across the workspace. Multi-language regression tests in recon-parser::extract::tests assert non-empty refs per language; telemetry_persists_across_server_restarts proves lifetime counters survive a clean shutdown/restart cycle.

v0.3.0

2026-04-28
Graph-traversal tools

Seven new tools that turn the symbol reference graph into a first-class navigation surface — replacing chained code_find_refs walks with a single bounded BFS.

Engineered alongside: a forward + reverse CSR call graph cached on the server (built lazily on first graph-tool call after each reindex), invalidated by the watcher alongside cached_symbols / cached_refs. Latency: code_path typically < 5 ms on real repos.

Also fixed: a parser/storage parser-local-id mismatch that caused refs in every file after the first to point at the wrong global symbol — invisible in single-file unit tests, broken in real multi-file workspaces.

Browse the new tool surface →

v0.2.4

2026-04-27
Patch

v0.2.3

2026-04-26
Patch

v0.2.2

2026-04-22
Release

v0.2.1

2026-04-15
Release

v0.2.0

2026-04-10
Server-side repo enforcement

v0.1.1

2026-03-22
Patch

v0.1.0

2026-03-12
Initial release

The first public cut. Twelve MCP tools, nine languages, one small signed Rust binary.