Special thanks to timkjr for the classifier fix in #180, and to @tecnobrat, whose report in #170 is the origin of most of what shipped here and in v11.6.0.
PATCH release. Two things carry it.
The harvest classifier now honors HARVEST_LLM_PROVIDERS instead of demanding GROQ_API_KEY. That completes #178 — the rewriter half shipped in v11.6.0, the classifier did not, so a deployment pointed at LiteLLM, Ollama, or any other OpenAI-compatible endpoint was still skipping classification silently and still needed the placeholder-key workaround.
And the Claude Code plugin manifest goes to 1.0.2. That bump is what actually delivers the #177 hook fix to anyone who already installed the plugin. v11.6.0 shipped that fix with the manifest still at 1.0.1, and the Marketplace caches the plugin under a version-keyed directory, so no existing install ever re-fetched the hooks. If you installed the plugin before today and your auto-capture is still tagging everything observation, updating to plugin 1.0.2 is what corrects it.
Fixed
- fix(harvest): classifier honors
HARVEST_LLM_PROVIDERS, not justGROQ_API_KEY(#180, timkjr; #178, reported by @tecnobrat in #170).HarvestClassifier._ensure_initializedgated all LLM classification onGROQ_API_KEY, so a provider chain configured throughHARVEST_LLM_PROVIDERSwas ignored and classification was skipped with no warning. The rewriter's provider loading and usability check are now module-level functions inrewriter.py(load_llm_providers,is_usable_provider) that the classifier reuses, so the two cannot drift apart again. The classifier tries the provider chain first through a new OpenAI-compatible call path and falls back to the legacy Groq SDK bridge only when nothing usable is configured, logging which provider resolved. - chore(plugin): bump the Claude Code plugin manifest to 1.0.2. Ships #177 (
fix(hooks): send memory types the server ontology accepts) to installed plugin users. See above. - fix(hooks): stop the worktree guard from minting a branch per session start (#193).
.claude/hooks/worktree_guard.sh— the repo-local dev hook, not the Claude Code plugin — calledprepareunconditionally on everySessionStartfiring and never reclaimed anything, which had accumulated 85 orphanedwt/*branches and 9 abandoned worktrees in one checkout. It now reuses an already-prepared, unused worktree instead of creating another, and garbage-collectswt/*branches that back no worktree and are already merged into the default branch.
Added
- ci(plugin): gate releases on the Claude Code plugin manifest version (#195; #170, reported by @tecnobrat).
scripts/ci/check_plugin_version.shnow runs as a CI job on release changes and fails whenclaude-hooks/changed since the last commit that moved the manifest version. It anchors on the version line rather than on the file, because a metadata-only edit to the manifest would otherwise move the window forward and hide the hook changes before it. This release is the gate's first live run.
Changed
- test(harvest): pin the classifier provider chain and sanitize its log values (#194). Nothing in
tests/harvest/test_classifier.pyconfiguredHARVEST_LLM_PROVIDERS, so the exact case reported in #178 could regress unnoticed. Five cases now hold it. The new provider logging also interpolated provider names and remote response bodies straight into f-strings; all logger calls in the file now use lazy%-style formatting with_sanitize_log_valueon anything from outside. - docs(claude-md): trim
CLAUDE.mdto what a session cannot derive from the repo, and surfaceAUTHORSHIP.md(#192).
Upgrading
pip install --upgrade mcp-memory-service
Docker images are published for this tag as usual. Plugin users should update the plugin so the Marketplace picks up 1.0.2.
Full changelog: https://codeberg.org/doobidoo/mcp-memory-service/src/branch/main/CHANGELOG.md