DrumsBench

Experiments / EXP-024

L0 spikes: a real Chromium task through envd-linux, the real OSWorld guest server inside a session, one public task scored 0.0 then 1.0, and the systemd-as-PID-1 incident

Record what the Linux L0 session prototype demonstrably ran on 2026-10-23 (single samples, test-backed), what it did not, and the full-suite runs that followed as software evidence.

preliminaryA real observation that needs more runs, a positive control, or an independent check before it counts.
Date
2026-10-23 to 2026-10-24
Arms
l1-criu-container
Hardware
4 vCPU, 16 GiB, cgroup v1, no KVM (dev-sandbox)
OS
Ubuntu 24.04, kernel 6.18 (sandbox)
Workload
One real browser form task through the envd protocol; the real OSWorld guest server with a real accessibility tree and terminal inside a session; public task e0df059f through the real DesktopEnv; a systemd-as-PID-1 probe
Code
claude/linux-comparison-prep at e980c46
Evidence
docs/envd-linux-spike.md
docs/osworld-contract-spike.md
docs/gnome-namespace-investigation.md (section 'Experiment: systemd as PID 1')
docs/incident-docker-leftovers.md
docs/data/suite_runs/full_suite.log through full_suite12.log and README.md
envd-linux/tests (test_envd_linux_*, test_osworld_real_server.py, test_osworld_task_flow.py, test_osworld_real_package.py)
Limitation
Every performance number in this record is a hand-measured single sample quoted from a document, with no data file on the branch; the only artifacts are the test suites' logs, which are software evidence and not benchmark results.

In one paragraph

On 2026-10-23 the Linux session prototype went from nothing to three demonstrations in one day, each backed by tests that ran and passed in the sandbox and none backed by a data file. First, envd-linux: a session made of Linux namespaces, an overlayfs on $HOME, a private Xvfb and a Python daemon speaking the envd protocol ran one real Chromium form task end to end and passed the roughly 30-check envd conformance suite over real screenshots and real XTEST input. Second, the OSWorld contract: a full-root overlay with pivot_root, a network namespace per session with a veth, an nftables policy between sessions, and then the real, unmodified OSWorld guest server inside a session with a real accessibility tree and a real /terminal read through AT-SPI. Third, one public task, e0df059f (rename a directory), through the real desktop_env package: the real SetupController ran the setup, evaluate() scored 0.0 before acting and 1.0 after a hand-written os.rename, with only librosa mocked. The same day a probe that made a session's PID 1 exec systemd started the host rootfs's enabled units, including Docker, in the host's network namespace; the residue broke three forwarding tests until the sandbox's kernel state reset. The hand-measured samples (363 MiB PSS for a Chromium session, about 2.5 s reset, 0.8 s empty session) are quoted here as single samples with no data file and are not benchmark results. The twelve full-suite runs that followed over 2026-10-24 (175 to 232 passed) are verified software evidence. "Drums" here means the L0 prototype on the sandbox's own Ubuntu 24.04 root; L0 shares files and page cache only; no shared-runtime (L1) result exists.

Setup

Host. One development sandbox: 4 vCPU, 16 GiB, kernel 6.18, cgroup v1 (hybrid), no KVM, PID 1 is not systemd; hostname and provider not recorded. Nothing launched in a cloud; no credentials.

What L0 is, in this record's own words (envd-linux-spike.md): "shared files and page cache, private state, per-session processes. It is an engineering precursor, not a Drums result. The memory number above is what L1 (shared pre-warmed runtime forks) would have to beat."

Three spikes, in order of commit:

SpikeCommit (UTC, 2026-10-23)Session shape
envd-linux67847dc 08:07unshare --mount --pid --ipc --uts; overlayfs on /home/drums over a shared read-only template with a Chromium profile; private /tmp, /dev/shm, X-socket directory; own Xvfb -nolisten tcp -nolisten local; one daemon process per session on its own port; XGetImage screenshots, XTEST input; no window manager; shared host network namespace; no cgroups; Chromium --no-sandbox --disable-gpu
OSWorld contractbc0cadb 09:09, 098613c 11:04full-root overlay (lower: template then the host /), pivot_root, private /proc, minimal /dev, read-only /sys; a network namespace per session with a veth (10.200.<slot>.0/30) and an nftables table per run; a guest-server stub on port 5000; a controller against the real agentrl-worker 0.4.0 interface
real guest server and taske980c46 14:37the real OSWorld main.py from 04718ea, copied unmodified into a build-time kit with Flask, lxml, pyautogui, python-xlib, Pillow; session D-Bus, AT-SPI, openbox; the public task through the real desktop_env

What ran

envd-linux spike (tests that ran and passed, envd-linux/tests). The real daemon process passes the full conformance suite (drums_compare.conformance, about 30 checks: Origin/Host refusal, stale 409, validation, 404/405). One real Chromium task end to end: the form row reached the real verify-server with the attempt's generation and token; the shared template tree was byte-for-byte unchanged afterwards. Reset: a file written in $HOME and /tmp is gone after reset; a second attempt on the same slot is valid with no foreign rows. Two simultaneous sessions: files invisible to each other and to the host; the namespace sees only its own processes; session 0's X socket is on neither the filesystem nor an abstract socket from session 1; kill-all in session 0 leaves session 1 alive; typing into session 0's browser changes session 0's frame and not session 1's. A late action with the previous generation is refused with 409 during a rebuild.

OSWorld contract spike. Each session answers /platform, a 1280x800 screen and a real PNG; two sessions serve port 5000 and a second listener on 9222 at the same time on different addresses; files written under /etc, /opt, /usr/local/bin, /tmp and /home/drums in one session are absent from another and from the host; a browser task runs through the guest contract alone. Network policy (firewall.py): session to session dropped both directions even with forwarding on; a session reaches the host only at its own gateway; private, link-local (cloud metadata) and CGNAT egress dropped under NAT; a control with the firewall off reaches. The outer ownership sweep (sweep.py) was built after a killed test run left sessions, a table and ip_forward=1 and the next run failed 18 tests with "File exists".

Real guest server and one public task. tests/test_osworld_real_server.py: /platform, /screen_size, a real /screenshot; real pyautogui through /execute; launching gnome-terminal via /setup/launch makes /accessibility return a real tree with a terminal node whose text holds the command output, and /terminal returns a test string read through AT-SPI. tests/test_osworld_task_flow.py: task os/e0df059f JSON unmodified through the real DesktopEnv (OSWorld main 04718ea): reset runs the setup (sudo mkdir and a pyautogui click via /setup/execute); the observation has a real accessibility tree, screenshot and terminal key; evaluate() scores 0.0 before acting; step() runs a hand-written os.rename through /execute; evaluate() runs the real getter get_vm_command_line and metric exact_match and scores 1.0. Only librosa is replaced by a mock.

The systemd probe (envd_linux/systemd_probe.py, one run, no network namespace, a 12 s wait). The session's PID 1 exec'd /lib/systemd/systemd --system --unit=multi-user.target over the full-root overlay of the host's own Ubuntu 24.04. Observed from outside: systemd stayed PID 1, systemctl is-system-running = running, 17 active units, 0 failed, systemd-detect-virt --container = container-other.

Results

Single samples, no data file (hand-measured, quoted from the spike documents; not benchmark results):

QuantityValueWhere quoted
reset plus browser settleabout 2.5 senvd-linux-spike.md
a session of about 12 processes (Xvfb plus Chromium)about 363 MiB PSS (814 MiB RSS)envd-linux-spike.md
private copy-on-write state after one attemptabout 9 MBenvd-linux-spike.md
session ready, empty session (4 slots, 8 attempts)about 0.8 s (p50 and p95)osworld-contract-spike.md
mean session PSS, empty session (Xvfb, stub, init; no browser)about 38 MiBosworld-contract-spike.md
a session of 14 processes (Xvfb, Chromium, stub)about 394 MiB PSS (908 MiB RSS)osworld-contract-spike.md
create a full-root session with its network namespace0.69 s for the first ("measured by hand, not asserted")osworld-contract-spike.md
real guest server first start in a fresh sessionunder 1 s to about 13 s (one sample each, uninvestigated)osworld-contract-spike.md section 7

The spike doc says of these: "One sample on this sandbox (not a benchmark)". They are not comparable with the host-delta slopes of EXP-004 and later (different workload, accounting and readiness definition).

Suite runs as software evidence (measured, docs/data/suite_runs/, pytest -q on the whole repository with every optional environment set):

LogLast lineTree
full_suite.log175 passed in 291.83 safter the K results (1218b2c)
full_suite2.log179 passed in 357.78 safter the first CRIU results (ca07330)
full_suite3.log183 passed in 423.85 safter clone-hygiene and orphan-cleanup tests
full_suite4.log184 passed in 431.83 seb571a9
full_suite5.log190 passed in 363.89 sb8d1aad
full_suite6.log191 passed in 376.41 s6366826
full_suite7.log1 failed, 191 passed in 415.06 sf37be36; the failure is test_control_without_the_firewall_sessions_do_reach_each_other, a probe that read HTTP headers without the body; a harness flake, repeated 3 times alone after the probe fix
full_suite8.log192 passed in 388.93 s65da9c4
full_suite9.log214 passed in 574.03 scc3a560, intermediate
full_suite10.log221 passed in 554.88 s8b3bfd2
full_suite11.log1 failed, 224 passed in 572.88 stree changed during the run; the failure is a test-versus-code edit race, not a clean final-tree result
full_suite12.log232 passed in 560.39 sclean tree d6a9e8a

Counts from commit messages alone ("141 passed", "145 passed", "148 passed, 0 failed" in dce0211) have no log on the branch and are not listed as evidence.

Failures and surprises

Limitations

Reproduce

pytest envd-linux compare -q                                            # fake-backed and (if root, overlayfs, Xvfb, nft, python-xlib) integration tests
DRUMS_OSW_PYTHON=<venv python> DRUMS_OSW_SRC=<OSWorld checkout> pytest envd-linux/tests/test_osworld_task_flow.py -q
DRUMS_ALLOW_SYSTEMD_PROBE=1 python -m envd_linux.systemd_probe          # only with a private network namespace and a cgroup subtree you own

Integration tests need root and must not run concurrently (veth names and the nftables table are host-global).

Sources