* docs(release): cover #314 stricter validation + #316 linux-arm64 in v0.8.0 notes Two changes landed after the version-bump commit (#313) that wrote the v0.8.0 release notes, so they were undocumented: - #314 unified constraint validation across the loader, mutation, and merge surfaces. Its behavior changes are all stricter (enum enforced on merge, cross-version @unique rejection, precise within-batch vs across-batch dup-key semantics, per-table overwrite validation) and are user-visible, so they get a dedicated section. - #316 added linux-arm64 (aarch64) as a first-class prebuilt target + Homebrew bottle; note the new platform. Also mention the stricter validation in the release intro. Docs-only. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs(release): scope cross-version uniqueness to the write's visible state Greptile P2: the prior wording implied a live-head @unique guarantee, but #314's check is snapshot-scoped (probes the write's pinned base view via the @key/@unique BTREEs), so a concurrent writer committing the same value after the base was opened is not caught — matching the 'full cross-version uniqueness is still a gap' note in docs/dev/invariants.md. Qualify with 'visible to that write'. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6.2 KiB
Omnigraph v0.8.0
This release moves the graph commit lineage into __manifest (RFC-013 Phase 7),
retires the two legacy commit-graph datasets, unifies constraint validation across
every write surface (stricter in a few cases), and surfaces the storage-format
version to operators. It is the first release with an internal-schema change since
v0.4.0, and storage is strict-single-version: there is no in-place migration —
a graph from an older release is rebuilt via export/import. Read the upgrade notes
and the stricter-validation notes before rolling it out.
Graph lineage now lives in __manifest (internal schema v4)
The graph commit DAG (commits, parents, merge parents, per-branch heads, and the
authoring actor) is now stored in __manifest as graph_commit / graph_head
rows, written in the same commit (CAS) as the table-version rows of a graph
publish. Previously the lineage lived in a separate _graph_commits.lance dataset
written after the manifest commit, leaving a narrow window where a crash could land
a manifest version with no matching lineage row. Folding the lineage into the
publish closes that gap by construction: a graph commit and its lineage now land
atomically at one manifest version. The in-memory commit graph is a pure projection
of those manifest rows.
This bumps the __manifest internal schema stamp to v4.
The _graph_commits.lance / _graph_commit_actors.lance tables are retired
With lineage in __manifest and branch authority already on the manifest, the two
legacy commit-graph datasets are no longer created, read, or written. A graph this
release creates has neither. This removes two cold-open directory listings per
graph open and simplifies maintenance (optimize compacts only __manifest among
the internal tables now).
Strict-single-version storage: rebuild via export/import, no in-place migration
Internal schema v4 is a hard version gate, enforced in both directions on every open (read-write and read-only):
- A graph stamped below v4 (created by an older release whose storage format
this binary does not read) is refused with a rebuild-via-export/import
message. There is no in-place upgrade: export the graph with the older binary,
then
omnigraph init+omnigraph loadwith this one. Data, vectors, and blobs are preserved; commit history and branches are not carried over. See the upgrade guide. - A graph stamped above v4 (created by a newer release) is refused with an
upgrade omnigraph before opening this grapherror, so an old binary cannot silently misread a newer format.
This replaces the speculative one-time on-disk migration that earlier drafts of this release described. The rationale (lower long-term liability than carrying in-place migration code for a pre-release format) is in docs/dev/versioning.md.
See the storage-format version
Operators can now read the internal-schema version directly instead of discovering it through a refusal:
omnigraph versionprints aninternal-schema <N>line (the version this binary serves).omnigraph snapshotreports the opened graph's on-diskinternal_schema_version.- The server
GET /healthzresponse includesinternal_schema_version(the binary's served version).
Stricter, unified constraint validation (#314)
Constraint enforcement — value/range/@check, enum, @unique, edge referential
integrity, and cardinality — was previously implemented separately in the bulk
loader, the mutation executor, and the branch-merge path, and had drifted. All three
write surfaces now route through one catalog-derived evaluator, so they can no longer
diverge. The evaluator is delta-scoped (it checks only the change set) and
index-backed (it probes committed state through the @key/@unique/src/dst
BTREEs instead of scanning every catalog table), so a one-row merge opens ~3 data
tables instead of 6+ and validation cost is flat in graph size rather than O(V+E).
The unification closes real gaps. These behavior changes are all stricter — none relax an existing check — so a graph that already satisfies its schema is unaffected, but inputs that previously slipped through are now rejected before the commit:
- Enum constraints are enforced on the merge path (previously a gap: merge
validated
@range/@checkbut not enum). - Cross-version uniqueness is enforced. A write or load whose
@uniquevalue collides with an already-committed different row visible to that write is now rejected. Re-upserting an existing@keystill upserts as before. - Duplicate-key semantics are precise. A
@keythat appears twice as two distinct records within one input batch (e.g. a bulk load listing the same key twice) is rejected; the same id reappearing across batches (e.g. an insert-then-update in one mutation) is coalesced as ordered supersession of one logical row. - Overwrite loads validate per touched table. A table in the overwrite batch is validated against its replacement image (an empty committed view); a table absent from the batch keeps its committed rows, so an edges-only overwrite still resolves referential integrity against the retained nodes.
If an ingestion pipeline unknowingly relied on one of these gaps — a duplicate
@unique value, or an enum violation reaching a branch through merge — it will now
fail loudly at write time. Validate load inputs against the schema before upgrading
if in doubt.
New prebuilt platform: linux-arm64 (#316)
Tagged releases now ship an omnigraph-linux-arm64 (aarch64) archive alongside the
existing Linux x86_64, macOS arm64, and Windows x86_64 builds, and the Homebrew
formula carries a matching on_linux/on_arm bottle. The install script maps
Linux/aarch64 to the new asset, so aarch64 Linux is now a first-class prebuilt
target instead of build-from-source.
Upgrade order
Upgrade every binary that touches a graph to v0.8.0 together. A mixed fleet where an
older binary still writes a graph another has stamped v4 is unsupported, as with any
internal-schema bump. To move a pre-v4 graph forward, follow the
upgrade guide: export with the old binary, then
init + load with v0.8.0.