@@ -7,6 +7,93 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
88## [ Unreleased]
99
10+ ## [ 1.3.0] - 2026-09-07
11+
12+ ** Milvus as an optional index backend, behind a port that hides which one you
13+ run.** The rebuildable BM25/vector index can now live in a remote Milvus Server
14+ or Zilliz Cloud instead of the embedded LanceDB, selected by one setting and
15+ verified at startup. Nothing about the default installation changes: LanceDB
16+ stays the backend, ` pymilvus ` stays an optional extra, and markdown stays the
17+ source of truth — the index is derived either way, so switching backends is a
18+ rebuild, not a migration. Both backends implement the same typed ports, so
19+ cascade, search and ` /get ` never branch on physical storage; a filter is a
20+ backend-neutral predicate tree rather than a rendered SQL string, which is what
21+ lets one set of contract tests hold both adapters to the same behaviour. The
22+ vector metric is now cosine everywhere, which corrects an inconsistency
23+ described under Changed.
24+
25+ ### Added
26+
27+ - ** Optional Milvus derived-index backend.** Install with
28+ ` pip install everos[milvus] ` and select it with:
29+
30+ ``` toml
31+ [index ]
32+ backend = " milvus"
33+
34+ [milvus ]
35+ uri = " http://127.0.0.1:19530" # or a Zilliz Cloud endpoint
36+ token = " " # Zilliz Cloud API key
37+ db_name = " "
38+ consistency_level = " Session" # Strong | Bounded | Session | Eventually
39+ collection_prefix = " everos"
40+ ```
41+
42+ Every field binds to an environment variable
43+ (` EVEROS_INDEX__BACKEND ` , ` EVEROS_MILVUS__URI ` , ...). The seven business
44+ tables are created as ` <collection_prefix>_<kind> ` .
45+
46+ ** Remote Milvus Server or Zilliz Cloud only.** A local database path is
47+ rejected at startup rather than silently accepted: embedded Milvus Lite is
48+ not supported, because its pure-Python rewrite degrades a single query to a
49+ full scan and drops search-time parameters.
50+
51+ Startup verifies the physical collection field by field — datatype, primary
52+ key, nullability, vector dimension, and the index metric (dense ` COSINE ` ,
53+ BM25 output fields) — so a collection that disagrees with the declared schema
54+ fails immediately instead of at the first write or search.
55+
56+ ### Changed
57+
58+ - ** Vector search now uses cosine distance on LanceDB too.** The generic
59+ vector path called ` nearest_to() ` without a distance type, so it ran on
60+ LanceDB's L2 default while ` agent_skill ` recall and every Milvus query
61+ already used cosine. All of them are cosine now. ** Ranking can shift for
62+ existing deployments** — the same vectors are scored by a different metric.
63+ No action is required and no rebuild is involved; the index is unchanged.
64+ - ** everalgo's transitive layer is pinned.** ` everalgo-boundary ` ,
65+ ` everalgo-core ` and ` everalgo-clustering ` are now direct ` == ` dependencies
66+ matching the versions the test suite resolves. The consumer packages declare
67+ them as ` >=0.2.0,<2.0.0 ` , which treats a 0.x line as if only a major bump
68+ could break compatibility, so a fresh resolution could pick releases the
69+ suite had never run against. Raise them deliberately, together with a smoke
70+ run against a PyPI-resolved install — ` make package ` installs the built
71+ wheel with ` --no-deps ` , so it cannot catch a resolution break on its own.
72+
73+ ### Fixed
74+
75+ - ** ` POST /api/v1/memory/add ` no longer fails on a freshly resolved install.**
76+ ` everalgo-boundary ` 0.3.0 added a third required field to the public
77+ ` DetectionResult ` NamedTuple while ` everalgo-agent-memory ` 0.4.0 still built
78+ it with two, so a default (` memorize.mode = "agent" ` ) install answered
79+ `500 TypeError: DetectionResult.__ new__ () missing 1 required positional
80+ argument: 'should_wait'`. Chat mode was unaffected. The pin above resolves
81+ the compatible pair.
82+ - ** Milvus datetime round-trips are exact below the millisecond threshold.**
83+ Timestamps were written in milliseconds but read back through a
84+ seconds-or-milliseconds heuristic, so any instant before 2001-09-09 either
85+ landed in the year 30000 or raised ` ValueError ` . Physical column reads now
86+ use an exact inverse.
87+ - ** Concurrent ` update() ` on the Milvus backend no longer loses writes.** The
88+ read half of the read-modify-write cycle sat outside the write lock, so a
89+ backfill writing ` vector ` and a reflection writing ` deprecated_by ` could
90+ overwrite each other on the same row. Both halves share one lock, and the
91+ silent 10,000-row truncation on that path is gone.
92+ - ** Milvus queries stay inside the engine's result window.** Row scans and
93+ search ` topK ` are bounded by the 16,384-row ceiling instead of requesting
94+ more and failing.
95+
96+
1097## [ 1.2.3] - 2026-08-07
1198
1299** Background maintenance that fails loudly instead of quietly.** A soak run on
@@ -946,7 +1033,7 @@ for AI agents.
9461033- ** Decoupled algorithms** — memory extraction algorithms live in the standalone
9471034 ` everalgo-* ` libraries published on PyPI.
9481035
949- [ Unreleased ] : https://github.com/EverMind-AI/everos/compare/v1.1.4 ...HEAD
1036+ [ Unreleased ] : https://github.com/EverMind-AI/everos/compare/v1.3.0 ...HEAD
9501037[ 1.1.4 ] : https://github.com/EverMind-AI/everos/compare/v1.1.3...v1.1.4
9511038[ 1.1.3 ] : https://github.com/EverMind-AI/everos/compare/v1.1.2...v1.1.3
9521039[ 1.1.2 ] : https://github.com/EverMind-AI/everos/compare/v1.1.1...v1.1.2
0 commit comments