release: v0.7.2 (#301)

Patch release over v0.7.1: write-path latency reductions (#288 direct table
opener, #298 schema-once + open-each-table-once) and three correctness fixes on
the maintenance and recovery paths (#297 optimize survives a cross-process write
race, #291 optimize compacts the internal metadata tables + non-destructive
auto_cleanup strip, #296 recovery converges under a concurrent manifest advance).
No breaking changes, no on-disk format change, no migration.

Version coherence: all 7 crate manifests + path-dep constraints, Cargo.lock,
openapi.json, and the AGENTS.md surveyed version bumped 0.7.1 -> 0.7.2. Build
green under --locked; OpenAPI drift check green.
This commit is contained in:
Ragnor Comerford 2026-06-25 09:08:12 +02:00 committed by GitHub
parent 4a5277b9c0
commit b6c19bfa5d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 94 additions and 34 deletions

View file

@ -16,7 +16,7 @@ Tools that support `@`-imports (Claude Code) auto-include all three files via th
`CLAUDE.md` is a symlink to this file — there is exactly one source of truth. Edit `AGENTS.md`. `CLAUDE.md` is a symlink to this file — there is exactly one source of truth. Edit `AGENTS.md`.
**Version surveyed:** 0.7.1 **Version surveyed:** 0.7.2
**Workspace crates:** `omnigraph-compiler`, `omnigraph` (engine), `omnigraph-policy`, `omnigraph-api-types` (shared HTTP wire DTOs), `omnigraph-cluster`, `omnigraph-cli`, `omnigraph-server` **Workspace crates:** `omnigraph-compiler`, `omnigraph` (engine), `omnigraph-policy`, `omnigraph-api-types` (shared HTTP wire DTOs), `omnigraph-cluster`, `omnigraph-cli`, `omnigraph-server`
**Storage substrate:** Lance 7.x (columnar, versioned, branchable) **Storage substrate:** Lance 7.x (columnar, versioned, branchable)
**License:** MIT **License:** MIT

14
Cargo.lock generated
View file

@ -4851,7 +4851,7 @@ dependencies = [
[[package]] [[package]]
name = "omnigraph-api-types" name = "omnigraph-api-types"
version = "0.7.1" version = "0.7.2"
dependencies = [ dependencies = [
"omnigraph-compiler", "omnigraph-compiler",
"omnigraph-engine", "omnigraph-engine",
@ -4862,7 +4862,7 @@ dependencies = [
[[package]] [[package]]
name = "omnigraph-cli" name = "omnigraph-cli"
version = "0.7.1" version = "0.7.2"
dependencies = [ dependencies = [
"assert_cmd", "assert_cmd",
"clap", "clap",
@ -4886,7 +4886,7 @@ dependencies = [
[[package]] [[package]]
name = "omnigraph-cluster" name = "omnigraph-cluster"
version = "0.7.1" version = "0.7.2"
dependencies = [ dependencies = [
"fail", "fail",
"omnigraph-compiler", "omnigraph-compiler",
@ -4905,7 +4905,7 @@ dependencies = [
[[package]] [[package]]
name = "omnigraph-compiler" name = "omnigraph-compiler"
version = "0.7.1" version = "0.7.2"
dependencies = [ dependencies = [
"ahash", "ahash",
"arrow-array", "arrow-array",
@ -4924,7 +4924,7 @@ dependencies = [
[[package]] [[package]]
name = "omnigraph-engine" name = "omnigraph-engine"
version = "0.7.1" version = "0.7.2"
dependencies = [ dependencies = [
"arc-swap", "arc-swap",
"arrow-array", "arrow-array",
@ -4968,7 +4968,7 @@ dependencies = [
[[package]] [[package]]
name = "omnigraph-policy" name = "omnigraph-policy"
version = "0.7.1" version = "0.7.2"
dependencies = [ dependencies = [
"cedar-policy", "cedar-policy",
"clap", "clap",
@ -4981,7 +4981,7 @@ dependencies = [
[[package]] [[package]]
name = "omnigraph-server" name = "omnigraph-server"
version = "0.7.1" version = "0.7.2"
dependencies = [ dependencies = [
"arc-swap", "arc-swap",
"async-trait", "async-trait",

View file

@ -1,6 +1,6 @@
[package] [package]
name = "omnigraph-api-types" name = "omnigraph-api-types"
version = "0.7.1" version = "0.7.2"
edition = "2024" edition = "2024"
description = "Shared HTTP wire DTOs for Omnigraph — request/response types and engine-result → DTO mappings used by both omnigraph-server and omnigraph-cli (RFC-009). Plain serde/utoipa types; no transport or server internals." description = "Shared HTTP wire DTOs for Omnigraph — request/response types and engine-result → DTO mappings used by both omnigraph-server and omnigraph-cli (RFC-009). Plain serde/utoipa types; no transport or server internals."
license = "MIT" license = "MIT"
@ -9,8 +9,8 @@ homepage = "https://github.com/ModernRelay/omnigraph"
documentation = "https://docs.rs/omnigraph-api-types" documentation = "https://docs.rs/omnigraph-api-types"
[dependencies] [dependencies]
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" }
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
serde = { workspace = true } serde = { workspace = true }
serde_json = { workspace = true } serde_json = { workspace = true }
utoipa = { workspace = true } utoipa = { workspace = true }

View file

@ -1,6 +1,6 @@
[package] [package]
name = "omnigraph-cli" name = "omnigraph-cli"
version = "0.7.1" version = "0.7.2"
edition = "2024" edition = "2024"
description = "CLI for the Omnigraph graph database." description = "CLI for the Omnigraph graph database."
license = "MIT" license = "MIT"
@ -13,12 +13,12 @@ name = "omnigraph"
path = "src/main.rs" path = "src/main.rs"
[dependencies] [dependencies]
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" }
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.1" } omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.2" }
omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.1" } omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.2" }
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" }
omnigraph-server = { path = "../omnigraph-server", version = "0.7.1" } omnigraph-server = { path = "../omnigraph-server", version = "0.7.2" }
clap = { workspace = true } clap = { workspace = true }
color-eyre = { workspace = true } color-eyre = { workspace = true }
serde = { workspace = true } serde = { workspace = true }

View file

@ -1,6 +1,6 @@
[package] [package]
name = "omnigraph-cluster" name = "omnigraph-cluster"
version = "0.7.1" version = "0.7.2"
edition = "2024" edition = "2024"
description = "Cluster configuration validation, planning, and config-only apply for Omnigraph." description = "Cluster configuration validation, planning, and config-only apply for Omnigraph."
license = "MIT" license = "MIT"
@ -14,8 +14,8 @@ documentation = "https://docs.rs/omnigraph-cluster"
failpoints = ["dep:fail", "fail/failpoints", "omnigraph/failpoints"] failpoints = ["dep:fail", "fail/failpoints", "omnigraph/failpoints"]
[dependencies] [dependencies]
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" }
fail = { workspace = true, optional = true } fail = { workspace = true, optional = true }
serde = { workspace = true } serde = { workspace = true }
serde_json = { workspace = true } serde_json = { workspace = true }

View file

@ -1,6 +1,6 @@
[package] [package]
name = "omnigraph-compiler" name = "omnigraph-compiler"
version = "0.7.1" version = "0.7.2"
edition = "2024" edition = "2024"
description = "Schema/query compiler for Omnigraph. Zero Lance dependency." description = "Schema/query compiler for Omnigraph. Zero Lance dependency."
license = "MIT" license = "MIT"

View file

@ -1,6 +1,6 @@
[package] [package]
name = "omnigraph-policy" name = "omnigraph-policy"
version = "0.7.1" version = "0.7.2"
edition = "2024" edition = "2024"
description = "Policy / authorization layer for Omnigraph — Cedar-backed PolicyEngine, PolicyChecker trait, ResourceScope enum." description = "Policy / authorization layer for Omnigraph — Cedar-backed PolicyEngine, PolicyChecker trait, ResourceScope enum."
license = "MIT" license = "MIT"

View file

@ -1,6 +1,6 @@
[package] [package]
name = "omnigraph-server" name = "omnigraph-server"
version = "0.7.1" version = "0.7.2"
edition = "2024" edition = "2024"
description = "HTTP server for the Omnigraph graph database." description = "HTTP server for the Omnigraph graph database."
license = "MIT" license = "MIT"
@ -19,11 +19,11 @@ default = []
aws = ["dep:aws-config", "dep:aws-sdk-secretsmanager"] aws = ["dep:aws-config", "dep:aws-sdk-secretsmanager"]
[dependencies] [dependencies]
omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.2" }
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" }
omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.1" } omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.2" }
omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.1" } omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.2" }
axum = { workspace = true } axum = { workspace = true }
clap = { workspace = true } clap = { workspace = true }
color-eyre = { workspace = true } color-eyre = { workspace = true }

View file

@ -1,6 +1,6 @@
[package] [package]
name = "omnigraph-engine" name = "omnigraph-engine"
version = "0.7.1" version = "0.7.2"
edition = "2024" edition = "2024"
description = "Runtime engine for the Omnigraph graph database." description = "Runtime engine for the Omnigraph graph database."
license = "MIT" license = "MIT"
@ -16,8 +16,8 @@ default = []
failpoints = ["dep:fail", "fail/failpoints"] failpoints = ["dep:fail", "fail/failpoints"]
[dependencies] [dependencies]
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.2" }
lance = { workspace = true } lance = { workspace = true }
lance-datafusion = { workspace = true } lance-datafusion = { workspace = true }
datafusion = { workspace = true } datafusion = { workspace = true }
@ -52,7 +52,7 @@ chrono = { workspace = true }
arc-swap = { workspace = true } arc-swap = { workspace = true }
[dev-dependencies] [dev-dependencies]
omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.2" }
tokio = { workspace = true } tokio = { workspace = true }
lance-namespace-impls = { workspace = true } lance-namespace-impls = { workspace = true }
lance-io = "7.0.0" lance-io = "7.0.0"

60
docs/releases/v0.7.2.md Normal file
View file

@ -0,0 +1,60 @@
# Omnigraph v0.7.2
A patch release over v0.7.1: write-path latency reductions plus three
correctness fixes on the maintenance and recovery paths. No breaking changes, no
on-disk format change, and no migration — drop-in over v0.7.1.
## Performance
- **Write opens go direct, schema validates once (#288, #298).** Write opens
used to route through the per-table Lance namespace catalog, which re-opened
the dataset just to read its location and re-resolved the latest version on
every table open — an O(commit-depth) double resolution that dominated write
latency on object stores (~70%). Writes now open each touched data table
directly by its manifest-recorded location (Lance's O(1) version-hint path),
validate the schema contract once per write instead of ~4×, and open each
touched table once instead of 4×.
- **`optimize` compacts the internal metadata tables (#291).** `optimize`
previously iterated only node/edge tables, so the internal `__manifest`,
`_graph_commits`, and `_graph_commit_actors` tables accumulated one fragment
per commit and were never compacted — making every write's metadata scan grow
with commit history. `optimize` now compacts all three, so a periodically
optimized long-lived graph keeps its per-write metadata scan flat in history.
## Fixes
- **`optimize` survives a cross-process write race (#297).** A CLI `optimize`
racing a served write on the same table could fail: the in-process write queue
doesn't serialize across processes, so a concurrent insert/delete advancing the
manifest between optimize's compaction and its publish broke the strict
equality CAS. Optimize now reopens-and-replans on a genuine Lance conflict and
fast-forwards its publish monotonically, so a maintenance compaction never
fails a live write. Bounded retry; sustained contention surfaces a loud
conflict rather than dropping work.
- **`optimize` is non-destructive on upgraded graphs (#291).** A graph created by
a pre-0.7.0 binary carries an on-by-default Lance auto-cleanup config; under it,
optimize's compaction commit could fire Lance's version-GC hook and prune
`__manifest`-pinned versions (breaking snapshots and time travel). Optimize now
strips any stale `lance.auto_cleanup.*` config off every table — data and
internal — before its HEAD-advancing commits, so compaction can never GC pinned
versions.
- **Recovery converges instead of failing `open` under a concurrent manifest
advance (#296).** The open-time recovery sweep published its roll-forward at the
sidecar's pinned expected version; if another writer advanced the manifest
during the classify→publish window, the CAS failed and aborted the whole
`Omnigraph::open`. The sweep now treats roll-forward as "the manifest reflects
the sidecar's committed state," not "this sweep won the CAS": on a CAS loss it
re-reads the live manifest and, when the sidecar's intent is already satisfied,
records the recovery and deletes the sidecar idempotently — so a concurrent
advance no longer fails the open. (The destructive roll-back twin still defers
to a cross-process lease, as documented.)
## Upgrade notes
Drop-in over v0.7.1 — no configuration, schema, or data changes. Upgrade the
server and CLI together as usual. Graphs created on v0.7.1 read and write
identically on v0.7.2; the optimize non-destructive fix additionally protects
graphs created by pre-0.7.0 binaries from version GC during compaction.

View file

@ -7,7 +7,7 @@
"name": "MIT", "name": "MIT",
"identifier": "MIT" "identifier": "MIT"
}, },
"version": "0.7.1" "version": "0.7.2"
}, },
"paths": { "paths": {
"/graphs": { "/graphs": {