From aeb6bb5294237d8ec6678bdc99ef5f4b37599fc9 Mon Sep 17 00:00:00 2001 From: SAPHID Date: Mon, 26 Oct 2026 01:50:32 +0000 Subject: [PATCH] Guard real Frame smoke with shared lock and standby preflight --- .../v0438-release-smoke-2026-10-26.json | 32 ++++++ .../v0438-release-smoke-2026-10-26.md | 27 +++++ docs/testing.md | 7 ++ tests/smoke/frame_smoke.py | 108 ++++++++++++++++-- tests/test_smoke_cleanup.py | 53 ++++++++- 5 files changed, 214 insertions(+), 13 deletions(-) create mode 100644 docs/evidence/v0438-release-smoke-2026-10-26.json create mode 100644 docs/evidence/v0438-release-smoke-2026-10-26.md diff --git a/docs/evidence/v0438-release-smoke-2026-10-26.json b/docs/evidence/v0438-release-smoke-2026-10-26.json new file mode 100644 index 0000000..e881ed7 --- /dev/null +++ b/docs/evidence/v0438-release-smoke-2026-10-26.json @@ -0,0 +1,32 @@ +{ + "tag": "v0.4.38", + "commit": "d87b863aa3c61c9833045b29ba79c7534a351ef4", + "startedUtc": "2026-10-26T01:47:23Z", + "frameOSVersion": "0.5.6", + "frameOSBuild": "20261022.6153909", + "preflight": { + "steamVRActivity": 3, + "proximityRaw": 6.3125, + "batteryPercent": 100 + }, + "postflight": { + "steamVRActivity": 3, + "proximityRaw": 6.25, + "batteryPercent": 100 + }, + "smoke": { + "passed": 13, + "failed": 0, + "arm64": "running", + "x86_64": "runtime missing", + "windowsExe": "running", + "finalCleanupPassed": true, + "ownedProcessesAfterCleanup": 0 + }, + "sharedLock": "unique owner released", + "limits": [ + "No worn headset", + "No physical controller input", + "No official Decky panel tested in this smoke" + ] +} diff --git a/docs/evidence/v0438-release-smoke-2026-10-26.md b/docs/evidence/v0438-release-smoke-2026-10-26.md new file mode 100644 index 0000000..9437cfe --- /dev/null +++ b/docs/evidence/v0438-release-smoke-2026-10-26.md @@ -0,0 +1,27 @@ +# v0.4.38 real Frame release smoke + +On 2026-10-26 at 01:47 UTC, the exact `v0.4.38` tag +`d87b863aa3c61c9833045b29ba79c7534a351ef4` passed `scripts/frame-smoke.sh` +on a real Frame running SteamOS 0.5.6 build `20261022.6153909`. The wrapper +atomically acquired `/tmp/frame-test.lock` with a unique owner, then read +SteamVR activity 3 (standby), proximity raw 6.3125 and battery 100%. It ran +the smoke only after that preflight. + +All 13 smoke steps passed. The ARM64 test title ran. The x86_64 title correctly +reported its runtime missing. The Windows executable ran through the ARM64 +Proton path. The final cleanup found no test processes and removed the reserved +smoke titles. The read-only postflight still found activity 3 and battery 100%; +the wrapper released only its own lock. The public numeric summary is +[v0438-release-smoke-2026-10-26.json](v0438-release-smoke-2026-10-26.json). +Private raw logs and process paths remain in `/tmp` and were not published. + +The new built-in shared-lock preflight on this PR's branch separately passed +the same 13/13 smoke steps at 01:46 UTC, with activity 3, proximity raw 6.3125 +and battery 100% before the run. The lock was released after cleanup. The local +`tests.test_smoke_cleanup` suite passed 20 tests, including refusal on a busy +lock and release after a failed preflight. The built-in preflight was **not** +part of the v0.4.38 tag; that release used the external lock wrapper described +above. + +These checks did not involve a worn headset or prove Framey panel visibility, +physical controller interaction, or optical comfort. diff --git a/docs/testing.md b/docs/testing.md index 043abce..569206b 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -208,6 +208,13 @@ It resolves the checkout path independently of the current working directory. `/path/to/checkout/scripts/frame-smoke.sh --help` is safe to run offline and does not contact the headset. +Before reading headset status or changing titles, the smoke script atomically +acquires the shared `/tmp/frame-test.lock` with a unique owner token. It reads +SteamVR activity, proximity and battery while locked. An awake headset, unknown +activity, battery below 20%, or a busy lock stops the run without installing +anything. It releases only its own lock after cleanup. The JSON result includes +the read-only preflight for completed smoke runs. + It checks `properties.json` and the status, then installs, launches and removes three tiny titles built from bytes by `tests/smoke/tiny_programs.py` (an ARM64 and an x86-64 static Linux program that sleep for ten seconds, and diff --git a/tests/smoke/frame_smoke.py b/tests/smoke/frame_smoke.py index a11b0f9..c69533b 100644 --- a/tests/smoke/frame_smoke.py +++ b/tests/smoke/frame_smoke.py @@ -4,6 +4,11 @@ Runs on your computer through the `frame` SSH alias (or FRAME_ALIAS), with Frame Control's own modules, and records what happened with the headset's BUILD_ID in tests/smoke/results/