OmniGraph v0.11.0
Released 2026-09-13.
This release improves branching reliability, query performance, and cluster
operations, with changes to identity fields and result formats.
Before upgrading
Upgrade the CLI, server, and consuming integrations together. Existing
v0.9/v0.10 graphs require an explicit offline storage upgrade. Stop servers,
writers, and maintenance, retain a verified whole-root backup, and run the
check before converting a qualified standalone graph:
omnigraph upgrade ./graph.omni --check --json
omnigraph upgrade ./graph.omni --jsonThe default target is v9, which requires only main and no declared property
names beginning _. To retain branches or legacy system column spellings,
add --to-format 8 to both commands. The binary serves v8 and v9; qualified
conversion retains data and history. Cluster-managed roots and unqualified
inputs refuse conversion. See the upgrade guide
for admission, interrupted upgrades, rollback, and the export/rebuild fallback.
Highlights
- More reliable branches and merges. Fixes stale fast-forward results,
false merge conflicts, failures on unrelated large rows, and reads racing
with branch deletion. Branches remain writable after adopting another
branch's table history. Some failed merges clean up safely without reopening;
ambiguous outcomes still require recovery. - Faster queries and search. Cached catalogs and query compilation speed
up warm reads. Adaptive traversals and adjacency persisted byoptimize
reduce traversal startup work. Bounded BM25/vector scans and selective hybrid
search avoid unnecessary reads; filterednearest()queries widen their
search to fill the limit when enough matches exist. Broadrrf()queries
retain their exhaustive full-text path. - Keyed relationships. Edge declarations support
@key(@src, @dst, ...).
Matching relationships inserted on separate branches converge on merge,
with conflicting non-key values reported explicitly. - Richer GQ. Return whole node objects, project
nearest()distances and
BM25 scores, and usemin/maxwith dates and booleans. Projected search
expressions must match the leading ordering expression. Branch create,
delete, merge, and list are also available as GQ statements through the
canonical query/mutation routes. See queries
and branching. - Better operational visibility.
/readyzreports serving/draining state,
the applied revision it booted from, and served/quarantined counts. Authorized
graph listings identify quarantined graphs. Shutdown has a configurable deadline (25 seconds
by default); set the orchestrator's termination grace longer. See
deployment guide.
cluster observeandcluster plan --observeinspect state without taking
the cluster write lock or changing its ledger.
Compatibility and behavior changes
- Identity fields: GQ uses
@id,@src, and@dst; ordinaryid,src,
anddstcan be user properties on new graphs. New physical system columns
use__id,__src, and__dst;schema show --jsonreports the vintage.
JSONL exports put identity in top-levelid. Move legacydata.idthere
before loading into a new graph, wheredata.idmeans a user property.
Property names beginning_are reserved on new graphs; edge properties
fromandtoremain reserved. - Node results:
return { $p }now returns an object containing@idand
its non-Blob/non-Vector properties. Use$p.@idwhen you need only identity. - JSON values: Query/export rows omit null-valued fields; change images
retain explicit nulls. Dates are strings, UTC DateTime output has no trailing
Z, F32/vector values use 32-bit rendering, and float exponent spelling
changes. Non-finite computed floats becomenull. All integers are JSON
numbers, so JavaScript consumers must handle values beyond safe precision.
Entity Blob values usebase64:or URI spelling. See
JSON result spelling. - Stricter validation: Duplicate result column names, unsupported score
projections, and malformed date values fail explicitly. ADatecannot
contain a time of day. Previously stored out-of-range date counts must be
corrected before affected reads/exports succeed. Traversal fixes cover
self-loop hop counts, repeated variables, and anonymous endpoints. - Ordering and cleanup: Search scores and secondary keys now determine
ranked result order. Unordered traversal limits may select a different valid
subset. Deleting a parent preserves history needed by descendants; explicit
cleanupreclaims unused forks and retired refs.optimizemaintains layout
and indexes without collecting those forks. - Cluster config: Declared relative paths containing
..or traversing
symbolic links are refused. Absolute paths retain their previous behavior. - Rust consumers:
to_sdk_jsonmethods are removed.ReadOutput::rowsand
LegacyReadOutput::rowsnow useBox<serde_json::value::RawValue>. Fields
omitted for nulls needOptionor#[serde(default)]when deserializing. - Interim actor provenance removed: Automatic
OmniActorcreation,
actor_provenanceconfig, and--actor-provenanceflags are withdrawn; commit
attribution remains. Interim schema IR v3 and actor-extended cluster ledgers
are refused. See the compatibility boundary
if you used a development build with this feature.
Kudos to the new contributors: @roy2392 (#594), @mikemikimike (#591).