A reliability and features release. The storage substrate moves to Lance
9.0.0-beta.15, adopting two upstream fixes that matter for embedding-heavy
workloads; filtered vector search now applies filters before the search;
schema migration learns enum widening; and the query language gains
undirected edge traversal. The on-disk format is unchanged (internal schema
v4) — v0.8.0 graphs are served as-is, no rebuild.
Channel note: this release ships as binaries, Homebrew, and the
installer. crates.io publication is deferred for one release: the substrate
is pinned to a Lance pre-release, which exists as a git tag rather than a
registry version, and published crates can only reference registry versions.
cargo install users can build the tag directly —
cargo install --git https://github.com/ModernRelay/omnigraph --tag v0.8.1 omnigraph-cli
— or use the installer. Registry publication resumes at v0.9.0 with Lance
9.0.0 stable.
Highlights
-
Storage substrate: Lance 9.0.0-beta.15. The Lance team resolved two
issues upstream that this release adopts (lance#7480, lance#7320); both
could surface on embedding-heavy graphs under routine write-then-maintain
patterns. If you have seen filtered reads fail with a record-batch length
error after refresh-style updates and deletes, or keyed lookups fail after
optimizeon a recently-updated table, upgrading the binary resolves both
— the data on disk was always intact, and no repair step is needed.
The interim vendored patch omnigraph carried for the first issue is
retired now that the fix is upstream. The bump was validated against a
full review of the upstream changes (382 commits) plus the complete local
and CI test matrix, including S3 integration. -
Filtered vector search returns what it should. Combining a
match
filter withnearest()(orbm25()) previously applied the filter after
the ANN top-k, so a selective filter could return far fewer rows than
requested. Filters now apply before the search:limit kmeans the
top-k of matching rows. Filtered search results will change — they are
now correct. -
Undirected edge traversal.
$a <edgeName> $bmatches an edge in either
direction with set semantics (a pair connected both ways appears once), for
same-endpoint-type edges (e.g.Related: Issue -> Issue); asymmetric edges
are rejected at typecheck (T22). Composes with hop bounds
($a <knows>{1,3} $b) andnot { }("no edge in either direction"). One
pattern replaces the query-both-directions-and-merge workaround. -
Enum widening in schema migration. Adding variants to an
enum(...)
property is now a supported, metadata-only migration step —schema plan
showsextend enum,applytouches no table data, and the new variants
are accepted immediately on every write surface. Narrowing, variant
renames, and enum↔String conversions still refuse (OG-MF-106). -
Embedding validation hardened. Non-finite embeddings (NaN/Inf) and
zero vectors are rejected at the client boundary instead of being stored;
the JSONL loader rejects non-numeric vector elements (previously coerced
to 0.0); and forcing the mock embedding provider over an explicitly
configured real one now logs a warning. -
Blob-bearing tables rejoin maintenance. With Lance 9's blob-column
compaction support,optimizenow includes tables withBlobproperties
— fragment reclamation and index folding cover them like any other table. -
Self-service upgrade refusals. Opening a graph from an older storage
format now names the release line that wrote it (e.g. "created by omnigraph
0.6.2 to 0.7.2") and the exact export → init → load commands, instead of
asking the operator to identify the right binary themselves.
Behavior changes
- Filtered
nearest()/bm25()result sets change (see above) — previously
missing results now appear. - New inverted indexes are written in Lance's FTS v2 format (readable by
omnigraph ≥ 0.8.0 binaries), and text-searchANDsemantics were refined
upstream, somatch_text/bm25rankings may shift slightly. - Loads that previously succeeded with non-numeric vector elements or
non-finite embeddings now fail loudly at write time.
Upgrade notes
- No storage-format change. v0.8.0 graphs open unchanged; downgrade to
v0.8.0 remains possible (same internal schema v4). - Upgrading the binary is the complete fix for the two substrate issues
above — no data repair, no rebuild. - The substrate is a rev-pinned Lance pre-release (9.0.0-beta.15), adopted
ahead of the stable release to deliver the fixes above promptly. v0.9.0
moves to Lance 9.0.0 stable.
Developer-facing
- Scenario benchmark harness (
cargo bench -p omnigraph-engine --bench scenarios): cold subprocess runs measuring wall-clock + peak RSS, JSON-line
results with a persistent log — a decision instrument, never a CI gate. - A gated cross-version upgrade test (
OMNIGRAPH_OLD_BIN) proves a genuine
v3-format graph is refused with the release-named message and rebuilds via
the documented path; run on demand, not in CI. - One dataset-open chokepoint (
instrumentation::open_dataset) with the
shared per-graph LanceSessionattached to write-side opens — the local
merge-scan cost term is now flat in commit history.