v11.9.0
MINOR release. The headline is a dependency bump that closes two high-severity transformers advisories with no fix anywhere in the 4.x line (#305) — the reason to upgrade if you install the [ml] or [nli] extras. Verifying it needed a CI job that actually installs those extras (#303), and that job promptly earned its keep: it turned up a real quality-system bug where a disabled quality system still built and exported a full ONNX model on its first call, found when it blew pytest's 120s timeout in CI (#316). Everything else this cycle is dependency and test-hygiene follow-through from those two changes, a docs fix, and finally wiring in a dead-reference check that had existed since #702 without ever running once (#314).
Security
- deps: move to transformers 5.x, closing two high-severity advisories (#305). GHSA-29pf-2h5f-8g72 (RCE via
_attn_implementation_internalin a craftedconfig.json, fixed in 5.3.0) and GHSA-fgcw-684q-jj6r (trust_remote_code=Falseoverridden by a nested config on the LightGlue load path, fixed in 5.5.0) — neither advisory has a 4.x patch.[ml]and[nli]now both declaretransformers>=5.5.0,<6.0.0; before this the[ml]extra capped at<5.0.0while[nli]carried a bare>=4.30.0, so an[nli]-only install was already resolving 5.x. Verified against the same selection the new ml-extras job (#303) runs, on both transformers 4.57.6 and 5.15.1: 2347 passed, 63 skipped, 8 deselected, 13 xfailed, 2 xpassed — identical on both. The lock moveshuggingface-hub0.36.0 to 1.28.0 andsafetensors0.4.5 to 0.8.0; torch does not move.
Fixed
- fix(quality): stop a disabled quality system from loading the ONNX ranker (#316, closes #315).
evaluate_quality()andevaluate_quality_batch()return a neutral 0.5 when the quality system is off, but both called_ensure_initialized()before checkingconfig.enabled, soMCP_MEMORY_QUALITY_ENABLED=falsestill paid for a fulltorch.onnx.exportof DeBERTa on the first call. Surfaced as CI noise on an unrelated docs PR (#314), which failed twice on identical content with exactly one test timing out — the twelve green runs before it were the same code getting lucky on timing, since the export path only became reachable in CI once #310 added onnxscript. Three regression tests intests/quality/test_disabled_skips_model_load.pyassert the loader is never invoked while the system is disabled. - fix(quality): let huggingface_hub resolve its own cache (#307, closes #304).
onnx_ranker.pybuilt the model cache path by hand and tooksnapshots[0]from a glob with no ordering or completeness guarantee, so it ignoredHF_HOME/HF_HUB_CACHE(which this project sets itself inoffline_mode.py) and could pick an empty snapshot left behind by an interrupted download. Addressing models by repository id throughhuggingface_hubfixes both;get_onnx_ranker_modelnow resolves through the sameonnx_model_dir()helperONNXRankerModelalready used instead of checkingPath.home()directly. - fix(deps): correct the setuptools bound that keeps milvus-lite importable (#300). The
[milvus]extra'ssetuptools<83; python_version >= '3.13'bound was wrong on both counts:pkg_resourceswas removed in setuptools 82.0.0, not 81 as the comment claimed, and Python 3.12 already ships without setuptools in a fresh venv, so the marker left that case uncovered entirely. One unconditionalsetuptools<82covers both;uv.lockmoves 82.0.1 down to 81.0.0. - deps: put onnxscript in the
[ml]extra (#310).torch.onnx.exportroutes through the dynamo exporter, which importsonnxscript. It was declared only intools/docker/Dockerfile.quality-cpu, so a plainpip install mcp-memory-service[ml]could never perform the export itself and failed withModuleNotFoundError: No module named 'onnxscript'partway through loading the DeBERTa ranker.
Changed
- ci: run the suite once with the
mlandnliextras installed (#303).transformersandsentence-transformershad never been imported in CI, so the quality ranker, the SentenceTransformer embedding path, and anything branching on a real embedding model being present rather than the hash fallback were uncovered by a green build. The job found three pre-existing failures on its first run (next entry) and is what made the transformers 5.x move above verifiable at all. - test(storage): stop the 1024-dim migration tests from passing by accident. Three fixtures ran with the default
strict_dimension_check=Trueand only worked because CI had no embedding model installed; with the ml extras added, a real 384-dimall-MiniLM-L6-v2load trips the dimension guard these tests were never meant to exercise. Set tostrict_dimension_check=False, which is what they actually cover. - test(quality): make the two ONNX tests test what they claim (#309, closes #306). One test's tokenizer call passed a query/document pair as a single tuple where the API expects two separate arguments. The other's fallback-path mock patched
onnx_ranker.get_onnx_ranker_modelthrough thesrc.import prefix, which resolves to a different module object than the oneai_evaluatoractually imports, so the patch never reached the code under test. Also drops six long-xfailed tests intest_lightweight_onnx.pythat mocked an internal code path removed since #307. - test(quality): stop the async-scorer test from exporting a real ONNX model (#319).
test_async_background_scoringused the default evaluator, so with onnxscript installed the worker's first queued item triggered a synchronous, multi-minutetorch.onnx.exportinside an async worker — blocking the event loop badly enough that evenstop()'s own 5swait_forcould not fire, which showed up as another 120s CI timeout. Switched to a disabled evaluator, which since #316 returns a neutral score without loading anything; every assertion in the test is unchanged. - docs: correct the venv Python version and note the missing dev tooling (#302). CLAUDE.md said 3.11 in both places it mentions the venv; it's 3.12. Also documents that a
uv-created.venvcarries runtime dependencies only, with nopipand nopytest— the repair command is now in the same section as the trap. - docs: point contributors at Codeberg, keep security reports on GitHub (#311, reported by FBISiri). CONTRIBUTING.md never mentioned Codeberg once, so a visitor landing on the read-only GitHub mirror had no way to learn where development actually happens; it now opens with that, and a new
.github/PULL_REQUEST_TEMPLATE.mdsays the same in the one place a would-be contributor can't miss it. SECURITY.md's supported-version table still claimed 8.x and 7.x and now reads 11.x only, and both files explain why security reports stay on the GitHub mirror instead of moving to Codeberg too — Forgejo has no confidential-issue or security-advisory feature, so a Codeberg issue is always public. - fix: run the dead-ref check that was never wired up (#314, closes #313).
scripts/ci/check_dead_refs.shhas existed since #702 and was extended twice since, but nothing ever ran it — no Forgejo workflow, no git hook, notpre_pr_check.sh— despite CLAUDE.md telling contributors it catches dead refs in CI. It is now check 6.8 of the pre-PR gate, scoped todocs/andREADME.md. Wiring it into CI itself is tracked separately as #312.
Install: pip install mcp-memory-service==11.9.0 · Docker: doobidoo/mcp-memory-service:11.9.0 (and :11.9.0-slim)