mirror of
https://github.com/saphid/frame-control.git
synced 2026-10-27 05:01:44 +01:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af8fc63f3b | ||
|
|
9c39300185 | ||
|
|
592988c212 | ||
|
|
89f5dc164e | ||
|
|
13c689926d | ||
|
|
1b143094d1 | ||
|
|
b2cc34576c |
No files matched your search
@@ -0,0 +1,55 @@
|
||||
# Decky Localsend 0.4.5 source match and ARM64 build, 27 October 2026
|
||||
|
||||
The exact official store archive (ID 125, SHA-256
|
||||
`e271ccb55eb23f918b99a69f79aec905df4c9b2ef7b23bbf4ec1c2d1a6f0c6b7`)
|
||||
remains **blocked** on Frame: it carries an x86_64 `bin/localsend-core`.
|
||||
No managed plugin install, transfer, or status promotion was performed.
|
||||
|
||||
The archive's `main.py` has SHA-256
|
||||
`db03f9201fe50b75dea99a7a05b54ec3f352d1bdfe174115b0e569154198d8ad`,
|
||||
identical byte for byte to `main.py` at the upstream Decky plugin tag `v0.45`
|
||||
(`7c166bdc33e2a667527ffd511eb5b90d3ce0bd67`). That tag pins its Go
|
||||
submodule to `ad28b8e9440e17e44b4735a6c4aa0512009cf333`. All 42 dependency
|
||||
versions embedded in the official helper match that source's `go.mod`, which
|
||||
declares Go 1.25.7.
|
||||
|
||||
Building that pinned Go commit with `CGO_ENABLED=0`, `GOOS=linux`,
|
||||
`GOARCH=amd64`, and the flags `-trimpath -buildvcs=false -ldflags='-s -w'`
|
||||
produced **byte-identical** official helper bytes: 15,241,400 bytes,
|
||||
SHA-256 `d448d03861d578685e6c70ea3ace25eb34fca99cb9d4f98bf51ba23aa5cae843`.
|
||||
This resolves the source correspondence gap left by the earlier build from
|
||||
the later `66edc509` commit. The same pinned source and flags with
|
||||
`GOARCH=arm64` produced a static AArch64 ELF of 11,731,128 bytes, SHA-256
|
||||
`e20363237e606ee65eae857792176d21a0bb8ba863489952728eaf2b13277dae`.
|
||||
Two ARM64 builds matched byte for byte. The Go core is MIT licensed; the
|
||||
separate Decky Python plugin is BSD-3-Clause.
|
||||
|
||||
A unique-owner atomic `/tmp/frame-test.lock` preflight on the real Frame read
|
||||
SteamVR activity **1**, proximity raw **88.0625**, and battery **35%**.
|
||||
Because the headset was active or wearer status was unknown, the probe did
|
||||
not upload or execute the ARM64 helper, start a LocalSend service, or send
|
||||
input. The task-owned directory was absent and only the owned lock was
|
||||
released. This is **not** a worn visual or controller result.
|
||||
|
||||
The unmodified plugin backend's `_main` starts a fixed-path Unix notification
|
||||
socket but does not start the Go network service. Its explicit `start_backend`
|
||||
method starts the helper with a default all-interface setting, HTTPS and
|
||||
auto-save disabled. A local follow-up ran that exact Python backend with the
|
||||
official x86_64 helper in a disposable user/network namespace. A veth pair
|
||||
provided only documentation-range private addresses and there was no default
|
||||
route. A private Decky module stub supplied task-owned settings, runtime,
|
||||
plugin and log directories; its notification socket was moved into that
|
||||
directory. The backend's `start_backend`, `proxy_get` info request and
|
||||
`proxy_post` prepare/upload methods passed. One 42-byte public marker
|
||||
arrived in the private upload directory with independent SHA-256
|
||||
`346373ca56ec52c3f47b8d41de2a6a8479d8ad10d2891ff3b0dc7ea9c3892a39`.
|
||||
The backend stopped, its process and private directory were absent, and the
|
||||
global notification socket was untouched. This verifies the upstream x86
|
||||
backend/proxy/transfer contract locally, **not** Decky 3.3.0 discovery, ARM64
|
||||
transfer, an installed Frame plugin or real-network transfer.
|
||||
|
||||
Before a managed ARM64 adaptation, verify actual Decky backend discovery/RPC,
|
||||
the frontend and a private transfer with the exact-source ARM64 helper;
|
||||
package the source, license and exact helper digest. The official x86_64
|
||||
archive remains blocked until that work passes. Worn VR and physical
|
||||
controller use remain unverified.
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"tag": "v0.4.50",
|
||||
"releaseId": 424993367,
|
||||
"tagNameAtAudit": "v0.4.50",
|
||||
"draftAtAudit": true,
|
||||
"sha256sumsSha256": "85383104a8f08f49ffde24ac867f9c2ead41951e602600a9d22d58bc19bf06f5",
|
||||
"assets": [
|
||||
{
|
||||
"name": "Frame-Control-mac-arm64.dmg",
|
||||
"size": 173090558,
|
||||
"sha256": "d402924394725bac2b28bef17c7945e2f7e4c3093227eace78a42ed80e864be9",
|
||||
"udifTrailer": "ok"
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-mac-arm64.zip",
|
||||
"size": 172911785,
|
||||
"sha256": "2583937fefdc315706018c1bf794b916726ee55b461e321c3334df21245a110d",
|
||||
"zipCrc": "ok",
|
||||
"members": 1666,
|
||||
"bundleVersion": "0.4.50"
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-mac-x64.dmg",
|
||||
"size": 180139223,
|
||||
"sha256": "2128c14b15dd1a2a59790c43d42640a25185562056796a3437910d6f88f996c8",
|
||||
"udifTrailer": "ok"
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-mac-x64.zip",
|
||||
"size": 179998207,
|
||||
"sha256": "ed684023ff087d6741e88d4ca4f8a47e67bec07255fc73fbd18a6bcaa42d14fe",
|
||||
"zipCrc": "ok",
|
||||
"members": 1662,
|
||||
"bundleVersion": "0.4.50"
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-Setup-x64.exe",
|
||||
"size": 147348168,
|
||||
"sha256": "7c46fcc759cefb9060e1dc2fce39682f6dad306f3666805f77ce707e16ef3e2c",
|
||||
"peMachine": 332
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-win-x64.zip",
|
||||
"size": 194302082,
|
||||
"sha256": "57e71304bae96dc8aab6b845a64c27ac428931d02bb41ae60b33b19fcd11193f",
|
||||
"zipCrc": "ok",
|
||||
"members": 1510
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-linux-x86_64.AppImage",
|
||||
"size": 175453095,
|
||||
"sha256": "d2196b9a50d0777203e60721dd19c6edbb5c18a7639148f0a496d420e231b053",
|
||||
"elfMachine": 62
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-linux-arm64.AppImage",
|
||||
"size": 167036625,
|
||||
"sha256": "49370f9c27931bf6c28676d627dc34553550b544ab38b7f4be8e8f6dbc9b7c4b",
|
||||
"elfMachine": 183
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-linux-amd64.deb",
|
||||
"size": 142209572,
|
||||
"sha256": "430d057f234557f5f9dbb3e2cff3469829d041d0d7be191e70e6ef7de6663256",
|
||||
"debVersion": "0.4.50",
|
||||
"architecture": "amd64"
|
||||
},
|
||||
{
|
||||
"name": "Frame-Control-linux-arm64.deb",
|
||||
"size": 129291236,
|
||||
"sha256": "6403f8caafcdd5832415547e146ce3886cf7358e0c3a8898f4ee6e9a0a7b05ea",
|
||||
"debVersion": "0.4.50",
|
||||
"architecture": "arm64"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
# v0.4.50 tagged release verification, 27 October 2026
|
||||
|
||||
The annotated `v0.4.50` tag dereferences to merged main commit
|
||||
`2797212d8c95311deb8ba73043d0f90ba10bc962`. Its tree exactly matched
|
||||
the reviewed [candidate PR #360](https://github.com/saphid/frame-control/pull/360)
|
||||
head `dab13fa8763b4f836cd49d398d152124655ea8dc`. The candidate includes
|
||||
the Framey and Windows changes listed in the public release notes and the
|
||||
publisher gate that checks every workflow run attempt.
|
||||
|
||||
## Exact commit and tagged build gates
|
||||
|
||||
- [Main checks](https://github.com/saphid/frame-control/actions/runs/40440862876)
|
||||
completed successfully on the tag commit: seven of seven jobs, including
|
||||
e2e, iOS, Windows, macOS, Linux and the aggregate gate.
|
||||
- [Native Decky runtime](https://github.com/saphid/frame-control/actions/runs/40440862867)
|
||||
completed successfully on that commit: AMD64 and ARM64 actual Decky 3.3.0
|
||||
discovery and safe probes.
|
||||
- An exact-main [installer preview](https://github.com/saphid/frame-control/actions/runs/40441532929)
|
||||
built Windows, Linux, Apple Silicon Mac and Intel Mac installers successfully
|
||||
before tagging. Its draft and checksum jobs were inapplicable to the manual
|
||||
preview and skipped by their tag-only conditions; they were not release gates.
|
||||
- The [exact-tag release workflow](https://github.com/saphid/frame-control/actions/runs/40442228066)
|
||||
then passed all six jobs on its first attempt: draft, four platform builds,
|
||||
and checksums. No tagged job failed, was cancelled, skipped or overridden.
|
||||
|
||||
The draft contained exactly ten installer assets and `SHA256SUMS` before
|
||||
publication. Every installer was independently downloaded by GitHub asset ID,
|
||||
one file at a time. Its downloaded size and SHA-256 matched GitHub's asset
|
||||
metadata and the downloaded `SHA256SUMS`; the latter's SHA-256 was
|
||||
`85383104a8f08f49ffde24ac867f9c2ead41951e602600a9d22d58bc19bf06f5`.
|
||||
The [sanitized audit result](v0450-assets-2026-10-27.json) records all ten
|
||||
names, sizes, hashes and package checks. The audit also checked both Mac ZIP
|
||||
CRCs and bundle version `0.4.50`, both DMG UDIF trailers, the Windows ZIP
|
||||
CRC and PE installer header, both AppImage ELF architectures, and both DEB
|
||||
version and architecture fields. The Windows NSIS installer itself has a
|
||||
32-bit PE launcher; tagged Windows CI installed its x64 payload and checked
|
||||
packaged resources and Python libraries.
|
||||
|
||||
The independently downloaded Linux x86_64 AppImage had SHA-256
|
||||
`d2196b9a50d0777203e60721dd19c6edbb5c18a7639148f0a496d420e231b053`.
|
||||
Its first local launch exited inside the workspace sandbox before the server
|
||||
answered. The same bytes then passed outside that sandbox under isolated Xvfb:
|
||||
HTTP 200 with `FrameControl/1`, followed by a stopped server. The launcher
|
||||
used a temporary profile and disabled telemetry and update checks. Tagged
|
||||
Linux CI also launched its own built AppImage. No physical Mac or Windows
|
||||
launch of these exact installers was performed.
|
||||
|
||||
## Real Frame and publication
|
||||
|
||||
The [candidate evidence](v0450-candidate-2026-10-27.md) records a unique-lock
|
||||
real Frame smoke on the version-bumped source: **12 passed, one optional
|
||||
x86_64 launch skipped, zero failed**. Steam Linux Runtime 4 was absent, so no
|
||||
x86_64 launch is claimed. A separate fresh-lock cleanup audit found no owned
|
||||
test title directories, metadata or processes; both locks were released.
|
||||
SteamVR activity was 3 (standby), proximity raw 3.25 and battery 100%.
|
||||
There was no wearer confirmation, wake command or worn interaction test.
|
||||
The private smoke result's SHA-256 is
|
||||
`7b8d88aafb4459bf882edeb10f65c021c5aa25ad9ed2755faf04e3b4a95c1632`.
|
||||
|
||||
`scripts/publish-release.sh --dry-run v0.4.50` passed the exact main,
|
||||
native runtime and tagged release jobs, all ten installer hashes, regenerated
|
||||
`SHA256SUMS`, draft notes and update-manifest checks. The real publisher
|
||||
repeated those gates, attached `update.json`, and published
|
||||
[v0.4.50](https://github.com/saphid/frame-control/releases/tag/v0.4.50) at
|
||||
**03:19:21 UTC**. GitHub's latest-release API returned `draft=false`,
|
||||
`prerelease=false`, ten installers, `SHA256SUMS` and `update.json`. A fresh
|
||||
public latest-download of `update.json` reported version `0.4.50`, the
|
||||
correct release page, ten hashes matching the independent downloads, and the
|
||||
worn-headset limit in its notes.
|
||||
|
||||
The exact-version official Decky catalog is **6 works / 51 partial /
|
||||
48 broken / 11 N/A**. These statuses have the scoped evidence in
|
||||
[the compatibility table](../framey-compatibility.md). Worn headset
|
||||
visibility, physical controller input, VR keyboard and optical comfort remain
|
||||
unverified. The hourly shared-lock worn check remains enabled.
|
||||
@@ -283,7 +283,7 @@ All published Linux native payloads in this snapshot are x86_64; no published aa
|
||||
|
||||
A [DeckyFileServer ARM64 follow-up](evidence/framey-fileserver-arm64-2026-10-27.md) ships an offline, digest-checked GPL helper build, corresponding vendored source and a build recipe. Only its exact managed archive can replace the x86 helper and remove its unnecessary root flag. Actual Decky 3.3.0 discovery/RPC and real Frame HTTPS private-fixture listing/download pass; uploads stay disabled. Hostname-DNS failures and empty optional arguments are repaired. Decky 3.3.0 still exposes `decky.HOME`; that call is unchanged. The plugin moves from broken to partial: its frontend advertises HTTP/steamdeck URLs and needs a Steam folder picker. Use HTTPS and a preconfigured directory. Uploads, generated thumbnails and worn VR remain unverified.
|
||||
|
||||
[LocalSend ARM64 build/runtime evidence](evidence/framey-localsend-arm64-2026-10-26.md) covers a reproducible MIT helper build and its isolated real-Frame protocol 2.0 info response. The official x86 archive remains blocked; full plugin integration and file transfers are unverified.
|
||||
[LocalSend ARM64 build/runtime evidence](evidence/framey-localsend-arm64-2026-10-26.md) covers an isolated real-Frame protocol 2.0 info response from an earlier helper build. [Exact official source matching](evidence/framey-localsend-source-match-2026-10-27.md) now identifies the official helper source and a reproducible ARM64 build from that revision. The exact official x86 backend passed one local private-namespace transfer. The official x86 archive remains blocked on Frame; ARM64 transfer and full plugin integration are unverified.
|
||||
|
||||
| Plugin | Native payloads | ARM64 result / remaining blocker |
|
||||
| --- | --- | --- |
|
||||
@@ -308,7 +308,7 @@ A [DeckyFileServer ARM64 follow-up](evidence/framey-fileserver-arm64-2026-10-27.
|
||||
| HueSync | bin/hello, py_modules/portio.so | portio and handheld LED backends depend on x86 I/O/unsupported hardware; ARM64 compilation alone is insufficient. |
|
||||
| Decky Clipboard | bin/xclip | xclip needs ARM64 X11 libraries/server; root and gamescope assumptions also block this archive. |
|
||||
| Reroll | bin/memscan.so | memscan.so needs ARM64 process-memory support and ABI testing; root requirement remains. Frontend initializes but no memory access was tested. |
|
||||
| Decky Localsend | bin/localsend-core | MIT LocalSend-Go 66edc509a28b9f877e7374504892dcbc653a4da4 reproducibly cross-built with Go 1.25.7/CGO_ENABLED=0 for ARM64; SHA-256 e79238f6051ce34f172f765ae918d3d902b819e27377989a55e5b1eba10e46f9. Help/official backend CLI flags and protocol 2.0 info endpoint passed on real Frame in an isolated network namespace. No file transfer or full plugin/CEF integration tested; exact source match to shipped helper unproven. Official ZIP stays x86_64 and blocked. |
|
||||
| Decky Localsend | bin/localsend-core | Official 0.4.5 ZIP main.py matches plugin tag v0.45 byte for byte; its pinned LocalSend-Go ad28b8e9 source reproduces the official x86 helper byte for byte with Go 1.25.7 and a static ARM64 helper twice (SHA-256 e20363237e606ee65eae857792176d21a0bb8ba863489952728eaf2b13277dae). Earlier build from a later source revision answered protocol 2.0 info on real Frame in an isolated namespace. The official x86 backend/proxy passed a marker transfer in a private no-route namespace. The exact-source ARM64 helper has not run on Frame; actual Decky discovery, ARM64 transfer, frontend and managed adaptation remain unverified. Official ZIP stays x86_64 and blocked (docs/evidence/framey-localsend-source-match-2026-10-27.md). |
|
||||
| Launch Options | bin/hello | Remove the template x86 bin/hello or publish an ARM64 rebuild; missing Steam module mapping also prevents frontend initialization. |
|
||||
| Decky-Clipper | bin/gstreamer-1.0/libgstproxy.so, bin/gstreamer-1.0/libgstmidi.so, bin/gstreamer-1.0/libgstmpegtsmux.so, bin/gstreamer-1.0/gst-plugin-scanner, bin/gstreamer-1.0/libgstivfparse.so, … 115 total; full list in JSON | Rebuild all bundled GStreamer libraries/plugins for ARM64 and verify capture/codec ABI against Frame SteamVR; gamescope capture differs. |
|
||||
|
||||
|
||||
@@ -130,8 +130,11 @@ def render(data):
|
||||
'Hostname-DNS failures and empty optional arguments are repaired. Decky 3.3.0 still exposes `decky.HOME`; that call is unchanged. '
|
||||
'The plugin moves from broken to partial: its frontend advertises HTTP/steamdeck URLs and needs a Steam folder picker. Use HTTPS and a preconfigured directory. Uploads, generated thumbnails and worn VR remain unverified.', '',
|
||||
'[LocalSend ARM64 build/runtime evidence](evidence/framey-localsend-arm64-2026-10-26.md) '
|
||||
'covers a reproducible MIT helper build and its isolated real-Frame protocol 2.0 info response. '
|
||||
'The official x86 archive remains blocked; full plugin integration and file transfers are unverified.', '',
|
||||
'covers an isolated real-Frame protocol 2.0 info response from an earlier helper build. '
|
||||
'[Exact official source matching](evidence/framey-localsend-source-match-2026-10-27.md) '
|
||||
'now identifies the official helper source and a reproducible ARM64 build from that revision. '
|
||||
'The exact official x86 backend passed one local private-namespace transfer. '
|
||||
'The official x86 archive remains blocked on Frame; ARM64 transfer and full plugin integration are unverified.', '',
|
||||
'| Plugin | Native payloads | ARM64 result / remaining blocker |', '| --- | --- | --- |']
|
||||
for p in data['plugins']:
|
||||
if p['native']:
|
||||
|
||||
@@ -11174,7 +11174,7 @@
|
||||
},
|
||||
"backend": "Python + native payload",
|
||||
"hardware": "No specific hardware requirement detected statically; runtime requirements unverified.",
|
||||
"nativePort": "MIT LocalSend-Go 66edc509a28b9f877e7374504892dcbc653a4da4 reproducibly cross-built with Go 1.25.7/CGO_ENABLED=0 for ARM64; SHA-256 e79238f6051ce34f172f765ae918d3d902b819e27377989a55e5b1eba10e46f9. Help/official backend CLI flags and protocol 2.0 info endpoint passed on real Frame in an isolated network namespace. No file transfer or full plugin/CEF integration tested; exact source match to shipped helper unproven. Official ZIP stays x86_64 and blocked.",
|
||||
"nativePort": "Official 0.4.5 ZIP main.py matches plugin tag v0.45 byte for byte; its pinned LocalSend-Go ad28b8e9 source reproduces the official x86 helper byte for byte with Go 1.25.7 and a static ARM64 helper twice (SHA-256 e20363237e606ee65eae857792176d21a0bb8ba863489952728eaf2b13277dae). Earlier build from a later source revision answered protocol 2.0 info on real Frame in an isolated namespace. The official x86 backend/proxy passed a marker transfer in a private no-route namespace. The exact-source ARM64 helper has not run on Frame; actual Decky discovery, ARM64 transfer, frontend and managed adaptation remain unverified. Official ZIP stays x86_64 and blocked (docs/evidence/framey-localsend-source-match-2026-10-27.md).",
|
||||
"uiSurfaces": [
|
||||
"local/Steam routes",
|
||||
"toasts",
|
||||
|
||||
Reference in new issue
Block a user