diff --git a/AGENTS.md b/AGENTS.md index 1772f77..bf60a57 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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`. -**Version surveyed:** 0.7.0 +**Version surveyed:** 0.7.1 **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) **License:** MIT diff --git a/Cargo.lock b/Cargo.lock index 3963da1..7033173 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4851,7 +4851,7 @@ dependencies = [ [[package]] name = "omnigraph-api-types" -version = "0.7.0" +version = "0.7.1" dependencies = [ "omnigraph-compiler", "omnigraph-engine", @@ -4862,7 +4862,7 @@ dependencies = [ [[package]] name = "omnigraph-cli" -version = "0.7.0" +version = "0.7.1" dependencies = [ "assert_cmd", "clap", @@ -4886,7 +4886,7 @@ dependencies = [ [[package]] name = "omnigraph-cluster" -version = "0.7.0" +version = "0.7.1" dependencies = [ "fail", "omnigraph-compiler", @@ -4904,7 +4904,7 @@ dependencies = [ [[package]] name = "omnigraph-compiler" -version = "0.7.0" +version = "0.7.1" dependencies = [ "ahash", "arrow-array", @@ -4923,7 +4923,7 @@ dependencies = [ [[package]] name = "omnigraph-engine" -version = "0.7.0" +version = "0.7.1" dependencies = [ "arc-swap", "arrow-array", @@ -4967,7 +4967,7 @@ dependencies = [ [[package]] name = "omnigraph-policy" -version = "0.7.0" +version = "0.7.1" dependencies = [ "cedar-policy", "clap", @@ -4980,7 +4980,7 @@ dependencies = [ [[package]] name = "omnigraph-server" -version = "0.7.0" +version = "0.7.1" dependencies = [ "arc-swap", "async-trait", diff --git a/crates/omnigraph-api-types/Cargo.toml b/crates/omnigraph-api-types/Cargo.toml index d69d4fe..037edba 100644 --- a/crates/omnigraph-api-types/Cargo.toml +++ b/crates/omnigraph-api-types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-api-types" -version = "0.7.0" +version = "0.7.1" 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." license = "MIT" @@ -9,8 +9,8 @@ homepage = "https://github.com/ModernRelay/omnigraph" documentation = "https://docs.rs/omnigraph-api-types" [dependencies] -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.0" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.0" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } serde = { workspace = true } serde_json = { workspace = true } utoipa = { workspace = true } diff --git a/crates/omnigraph-cli/Cargo.toml b/crates/omnigraph-cli/Cargo.toml index e21b21e..87c42aa 100644 --- a/crates/omnigraph-cli/Cargo.toml +++ b/crates/omnigraph-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-cli" -version = "0.7.0" +version = "0.7.1" edition = "2024" description = "CLI for the Omnigraph graph database." license = "MIT" @@ -13,12 +13,12 @@ name = "omnigraph" path = "src/main.rs" [dependencies] -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.0" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.0" } -omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.0" } -omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.0" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.0" } -omnigraph-server = { path = "../omnigraph-server", version = "0.7.0" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } +omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.1" } +omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.1" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } +omnigraph-server = { path = "../omnigraph-server", version = "0.7.1" } clap = { workspace = true } color-eyre = { workspace = true } serde = { workspace = true } diff --git a/crates/omnigraph-cluster/Cargo.toml b/crates/omnigraph-cluster/Cargo.toml index f0a3a22..119545e 100644 --- a/crates/omnigraph-cluster/Cargo.toml +++ b/crates/omnigraph-cluster/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-cluster" -version = "0.7.0" +version = "0.7.1" edition = "2024" description = "Cluster configuration validation, planning, and config-only apply for Omnigraph." license = "MIT" @@ -14,8 +14,8 @@ documentation = "https://docs.rs/omnigraph-cluster" failpoints = ["dep:fail", "fail/failpoints", "omnigraph/failpoints"] [dependencies] -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.0" } -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.0" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } fail = { workspace = true, optional = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/crates/omnigraph-compiler/Cargo.toml b/crates/omnigraph-compiler/Cargo.toml index 4645b81..13c3bbf 100644 --- a/crates/omnigraph-compiler/Cargo.toml +++ b/crates/omnigraph-compiler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-compiler" -version = "0.7.0" +version = "0.7.1" edition = "2024" description = "Schema/query compiler for Omnigraph. Zero Lance dependency." license = "MIT" diff --git a/crates/omnigraph-policy/Cargo.toml b/crates/omnigraph-policy/Cargo.toml index 907ce07..25bedd1 100644 --- a/crates/omnigraph-policy/Cargo.toml +++ b/crates/omnigraph-policy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-policy" -version = "0.7.0" +version = "0.7.1" edition = "2024" description = "Policy / authorization layer for Omnigraph — Cedar-backed PolicyEngine, PolicyChecker trait, ResourceScope enum." license = "MIT" diff --git a/crates/omnigraph-server/Cargo.toml b/crates/omnigraph-server/Cargo.toml index a6a0717..0f6bcfc 100644 --- a/crates/omnigraph-server/Cargo.toml +++ b/crates/omnigraph-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-server" -version = "0.7.0" +version = "0.7.1" edition = "2024" description = "HTTP server for the Omnigraph graph database." license = "MIT" @@ -19,11 +19,11 @@ default = [] aws = ["dep:aws-config", "dep:aws-sdk-secretsmanager"] [dependencies] -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.0" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.0" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.0" } -omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.0" } -omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.0" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.7.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } +omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.7.1" } +omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.7.1" } axum = { workspace = true } clap = { workspace = true } color-eyre = { workspace = true } diff --git a/crates/omnigraph/Cargo.toml b/crates/omnigraph/Cargo.toml index 55d3008..c830367 100644 --- a/crates/omnigraph/Cargo.toml +++ b/crates/omnigraph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-engine" -version = "0.7.0" +version = "0.7.1" edition = "2024" description = "Runtime engine for the Omnigraph graph database." license = "MIT" @@ -16,8 +16,8 @@ default = [] failpoints = ["dep:fail", "fail/failpoints"] [dependencies] -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.0" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.0" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.7.1" } lance = { workspace = true } lance-datafusion = { workspace = true } datafusion = { workspace = true } @@ -52,7 +52,7 @@ chrono = { workspace = true } arc-swap = { workspace = true } [dev-dependencies] -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.0" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.7.1" } tokio = { workspace = true } lance-namespace-impls = { workspace = true } lance-io = "7.0.0" diff --git a/docs/releases/v0.7.1.md b/docs/releases/v0.7.1.md new file mode 100644 index 0000000..3497261 --- /dev/null +++ b/docs/releases/v0.7.1.md @@ -0,0 +1,67 @@ +# Omnigraph v0.7.1 + +A patch release on top of v0.7.0: three correctness fixes (camelCase filters, +cluster-apply crash loops, branch-merge OOM on embedding tables), one CLI +catalog-metadata improvement, and a warm-read performance fix. No breaking +changes, no on-disk format change, and no migration — drop-in over v0.7.0. + +## Fixes + +- **camelCase property filters now execute (#283).** A query — or a chained + mutation — that filtered on a camelCase schema field (e.g. `repoName`) linted + and planned cleanly but failed at run time with `No field named reponame. + Column names are case sensitive.` The identifier's case was destroyed at two + engine→Lance boundaries: the read-filter pushdown built the column with a + case-normalizing constructor, and the pending-batch mutation scan re-parsed + the predicate through a normalizing SQL context. Both now preserve case (the + read path uses a case-preserving column reference; the pending scan disables + SQL identifier normalization), so camelCase fields work consistently in read + and write predicates and a camelCase `@index` equality still routes to the + scalar index. The fix is correct-by-construction rather than a per-query + guard; a regression test pins index routing so a silent full-scan fallback + can't slip back in. + +- **`cluster apply` no longer crash-loops a booting server (#284).** Applying a + schema change while a graph had non-main (agent/review) branches, or a + migration that needed a backfill, could throw a freshly-booting + `omnigraph-server --cluster` into an unescapable crash loop. Neither input is + an engine bug — the engine rejects both cleanly and before moving any graph + state — but `cluster apply` wrote a recovery sidecar before calling the + engine and left it in place on the clean rejection, and the server refuses to + boot while a sidecar is pending. The asymmetric-cleanup path is fixed so a + pre-movement rejection leaves no stale sidecar, breaking the loop. + +- **Branch-merge fast-forward no longer OOMs on embedding tables (#277).** A + branch→main fast-forward merge of a forked, embedding-bearing table + re-derived the whole branch through a single Lance `merge_insert` — a + full-outer hash join over the entire delta — which exhausted the DataFusion + memory pool on high-dimensional embeddings (e.g. 8k rows × 3072-dim) and hung + or failed the merge. New rows now stream through `stage_append` (no hash + join), only genuinely-changed rows are upserted, embeddings are no longer + stringified to diff them, and index coverage defers to the reconciler, so a + fast-forward merge completes in bounded work. The three-way merge path is + unchanged. + +## Improvements + +- **`omnigraph queries list` surfaces stored-query `@description` / + `@instruction` (#280).** The CLI now shows a stored query's catalog metadata — + what it does and how to invoke it — in both human and `--json` output, + matching what `GET /queries` already returned. Previously both fields were + silently dropped on the CLI side. + +- **Warm reads no longer pay an O(history) metadata tax (#268).** Warm reads + used to re-derive per-query metadata (coordinator re-open, `__manifest` + + commit-graph re-scans, per-table re-open, double schema validation) on a cost + that scaled with commit history and never warmed up. A warm same-branch read + now does one cheap version probe, one schema read, and zero table opens on a + warm repeat (warm coordinator reuse, open-by-location+version, validate-once, + held `Dataset` handles + one shared Lance `Session` per graph). This also + closes a commit-DAG fork where a same-branch write after an external commit + could append off a stale cached head. + +## Upgrade notes + +Drop-in over v0.7.0 — no configuration, schema, or data changes. Upgrade the +server and CLI together as usual. Graphs created on v0.7.0 read and write +identically on v0.7.1. diff --git a/openapi.json b/openapi.json index fb76fae..225a959 100644 --- a/openapi.json +++ b/openapi.json @@ -7,7 +7,7 @@ "name": "MIT", "identifier": "MIT" }, - "version": "0.7.0" + "version": "0.7.1" }, "paths": { "/graphs": {