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.