In one paragraph
The macOS arm has a Linux twin so that the same number exists on an operating system without macOS's VM cap and license questions. One Ubuntu 24.04 server VM runs under UTM on the same Mac Studio; inside it each environment is a Linux user on its own Xvfb display with the Python envd, envd-linux, serving the same HTTP API on the same port scheme. The same tasks, isolation tests, sampler, gates, sweep, soak and report run inside the guest with OS=linux PY=python3. The arm exists in the repository as scripts and a build note. None of it has run on a real VM. The scripts pass bash -n and a dry run on a Mac, and that is the whole of the evidence.
Setup
Design values from baseline-linux/make_vm.md:
- Guest: Ubuntu 24.04 arm64 server under UTM with the Apple Virtualization backend; 14 vCPUs; 40 GB of the Mac's 48 GB; an 80 GB system disk and a second 80 GB XFS
/homedisk with reflink on, so reset usescp --reflink=always. - Environments: users env00 to env48; env NN on Xvfb display
:1NNat 1280 by 800 by 24 with openbox;envd@NN.serviceon port 7700 plus NN. - Apps: Chromium as a Debian bookworm
.debpinned at priority 900, never the snap (the Playwright build is the fallback);chromium-sandboxplus a guest-wide sysctl that allows unprivileged user namespaces, accepted for a throwaway VM with the undo documented; LibreOffice Writer from Ubuntu. - envd-linux: the same API over one Xvfb display (xdotool, scrot, xclip, wmctrl); one lock where the Swift envd has an actor.
- Canary: the Linux canary watches only the clipboard hash today, no TextEdit equivalent.
- Operating rule: reboot the Studio first; never run both arms at once; while the VM runs, the Mac's own sampler logs into its own folder so host swapping cannot penalize the Linux row unseen.
- Sweep: the same N values as macOS plus N equals 48.
What ran
Nothing on a real VM. The build note says so in its own words: "Nothing in this folder has been run on a real VM yet. The scripts were checked with bash -n and a dry run (DRUMS_DRY_RUN=1) on a Mac." The one skipped test in the Python suite (EXP-001) is envd-linux's real X round trip, which needs a display the test machines did not have.
Results
None. When the arm runs, its row will carry the same columns as the macOS row: N_max, valid rollouts per host-hour at N_max, USD per valid rollout at the three prices, contamination next to a positive control that fired (the Linux positive control runs both sides on env01's envd-linux on one display), plus the Chromium source and version recorded in meta.json and the host's memory pressure and swap growth during the Linux windows.
Failures and surprises
None yet.
Limitations
Asymmetries that will be disclosed next to any Linux number:
- The macOS arm gets the whole machine; the VM gets 40 of 48 GB and 14 of 16 CPUs (design values). The report prints both
meta.jsonhardware fields side by side. - The Linux arm runs inside a VM; the macOS arm does not. Virtualization overhead sits on the Linux side only.
- A Linux environment is a display, not a login session. Xvfb has no compositor of the WindowServer's kind, no pasteboard server per session and no TCC; the isolation question differs in kind, not only in degree.
- The Linux canary watches only the clipboard hash.
- Chromium (a Debian build) on Linux against Google Chrome on macOS; the flags each OS needed are printed by the report.
- A guest-wide sysctl loosens user-namespace restrictions for the Chromium sandbox; acceptable for a throwaway VM, and stated.
- Gate 7 (20 of 20 on all four tasks at N equals 1, reset p95 at most 5 s, the Linux positive control fires) must pass before the Linux sweep, exactly as on macOS.
- Linux has none of macOS's VM-cap or session-license questions. That is a reason the arm exists, not a result.
Reproduce
- On the Mac:
make baseline-linuxprints the guest steps. Build the VM asbaseline-linux/make_vm.mddescribes; copy the repository with its.gitfolder into the guest somake metarecords the commit. - In the guest, with
OS=linux PY=python3andRUNexported in both guest shells:setup_guest.sh;make meta;make baseline-sample LAST=48beforestart_displays.sh;make verify-serverin the second shell. - Gate 7:
make gate2 COORDS=results/linux-coords.yaml GATE_TASKS="writer_save browser_form clipboard_cross visibility", thenmake positive-control COORDS=results/linux-coords.yaml. make sweep NS=1,4,8,16,24,32,48 COORDS=results/linux-coords.yaml LAST=48;make soak N=<N_max> ...;make report;stop_displays.sh.- Meanwhile on the Mac:
make baseline-sample OS=mac RUN=results/<date>-<host>-linux-host SECONDS=<length of the sweep and soak>. - Copy the guest's run folder to the host and run
make results RUNS="results/<mac run> results/<linux run>" LINUX_HOST=results/<date>-<host>-linux-host.