Proof

Every claim has a gate.

Arkane is built on a proof culture: no feature merges without an acceptance gate — a script that boots the real system in QEMU, exercises the feature end-to-end, and greps the serial log for the exact markers that prove it happened. 47+ gates run on every release. What follows are the headline measurements, how they were taken — and what changed when the system was moved off the emulator onto real virtualization.

01 · First boot on KVM

Off the emulator, onto real virtualization.

Every number on this page used to come from QEMU under TCG — software emulation, where each privileged instruction is interpreted. Arkane now boots on KVM on AMD hardware: the same kernel, but the CPU executes it. That is the first time the measurements mean anything about speed — and it is the first time Arkane and Linux were timed on the same machine, with the same counter, in the same run.

first measured run · KVM · AMD host · dev profile · p50
                  arkane   linux
syscall              224    1393  getpid
ipc round-trip     36850   40864  af_unix

→ syscall ~6× faster · ipc ~10% faster

The honest frame, stated before anyone asks for it: one host, dev-profile build, n=2 runs. That is a first datapoint, not a benchmark suite — no claim about other hardware, other workloads, or a release build follows from it, and the IPC figures are raw counter values from the same harness on both sides: the pair is the result, not the unit. What it does settle is the direction: the syscall path is genuinely short, and IPC is not the liability the emulator made it look like.

It also corrects us. Under TCG the IPC round-trip measured 3.5× slower than Linux, and that was the working assumption — the thing to go fix. On real virtualization the same path is 10% faster. The old figure was an emulation artefact: TCG's cost model, not Arkane's. It is named here rather than quietly dropped, because a measurement culture that only publishes the flattering revisions is not one.

The full serving path has a correction of its own. Its first KVM run put Arkane at 5.5–10.8× Linux's latency. Before optimising anything, we decomposed it: 80–89% of that latency was our own debug serial output, written on every request. With it switched off, Arkane serves at 0.98–1.34× Linux — parity on the public tree, 1.2–1.35× behind on the rest. Honest benchmarks find your own mistakes too.

serving path · KVM · AMD 5700G · dev profile · boot-trace off · p50 arkane/linux
                   R_p50   (<1 = arkane faster)
public-tree        0.977   parity
static-json        1.224
mcp-notes-search   1.285
mcp-echo           1.344

→ parity on public-tree · 1.2–1.35× behind elsewhere

Same frame as above: one host, dev profile. Load was paced at 50 req/s, and both sides held that rate (throughput ratio 1.0–1.15). Peak capacity has not been measured yet. The tail is still wider, with p99 at 1.2–1.9× Linux. The remaining gap is real, and it is the next thing to work on.

02 · What the emulator hid

Three kernel bugs that only a real CPU could find.

The first KVM boot did not work. Three bugs had been sitting in the kernel — green through every gate — because TCG checks loosely where hardware checks strictly. Each one is a rule the real CPU enforces and the emulator waved through:

found by KVM · fixed before the measurement run
1  IDT gaps          — vectors missing from the interrupt
                       descriptor table. TCG tolerated it; KVM did not.
2  MSI-X swapgs      — GS handling on the MSI-X interrupt path.
                       Wrong under strict checking, harmless under TCG.
3  SS.RPL selector   — stack-segment selector privilege bits.
                       The emulator accepted them; the CPU rejected them.
→ all three fixed · KVM boot green · measurement run followed

This is the argument for the proof culture, made by counter-example. 47+ acceptance gates were green and three real bugs were still there — not because the gates were weak, but because they ran on an environment kinder than reality. What found the bugs was not a better test. It was a stricter machine.

TCG hid them. KVM found them. An after-work PC proved it. No lab, no cluster, no budget — one AMD desktop, and the bugs had nowhere left to hide.

03 · Zero-downtime update

802 requests. 0 errors. During the update.

The gate keeps a client firing requests at the inference replica group while arkctl cell rollout restarts it — three times in a row. The gateway routes round-robin to whichever replica is alive; the rollout is ready-gated so the group never drops to zero. Result across three rollouts under sustained fire: 802 requests, 0 failed responses.

acceptance gate · rollout under fire
$ arkctl cell rollout inference   # ×3, client firing throughout
ROLLOUT_START · step 1: alive_before=2 · ready · step 2: alive_before=2 · ready · DONE
requests: 802 · errors: 0 · min alive: 1 (floor N−1)

This is the availability claim made concrete: updating an app never takes it down. The serial-log markers (START / STEP / READY / DONE, never ABORT) are what the gate greps for — not a dashboard screenshot.

04 · Boot latency

Power-on to converged cluster: 7.4 s.

Measured in QEMU under TCG, unattended — no request needed to poke the system awake. The interesting part is what the gate found first: the kernel was never slow, but one cell waited indefinitely for its first network request, so an untouched boot never converged at all. The fix gave it a time budget; the gate now enforces convergence without any external stimulus. Boot under 3 s is a named optimization target, not yet claimed.

boot-trace · per-phase timing, on by default
[0.0s]  kernel entry · 4 cores
[2.1s]  cells spawned · signatures verified
[6.8s]  TLS keys generated · console up
[7.4s]  cluster converged · 0 drift · no poke
05 · Audit chain

Prove what ran — offline.

Every security-relevant event — spawn, stop, crash, capability grant, contract refusal, every console write — becomes an immutable block in a Blake3 hash chain, where each block's content hash is the next block's back-link, mirrored to disk. Verification needs the drive, not the running system.

arkctl audit · offline against the mirrored disk
$ arkctl audit verify --store store.img --list
audit chain OK: 23 blocks, head seq=22 hash=6b01c4…

$ printf '\x01' | dd of=store.img seek=571432 …   # flip ONE byte, anywhere
$ arkctl audit verify --store store.img
audit verify FAILED: TAMPER: block seq=4 does not
hash to its stored id (content was modified)

The honest boundary, stated exactly: the chain proves tampering and gaps after its last verified anchor. An attacker who controls the kernel before the first anchor can rewrite the story up to that point — external anchoring is on the roadmap, and until then this sentence is the precise edge of the claim.

06 · Sealed at rest

Nothing readable on the disk.

Every app-data body is encrypted before it is mirrored — XChaCha20-Poly1305 under a key that lives only in a net-free keystore cell, RAM-only. The gate is a command anyone can run: strings store.img after a full write round-trip finds no plaintext. Flip one ciphertext byte and the read fails loudly — an AEAD error, never silent garbage. And credentials are injected per call by the gateway: the app never holds them, so a fully compromised app cannot leak a secret it never had.

the headline gate · run it yourself
$ strings store.img | grep -c "secret note body"
0   # the data is on disk — as ciphertext

Honest edge: at rest means the disk. The in-RAM blob table holds plaintext while the machine runs — the same edge as "it runs in QEMU". Crash recovery is proven the same way: apply → hard reboot → the cluster is still there, without re-applying anything. That gate has run on every merge since v0.14.