diff --git a/docs/current-support-matrix.md b/docs/current-support-matrix.md index ebefe54..e2ba476 100644 --- a/docs/current-support-matrix.md +++ b/docs/current-support-matrix.md @@ -4,6 +4,7 @@ Current for Frame Control **v0.4.31**, 25 October 2026. “Real Frame + physical | Feature | Real Frame + physical PC tested | VM only | Untested or limited | Last check and proof | |---|---|---|---|---| +| Core title smoke test | Linux lxso2 installed, launched and removed reserved native/Proton titles on the real Frame; all 13 steps passed | No | Unworn headset; visible rendering and controller input not checked. Other feature paths retain their separate limits below | 25 Oct, v0.4.31 candidate source `1255ef2`, Frame OS 0.5.6 build `20261022.6153909`: [sanitized results](evidence/round2-smoke-2026-10-25.json) | | Windows desktop in the headset | No physical Windows PC test | Windows 11 VM sent a whole desktop to a real Frame; this used an intermediate fix, not the final native DLL | Physical GPU, capture and controller input; individual windows unavailable in bundled DXGI build | 24 Oct, v0.4.10 installer + candidate fix: [VM log](evidence/windows-vm-2026-10-24.md), [PC guide](pc-in-headset.md) | | Linux desktop in the headset | No | No | Native Linux PC capture is disabled; lxso2 lacked a desktop portal and PipeWire session. The separate Steam `-pipewire` helper is not Frame Control's PC capture | 24 Oct, v0.4.17: [host audit](evidence/linux-pc-host-lxso2-2026-10-24.md), [Steam helper PR #163](https://github.com/saphid/frame-control/pull/163) | | Mac desktop in the headset | A physical Mac sent its screen/window to a real Frame | No | Current v0.4.26 Mac installer and worn-headset controller input have not been repeated | 28 Sep, pre-v0.4 / Frame OS 0.4.1: [Mac guide and measurement](streaming.md#b-show-the-macs-desktop-inside-the-frame) | diff --git a/docs/evidence/round2-retry-2026-10-25.md b/docs/evidence/round2-retry-2026-10-25.md new file mode 100644 index 0000000..f00d6b3 --- /dev/null +++ b/docs/evidence/round2-retry-2026-10-25.md @@ -0,0 +1,91 @@ +# Round 2 retry, 25 October 2026 + +The provider retry completed four further fixes, each in an isolated child +worktree with its own issue, branch, PR, tests, docs and Announcement draft. +The coordinator reviewed each patch, independently ran focused tests, verified +its exact head and complete CI, merged it, then read back GitHub's merged state. +PR #113 was untouched. No social announcements were posted. + +## Merged fixes + +| Change | PR | Merge commit | Coordinator focused tests | Final CI | +| --- | --- | --- | --- | --- | +| Skip linked backup ancestors and recheck before packing | [#215](https://github.com/saphid/frame-control/pull/215) | `da34d94` | 34 passed | 11 checks passed at `8cc03c8` | +| Clean orphan smoke metadata/shortcuts; POSIX runner without zsh | [#216](https://github.com/saphid/frame-control/pull/216) | `d5fa8fe` | 17 passed | 10 checks passed at `a5daa4a` | +| Separate Steam clips by headset/account/full session ID | [#217](https://github.com/saphid/frame-control/pull/217) | `1255ef2` | 62 passed | 10 checks passed at `7dfe777` | +| Retry failed automatic copies and bind listings to the captured headset | [#218](https://github.com/saphid/frame-control/pull/218) | `fdd60d3` | 33 passed | 10 checks passed at `af2bb17` | + +Two initial CI fixture failures were fixed before merging: macOS temporary-path +aliases needed a resolved working directory in the wrapper test; Windows +needed explicit UTF-8 when reading the Settings test's HTML fixture. +Concurrent main changes #208/#209/#210 were preserved. Changelog conflicts +retained both entries. No history was rewritten. + +## Integrated validation + +At main `1255ef2`, after all four merges: + +- `python3 -m unittest discover -s tests`: 1,559 tests, 16 skipped, passed in + 157.335 seconds. Loopback networking was enabled for local HTTP fixtures. +- `node --test app/test/*.test.js site/test/*.test.mjs`: 59 tests passed. +- Worker backup validation also passed both Docker recovery-kit E2E tests in + an isolated Compose project, then removed its containers, volumes and network. +- Local proof logs: `/tmp/frame-round2-integrated-tests.log` and + `/tmp/frame-round2-integrated-node.log`. Individual focused logs use + `/tmp/frame-round2-{backup,smoke,clips,autosync}-review.log`. + +## Real Frame smoke + +The current host is lxso2; its existing direct `ssh frame` alias works. +Another OBS task initially held `/tmp/frame-test.lock`, so only read-only +checks were done until it released the lock. This coordinator then acquired it +atomically and labeled it `frame-round2-vdw4yh1xv8-20261025`. + +The merged `scripts/frame-smoke.sh` ran directly without zsh at 06:38:37 UTC. +All 13 steps passed on SteamOS 0.5.6, BUILD_ID `20261022.6153909`. The ARM64 +and Proton titles ran. The x86-64 Linux title reported its runtime missing, +an explicitly accepted smoke outcome rather than a successful execution. +Installs/removals succeeded; the Windows title's remove +step stopped five test-owned PIDs. Both final process sweeps were empty. +Independent readback found no reserved title folders or metadata, SteamVR's +PID was unchanged, and the three observed gamescope focus properties matched +before/after. Battery went from 99% Charging to 100% Full. Only this task's +lock was removed, and its absence was verified. + +[Sanitized structured proof](round2-smoke-2026-10-25.json). Raw local results: +`/tmp/frame-round2-smoke-results/2026-10-25T063837Z-20261022.6153909.json`; +console log `/tmp/frame-round2-headset-smoke.log`; state readbacks +`/tmp/frame-round2-smoke-before.txt` and `/tmp/frame-round2-smoke-after.txt`. + +The headset was unworn. Visible rendering/controller input was not verified. +No pairing, password/security change, reboot or factory reset was performed. +The new backup/clip/auto-sync paths have local fixtures and cross-platform CI; +this smoke does not establish a new real-data backup/clip/UI test. Synthetic +orphan metadata was not seeded on the real device. Backup path checks retain +a documented race with concurrent filesystem changes. + +## Prior round-two work reconciled + +The failed coordinator checkout was still at v0.4.7. It was first updated to +main `d79efb4`, already v0.4.30. Earlier PRs had completed clipboard testing +(#124), original smoke process cleanup (#126), Windows VM capture (#129), +battery health (#125), setup doctor (#127), and read-only storage (#128). +Later evidence already covered real clip export (#147/#149/#154/#156) and +Return to Game Mode (#143/#157). These remain earlier evidence, not tests +performed by this retry. Physical Windows GPU/input and current physical +macOS checks remain incomplete; see the current support matrix. + +Decision: fix reproduced data/cleanup/retry defects rather than automate game +moves without a verified transaction API or promise unverified phone-background +sync. Prepare v0.4.31; publication still requires its Linux AppImage install test. + +## Delegation provenance + +All implementations completed. Task IDs use prefix +`node:delegated-task:command%3Amcp%3Ad9bc35d8-0e9c-42c2-b798-25bd8af94d81%3Adelegate-task%3A` +followed by one of: + +- `frame-r2-retry-smoke-orphans-20261025-r1` +- `frame-r2-backup-symlink-20261025-r1` +- `frame-r2-clip-collision-20261025-r1` +- `frame-r2-autosync-retry-20261025-r1` diff --git a/docs/evidence/round2-smoke-2026-10-25.json b/docs/evidence/round2-smoke-2026-10-25.json new file mode 100644 index 0000000..89d7cad --- /dev/null +++ b/docs/evidence/round2-smoke-2026-10-25.json @@ -0,0 +1,123 @@ +{ + "source_commit": "1255ef2bbf2e2e5fd86f8b984b592bed56f20780", + "started": "2026-10-25T06:38:37Z", + "os_release": { + "VERSION_ID": "0.5.6", + "VARIANT_ID": "vr", + "BUILD_ID": "20261022.6153909" + }, + "passed": 13, + "failed": 0, + "paired": false, + "devkit_utils_there_before": true, + "battery_before": { + "capacity": 99, + "statuses": [ + "Charging", + "Charging" + ] + }, + "battery_after": { + "capacity": 100, + "statuses": [ + "Full", + "Full" + ] + }, + "steamvr_pid_before": 124586, + "steamvr_pid_after": 124586, + "observed_focus_properties_unchanged": true, + "reserved_files_and_processes_absent_after": true, + "own_shared_lock_released": true, + "headset_worn": false, + "steps": [ + { + "step": "cleanup: leftovers from earlier runs", + "ok": true, + "seconds": 7.8, + "stopped_process_counts": [ + 0, + 0 + ] + }, + { + "step": "devkit service: properties.json", + "ok": true, + "seconds": 0.0 + }, + { + "step": "status", + "ok": true, + "seconds": 0.6 + }, + { + "step": "arm64: install", + "ok": true, + "seconds": 7.7 + }, + { + "step": "arm64: launch", + "ok": true, + "seconds": 3.3, + "outcome": "running" + }, + { + "step": "arm64: remove", + "ok": true, + "seconds": 6.4, + "stopped_process_counts": [ + 2, + 0 + ] + }, + { + "step": "x86_64: install", + "ok": true, + "seconds": 7.6 + }, + { + "step": "x86_64: launch", + "ok": true, + "seconds": 3.2, + "outcome": "runtime missing" + }, + { + "step": "x86_64: remove", + "ok": true, + "seconds": 6.2, + "stopped_process_counts": [ + 0, + 0 + ] + }, + { + "step": "exe: install", + "ok": true, + "seconds": 7.5 + }, + { + "step": "exe: launch", + "ok": true, + "seconds": 3.3, + "outcome": "running" + }, + { + "step": "exe: remove", + "ok": true, + "seconds": 6.5, + "stopped_process_counts": [ + 5, + 0 + ] + }, + { + "step": "cleanup: everything this run installed", + "ok": true, + "seconds": 7.4, + "stopped_process_counts": [ + 0, + 0 + ] + } + ] +} diff --git a/docs/testing.md b/docs/testing.md index 077b25e..043abce 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -261,7 +261,14 @@ title; the following process sweep found none. The final cleanup found no test titles or processes, the test desktop was closed, and the battery remained at 99%. That historical run used the Python entry point directly; the current POSIX wrapper has local offline coverage on a PATH without zsh. -The orphan-metadata and shortcut follow-up has not been rerun on a headset. +The current runner and all-six-ID cleanup sweeps passed another 13-step real +Frame run on 25 October, build `20261022.6153909`, at source commit `1255ef2`. +The Windows title's remove step stopped five test-owned Proton/wrapper PIDs; +the final sweep and independent readback found no reserved files or processes. +SteamVR stayed running, observed focus properties matched before/after, and +this task's shared lock was released. The headset was unworn. This run did +not seed synthetic orphan metadata or shortcuts; those cases use local +fixtures. [Sanitized results](evidence/round2-smoke-2026-10-25.json). The local regression suite runs real Linux processes in temporary fake title directories (including deleted folders and a TERM-resistant wrapper); it checks exit, escalation and survival of unrelated processes. Local filesystem commands