DrumsBench

Experiments / EXP-026

Drums full-root sessions on the OSWorld image root with GNOME Shell 42.9: seven host attempts, two simultaneous GNOME sessions reported working, a CRIU 4.3 dump that failed on configfs, a black pre-dump capture

Boot a Drums session whose root filesystem is the incumbent's own OSWorld image (Ubuntu 22.04.3, GNOME Shell 42.9, uid 1000) on a real Ubuntu 24.04 host, prove a usable desktop, and dump and restore it with CRIU.

failedRan and missed a correctness, isolation, reset or pre-registered performance bar. Kept on the record.
Date
2026-10-24 to 2026-10-25
Arms
drums-rootfs-criu
Hardware
real Ubuntu 24.04 host (owner-operated; instance type and hardware not stated in the branch; cgroup v2)
OS
Ubuntu 24.04 host; session root Ubuntu 22.04.3 from the OSWorld qcow2 image
Workload
A Drums full-root session over a read-only mount of the OSWorld qcow2 root: GNOME Shell 42.9 via gnome-session --builtin, a private system D-Bus, the OSWorld guest server as uid 1000 under the image's Python 3.10.12, LibreOffice Writer launched, then a CRIU 4.3 dump
Code
claude/linux-comparison-prep at e23286d
Evidence
docs/matched-software-plan.md (sections 10 to 26b)
compare/tests/fixtures/sixth_black_capture.png
compare/tests/fixtures/facts_real_openbox_xterm.txt
compare/drums_compare/criu_probe.py, fullroot_gates.py, boot_validate.py, bus_validate.py
envd-linux/envd_linux/session_init.py, criu.py, limits.py, rootcheck.py, baseid.py
deploy/aws_host/run_image_criu_probe.sh, install_criu_private.sh, mount_image_rootfs.sh
Limitation
Every host result here is owner-reported in a planning document; no raw data file from any of the seven host runs is on the branch (the sixth run's black screenshot survives only as a test fixture, and the seventh run's tarball is referenced by hash but not committed), and nothing after session start (GNOME readiness, Writer, dump, restore) was ever measured.

In one paragraph

Every Drums number on this site so far was measured on the sandbox's own Ubuntu 24.04 userland with openbox. A fair comparison needs the incumbent's userland, so the team tried to run Drums sessions on top of a read-only mount of the official OSWorld qcow2 root (Ubuntu 22.04.3, GNOME Shell 42.9, Chrome 130, LibreOffice 7.3.7.2, user uid 1000) on a real Ubuntu 24.04 host, between 2026-10-24 19:52 and 2026-10-25 01:27 UTC by commit time. The branch records seven owner-reported attempts and no raw artifact from any of them. Attempts one and two failed before any desktop (no ensurepip in the image's Python; no Xvfb in the image after the pivot). The first GNOME attempt reached GNOME Shell 42.9, which exited with "Oh no! Something has gone wrong" because there was no system D-Bus; a private, non-activating system bus was added. After that the owner reported two simultaneous full-root image-backed sessions each showing a working GNOME Shell as uid 1000 with separate bus IDs and mount namespaces. The sixth run reached a CRIU 4.3 dump, which failed: Error (criu/mount.c:724): mnt: FS mnt ./sys/kernel/config dev 0x15 root / unsupported id 462, because the recursively bound /sys had imported configfs and other host submounts; and the screenshot taken before the dump was entirely black with a cursor, although GNOME (PID 68) and Writer (PID 731) were alive. The readiness check written after that falsely passed the very same black capture (70 colours from the cursor's soft edges), which is recorded as a failure of the team's own check and fixed. The seventh run failed in 1.7 s before any desktop on a cgroup path the fresh sysfs lacks. Status failed, author-reported: no CRIU dump of a GNOME session on the image root has succeeded, and GNOME dump/restore compatibility is unknown. "Drums" here is still the L0 mechanism (namespaces, overlayfs, pivot_root) with the image as the lower layer; no shared-runtime (L1) result exists.

Setup

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 three Linux shapes discussed on this site. This record is the middle one: Drums namespaces and overlayfs with the OSWorld image root as the lower layer, sharing the host kernel. The stock VirtualBox and Docker/KVM incumbents (right) have not run; the sandbox arm (left) is where every measured number comes from.

Host. A real Ubuntu 24.04 host operated by the owner, with cgroup v2 and KVM available; the instance type and hardware are not stated in the branch for these runs (the surrounding plan context is a small cloud instance). Each run ended with "all cloud resources were gone".

The session. Supervisor base_root = the read-only NBD mount of the pinned qcow2 (mount_image_rootfs.sh; qcow2 sha256 pinned in run_image_criu_probe.sh); overlay lower template:<image root>; pivot_root; drums_home=/home/user, drums_desktop=gnome (gnome-session --builtin --session=ubuntu), drums_uid=1000, drums_system_bus=true (a private dbus-daemon from a flattened copy of the image's system.conf with all activation removed), the guest server under the image's Python 3.10.12, a jammy xvfb deb (pinned from the Ubuntu snapshot archive of 2024-03-01, 863344 bytes) unpacked into the writable layer because the image has no X server for this purpose. CRIU 4.3 from the maintainer PPA's .deb installed privately by hash, because Ubuntu 24.04's archive has no criu candidate at all (a correction made on the host at 19:26).

Pre-dump requirements written before the sixth run (section 22): the token must be 16 hex characters from return code 0; the Writer must be live with the same PIDs before and after; the screen must be measurable, differ by at most 5% from the pre-dump reference, and show at least 50 distinct colours before and after.

What ran

Seven owner-reported host attempts, by source commit and commit time (UTC):

#SourceReported outcome
144754c0, 2026-10-24 19:52image hashes passed; read-only ext4 mount of the 22.04.3 root; kit build FAILED at python3 -m venv: ensurepip missing in the image. GNOME never started
2be11875, 20:13kit built on the image's Python 3.10.12 (venv --without-pip, pip seeded from a hash-checked wheel); startup FAILED with FileNotFoundError: 'Xvfb' after the pivot (the image has no Xvfb). GNOME never started
3preflight of 1d0dca7, 20:47rootcheck falsely refused four mutter and gnome-shell libraries (RUNPATH not honoured); the session file is ubuntu.session, not ubuntu-xorg.session. Both fixed
4c5ca1a3, 21:10Xvfb started; the server ran as uid 1000 under Python 3.10; a PNG screenshot; GNOME Shell 42.9 / mutter 42.9 started (PIDs 66 then 122) and exited code 1 with "Oh no! Something has gone wrong"; stderr Gio.IOErrorEnum: Could not connect from get_system (no system D-Bus). Private system bus added
5061d593, 21:46two simultaneous full-root image-backed sessions showed a working GNOME Shell as uid 1000 and Ubuntu desktop pixels; separate bus IDs and mount namespaces; no activatable names except org.freedesktop.DBus; host socket unchanged. The raw probe FAILED only on an inode-only identity check (both bus sockets inode 7 on different devices 0:62 and 0:74); the check now compares (device, inode). Parity gaps noted: screen lock disabled, no display manager, guest clock Oct 25 versus host Oct 24 EDT
6b9e2a33 plus a host-only bootstrap patch, reported 19:43:53 local host clock (timezone not stated), recorded in 8e113c1, 23:52attempt 1 of the run failed on PermissionError on cpu.max (cgroup v2 controllers not enabled top-down); attempt 2 on unshare not finding the image-only kit Python on the host; attempt 3 reached the dump: see Results
7runner 65ec348 (not a commit on this branch), source 19adee8, 2026-10-25 00:55; recorded in 9442746, 01:27image hashes, Python 3.10.12, merged-root audit, private CRIU 4.3 hashes, ldd, criu check and PIL all passed; the probe FAILED in 1.7 s before Xvfb, GNOME, readiness, Writer or any dump: FileNotFoundError: '/sys/fs/cgroup/drums/<run>/s0/cgroup.procs'. A raw tarball (24.66 MB, sha256 e91cd394...22e3a) is referenced and is not on the branch

Results

The sixth run (owner-reported, section 24)

Image capture from inside the session: Ubuntu 22.04.3, GNOME Shell 42.9, Chrome 130.0.6723.58, LibreOffice 7.3.7.2, Python 3.10.12, user 1000. The file marker and the token were set; the Writer (PID 731) and GNOME (PID 68) were alive.

screenshot_before.png was entirely black with a cursor. Process liveness and version readback are not a working desktop; initial usable-pixel readiness is a separate blocker. The sixth run's /tmp logs were lost on cleanup, so the cause of the black screen is unknown; the 0.5 s start-up sleep versus window-manager readiness is a hypothesis.

The CRIU 4.3 dump was reached and FAILED:

(00.025555) Error (criu/mount.c:724): mnt: FS mnt ./sys/kernel/config dev 0x15 root / unsupported id 462

/sys was recursively bound into the session, importing configfs and the host's security, debug, bpf, pstore, efivarfs, fuse and cgroup submounts, which CRIU cannot dump. No restore, no siblings, no task evaluation happened. The author: "This is not evidence about GNOME dump/restore compatibility, and no raw FAIL is rewritten."

The black capture, kept as a fixture (the one artifact on the branch)

compare/tests/fixtures/sixth_black_capture.png: 1280x800 RGB, 3480 bytes, sha256 173bd22793e560190da6c3b45f4e4b396f61ea9c0abcfa6dbe97a495017324a4. Measured on that file by the branch's own tests: 70 distinct colours (the antialiased cursor), 133 of 1,024,000 pixels brighter than intensity 16.

The false pass (section 25, kept as found)

After the sixth run a readiness check was added: at least 50 colours and no change between frames. Replaying the real black capture through it returned ready=True after two polls (colors=70, changed fraction 0). The synthetic black test images had no cursor, so they never caught it. Recorded as a failure of the team's own check. The corrected rule: at least 50 colours, at least 5% of the document region lit, no single colour over 90%, two consecutive frames agree, at least 25% of a 16x10 grid of cells textured, AND the guest reports a window manager on the root window and at least one mapped window of at least 200x100; before the dump and on every restored sibling the Writer must additionally be an identified on-screen window (class LibreOffice/soffice, _NET_WM_PID among the live soffice.bin PIDs). The facts parser was validated against real xprop/xwininfo output from Xvfb plus Openbox plus xterm (facts_real_openbox_xterm.txt); it has not been run against GNOME.

What is established and what is not

ClaimStatus
a Drums session boots with the OSWorld image as its root, GNOME Shell 42.9 running as uid 1000, two at once, on a real hostowner-reported (run 5), no artifact
a usable desktop (non-black pixels) before the dumpnot established (run 6 black)
a CRIU dump of that sessionFAILED (configfs in the mount table)
a CRIU restore, siblings, task evaluationnever reached
GNOME dump/restore compatibility with CRIU 4.3unknown

Failures and surprises

Limitations

Reproduce

Owner-operated host steps, all gated: bash deploy/aws_host/mount_image_rootfs.sh (read-only NBD mount of the pinned qcow2); bash deploy/aws_host/install_criu_private.sh DEST --debs DEB_DIR SHA256SUMS; PYTHONPATH=envd-linux python3 -m envd_linux.limits preflight (must exit 0 on a real v2 hierarchy); python -m drums_compare.criu_probe preflight --config CFG --out DIR --scope host; only after ALL OK, python -m drums_compare.criu_probe run --config CFG --out DIR (600 s timeout in run_image_criu_probe.sh). The pre-dump mount audit now refuses to dump if the session's /proc/self/mountinfo holds any filesystem in criu.UNSUPPORTED_FS.

Sources