8.2 KiB
VM export acceptance audit
Checked against the working tree and running services on 2026-09-14. The goal remains active: native service-menu operation is not yet confirmed. A successful export is not a claim that every game version is fully emulated.
| Requirement | Evidence and current result |
|---|---|
| Replace the emulator tab with Download VM | workbench/stern-catalog/src/browser/emulator-view.tsx opens /emulator/exports/ui. tests/ui-vm-exports.mjs passed against the running catalog, including standard ZIP range download and a complete quick ZIP download. |
| Package the selected game, SD runtime, kernel, initramfs and Mac supporting scripts | Published 0.83 723fe5e4d9024f2ab195d28d50271d12 and 0.85 e4359dddb21946689d3ded1dbab63648 include these artifacts. ZIP and image checks are recorded in docs/emulation.md. Standard launch requires host Python and QEMU; supported local IC profiles are prepared during export and need no Docker on launch. |
| Use the release's own SD before any donor | The current 0.83 ZIP manifest selects its own runtime ID and own-sd. test_bundle_selection.py also rejects substitution when an SD release's own system is missing. |
| Otherwise choose the closest same-title SD | The 0.85 standard export and actual quick build select the 0.83 SD. Numeric ordering, tie-breaking and title priority have policy tests. |
| Otherwise choose a same-generation SD | The policy excludes the wrong architecture and borrowed update runtimes. The live catalog selects King Kong's SD for other SPIKE 2 titles. SPIKE 2 standard and quick exports are now enabled; King Kong was built with its own SD. |
| Quick export connects to the catalog and caches components | Actual downloaded client fetched game/runtime components and reused verified SHA-256 caches. The current downloaded client matched the source byte-for-byte; receipt /tmp/verstack-quick-cleanup-validation.json. |
| Quick export updates and switches versions | Actual 0.83 and 0.85 builds, game/libc comparisons, filesystem checks and switching without rebuild are recorded in /tmp/verstack-universal-build-result.json and /tmp/verstack-universal-switch-result.json. Those runs predate local IC provisioning; they prove build/switch behavior, not current native boot of both versions. Recipe changes invalidate images; incomplete builds cannot become active. |
| Explicit shared runtime per generation | Actual quick 0.83 build used the 0.81 SD override. Browser test selects that override, and policy tests reject a cross-generation override. --default-runtime returns to automatic selection. |
| Retain the supplied SPIKE 3 nodebus and local switch panel | Both vendored netbridge implementations and keyboard relays match the hashes in SOURCE.json. The selected game's node firmware version is advertised while retaining the board model. The current ZIP's 28 JavaScript input tests pass. Native menu navigation remains pending. |
| Preserve experimental SPIKE 2 work | Existing emulator code and proxy remain; verstack-emulator was confirmed running. King Kong's imported SD remains available. The downloadable ARM64 appliance now contains the ARM32 worker and selected SD. Boot, diagnostic screen/audio and service controls passed; game-startup limitations remain. |
| Do not interrupt active catalog jobs | Export worker is separate and serialized with CPU/RAM limits. An erroneous ARM64 interpreter registration later blocked host execution and required a reboot; this violated the intended uninterrupted operation. After recovery, Star Wars was completed, Deadpool was running, and the backend reported three preparation workers. See the incident note below. |
| Clean up build and validation scratch | Standard success/failure cleanup is tested. Quick failure now removes incomplete images and source extraction while preserving the previous active VM and component cache. All 21 export tests pass. The recent headless validation disk was removed after saving small logs; published ZIPs remain. |
Native confirmation and remaining limits
The user reports that Pokémon runs on their Apple Silicon Mac and identifies
upstream commit 37d70e6. Both recent 0.83 exports carry that commit, so the report
does not identify which ZIP was tested. Preserve both 5cc3a773... and
723fe5e4.... Do not describe either one individually as native-confirmed until
the artifact is identified. Service / Enter, Back, + and − still need native
confirmation; the question has already been asked.
The current 0.83 image passed the game's factory-record and cabinet-record validators in isolated QEMU (both returned 1). That is narrower than full startup or authentication. Only exact recognized game binaries receive local IC provisioning; other selectable versions can export without being proven playable. The original scope retains the supplied node model rather than implementing new per-title physical playfield profiles.
The published 723fe5e4... dashboard also passed all five Python rendering and
event-routing tests using the existing Pillow environment. Together with its
28 JavaScript input tests, these verify the packaged control UI and event path,
not the game's response on macOS. Rechecked after the reboot directly from the
published ZIP: Node's test runner reported 28/28 passing; the five test_server.py
tests passed in a disposable verstack-emulator:local container with networking
disabled. Both packaged netbridge implementations and keyboard relays matched
the recorded SOURCE.json hashes again. The extracted dashboard files were removed
after testing; this paragraph preserves the result independently of /tmp.
After the recovery reboot, /api/info reported preparation_workers: 3 and
analysis_workers: 4; /api/activity reported execution.preparation_limit: 3.
The old activation watcher is inactive and is no longer needed.
ARM64 build-host registration incident
A manually constructed binfmt registration wrote raw NUL bytes instead of escaped
text. The kernel parser truncated its ELF signature and intercepted native
executables. The kernel format documentation
requires NUL bytes in registration text to be escaped. New host commands failed with Exec format error. The registration
was absent after the VM reboot; catalog and emulator services recovered, while
the export service needed to be started again. The first SPIKE 2 VM had not yet
been built. This was an implementation error, not an ARM32 game failure.
scripts/enable-arm64-builder.py now reads Debian's installed definition, checks
the complete ELF machine field, rejects native/x86/ARM32 matches, and preserves
escaped registration text. Installation performs readback and a native execution
check in the same live process, with rollback on failure. Its default invocation
only validates; --install changes the mounted host binfmt filesystem. Two tests
cover textual encoding, exclusion of the host, and truncated signatures. The user
authorized leaving the corrected registration enabled. It is not configured to
reinstall itself at boot.
SPIKE 2 download validation
Corrected King Kong standard export 79f02d81e9fc48dc83ab4f00b28f6342 is
4,629,361,401 bytes, SHA-256
87c1b420237d8ef9d351d9f811b2325f84a199ce072f6231c94c626de503f15a.
The catalog API reuses this completed export and serves ZIP range requests.
The launcher disables the optional virtio network ROM, so it does not depend on
a host firmware file. Both standard and actual quick builds preserve the selected
King Kong executable and SD libc byte-for-byte. Filesystem checks passed. The
downloaded quick client's second Update.command reused its completed image
without changing the disk.
An isolated QEMU boot of the exported disk exposed the selected ARM32 runtime.
tests/ui-spike2-vm.mjs passed diagnostic screen rendering, nonzero audio and all
four service buttons. A separate 302-second actual-game observation produced no
frames and remained in runtime preparation on the Intel test host. This verifies
downloadability and appliance operation, not playable King Kong or native Mac
speed. The validation VM was stopped; temporary image/component copies were
removed after retaining small receipts in /tmp/verstack-spike2-validation.
Published downloads and intentional component/build caches remain.