CI runner disks live in a qemu/ dir as a chain of content-addressed qcow2
checkpoints: base OS → toolchain → jab-built, each file named by a hash of
what produced it. A per-worktree be/test/ run boots a throwaway overlay
backed by the jab-built checkpoint, so jab is built once per rev, never per
run. This refines CI-001's flat "base image + overlay per runner" into a
multi-stage chain; revert/close remains rm <overlay>.
loadvm restore of a running-state snapshot ~1–3 s
(RAM-size bound). Numbers are estimates until measured on real images.qemu/ dir holding checkpoints qemu/<hash>.qcow2; hash identifies the
stage content, so a runner picks its start state by name alone.qemu-img commit into a referenced parent.savevm stream
costs ~0.3–1× guest RAM on disk (zero pages skipped), a few GB each.<os-base> ← <toolchain> ← <jab@rev> ← run overlay
(throwaway). Per-commit increments still ride the warm ninja cache
inside the <jab@rev> clone, checkpoints cover the coarse stages.qemu/<hash>.qcow2.qemu/ layout + hash-naming spec, folded into meta/ci.mkd
(CI-001 TODO 1).loadvm times on the actual Ubuntu and
FreeBSD images; record here.savevm RAM snapshot per
runner flavor (drop guest caches before saving); open-run does
loadvm (~1–3 s) instead of cold boot — kills the FreeBSD boot
cost. Verify overlay+internal-snapshot interplay.