omnigraph/docs/releases/v0.6.1.md
Ragnor Comerford d54bccb940
Some checks failed
CI / Classify Changes (push) Has been cancelled
CI / Check AGENTS.md Links (push) Has been cancelled
CI / Container Entrypoint (push) Has been cancelled
Release Edge / Prepare edge release (push) Has been cancelled
CI / Test Workspace (push) Has been cancelled
CI / Test omnigraph-server --features aws (push) Has been cancelled
CI / Test Windows release binaries (push) Has been cancelled
CI / RustFS S3 Integration (push) Has been cancelled
Release Edge / Build edge omnigraph-linux-x86_64 (push) Has been cancelled
Release Edge / Build edge omnigraph-macos-arm64 (push) Has been cancelled
Release Edge / Build edge omnigraph-windows-x86_64 (push) Has been cancelled
Release Edge / Smoke Windows installer (push) Has been cancelled
fix(optimize): skip blob-bearing tables to avoid Lance compaction crash (#138)
* test(optimize): pin Lance blob-column compaction failure as a surface guard

Lance compact_files mis-decodes blob-v2 columns under its forced BlobHandling::AllBinary read ("more fields in the schema than provided column indices"), failing even a pristine uniform-V2_2 multi-fragment blob table; reads use descriptor handling and are unaffected.

Guard 10 reproduces this and is self-retiring: it turns red on the Lance bump that fixes the bug, forcing LANCE_SUPPORTS_BLOB_COMPACTION to flip.

* fix(optimize): skip blob-bearing tables instead of crashing compaction

omnigraph optimize aborted the whole sweep when any node/edge table had a Blob property: Lance compact_files cannot decode blob-v2 columns under AllBinary (the column-index error pinned by the surface guard). Skip blob-bearing tables behind a LANCE_SUPPORTS_BLOB_COMPACTION gate and report them via TableOptimizeStats.skipped / SkipReason (surfaced in the CLI and a tracing::warn) instead of erroring, which also isolates the failure so the other tables still compact.

Reads/writes are unaffected; only fragment/space reclamation on blob tables is deferred until the upstream Lance fix. Adds a maintenance.rs regression test (validated red with the column-index symptom before the fix, green after), a concise v0.6.1 release note, and updates docs (maintenance, cli-reference, AGENTS capability matrix, invariants Known Gaps, lance.md audit, constants).

* refactor(optimize): make TableOptimizeStats and SkipReason non_exhaustive

Both are returned result types, never built by callers, so #[non_exhaustive] makes this the last field/variant addition that can break downstream literal construction and keeps future ones non-breaking (review feedback on the public-field addition). The v0.6.1 Compatibility Notes call out the source-level change.

Also drops the now-stale "RED today / GREEN after the fix lands" narration in the optimize_skips_blob_table_and_reports_skip test (historical regression context now that the fix is in this branch), and folds in the expanded v0.6.1 release note.

* chore(release): bump workspace to v0.6.1

Coherent version bump to accompany the v0.6.1 release note: all five crate manifests + path-dependency constraints, Cargo.lock, the AGENTS.md surveyed-version line, and openapi.json info.version move 0.6.0 -> 0.6.1. Matches the established release pattern (#118 landed the v0.6.0 note + bump together) and resolves the Codex/Devin review flag that a v0.6.1 note without a bump leaves CARGO_PKG_VERSION reporting 0.6.0 and mixed package versions.
2026-06-02 17:12:00 +02:00

3.5 KiB

Omnigraph v0.6.1

v0.6.1 focuses on operational polish after v0.6.0: stored-query registries, safer branch cleanup, more complete release artifacts, and a Lance blob-compaction workaround.

Highlights

  • Stored-query registries. omnigraph.yaml can declare curated queries: blocks per graph. Servers load and type-check them at startup, omnigraph queries validate checks them offline, omnigraph queries list shows exposed queries and typed params, GET /queries exposes a typed catalog, and POST /queries/{name} invokes a stored query without accepting ad hoc .gq source from the client.
  • Stored-query policy gate. New Cedar action invoke_query gates the stored-query invocation surface. Stored mutations are double-gated: invoke_query to reach the stored query and change for the actual write.
  • Safer branch deletion. branch_delete now treats the manifest as the authority, flips branch visibility atomically, and reclaims per-table/commit-graph forks as derived state. If best-effort reclaim is interrupted, cleanup reconciles orphaned forks; reusing a branch name before cleanup reports an actionable error.
  • Blob-safe optimize. omnigraph optimize skips tables with Blob properties instead of failing the whole sweep on Lance's blob-v2 compaction decode bug. Skips are visible in human output, --json as skipped, TableOptimizeStats.skipped, and logs; non-blob tables still compact normally.
  • Deployment improvements. The container entrypoint now composes OMNIGRAPH_TARGET_URI with OMNIGRAPH_CONFIG, so operators can keep the graph URI in env while loading policy/query config from a mounted file. The local RustFS bootstrap pins RustFS beta.3 and allows the current insecure local-dev default credentials.
  • Windows release support. Tagged and edge releases now publish Windows x86_64 archives containing omnigraph.exe and omnigraph-server.exe, with a PowerShell installer and Windows install docs.
  • Release tooling. Homebrew formula generation was tightened to produce audit-clean formulas.

Compatibility Notes

  • A graph selected by name (--target or server.graph) now uses graphs.<name>.policy and graphs.<name>.queries. Top-level policy / queries blocks are only for anonymous bare-URI single-graph mode; using them with a named graph now fails loudly with migration guidance.
  • mcp.expose defaults to true for stored-query registry entries. Set mcp: { expose: false } for service-only queries that should not appear in the catalog.
  • invoke_query is graph-scoped, not branch-scoped. Branch/snapshot access remains enforced by the inner read / change gate.
  • Blob tables are not compacted until the upstream Lance fix lands, so fragment count and deleted-row space on blob tables are not reclaimed by optimize. Reads, writes, and query results are unaffected; no on-disk migration is required.
  • TableOptimizeStats is now #[non_exhaustive] and gains a skipped: Option<SkipReason> field (so does the new SkipReason enum). This is a source-level change only for downstream code that built this returned result struct by literal — rare, since it is produced by optimize and consumed by reading its fields; field access is unaffected, and #[non_exhaustive] keeps future additions non-breaking.

Docs And Cleanup

  • Public docs were updated for stored queries, policy, server routes, deployment, Windows installation, branch deletion, maintenance, and the runs docs rename to writes.
  • README copy and release documentation were refreshed; older release notes had small typo/wording fixes.