Fixed
Milvus backend's similarity_score is now normalized to [0, 1], matching pgvector/weaviate's convention.
Milvus with metric_type="COSINE" returns raw cosine similarity in the field it labels "distance" - verified against Milvus's own documentation, this was already correctly ordered (higher = more similar), not backwards, but its range was inconsistent: raw cosine similarity spans [-1, 1], while pgvector and weaviate_backend.py already normalize to [0, 1]. A caller filtering on similarity_score (e.g. score > 0.5) would behave correctly for those two backends but break silently for Milvus's negative scores.
Fixed via the standard (x + 1) / 2 linear transform - preserves exact ranking order, adds consistent range.
New regression test (test_search_dense_normalizes_cosine_similarity_to_unit_range) confirms the transform at all three boundaries (identical/orthogonal/opposite vectors -> 1.0/0.5/0.0).
Breaking change note: this changes real output values for anyone depending on Milvus's previous raw [-1, 1] scores. Acceptable pre-1.0; this inconsistency was already a documented, known limitation rather than a silent surprise.
Full 245-test suite passes. Published to PyPI, verified via the version-specific JSON endpoint.
See CHANGELOG.md for full detail.