methodology
How OVM verifies, measures, and broadcasts every release
OVM installs and switches versions of Claude Code, Codex, and Pi — but its real job is judgment: deciding which upstream release is safe to run, measuring the ones that are, and publishing the verdict. This is the whole system. The regression testing that gates a release, the benchmark that rides the same pass, and the public feed that pushes the result are one methodology, not three tools.
- Verify
- Every upstream release is installed and driven through a real tool-use canary — not a
--versioncheck — on macOS and Linux. Only releases that provably run are promoted. - Measure
- Verified releases are benchmarked in the same pass: launch latency, and — in the next dataset — cold vs warm, memory, and energy.
- Broadcast
- Every verdict — verified, benchmarked, or withheld — is published to a public Atom feed with WebSub push, so subscribers hear about a new model the moment it clears.
01Installed is not works
The premise of the whole system: a release that installs cleanly can
still be dead on arrival. Codex 0.144.0 moved command execution into a
sidecar binary. codex --version worked,
login worked, and the first real tool call died — no
such file, every session, on a code path no smoke test exercised.
A version manager that reported "installed, success" would have shipped
it to every user. So OVM does not trust installation; it verifies
execution, then measures, then broadcasts.
02The regression gate
Every new release is held out of the registry until it proves it runs.
The gate is not a fixed check but a growing ledger — each row added in
response to a real failure, with the date it landed and the reason it
exists. ok on any platform admits a version; an
execution-probe fail is a veto that withholds or revokes it
even when it installed and launched cleanly.
| check | added | why it exists |
|---|---|---|
| install + launch | 2026-07-06 | The baseline: a version stays invisible to clients until it installs and launches on at least one platform (per-platform labels). |
| schema diff | 2026-07-06 | Diffs Codex's open-source state/migrations between the previous and new tags — flags added or breaking migrations (a DROP with no same-name recreate) before any data is touched. The one place source is diffed today. |
| tool-use probe | 2026-07-11 | A real command through the OVM launcher; with credentials, a session that must run echo <nonce> | rev and return the reversed nonce. A fail vetoes. Reason: Codex 0.144.0 installed and launched but could not execute a command. |
| strict sidecars | 2026-07-11 | Every helper binary the release ships must be present and spawnable (an asset-manifest baseline lists them). Reason: codex-code-mode-host shipped but wasn't spawnable, killing every session. |
| version swap | 2026-07-17 | Install the new and previous version, then assert ovm use flips the active version both ways. A swap failure vetoes like a probe failure. |
| cliproxyapi | 2026-07-17 | A new managed claudex proxy version installs (checksum-verified) and reports its own version. |
| source diff → review | proposed | Generalize the schema diff: diff the full source between the previous and new tags and have an agent review it for silent behavior or capability changes — across every product, not just Codex migrations. |
The gate is proven both directions as a reproducible pair: one tag ships the pre-fix installer and the probe reddens, so the release never promotes; the next ships the fixed installer and the same release passes. Tags, not assertions.
03The version manager's own suite
Before OVM can be trusted to verify anything, its own code has to be
correct — it moves symlinks, swaps control planes, and downloads
binaries. Roughly 500 unit and integration tests run
beside the source, isolated in throwaway temp directories, never the real
~/.ovm. The hardest paths get adversarial coverage: the
atomic self-update swap is fault-injected at every mutation
stage and must roll back to the exact prior selection; an install owner
killed mid-download is recovered by a second process into exactly one
complete install; checksum, archive-size, and SSRF-redirect attacks are
rejected across every download path; the claudex proxy withholds its key
from any listener whose identity it can't confirm. CI enforces the full
gate on both platforms:
| gate | checks |
|---|---|
| rust | fmt --check · clippy -D warnings · cargo test (macOS + Linux) |
| e2e matrix | installed control plane → shim → plugin → verified proxy → fake Claude |
| scripts | shellcheck · actionlint · bundle, npm, and registry contracts |
| supply chain | gitleaks (full history) · cargo-audit · cargo-deny · macOS code-signature check on every downloaded binary |
| coverage | llvm-cov workspace line floor |
A macOS Gatekeeper sweeper closes the last gap: a binary
that installed cleanly can later be blocked if its Developer ID cert is
revoked, so the sweeper asks the live macOS policy engine
(spctl) every time rather than caching a verdict — a
benchmark never launches something the OS would refuse.
04The benchmark next dataset
Benchmarking is not a separate activity — it is the measurement half of
the same per-release pass, run only on versions that cleared the canary.
Each version is exercised in the same modes: spawn
(--version), interactive (launch → the TUI
accepting input), and response (launch → first real
model answer, with the real MCP config, again with MCP disabled, and — for
products with a faster tier — a fast variant).
The rest of this page describes the next dataset — proposed changes to the benchmark, written for review before the ledgers are reset. The verification system above is what runs today.
05Cold vs warm
The first launch of a freshly installed or re-indexed tool is a different measurement from its steady state; averaging them hides both. Each mode will run four times, with the first kept separate.
reduction
run #1 → cold (first-init) // recorded as *ColdMs
runs #2–4 → warm // *AvgMs (mean) + *StdDevMs
// today, for comparison — the cold run is smeared into the mean:
avg = mean(run#1, run#2, run#3)
This is not cosmetic. Our clean-room harness already showed why: Codex rebuilds a SQLite state index from its rollout files on the first launch after an import or migration — a one-time backfill of ~14 ms per session file, reaching ~25 s at 1,897 files / 6.8 GB. Claude has no separate index, so it is flat even cold. Warm time-to-ready is flat for both regardless of store size (Codex ~570 ms, Claude ~690 ms). Today that finding lives only in the research harness; this puts a cold and a warm number on every release, where a reindex regression would surface first.
06Resource & energy
Latency is half the story. A sampler walks the whole process tree — the tool plus the MCP servers it spawns — during the warm window.
| dimension | fields | how |
|---|---|---|
| memory | peakRssBytes, steadyRssBytes | Peak RSS during boot and idle footprint once ready, summed over the process tree. |
| cpu | cpuUserMs, cpuSysMs, threadCount, openFds | Work done (not wall-clock) plus cheap leak / fork-storm indicators. |
| energy | energyMilliJoules, avg{Cpu,Gpu,Ane}PowerMw | Real on-die power via powermetrics (Apple Silicon), attributed by differencing against an idle baseline. Long modes only. |
| environment | os, arch, hostCpuModel, hostCores, hostRamBytes, loadAvg1 | Makes cross-platform and cross-machine comparison valid; flags a busy runner. |
07The record
One append-only JSONL line per product / version / run. Every new field is optional, so older records stay valid, and the platform is read from the line rather than inferred from which folder it sits in.
HistoryRecord — new fields grouped
// timing — split cold vs warm, per mode
spawnColdMs · spawnAvgMs · spawnStdDevMs
interactiveColdMs · interactiveAvgMs · interactiveStdDevMs
responseColdMs · responseAvgMs · responseStdDevMs · responseNoMcp* · responseFast*
// resource + energy (macOS / Apple Silicon)
peakRssBytes · steadyRssBytes · cpuUserMs · cpuSysMs · threadCount · openFds
energyMilliJoules · avgCpuPowerMw · idlePackagePowerMw · powerAvailable
// environment — self-describing platform
os · arch · hostCpuModel · hostCores · hostRamBytes · loadAvg1
08Lanes
The macOS lane runs on the Mac mini against a real, growing session store on a subscription login — the numbers a heavy daily user feels, and the only honest place for the Codex reindex tax. The Linux lane runs in CI: reproducible and clean, strongest for spawn and startup. A combined lane unions both for range.
Because the real store keeps growing, a synthetic fixed fixture gives a frozen baseline that isolates a version's effect from session growth. It is built from open-source conversations — no personal data — and reproduces the shape that actually drives startup: the same file count, total bytes, and median and p90 file size as a real store (Codex ≈ 2,000 files / 7 GB, Claude ≈ 9,000 files / 6 GB). A CI runner with an empty home can then produce numbers comparable to the mini's, on demand.
09The public feed
Every verdict is broadcast, not just stored. OVM publishes a public Atom
feed at /versions.atom —
"new agent CLI versions, install-verified and benchmarked" — whose
entries are the verification detections themselves: a new release, a
version withheld from the registry because it hasn't verified on
any platform, a promotion once it clears. The feed carries a
WebSub hub link, and the pipeline pings the hub after
each deploy, so subscribers are pushed the moment a new
model clears the gate — no polling.
10One pass, two platforms
None of this is run by hand. When the release watcher detects an upstream version, a single pass executes on the Mac mini (macOS) and in CI (Linux):
- Install the release through OVM exactly as a user would.
- Canary — the regression gate above: tool-use probe, strict sidecars, version-swap, schema diff.
- Gatekeeper-check the macOS binary against the live policy engine.
- Benchmark the verified version and append its ledger line.
- Promote & broadcast — only cleared versions enter the registry; the site re-renders and the feed pushes.
The night the canary went live, upstream shipped four releases overnight; the scheduled run installed, probed, and benchmarked all four on both platforms and refreshed the registry autonomously, before anyone was awake.
11Reproducible by design
Nothing here is a private green check. The test suite is public, the
canary's proof is a tagged pair, and every benchmark point in
bench-data/ carries the runner and run URL that produced it.
The benchmark measures how fast and how cheaply a CLI reaches a working
answer, not model quality; energy attribution leans on a quiet, serialized
machine and an idle baseline; cold numbers depend on their starting state,
so each run records the session-store size behind them. When the next
dataset ships, this page becomes the as-built record.