chore: release witan-core 0.18.0 and revert omnigraph to 0.9.0 - #233
Merged
Conversation
Two things that belong in one commit because the revert has to be in the released version: the predictive write gate ships, and the 0.10.0 edge experiment ends. ── THE REVERT: 0.10.0 HALVED THE WRITE CEILING ── #231 pinned the upstream `edge` build to measure its effect on the write ceiling. That is the measurement, and the sign is wrong. Same probe, same cluster, same actor, same evening: 0.9.0 8 writers PASS — 8 acked, 0 indeterminate, readers clean 0.10.0 8 writers FAIL x6 consecutive runs, 2 to 8 of 8 indeterminate, every reader degraded in every run 0.10.0 4 writers PASS x2 — clean ★ THE CLEAN POINT MOVED FROM 8 TO 4. Higher loads are the same story, worse: 12w → 10 of 12 indeterminate, 16w → 10 of 16, 24w → 19 of 24 with the pod log showing all 24 handlers `"outcome": "ok"` — every one of those writes committed while its caller was told it failed. 0.10.0 also produces a shape 0.9.0 never did: a few genuine server-side errors, ~7ms, on `task_get` and `memory_store` at the same instant. Small in number and not the main effect, but new. Mutual exclusion is unaffected — probe A passed at every load on both builds, exactly one `claimed: true` and every loser a structured refusal. What changed is the write path's capacity, not its correctness. ★ NOTHING IN 0.10.0 WAS AIMED AT OUR PROBLEM ANYWAY. The two upstream changes that address the indeterminate write — cancellation shielding and the async job API — are not in it; the first was closed 2026-08-13 as superseded by RFC-035 (#498), which with RFC-034 (#496) and RFC-036 (#499) is an open design document. So this build was carrying a measured regression in exchange for nothing, on an unreleased binary off upstream main. Reverting is as cheap as the upgrade was, for the same reason: storage format 6 is unchanged in both directions, so this is a binary swap against the same store with no migration. Verified by building the fetch stage — the pinned v0.9.0 digests produce `omnigraph 0.9.0`. WEAKNESS TO CARRY: the 0.9.0 side is ONE run at 8 writers against six on 0.10.0. Six consecutive failures where 0.9.0 was clean is strong, but the clean baseline is not itself replicated. Re-run 8w a few times on 0.9.0 before concluding anything upstream. ── THE RELEASE: witan-core 0.18.0 ── The predictive write gate (#232). The gate previously bounded concurrency and the wait for a slot, and neither predicts how long the work takes once admitted — so it let through exactly the writes that strand. It now measures what an admitted write costs per graph and refuses when that no longer fits the call's remaining budget. This does not raise the ceiling; it converts the writes that cannot succeed into a clean pre-send refusal instead of an indeterminate outcome. Refs tk-the-write-gate-is-sized-against-a-3-45s-solo-wri-73fc2b Memory: les-omnigraph-0-10-0-edge-looks-worse-than-0-9-0-on--ef8f5d Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JYb9sMjetD9Nxjf24Aw3m5
Contributor
There was a problem hiding this comment.
Pull request overview
Releases witan-core 0.18.0 and restores the stable OmniGraph 0.9.0 binary after the edge-build performance experiment.
Changes:
- Updates
witan-corerelease metadata and changelog. - Reverts OmniGraph version, release tag, and checksums consistently across installer and images.
- Preserves storage format compatibility without migration.
Reviewed changes
Copilot reviewed 5 out of 6 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
uv.lock |
Records witan-core 0.18.0. |
packages/witan-core/witan_core/omnigraph_install.py |
Restores OmniGraph 0.9.0 installer pins. |
packages/witan-core/pyproject.toml |
Bumps package and release-tool versions. |
packages/witan-core/CHANGELOG.md |
Documents predictive write admission. |
docker/witan.Dockerfile |
Restores OmniGraph 0.9.0 in the MCP image. |
docker/omnigraph-server.Dockerfile |
Restores OmniGraph 0.9.0 in the data-tier image. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What are the relevant tickets?
tk-the-write-gate-is-sized-against-a-3-45s-solo-wri-73fc2b, underwp-witan-multi-user-service-deployment-dcf6ee. Findings recorded inles-omnigraph-0-10-0-edge-looks-worse-than-0-9-0-on--ef8f5d.Ends the experiment opened by #231 and releases the gate work from #232.
Description (What does it do?)
Two things in one commit, because the revert has to be in the released version.
1. Revert omnigraph 0.10.0 edge → v0.9.0
#231 pinned the upstream
edgebuild specifically to measure its effect on the write ceiling. That measurement is now in, across several runs, and the sign is wrong.Same probe, same cluster, same actor, same evening:
The clean point moved from 8 to 4 — the ceiling roughly halved. Higher loads are the same story, worse: 12w → 10 of 12 indeterminate, 16w → 10 of 16, 24w → 19 of 24 with the pod log showing all 24 handlers
"outcome": "ok". Every one of those committed while its caller was told it failed.0.10.0 also produces a shape 0.9.0 never did — a few genuine server-side errors, ~7ms, on
task_getandmemory_storeat the same instant. Small in number, not the main effect, but new.Mutual exclusion is unaffected. Probe A passed at every load on both builds: exactly one
claimed: true, every loser a structured refusal, zero errors. What changed is the write path's capacity, not its correctness.And nothing in 0.10.0 was aimed at our problem anyway. The two upstream changes that address the indeterminate write — cancellation shielding and the async job API — are not in it. The first was closed on 2026-08-13 as superseded by RFC-035 (#498), which along with RFC-034 (#496) and RFC-036 (#499) is an open design document. So this build was carrying a measured regression in exchange for nothing, on an unreleased binary off upstream main.
The 0.9.0 side is one run at 8 writers against six on 0.10.0. Six consecutive failures where 0.9.0 was clean is strong evidence, but the clean baseline is not itself replicated. Re-running 8w a few times on 0.9.0 would close that, and is the thing to do before concluding anything upstream.
2. Release witan-core 0.18.0
The predictive write gate (#232). The gate previously bounded concurrency and the wait for a slot, and neither predicts how long the work takes once admitted — so it let through exactly the writes that strand. It now measures what an admitted write costs per graph and refuses when that no longer fits the call's remaining budget.
This does not raise the ceiling. It converts the writes that cannot succeed into a clean pre-send refusal instead of an indeterminate outcome.
How has this been tested?
just check-omnigraph-pins→omnigraph pins agree: 0.9.0 (tag v0.9.0, sha 507a36f385be…)just check-omnigraph-format→omnigraph 0.9.0 reads storage format 6, as declared.just check-versions→ consistent across 5 packagesomnigraph 0.9.0, confirming the v0.9.0 digests are correct before they reach the pipelinewitan-core478 passed,witan-council785 passed,witan-code516 passedprekcleanThe revert is as cheap as the upgrade was, for the same reason: storage format 6 is unchanged in both directions, so it is a binary swap against the same store with no migration and no rebuild.
Deploy note
Merging rebuilds the
omnigraph-serverimage and CI's Pulumi deploy triggers on the fresh build, restarting the data tier automatically — the same path #231 took. Concourse polls rather than being triggered by the merge, so expect roughly half an hour before the image appears.Worth doing once it lands: re-run 8w on 0.9.0 a few times to replicate the clean baseline, then re-measure the new gate, whose expected shape is
WriteQueueFullrefusals replacing the indeterminate writes.Does this change require a change to documentation?
No.