v0.9.0: Clustering, more embedding backends, critical summary fix
Critical fix: empty session-start injection for large stores
The get_project_summary truncation loop evaluated the original text in its condition, so any store whose summary exceeded the token budget (~30+ entries) silently popped every line and injected an empty summary at session start. Large stores were getting ~0 tokens of memory briefing. Found by measurement (see below); fixed with a regression test.
Topic clustering
Above 8 decisions, get_project_summary groups decisions by their most-frequent shared tag instead of one flat list -- a 59-decision store reads as a dozen topics.
OpenAI-compatible embedding backends
semantic.api: "openai" points the semantic blend at any /v1/embeddings endpoint -- LM Studio, llama.cpp server, or OpenAI itself (api_key_env names the env var holding the key). Ollama stays the default; same fail-safe lexical fallback. nomic task prefixes now apply only to nomic models.
Trust-aware conflict guidance
similar_entries matches now carry each entry's origin, and the guidance states the precedence: user-stated overrides agent-inferred overrides imported.
Token-reduction measurement published
evals/token_reduction.py, run against four real stores: 94-97% reduction on large stores (e.g. 78 entries: ~75k tokens dumped vs ~2k injected), with the by-construction caveat stated in-script. Running this measurement is what caught the empty-injection bug.
Six more MCP clients documented
OpenCode, GitHub Copilot CLI, Antigravity, OpenClaw, Hermes, and pi/oh-my-pi config snippets in the README. The server is standard stdio MCP; only the hooks are Claude Code specific.
136 tests passing (5 new). Tool schemas unchanged (2481/2500 token budget). Held-out retrieval eval unchanged.