v1.2.0 — fast when it's full, honest when it's empty
Two things a memory does badly as it fills up, fixed independently — plus one addition.
Speed at size
At 12,500 memories a recall cost 380ms and opening a session cost 606ms. Neither was doing too much work; both were doing the same work the slow way. Similarity search compared the query against every stored vector one at a time in Python, and the supersede chain that brief walks fifteen times had no index on the column it walks.
| before | after | |
|---|---|---|
recall |
380 ms | 27 ms |
brief (session open) |
606 ms | 18 ms |
The search is still exact — every vector scored, nothing approximated, no ANN index introduced — and what comes back is unchanged, verified rank-for-rank against the full golden set rather than assumed. Nothing is cached between calls, so a memory written a moment ago is still visible to the very next recall.
Existing stores need no migration step and nothing to run: the new index appears on the next open.
An honest "nothing relevant"
Asked how tall a mountain is or how long to boil an egg, recall could still claim it had an answer — because a note in the store happened to reuse one common word from the question.
Every signal the abstention gate had was a magnitude, and a magnitude cannot separate "this answers the question" from "this contains that word": one accidental word in a short note outweighs several real ones in a long one. The gate now also counts how many distinct meaningful words the question and the candidate answer actually agree on, because a real answer agrees about several things and a coincidence agrees about one.
Twenty ordinary out-of-store questions leaked six before this and none after, on two stores of different shape and size, with no question the store can answer falling silent.
Added
projects— the project labels in a store, their row counts, and which of them are spellings of one project.projects --normalizeproposes the fold and changes nothing;--applywrites it. Propose-not-dispose: deciding two labels mean one project is the owner's call.
Changed
- Declaring a project in a prompt now reports its canonical name rather than the words typed, so a project has one name however you reach for it. This is what lets an alias carry a spelling a directory name cannot hold.
Known limit
The abstention gate's stopword list is English-only, and the default embedder is English-derived already. On a non-English store the gate becomes more permissive, not more silent.
987 tests. Full detail in CHANGELOG.md.