diff --git a/docs/evidence/framey-shotty-rpc-2026-10-28.md b/docs/evidence/framey-shotty-rpc-2026-10-28.md new file mode 100644 index 0000000..427162c --- /dev/null +++ b/docs/evidence/framey-shotty-rpc-2026-10-28.md @@ -0,0 +1,27 @@ +# Shotty screenshot copy through native Decky RPC, 28 October 2026 + +The exact official Shotty 0.1.0 archive (store ID 53, SHA-256 +`ab7f6618b264a0cb766525e788cef6c3e1478c0fef98a701225e5e8af441e2fe`) +was installed with Frame Control's digest-scoped `shotty-click-app-dir` shim. +The local `scripts/framey-test-decky-runtime.py` run used the published, +digest-verified Decky 3.3.0 amd64 loader in a disposable unprivileged container +with no network, host devices or writable host mount. Its full 14-case native +suite, including three negative controls, exited successfully. + +The Shotty case placed two small marker files under a private synthetic Steam +screenshots directory in the container's temporary home. Calls went through +Decky's real legacy websocket RPC. `set_id_map_fronend` supplied a private game +name; `copy_screenshot` returned `true` for the selected file. Independent +reads of `Pictures/Screenshots/Private Game/selected.jpg` and +`Pictures/Screenshots/most_recent.jpg` matched the marker bytes. A later +`aggregate_all` returned `1`, and the historical file in the named folder +also matched its source bytes. Empty aggregation and `was_rescued=false` still +passed. The runner removed its owned containers and image; no headset or user +screenshot was accessed. + +This local run checks the real Decky RPC and same-filesystem copy path with +synthetic files on amd64. The PR's hosted native ARM64 gate must pass before +merge; this local result alone does not establish ARM64 behavior. Steam's live +screenshot notification, cross-filesystem copies, the continuous rescuer, real +Frame installation, wearer-visible VR and physical controller use remain +unverified. Shotty remains **partial**. diff --git a/tests/decky-runtime/check.py b/tests/decky-runtime/check.py index 652aca2..9a3a541 100644 --- a/tests/decky-runtime/check.py +++ b/tests/decky-runtime/check.py @@ -358,7 +358,22 @@ def main(): assert case['probe'] == 'screenshots' assert legacy('was_rescued') is False assert legacy('aggregate_all', allapps=[]) == 0 - report['result'] = 'discovery, backend import and empty screenshot aggregation passed' + screenshots = home/'.local/share/Steam/userdata/9001/760/remote/4242/screenshots' + screenshots.mkdir(parents=True) + marker = b'Framey private screenshot fixture\n' + (screenshots/'selected.jpg').write_bytes(marker) + legacy('set_id_map_fronend', allapps=[[4242, 'Private Game']]) + assert legacy('copy_screenshot', app_id=4242, + url='https://localhost/selected.jpg') is True + copied = home/'Pictures/Screenshots/Private Game/selected.jpg' + assert copied.read_bytes() == marker + assert (home/'Pictures/Screenshots/most_recent.jpg').read_bytes() == marker + (screenshots/'historical.jpg').write_bytes(b'Framey historical fixture\n') + assert legacy('aggregate_all', allapps=[[4242, 'Private Game']]) == 1 + assert (copied.parent/'historical.jpg').read_bytes() == b'Framey historical fixture\n' + assert legacy('was_rescued') is False + report['result'] = ('discovery, backend import, empty aggregation, private screenshot ' + 'copy and historical aggregation passed') log.flush() log.seek(0) assert 'Starting Decky version v3.3.0' in log.read()