Fixed
- **`auto_index()` routed on the caller's possibly-stale `Criteria.n_vectors`/
`.dim`, not the array's real shape**, contradicting its own documented
contract ("the array wins... the criteria are advisory for routing"). Only
the *built index's* `dim` came from the array; the routing decision itself
(which backend gets picked) ran on the un-corrected criteria first —
`raw_memory_gb()` is `n_vectors * dim`, feeding the tight-memory rules, so a
wrong `dim` could silently route to the wrong backend. Now reconciles
`criteria` against `vectors.shape` before routing.
- **Tests**: `test_backend_lifecycle[annoy]` could hard-fail with a confusing
"recall10=0.000" on a machine where `annoy`'s native extension is
importable but returns wrong results (observed on Python 3.13; annoy is
unmaintained upstream, no official 3.13 support). Added a direct
self-check of the installed extension before running the recall test, and
skip with a clear reason when it fails — same treatment as the existing
pgvector-needs-a-live-server skip. Not an ann-router bug: verified with a
raw, ann-router-independent repro against the bare `annoy` package.
Documentation
- **README.md/LISEZMOI.md** opened by using "vector," "ANN," and "engine"
before ever grounding what a vector actually is in this context. Reordered
so the concrete explanation (turning a photo, sentence, or product into a
list of numbers, similar things landing close together, why approximate
search is needed at scale) comes first, then the router framing. Also
glossed "RAG," used but never explained anywhere in the file.
- Removed the em dash used as a title/subtitle separator and as a
mid-sentence aside from every module-opening docstring (25 files), per
this project's writing charter; no meaning change. Fixed a stray French
word ("brique") left in `ann_router/__init__.py`'s English docstring.