Changelog#
1.0.0 — 2026-10-08#
The first version meant for other people's data. What it is, and what it is not, in the order a new reader needs them.
What it does#
A Space is a learned comparison environment for one population of objects. It discovers what the properties are, what kind each is, how informative each is, which ones are saying the same thing twice, and what their values mean relative to the population — then answers comparisons and searches against that, with four numbers per answer rather than one: similarity, coverage, score and relatedness.
- No vector per object. Objects are kept as per-property observations, so missing evidence is missing rather than different, and every number can be traced back to the property that produced it.
- Exact search, with pruning that reads only the blocks that can matter: microseconds on millions of objects for a selective query. Approximate search is available for huge free-text vocabularies and says so when used.
- Versioned, immutable artifacts. A change makes a new version; the old one is still there, still answerable, and retention decides how long for.
- One container, CPU only, with the embedding model baked in: no GPU, no network at runtime, data never leaves the deployment.
- A viewer that lays the population out and explains what a group of objects has in common, with every number but the positions exact.
- Authorization: service keys with roles, and short-lived tokens a customer's own application mints for its end users, enforced per object — in a cluster as well as on one machine.
What it is not#
- Not open source. Business Source License 1.1: self-hosting and production use are allowed, offering it to third parties as a hosted service is not, and each version turns Apache-2.0 four years after release.
- Not multi-tenant in its statistics. One Space is learned from every object in it, which is the reason to share one — and it means a restricted caller can still read the shape of the whole population. Where the population itself is the secret, give each tenant its own Space.
- Not highly available. One writer, chosen by you; replicas follow a directory read-only. Nothing elects a leader and nothing fails over.
- Not audited. No record of which principal read what.
- Not revocable per token. A token lives minutes and cannot be withdrawn before it expires; its lifetime is the revocation window.
Measured, on the code this release is cut from#
- 468,000 requests over twenty minutes at 400 reads a second against a writer and a replica, with changes, retention, projections and grants running throughout: nothing failed, nothing was shed, and no restricted caller was shown an object it had not been granted. Search p50 0.8 ms, p99 3.9 ms.
- CI runs the suite on x86-64 and arm64, with clippy as an error, the scalar fallback, a build without the embedding model, a daily
cargo auditand a licence check; the AVX2 kernel is exercised on real x86 hardware. - The AVX-VNNI and AVX-512 kernels have still not run anywhere: no machine that has them has run this. They self-check against scalar before use.
Known to be unfinished#
scripts found a read that could answer 500 where a retry was meant, about once in seventy thousand, when retention replaced a shard while it was being read. The dangerous form of that — bytes belonging to another object — was already caught and answered as a retry; the rest is hardened and now answers the same way, but the race itself was never reproduced on demand, so the hardening is reasoned rather than proven.
Two adversarial reviews of the authorization code found eleven and then thirteen ways to count or enumerate objects behind a mask. All are fixed, and the policy that decides what a restricted caller may be told now lives in one table rather than in each handler. That table has not itself been reviewed.