DrumsBench

Experiments / EXP-007

QEMU/KVM warm-snapshot baseline harness (drumsbench) and the OSWorld rename scripted smoke, first real run failed 0/0

Build a black-box harness that runs one frozen desktop workload against a warm QEMU/KVM snapshot baseline and an external arm under the same validity gates, and smoke-test its plumbing on one pinned OSWorld task.

failedRan and missed a correctness, isolation, reset or pre-registered performance bar. Kept on the record.
Date
2026-10-25
Hypothesis
A scripted GUI-only rename of a folder in GNOME Files, run from a restored VM snapshot, passes the task's own checker and resets to the same state hash.
Arms
qemu-kvm-warm-snapshot
Hardware
unidentified host for the author-claimed run; no QEMU or KVM in the authoring sandbox
OS
guest: OSWorld Ubuntu 22.04.3 image (pinned qcow2); host not recorded
Workload
OSWorld task e0df059f: rename todo_list_Jan_1 to todo_list_Jan_2 in GNOME Files, GUI-only, three seeds
Benchmark
drumsbench (harness, not a result)
Code
claude/ecstatic-archimedes-456go6 at 3b8d6dd
Limitation
The one real run described on the branch (correct-control seed, pre-check 0, post-check 0) is author-claimed with no screenshot, pre/post-check file or receipt on the branch; the revised keystroke policy is unvalidated.

In one paragraph

drumsbench is the harness we intend to use for every Linux comparison. It takes one user-supplied workload (image, policy command, checker, seeds, ready/warmup/reseed, canary and state-hash commands) and runs it identically against "arms". The implemented arm is a warm QEMU/KVM VM with savevm/loadvm; an external arm such as Drums is reached only through a command you supply. The harness's README says what it is: "This is a harness, not a result. No run has been performed with it". The OSWorld rename smoke is the first workload for it: one pinned OSWorld task, driven through a GUI-only pyautogui channel with no shell path, scored by the task's own checker. The branch records one real attempt of the correct-control seed, which failed: the keystrokes typed the new name into the Files search field and renamed nothing (checker 0 before, 0 after). That statement is author-claimed with no artifact on the branch. The policy was rewritten and is "still unvalidated until the screenshots ... are reviewed". Status is failed because the only run reported missed the task bar; nothing about it is measured here.

Setup

What the harness enforces

flowchart TD
A[Provision slot: qemu-img overlay, qemu-system with accel=kvm, QMP query-kvm readback] --> B[ready + warmup commands]
B --> C[savevm bench-clean over QMP]
C --> D[Reference state hash]
D --> E[loadvm bench-clean]
E --> F[reseed + canary plant]
F --> G[Policy command: the task]
G --> H[Checker + canary probe]
H --> I[Reset: loadvm, state hash must equal reference]
I -->|next attempt| E
I --> J[Cleanup, always, even after a crash]
J --> K[summary.json + receipts.jsonl, then reconcile, then compare]
drumsbench run phases. Per slot once: provision, endpoint, ready, warmup, snapshot, reference hash. Per attempt: restore, reseed, canary plant, task, evaluate, canary probe, reset, hash compare. Cleanup always runs.
same workload, same checkersame hardware allocation, same reset semanticsinput manifoldfixtureQEMUQEMU/KVMwarm snapshotruncruncCRIUCRIUOCI runc+ CRIUDrumsDrumsruntimelateroptimized armsread from every armp50 / p95 prepare and reset (s) · RAM and CPU per env · stable Nvalid rollouts per host-hour · USD per valid rollouta number from one slot means nothing until the samereading exists for the slot beside it
The rig the harness assumes: one frozen workload and checker, two arms with equal declared guest resources, per-attempt isolation canary and fidelity hash, receipts and a reconciled bill before any comparison.
same OSWorld task image, task and checkerUbuntu 22.04 desktop, 4 vCPU / 4 GiB per env, one scripted policyQEMUUbuntuQEMU/KVM snapshotappsUbuntu desktopguest kernelhost kernel with KVM(a)one VM per env, resumedfrom a warm snapshotruncruncCRIUCRIUOCI: runc + CRIUapps, restored by CRIUown rootfsharness-owned netnsshared host kernel(b)CRIU checkpoint/restoreof the process treeDrumsGNOMEcustom rootfsXorg dummy + GNOMEoverlayfs + pivot_rootCRIU --root, own mnt nsshared host kernel(c)candidate Drums arm;restore gates failingwhite strips are per environment; grey is shared by every environment.(b) is the OCI reference arm, not a Drums result; (c) has not passed its gates.
The Linux arms this harness is written for: the QEMU/KVM warm-snapshot baseline (implemented), the OCI runc + CRIU control (EXP-010) and the custom rootfs Drums candidate (EXP-008). Only the baseline is implemented inside drumsbench; the others are external arms.

The OSWorld smoke task

The task is bundled from OSWorld commit 04718eab9327856efe8192cc58161acc7a7627e2 and its sha256 (a507ec6c35284c1413efe0d8a325b41a1626522221efc14f153742a865f1c04d) is re-verified by every command.

task id:      e0df059f-28a6-4169-924f-b9623e7184cc
instruction:  I have a directory named "todo_list_Jan_1". Can you help me change its name into "todo_list_Jan_2"?
setup:        echo {CLIENT_PASSWORD} | sudo -S mkdir ~/Desktop/todo_list_Jan_1
              (then a pyautogui click at screen centre)
checker:      func exact_match, result type vm_command_line, command:
              [ -d ~/Desktop/todo_list_Jan_2 ] && [ ! -d ~/Desktop/todo_list_Jan_1 ] && echo 'Directory exists.' || echo 'Directory does not exist.'
expected:     "Directory exists.\n"   (exact match, no stripping)

Three seeds: 1 correct rename to todo_list_Jan_2 (expect checker 0 before, 1 after), 2 wrong name todo_list_Jan_3 (0, 0), 3 no-op control (0, 0). The guest is reached through OSWorld's own server API (/execute, /screenshot, /screen_size, /setup/launch on guest port 5000). ready requires a display server and gnome-shell running, nautilus and sudo installed, a writable ~/Desktop, and the screenshot size equal to the server's screen size. reseed runs the task's own setup and the evaluator must say 0 before any action. The policy has no shell path: only AST-validated pyautogui.click/press/hotkey/write and time.sleep snippets and one fixed launch of nautilus ~/Desktop.

Image: public OSWorld Ubuntu image, zip sha256 b795b6cd...712, extracted qcow2 sha256 6bf667a852b3c307f61d9f09c42559351f45e0607e428b4997becf534cf4d313. The ~11 GB (design value) image was not downloaded into the authoring sandbox.

What ran

Results

No measured result. The author-claimed outcome of the first real correct-control run (no artifact on branch): "pre-check 0, post-check 0". The original keystroke sequence (down, F2, type) "put the new name into the Files search field and renamed nothing".

The rewritten policy (scenarios.py): wait 3 s; Ctrl+L; type /home/user/Desktop; Enter; wait 2 s; Ctrl+A (selects the sole folder); F2; wait 2 s; then it requires the screenshot to differ (a rename dialog) before typing; Ctrl+A; type the new name; Enter. If the screen does not change it stops, keeps every receipt and fails the step. The branch calls this "still unvalidated". Screenshots at each stage (desktop-opened, folder-selected, rename-dialog, name-typed-before-enter, after) are saved for a human to review.

Failures and surprises

Limitations

Reproduce

python -m osworld_smoke.make_workload --image /path/to/Ubuntu.qcow2 --out smoke-workload.json
python -m drumsbench plan --workload smoke-workload.json --arm baseline --baseline-config B.json   # dry run
python -m drumsbench baseline-hash --workload smoke-workload.json --baseline-config B.json          # write into B.json
python -m drumsbench run --workload smoke-workload.json --arm baseline --baseline-config B.json \
    --money M.json --out-dir runs/baseline-1 --execute --concurrency 1
python -m drumsbench verify-receipts runs/baseline-1/receipts.jsonl
python -m osworld_smoke.verdict runs/baseline-1

Needs qemu-system-x86_64, qemu-img, a readable and writable /dev/kvm, the pinned image and a money file. Templates in benchmark/examples/ fail closed on purpose until filled in.

Sources