From 2e8e034c19585ccdebb5f107c92e8b3d77c94463 Mon Sep 17 00:00:00 2001 From: aaltshuler Date: Mon, 6 Jul 2026 22:19:01 +0300 Subject: [PATCH] release: v0.8.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Version bump across all seven workspace crates + path-dep constraints, Cargo.lock, openapi.json, and the AGENTS.md surveyed version (also restores the RFC-process row in the topic index that was dropped during branch juggling). Release notes: docs/releases/v0.8.1.md. Channel note: crates.io publication is deferred for this release — the substrate is a rev-pinned Lance pre-release (git dependency), which published crates cannot reference. publish-crates.yml gains a self-healing guard that skips cleanly while the pin is a git dep and resumes automatically when the dependency returns to a registry version (Lance 9.0.0 stable → v0.9.0); a workflow_dispatch catch-up can then publish any skipped tag. Binaries, Homebrew, and the installer ship normally via release.yml. --- .github/workflows/publish-crates.yml | 15 ++++ AGENTS.md | 3 +- Cargo.lock | 14 ++-- crates/omnigraph-api-types/Cargo.toml | 6 +- crates/omnigraph-cli/Cargo.toml | 14 ++-- crates/omnigraph-cluster/Cargo.toml | 6 +- crates/omnigraph-compiler/Cargo.toml | 2 +- crates/omnigraph-policy/Cargo.toml | 2 +- crates/omnigraph-server/Cargo.toml | 12 ++-- crates/omnigraph/Cargo.toml | 8 +-- docs/releases/v0.8.1.md | 98 +++++++++++++++++++++++++++ openapi.json | 2 +- 12 files changed, 148 insertions(+), 34 deletions(-) create mode 100644 docs/releases/v0.8.1.md diff --git a/.github/workflows/publish-crates.yml b/.github/workflows/publish-crates.yml index 4fac9418..632b2fce 100644 --- a/.github/workflows/publish-crates.yml +++ b/.github/workflows/publish-crates.yml @@ -36,6 +36,7 @@ jobs: echo "CARGO_REGISTRY_TOKEN is not set; skipping crates.io publish." echo "CARGO_PUBLISH_SKIP=1" >> "$GITHUB_ENV" + - name: Resolve ref if: env.CARGO_PUBLISH_SKIP != '1' id: ref @@ -50,6 +51,20 @@ jobs: with: ref: ${{ steps.ref.outputs.ref }} + # crates.io rejects git dependencies, so while the storage substrate is + # rev-pinned to a Lance pre-release (git dep in the workspace manifest) + # registry publication is deliberately deferred — binaries/Homebrew still + # ship from release.yml. This self-heals: the step stops matching the + # moment the dependency returns to a crates.io version (Lance 9 stable), + # and a workflow_dispatch catch-up run can then publish the skipped tag. + - name: Skip while the storage substrate is git-pinned + if: env.CARGO_PUBLISH_SKIP != '1' + run: | + if grep -qE '^lance = \{ git' Cargo.toml; then + echo "lance is git-pinned (pre-release substrate); deferring crates.io publish for this tag." + echo "CARGO_PUBLISH_SKIP=1" >> "$GITHUB_ENV" + fi + - name: Install Linux dependencies if: env.CARGO_PUBLISH_SKIP != '1' run: | diff --git a/AGENTS.md b/AGENTS.md index 8b50eb80..73f177b3 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.8.0 +**Version surveyed:** 0.8.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 9.x (columnar, versioned, branchable; 9.0.0-beta.15 git-rev pin until 9.0.0 stable) **License:** MIT @@ -106,6 +106,7 @@ Full diagram and concurrency model: [docs/dev/architecture.md](docs/dev/architec | CI / release workflows | [docs/dev/ci.md](docs/dev/ci.md) | | Branch protection policy (declarative, applied via `scripts/apply-branch-protection.sh`) | [docs/dev/branch-protection.md](docs/dev/branch-protection.md) | | Constants & tunables cheat sheet | [docs/user/reference/constants.md](docs/user/reference/constants.md) | +| RFC process — public contribution track (substantial / irreversible changes) | [docs/rfcs/README.md](docs/rfcs/README.md) | | Per-version release notes | [docs/releases/](docs/releases/) | --- diff --git a/Cargo.lock b/Cargo.lock index 4ae5efcc..aee2ff62 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4962,7 +4962,7 @@ dependencies = [ [[package]] name = "omnigraph-api-types" -version = "0.8.0" +version = "0.8.1" dependencies = [ "omnigraph-compiler", "omnigraph-engine", @@ -4973,7 +4973,7 @@ dependencies = [ [[package]] name = "omnigraph-cli" -version = "0.8.0" +version = "0.8.1" dependencies = [ "assert_cmd", "clap", @@ -4997,7 +4997,7 @@ dependencies = [ [[package]] name = "omnigraph-cluster" -version = "0.8.0" +version = "0.8.1" dependencies = [ "fail", "omnigraph-compiler", @@ -5016,7 +5016,7 @@ dependencies = [ [[package]] name = "omnigraph-compiler" -version = "0.8.0" +version = "0.8.1" dependencies = [ "ahash", "arrow-array", @@ -5035,7 +5035,7 @@ dependencies = [ [[package]] name = "omnigraph-engine" -version = "0.8.0" +version = "0.8.1" dependencies = [ "arc-swap", "arrow-array", @@ -5082,7 +5082,7 @@ dependencies = [ [[package]] name = "omnigraph-policy" -version = "0.8.0" +version = "0.8.1" dependencies = [ "cedar-policy", "clap", @@ -5095,7 +5095,7 @@ dependencies = [ [[package]] name = "omnigraph-server" -version = "0.8.0" +version = "0.8.1" dependencies = [ "arc-swap", "async-trait", diff --git a/crates/omnigraph-api-types/Cargo.toml b/crates/omnigraph-api-types/Cargo.toml index 7157524a..114c2401 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.8.0" +version = "0.8.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.8.0" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.0" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.8.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.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 afed02ee..f8b7a2ad 100644 --- a/crates/omnigraph-cli/Cargo.toml +++ b/crates/omnigraph-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-cli" -version = "0.8.0" +version = "0.8.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.8.0" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.0" } -omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.8.0" } -omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.8.0" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.8.0" } -omnigraph-server = { path = "../omnigraph-server", version = "0.8.0" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.8.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.1" } +omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.8.1" } +omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.8.1" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.8.1" } +omnigraph-server = { path = "../omnigraph-server", version = "0.8.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 2ad384ef..fadac791 100644 --- a/crates/omnigraph-cluster/Cargo.toml +++ b/crates/omnigraph-cluster/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-cluster" -version = "0.8.0" +version = "0.8.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.8.0" } -omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.8.0" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.1" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.8.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 26fce161..0247baa3 100644 --- a/crates/omnigraph-compiler/Cargo.toml +++ b/crates/omnigraph-compiler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-compiler" -version = "0.8.0" +version = "0.8.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 93a96bce..d0e4f111 100644 --- a/crates/omnigraph-policy/Cargo.toml +++ b/crates/omnigraph-policy/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-policy" -version = "0.8.0" +version = "0.8.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 d768d6bd..5de77321 100644 --- a/crates/omnigraph-server/Cargo.toml +++ b/crates/omnigraph-server/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-server" -version = "0.8.0" +version = "0.8.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.8.0" } -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.0" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.8.0" } -omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.8.0" } -omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.8.0" } +omnigraph = { package = "omnigraph-engine", path = "../omnigraph", version = "0.8.1" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.1" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.8.1" } +omnigraph-api-types = { path = "../omnigraph-api-types", version = "0.8.1" } +omnigraph-cluster = { path = "../omnigraph-cluster", version = "0.8.1" } axum = { workspace = true } clap = { workspace = true } color-eyre = { workspace = true } diff --git a/crates/omnigraph/Cargo.toml b/crates/omnigraph/Cargo.toml index 05472ff2..c3b5b17f 100644 --- a/crates/omnigraph/Cargo.toml +++ b/crates/omnigraph/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "omnigraph-engine" -version = "0.8.0" +version = "0.8.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.8.0" } -omnigraph-policy = { path = "../omnigraph-policy", version = "0.8.0" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.1" } +omnigraph-policy = { path = "../omnigraph-policy", version = "0.8.1" } lance = { workspace = true } lance-core = { workspace = true } lance-select = { workspace = true } @@ -54,7 +54,7 @@ chrono = { workspace = true } arc-swap = { workspace = true } [dev-dependencies] -omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.0" } +omnigraph-compiler = { path = "../omnigraph-compiler", version = "0.8.1" } tokio = { workspace = true } lance-namespace-impls = { workspace = true } # test-util gates IoStats.requests + assert_io_eq! (failure diagnostics only); dev-dep, diff --git a/docs/releases/v0.8.1.md b/docs/releases/v0.8.1.md new file mode 100644 index 00000000..a1453830 --- /dev/null +++ b/docs/releases/v0.8.1.md @@ -0,0 +1,98 @@ +# Omnigraph v0.8.1 + +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 + `optimize` on 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 with `nearest()` (or `bm25()`) 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 k` means the + top-k of *matching* rows. Filtered search results will change — they are + now correct. + +- **Undirected edge traversal.** `$a $b` matches 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 {1,3} $b`) and `not { }` ("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` + shows `extend enum`, `apply` touches 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, `optimize` now includes tables with `Blob` properties + — 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-search `AND` semantics were refined + upstream, so `match_text`/`bm25` rankings 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 Lance `Session` attached to write-side opens — the local + merge-scan cost term is now flat in commit history. diff --git a/openapi.json b/openapi.json index 277bf657..df532f35 100644 --- a/openapi.json +++ b/openapi.json @@ -7,7 +7,7 @@ "name": "MIT", "identifier": "MIT" }, - "version": "0.8.0" + "version": "0.8.1" }, "paths": { "/graphs": {