Files
saphid--frame-control/docs/evidence/mods-2026-09-28.md
T

6.2 KiB
Raw Blame History

Mod feasibility test, 2026-09-28

Verified observations, with limits below. Device: aarch64, SteamOS VERSION_ID=0.4.1, BUILD_ID=20260925.6191901; Proton version file: 1788505046 proton-11.0-2c-arm64; vrcmd --stats: SteamVR 2.18.1. Times below are the Frame's AEST clock.

Inventory and allowed content

ssh frame 'python3 - owned' < ui/frame_steam.py returned 868 games before the test. Beat Saber (620980) and Skyrim VR (611670) were absent. Half-Life 2: VR Mod – Episode One (2177750) was installed. Hogwarts Legacy (990080), Horizon Zero Dawn (1151640) and Horizon Forbidden West (2420110) were listed but not installed. The full personal library is not committed.

Documented, owner report after these tests: Alex has Beat Saber on a Quest 2, which is charging. That copy was not accessed or inspected during this test. Its version, transfer path and Frame compatibility remain unknown; Steam ownership is still not established.

Gravitas's public Steam metadata reported is_free: true, developer Galaxy Shark Studios, Windows only. Frame Control's existing Steam helper requested its install. Steam first returned free-license state 3, then config state 7, then queued the download. The helper did not accept state 3; a later read found state 7. The source of that transition was not observed. A later install 1067310 returned state: installed. No purchase occurred.

UEVR was downloaded from the author's 1.05 release, not a mirror. UEVR.zip was 7,399,455 bytes. Its SHA-256 matched the author's UEVR.zip.sha256 (a UTF-16 text file):

af4f2f91306802d7ee4e8497d483a547ac8e9a3067dbafb81324100524215d3c

Microsoft's Windows x64 .NET runtime and Windows Desktop runtime 6.0.36 ZIPs were downloaded using URLs in the official release metadata. Both SHA-512 hashes matched that metadata. They were extracted into a test-only user directory, not installed globally. No other mod manager was used.

Half-Life 2 VR: visible setup, not gameplay

Launched the already-installed Episode One using steam steam://rungameid/2177750. The existing manifest recorded build 25413453 and a shared base depot from app 658920, build 25413418.

Selected fresh Steam / SteamVR log lines:

22:07:50 proton waitforexitandrun .../Half-Life 2 VR/ep1vr.exe
22:08:03 SetApplicationPid: Setting app steam.app.2177750 PID to 27990
22:08:03 Successfully loaded binding file '.../hlvr/cfg/steamvr/bindings_frame.json' for app 'steam.app.2177750'.

The game's episodicvr/console.log reached Creating VR hand HUD..., Creating VR weapon HUD... and Calibrating VR base position. It also contained missing material/weapon warnings. SteamVR logged a missing frame_hmd binding as well as the successful controller binding load; controller input was not exercised.

ui/frame_vrshot.py produced a stereo capture showing the mod's “First time setup” and “Dominant hand” dialog. This establishes visible startup, not a played level or comfortable performance. The capture includes room passthrough and is deliberately not published. The test's hl2.exe process was terminated; the pre-existing game installation was preserved.

Gravitas and UEVR: injection unverified

The game was launched through Steam. The injector was then started in the same steamapps/compatdata/1067310 prefix using the shipped SteamLinuxRuntime_4-arm64/_v2-entry-point and Proton 11 ARM64. The first attempt reported:

Application: UEVRInjector.exe
Message: You must install .NET to run this application.
Architecture: x64
App host version: 6.0.35
.NET location: Not found

With DOTNET_ROOT and DOTNET_ROOT_X64 pointing at the test-only Windows runtime directory, Proton loaded Microsoft.NETCore.App/6.0.36 and Microsoft.WindowsDesktop.App/6.0.36. A 25-second launcher timeout was too short to establish whether the UI worked. A longer attempt produced a 625×372 UEVR X11 window on display :1. This is window creation evidence, not a successful injection. That launcher returned exit 0; this was not treated as proof that a mod worked.

A combined launch set PROTON_REMOTE_DEBUG_CMD to UEVRInjector.exe and ran Gravitas's Drop.exe in the same runtime/prefix. The process SkyArk/Binaries/Win64/Drop-Win64-Shipping.exe and a 1600×900 window titled SkyArk (64-bit, PCD3D_SM5) appeared. The launcher exited 1 before an injection or stereo game scene could be verified. Output included:

Proton: Error while copying to ".../windows/system32/amdxcffx64.dll": No such file or directory
Error [GENERAL | xrCreateInstance | OpenXR-Loader] : xrCreateInstance failed
X Error of failed request: BadWindow (invalid Window parameter)
  Major opcode of failed request: 10 (X_UnmapWindow)
X Error of failed request: XI_BadDevice (invalid Device parameter)
  Minor opcode of failed request: 28 (X_GetDeviceButtonMapping)

These errors do not establish an ARM64/FEX incompatibility. Other work was launching apps on the shared Frame. SteamVR's PIDs changed during the experiment; ps recorded the replacement vrserver and vrcompositor starting at 22:13:03, corroborated by steamvr.service journal startup lines. This test did not request a Steam/SteamVR restart. The combined attempt ran at 22:14:17–22:14:27, after that restart. A stable, coordinated session is needed to distinguish launcher/environment problems from game or mod incompatibility.

Cleanup and remaining checks

  • No game executable or OpenVR DLL was replaced. No global runtime or power setting was changed by this test. No R.E.A.L., OpenComposite or Beat Saber payload was installed.
  • Removed the test-only UEVR/.NET directory and downloaded ZIPs from the Frame. Final process checks found no UEVRInjector.exe, Drop-Win64-Shipping.exe, ep1vr.exe or hl2.exe. SteamVR was running.
  • Gravitas and its Steam-created prefix remain installed for a repeat test; the pre-existing HL2 VR install remains. Steam may retain normal shader caches, logs and prefix temporary files.
  • Still unverified: UEVR injection and removal, R.E.A.L. releases and permissions, OpenComposite, Beat Saber playback on either build, and our own manager's end-to-end install/uninstall. No installer UI is justified by these results. See the support table and next checks.