D199 - Five scripts were still driving a build environment that had been deleted that morning

multipass was dropped on 2026-08-26 and CLAUDE.md says so in bold. sweep-emulators.sh was ported the same day; bulk-sweep.sh, sweep.sh, repeat.sh, run-emulator.sh and run-kyty.sh were not, and every one of them still called multipass in live code.

Found while trying to do backlog item 6, which is described there as "pure machine time, no judgement - the best thing to leave running unattended". It could not run at all. The item was not blocked on machine time; it was blocked on a script calling a program that is not installed.

Nothing failed loudly enough to notice. A missing multipass produces a message about a missing command, not about a decommissioned build environment, and none of these five run inside verify.sh - so the gate stayed green over five broken scripts for a day. That is the house failure again: a mechanism that reads as working while being wrong (D158, D163, D194).

One shim, not forty rewrites

scripts/wsl.sh translates the four multipass shapes these scripts already use:

vm exec NAME [--working-directory DIR] -- bash -lc "CMD"
vm transfer NAME:SRC DEST

Rewriting every call site would have been forty chances to change one by accident; translating four shapes in one place is one chance. The shapes also carry meaning worth keeping - --working-directory says "in the repository", transfer says "get this file out" - and an unrecognised verb is refused rather than approximated, because a shim that quietly does something nearly right is worse than one that stops.

The bug the test caught, which is the reason to test a shim at all

VM_MODULE="${VM_MODULE:-$HOME/obs/obscene.module.elf}" expands $HOME in Git Bash, not in WSL. It becomes /c/Users/<name>/obs/... - a Windows home with no module in it - and the failure then reads as a missing build rather than a mangled path. Escaped to \$HOME so the inner shell expands it, which is what sweep-emulators.sh already did and why comparing against the working example was worth the minute.

All four shapes verified end to end: exec with and without a working directory, a 12,977,480 byte transfer, and an unsupported verb refused.

The || true at every transfer site is kept deliberately

multipass copied files correctly and then failed setting POSIX permissions on NTFS, so every call site ignores the exit code and tests for the file instead. WSL does not have that fault - but "test for what you actually want rather than trusting an exit code" does not stop being right when the tool improves, and today produced three separate bugs from trusting a pipeline's status. The tests stay.

Status: derived - every script checked, every shape exercised.