Skip to content

Realign cross-version refusal assertions with the corrected release map - #386

Open
aaltshuler wants to merge 7 commits into
mainfrom
fix/crossversion-release-line-assertions
Open

Realign cross-version refusal assertions with the corrected release map#386
aaltshuler wants to merge 7 commits into
mainfrom
fix/crossversion-release-line-assertions

Conversation

@aaltshuler

@aaltshuler aaltshuler commented Jul 26, 2026

Copy link
Copy Markdown
Collaborator

What & why

main is red. The post-merge run for #385 failed Test Workspace on
current_v9_refuses_and_rebuilds_genuine_v8_and_v8_refuses_v9.

Not a regression in product behavior — a stale test. #385 deliberately corrected
release_for_internal_schema_version because internal schema stamps v5–v8 never
shipped in any published binary: the format advanced five times inside the single
0.8.1 → 0.9.0 window. They now report 0.9.0-dev rather than naming 0.9.x/0.10.x/
0.11.x/0.12.x lines that will never exist. That change updated migrations.rs,
upgrade.md, and the manifest unit tests, but missed this CLI suite.

Scope: four stale assertions, not one

cell asserted now returns
v4 0.8.x 0.8.x — correct, unchanged
v5 0.9.x 0.9.0-dev
v6 0.10.x 0.9.0-dev
v7 0.11.x 0.9.0-dev
v8 0.12.x 0.9.0-dev

Only v8 turned red because CI builds OMNIGRAPH_V8_BIN for the
immediate-predecessor fence; the v5/v6/v7 seams stay gated on unset absolute
paths and skip. The other three are equally stale and would fire the moment
someone supplies those binaries.

The v5 cell was the sharpest: it asserted 0.9.x, which is exactly what a v9
graph now reports — so a future regression conflating v5 with v9 would have
passed silently. 0.9.0-dev is the exact discriminating string.

Evidence

The expected value is taken from the actual refusal in the failing run, not
guessed:

__manifest is stamped at internal schema v8, but this omnigraph reads only v9. This graph was created by omnigraph 0.9.0-dev. Rebuild it: with an omnigraph 0.9.0-dev binary run ...

Locally all six cells pass, but they take the graceful-skip path (no old binaries
present), so that only proves compilation. I am dispatching Test Workspace on
this branch so the v8 cell runs non-vacuously before merge, rather than
discovering it post-merge a second time.

Note for reviewers

This is the second-order cost of Test Workspace being post-merge-only: #385
passed every PR check and still broke main. Worth considering whether the
cross-version fence — which is cheap once the old binary is cached — belongs in
the PR gate.

Greptile Summary

Realigns the v5–v8 cross-version refusal assertions with the corrected 0.9.0-dev release mapping.

  • Moves the workspace to OmniGraph 0.9.0 and Lance 9.0.0 stable from crates.io.
  • Updates staged-filter behavior tests and the Lance source-audit tripwire for the stable release.
  • Refreshes release, upgrade, testing, RFC, and generated OpenAPI documentation.

Confidence Score: 5/5

The PR appears safe to merge with the corrected cross-version assertions and coordinated release updates.

The changed assertions agree with the updated release mapping, the workspace version and Lance source changes are coordinated across manifests and the lockfile, and no changed-code-triggered failure remains.

Important Files Changed

Filename Overview
crates/omnigraph-cli/tests/crossversion_upgrade.rs Updates all four stale v5–v8 refusal-message assertions to expect the release map’s 0.9.0-dev label.
crates/omnigraph/src/db/manifest/migrations.rs Maps unreleased internal schema versions v5–v8 to 0.9.0-dev, maps v9 to 0.9.x, and updates focused unit coverage.
Cargo.toml Replaces the Lance 9.0.0-rc.1 git pins with consistent crates.io 9.0.0 dependencies.
Cargo.lock Resolves the Lance package family from crates.io and updates workspace package versions without changing the flagged transitive security dependency versions.
crates/omnigraph/src/table_store/staged_tests.rs Updates the staged filtered-scan regression test to assert the corrected Lance 9.0.0 behavior.
docs/releases/v0.9.0.md Adds release notes covering the storage-format boundary, Lance upgrade, and export/import requirement.

Reviews (1): Last reviewed commit: "test: realign cross-version refusal asse..." | Re-trigger Greptile

Lance 9.0.0 shipped stable on 2026-07-24 and every crate this workspace
depends on is published at that version, so the 9.x prerelease git-rev
pin (`v9.0.0-rc.1`, cec0b7df) is retired for ordinary registry version
pins. `Cargo.lock` now carries zero git sources, which restores ordinary
publishability — the release gate recorded in docs/dev/versioning.md.

The delta is 35 commits with no file-format or minimum-reader-version
movement: OmniGraph still writes explicit stable V2_2, and every MemWAL
format-bearing file is byte-identical to the rc.1 rev. Dependency floors
are unchanged (Arrow 58, DataFusion 54, object_store 0.13.2, roaring
0.11.4, Rust 1.91+).

Includes the engine's `lance-io` test dependency, which carried the same
rev pin.
Lance 9.0.0 fixed the documented limitation that a `Some(filter)`
`scan_with_staged` silently dropped matching *staged* rows: stats-based
pruning discarded uncommitted fragments because they lack the per-column
statistics committed fragments carry, and `use_stats(false)` did not
bypass it.

The pin for that limitation carried an explicit instruction to rewrite
it if Lance ever scanned uncommitted fragments without stats-based
pruning. It did, so the assertion becomes the correct semantics and the
test is renamed to describe them.

Production was unaffected in both directions: no production caller
passes a filter to `scan_with_staged`, and read-your-writes goes through
`MutationStaging`'s in-memory union via DataFusion `MemTable`.
Gate R0's tripwire asserted the exact git rev in `Cargo.lock` so the
source audit could not silently outlive the source it surveyed. The
crates.io move retires that rev, so the tripwire now pins the released
version across the whole Lance package family — with the two
Arrow-versioned members (`lance-arrow-scalar`, `lance-arrow-stats`)
carrying their own surveyed version — and additionally refuses any
return to a git source.

Purpose unchanged, and verified non-vacuous: faking a version move fails
the assertion. The underlying RC.1 no-go facts survive the bump because
the MemWAL flush ordering and system-index files did not change.
Adds the required audit stanza for the bump and demotes the rc.1 stanza
to prior. Records: no storage-format event; the #7769 `ShardWriter::close`
contract change (the pre-registered re-audit item, which needed no code
change because close is never durability evidence here); the fixed
filtered-staged-scan limitation; #7817's extra ranged read with the cost
gates re-run green; #7699's BM25 corpus-statistics change; and that
neither RFC-026 upstream ask landed, so adapter-side containment stays
load-bearing.

Also records the three known gaps taken by choosing 9.0.0 over the v10
beta line — #7704 (stable-row-id filter_deleted_ids), #7868 (flat-KNN
ordering, upstream-Critical), and #7965 (blob compaction misclassifying
an empty blob as NULL, reachable through `omnigraph optimize`) — and
notes that OmniGraph's own blob decoder replicates the same
empty-vs-null misclassification independently, to be fixed on its own
merits.

Rewords the matching close-contract sentences in testing.md and RFC-026,
and updates the substrate line in AGENTS.md.
Moves every published crate manifest, path-dependency constraint,
Cargo.lock, the generated openapi.json `info.version`, and AGENTS.md's
surveyed version from 0.8.1 to 0.9.0.

Corrects the schema-to-release map in the same change, because the bump
makes it wrong. `release_for_internal_schema_version` claimed v5 -> 0.9.x,
v6 -> 0.10.x, v7 -> 0.11.x, v8 -> 0.12.x, v9 -> 0.13.x, but v0.8.1 was
the last published release and it stamped v4 (verified with
`git show v0.8.1:.../migrations.rs`). The format then advanced five times
— RFC-028 identity, RFC-023 key fencing, and the three RFC-026 stream
slices — entirely inside the 0.8.1 -> 0.9.0 development window, so no
release ever stamped v5 through v8 and none ever will.

Left uncorrected, a v9 graph's refusal would have told operators to fetch
an omnigraph 0.13.x binary that will never exist, and a v5 graph's
refusal would have named 0.9.x — the line this release actually occupies.
v5-v8 now report `0.9.0-dev`, which reads correctly in both slots of the
rebuild instruction ("created by omnigraph X" and "with an omnigraph X
binary"); a new assertion pins that grammar. v9 reports 0.9.x.
docs/user/operations/upgrade.md carries the same correction and explains
that those stamps only ever came from source builds.
AGENTS.md's maintenance contract requires a docs/releases/<version>.md
alongside any release-version bump; the 0.8.1 -> 0.9.0 move landed
without one.

Covers the user-visible delta across the whole window, not just the
substrate bump: the Lance 9.0.0 stable move and restored registry
publication, the internal schema v4 -> v9 rebuild requirement (including
why stamps v5-v8 name no published release), stable schema identity
across renames, keyed-write conflict fencing, writer crash recovery,
`branch merge --delete-branch`, release container images, and batched
committed @unique probes.

Behavior changes are called out separately because several are
script-breaking: newest-first commit listings, strict `load --mode
append` on an existing id, per-verb rejection of scope flags that were
previously discarded, registry-scoped `graphs list`, and `GET /commits`
authorizing an omitted branch as main.

Excludes the blob read surface added and then reverted in this window
(#367 / #373) — it is not in the release.
…ease map

The 0.9.0 release bump corrected `release_for_internal_schema_version`:
stamps v5-v8 never shipped in any published binary, so they now report
`0.9.0-dev` instead of naming 0.9.x/0.10.x/0.11.x/0.12.x lines that will
never exist. `migrations.rs`, `upgrade.md`, and the manifest unit tests
were updated with that change; this CLI suite was not.

All four genuine-binary cells asserted the old strings. Only the v8 cell
turned red on the post-merge `main` run because CI builds
`OMNIGRAPH_V8_BIN` for the immediate-predecessor fence while the v5/v6/v7
seams stay gated on unset paths and skip. The other three are equally
stale and would fire the moment someone supplies those binaries.

The expected value is taken from the observed refusal in the failing run:
"This graph was created by omnigraph 0.9.0-dev. Rebuild it: with an
omnigraph 0.9.0-dev binary run `omnigraph export ...`".

Note the v5 cell was the sharpest of the four: it asserted `0.9.x`, which
is what a *v9* graph now reports, so a regression conflating the two
would have passed. `0.9.0-dev` is the exact discriminating string.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant