v0.2.0
Temporal reads grew up in this release: full valid-time history for many-edges, interval-valued answers ("when was", not just "as of"), live-maintained rule verdicts, bounded cold starts via changelog compaction, and a vector index that notices when its quantizers stop fitting the data.
Since v0.1.1:
- Valid time for
many-cardinality elements — each element of amany-predicate carries its own valid-time interval;closeends one element's interval (history stays sliceable), andpoint/expandacceptvalid_atfor as-of reads over both cardinalities. Late-arriving values cannot resurrect an ended element. (D23) timelineop (#203) — the interval form of as-of: the full valid-time timeline of one predicate, or of a value derived through a chain ofone-predicates ({"op":"timeline","subject":1,"hops":["member-of","manager-of"]}→ sorted{value, valid_from, valid_to}segments). Agrees with the point-wisevalid_atcomposition at every instant, by construction. Also an MCP tool.- Changelog compaction (#175) —
POST /compactpersists the full fold state as a snapshot and truncates the covered WAL (old prefix archived). Cold start becomes snapshot-load + tail replay; as-of reads keep answering across the boundary, byte-identically. Measured on a live database: WAL 7.77 MB → 21 B. (D24) - Conformance rule expressiveness (#204) —
distinct_from: a must-differ derived path (a self-approval ban is one line); conditionequalsnow accepts the documented object forms ({"node": N}, …), so rules can be scoped to a subgraph anchor. - Incremental conformance maintenance (#202) —
conformance_watchkeeps a stored rule's verdicts current in O(touched) per write via support-set tracking (one upstream write re-judges exactly the subjects whose derived paths run through it);conformance_changesreturns old→new verdict diffs behind a cursor. Property-tested equal to full re-evaluation after every event; measured 106×–1,812× cheaper than per-poll re-evaluation at 1K–100K subjects. (D26) - Vector index drift detection (#200) — training records a quantizer-fit baseline and every add updates the live fit; rebuilds reuse the trained quantizers (skipping k-means) until the drift ratio or corpus growth says otherwise, and training samples now span the whole corpus instead of the oldest prefix.
/statsexposes the fit numbers. (D25) - Container images carry OCI labels (#193); Docker quickstart leads with the published image.
Details and honest limits: docs/DECISIONS.md D23–D26. API shapes: SPEC.md.
Install: cargo install stromadb · docker run -p 7687:7687 ghcr.io/katsut/stromadb:latest