mirror of
https://github.com/saphid/frame-control.git
synced 2026-10-27 00:02:12 +01:00
Compare commits
4
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de3d7d4fbc | ||
|
|
1ddb6278b8 | ||
|
|
4252d22975 | ||
|
|
5438e1d9d0 |
No files matched your search
@@ -0,0 +1,44 @@
|
||||
# Native plugin packaging blockers, 26 October 2026
|
||||
|
||||
This is a static, digest-scoped follow-up. Neither plugin was installed or
|
||||
run on the Frame. Their compatibility statuses remain **broken**.
|
||||
|
||||
## Decky Cloud Save 1.4.2, store ID 49
|
||||
|
||||
The official ZIP SHA-256 is
|
||||
`b311d967ddf1b0f0046d36929645855891a40173e3a93f6f0cd8b1576b04b411`.
|
||||
It was downloaded and hash-checked without executing any member. Of its 27
|
||||
members, `decky-cloud-save/bin/rclone` is a regular executable of **60,776,600
|
||||
bytes** with ELF machine **62 (x86_64)**. The installer permits at most 30 MiB
|
||||
per member, so this exact ZIP fails before native architecture validation.
|
||||
Raising that limit alone would still leave an x86_64 executable on the ARM64
|
||||
Frame. No cloud credentials, saves, reads or writes were exercised.
|
||||
|
||||
## Emuchievements 2.0.5, store ID 28
|
||||
|
||||
The official ZIP SHA-256 is
|
||||
`98dcb443e81b9f9011cfe77c69eb659869c8e2df2df8b0a443df66cbfc2f5a89`.
|
||||
The [earlier helper check](framey-emuchievements-arm-2026-10-26.md) proved
|
||||
one synthetic ROM hash on ARM64, without installing the plugin. The upstream
|
||||
source commit `8567e94befffc943434b2adb842487274815f8bb` and its pinned
|
||||
libarchive, libchdr and rcheevos submodules were checked out separately for
|
||||
this audit. The source is GPL-3.0. An isolated Debian ARM64 cross-build made a
|
||||
2.6 MB helper (`c8794558a0d75294930f969a426e7d2ac13a27e3c1ff9bd8aae093e31596b9bd`),
|
||||
but it was **not shipped or run on ROM archives**. A complete source bundle
|
||||
without Git metadata compressed to about 8 MB; source and license distribution
|
||||
would be part of any release-ready port.
|
||||
|
||||
The proposed source has an additional blocker. `backend/src/util.cpp` builds
|
||||
an extraction destination by appending each raw archive member pathname to
|
||||
an owned `/tmp/tmpdir.*` prefix, then passes it to libarchive's disk writer.
|
||||
It neither rejects `..`/absolute paths nor enables libarchive's secure path
|
||||
flags. `backend/src/main.cpp` later removes the extracted file's parent path.
|
||||
With an untrusted archive, those paths may leave the intended temporary
|
||||
directory. The plugin's Python backend also invokes `bin/hash` through a
|
||||
shell with a path argument. A port needs bounded path validation, secure
|
||||
extraction/cleanup, safe subprocess arguments, format coverage and actual
|
||||
Decky/backend tests before its official ZIP can be transformed or installed.
|
||||
|
||||
The official archive still contains an x86_64 helper. RetroAchievements
|
||||
login, real ROM scanning, a packaged ARM64 backend, wearer-visible VR and
|
||||
physical controller use remain unverified.
|
||||
@@ -65,7 +65,7 @@ The API column shows manifest / actual bundled frontend API. Many manifests say
|
||||
| 44: DeckMTP 1.0.5 | legacy / legacy | broken | Plugin contains a non-ARM64 Linux binary: DeckMTP/bin/umtprd. | static archive, local browser, fake-Frame |
|
||||
| 46: Steamback 1.0.0-1 | legacy / legacy | partial | Panel opens using the real Frame current-user/library snapshot. Account setup and empty save-list reads pass through actual Decky 3.3.0 amd64 in isolation. ARM64 backend, supported-save discovery, automatic backups and restore remain unverified; no backup/restore ran. | static archive, local browser, fake-Frame, real Frame SSH |
|
||||
| 48: Quick Launch 1.2.1 | legacy / legacy | broken | This plugin needs root and is not supported by the Frame user service. | static archive, local browser, fake-Frame |
|
||||
| 49: Decky Cloud Save 1.4.2 | legacy / legacy | broken | Unsafe plugin archive member. | static archive, local browser, fake-Frame |
|
||||
| 49: Decky Cloud Save 1.4.2 | legacy / legacy | broken | The exact official ZIP contains a 60,776,600-byte x86_64 rclone member, above the 30 MiB member limit and unusable on ARM64. Installation remains blocked. | static archive, local browser, fake-Frame |
|
||||
| 50: Storage Cleaner 1.4.0 | 1 / 2 | partial | Empty-data panel rendered; cleanup was deliberately not run because it can remove local data. | static archive, local browser, fake-Frame |
|
||||
| 52: Game Theme Music 1.7.1-1 | 1 / 2 | partial | An inert local component lets the exact frontend initialize and render its Settings view in opaque Chromium. Backend get_setting and plugin network were denied in the audit; Steam game-page theme injection has no verified target in Framey. Music search, playback, downloads, settings persistence and worn VR remain unverified. | static archive, local browser, fake-Frame |
|
||||
| 53: Shotty 0.1.0 | legacy / legacy | partial | The frontend starts with the read-only Frame library snapshot. Frame Control adds a digest-scoped click.get_app_dir compatibility module to the managed install; the exact backend then imports and copies a synthetic Steam screenshot into a temporary Pictures folder in isolated Python. Actual Decky 3.3.0 ARM64 loading, live screenshots/rescue, in-VR panel and physical controller use remain unverified. | static archive, local browser, fake-Frame, real Frame SSH, isolated Python backend |
|
||||
@@ -288,11 +288,11 @@ All published Linux native payloads in this snapshot are x86_64; no published aa
|
||||
| Fantastic | bin/backend | Fan backend/driver is Deck-specific; an ARM64 rebuild would not provide compatible Frame hardware. |
|
||||
| PowerTools | bin/libryzenadj.so, bin/ryzenadj, bin/backend | RyzenAdj and AMD power backend cannot control an ARM64 Frame SoC. |
|
||||
| Memory Deck | bin/libscanmem.so.1.0.0 | libscanmem must be rebuilt for aarch64 and validated against target process architecture; memory writes were not tested. |
|
||||
| Emuchievements | bin/hash | A source-matched ARM64 bin/hash helper matched the official x86_64 helper on one synthetic ROM on the real Frame (docs/evidence/framey-emuchievements-arm-2026-10-26.md). The official ZIP still bundles x86_64 bytes and remains blocked; format coverage, packaging, plugin backend/UI, login and worn VR are unverified. |
|
||||
| Emuchievements | bin/hash | A source-matched ARM64 helper matched one synthetic ROM on the real Frame (docs/evidence/framey-emuchievements-arm-2026-10-26.md). The pinned upstream source proposed for packaging also has unsafe archive extraction and cleanup paths (docs/evidence/framey-native-port-blockers-2026-10-26.md); fix and test those before shipping an ARM64 binary. The official x86_64 ZIP remains blocked; format coverage, plugin backend/UI, login and worn VR are unverified. |
|
||||
| MoonDeck | python/externals/yarl/_quoting_c.cpython-313-x86_64-linux-gnu.so, python/externals/aiohttp/_http_parser.cpython-313-x86_64-linux-gnu.so, python/externals/aiohttp/_websocket/reader_c.cpython-313-x86_64-linux-gnu.so, python/externals/aiohttp/_websocket/mask.cpython-313-x86_64-linux-gnu.so, python/externals/aiohttp/_http_writer.cpython-313-x86_64-linux-gnu.so, … 26 total; full list in JSON | Rebuild vendored CPython 3.13 extension wheels for the headset Python ABI and ARM64; buddy/helper dependencies also need ports. |
|
||||
| Controller Tools | bin/backend | Native backend needs an ARM64 build and controller/HID dependencies; its direct websocket also bypasses the Framey bridge. |
|
||||
| DeckMTP | bin/umtprd | umtprd needs ARM64 libusb/MTP dependencies and USB gadget permissions; root user-service blocker remains. |
|
||||
| Decky Cloud Save | bin/rclone | rclone needs an ARM64 artifact; this ZIP also fails safe member validation. Cloud writes were not exercised. |
|
||||
| Decky Cloud Save | bin/rclone | An ARM64 rclone artifact and safe package policy are needed; the official 60,776,600-byte x86_64 member fails archive validation. No cloud writes were run (docs/evidence/framey-native-port-blockers-2026-10-26.md). |
|
||||
| DeckyFileServer | bin/backend | Native file-server backend needs ARM64 dependencies; root requirement also blocks the user service. |
|
||||
| TS3 QuickAccess | bin/ts3-qs4sd.so | TeamSpeak client plugin must match an ARM64 TeamSpeak client and SDK ABI, not merely rebuild the .so. |
|
||||
| Syncthing | bin/decky-syncthing-watchdog | The watchdog needs an ARM64 build, plus a supported Syncthing runtime/package and safe path validation. |
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
# Frame Control standing goal and takeover handoff
|
||||
|
||||
Owner: Alex. This records the 27 October 2026 AEDT recovery handoff; status
|
||||
checks below use UTC. It does not grant authority to publish a release or to
|
||||
start a second coordinator.
|
||||
|
||||
## Alex's top priority
|
||||
|
||||
> Make Frame Control's released version always stable and running cleanly. Never release something that isn't working correctly. I don't want to break things for people.
|
||||
|
||||
Keep the released app stable and main green. Investigate failures before
|
||||
shipping; a version number or an uploaded artifact is not proof of readiness.
|
||||
|
||||
## Standing roadmap
|
||||
|
||||
Roadmap round 2: test gaps, fixes and next features. The existing owner is T3
|
||||
job `mppkd9qczt` on lxso2. Preserve that job and its work. The recovery task did
|
||||
not send it messages, change its thread, or start replacement coding/release
|
||||
work. A human must settle ownership before a takeover starts.
|
||||
|
||||
## Mandatory release gates
|
||||
|
||||
- CI must be green on the **exact release commit**, not merely an earlier
|
||||
commit, another branch, or a previous successful workflow attempt.
|
||||
- End-to-end tests and release verification must pass for that candidate.
|
||||
- Every required installer build must succeed, including Linux, Windows,
|
||||
macOS Intel and macOS Apple Silicon.
|
||||
- Never publish a release with failed or cancelled required builds. A retry
|
||||
must actually finish successfully; a cancelled build is not a pass.
|
||||
- Keep main green. Resolve required failures before merging or releasing.
|
||||
- Preserve evidence linking the release tag/commit, successful workflow run,
|
||||
installer assets/checksums, e2e results and real-device verification.
|
||||
- Use `scripts/publish-release.sh --dry-run TAG` for inspection. A real publish
|
||||
or tag needs its own authorized release task; this handoff does not authorize it.
|
||||
|
||||
## Incident snapshot supplied by Alex
|
||||
|
||||
At the time of the recovery request, latest published was **v0.4.47** with a
|
||||
passed release run; **v0.4.48 RC was not published**, after a failed run with a
|
||||
cancelled macOS build. PRs **#337 and #338 were open**. Preserve this as the
|
||||
historical incident snapshot, not a claim that remote state stays unchanged.
|
||||
|
||||
## Verified update during recovery
|
||||
|
||||
Checked 26 October 2026 around 21:58 UTC:
|
||||
|
||||
- v0.4.47 was published at 15:07:28 UTC.
|
||||
- A subsequent v0.4.48 release run
|
||||
[40406781383](https://github.com/saphid/frame-control/actions/runs/40406781383)
|
||||
completed successfully on commit
|
||||
`5438e1d9d05ca472f200dcde50799c8ae882fafb`. Its Linux, Windows, Intel macOS
|
||||
and Apple Silicon macOS installer jobs, draft and checksum jobs all succeeded.
|
||||
- GitHub now reports **v0.4.48 published at 21:53:29 UTC**. This publication
|
||||
happened outside the recovery task. Recheck the exact-commit checks and
|
||||
release evidence before drawing conclusions about all release gates.
|
||||
- [#337](https://github.com/saphid/frame-control/pull/337) is merged; lxso1's
|
||||
clean main was fast-forwarded to
|
||||
`1ddb6278b8ae0a98ecc79a181bba4d3cc67a52b6`.
|
||||
- [#338](https://github.com/saphid/frame-control/pull/338) remains open.
|
||||
- lxso2 T3 recovered at **21:42:54 UTC**; port 3773/local HTTP and existing
|
||||
HTTPS returned 200 by 21:43:58 UTC. Root disk capacity remains critical;
|
||||
recovery is not a capacity fix.
|
||||
- Fleet guards, probe units, safety tests and incident evidence are proposed
|
||||
in [fleet #38](https://github.com/saphid/fleet/pull/38); units were installed
|
||||
under the owner's incident authorization. Disk critical alerts use the
|
||||
existing fleet Prometheus/watchdog pipeline.
|
||||
|
||||
## lxso1 readiness
|
||||
|
||||
Main checkout: `/home/saphid/projects/steam-frame` (GitHub repository
|
||||
`saphid/frame-control`). Shell default Node may be older; use
|
||||
`~/.nvm/versions/node/v24.22.1/bin` first in PATH for Node 24 CI commands.
|
||||
Python 3.9.25 and 3.13.14 were installed through uv for the CI matrix; system
|
||||
Python 3.12.3 already existed. Current workflows require no Rust/Go toolchain.
|
||||
|
||||
Readiness commands, per-gate logs and exact-commit JSON results live at
|
||||
`/tmp/frame-control-readiness-20261027/` on lxso1. These are local readiness
|
||||
checks, not a substitute for GitHub CI on a future release commit. The Linux
|
||||
installer command uses `--publish never`; no release was published by these
|
||||
checks. Native ARM64, Windows/macOS platform gates, Xcode/iOS and real-headset
|
||||
checks still require their proper runners/hardware.
|
||||
|
||||
Completed on main commit `1ddb6278b8ae0a98ecc79a181bba4d3cc67a52b6`,
|
||||
26 October 2026 at 22:00 UTC:
|
||||
|
||||
| Gate | Result on lxso1 |
|
||||
| --- | --- |
|
||||
| Shell syntax, Python compile | Passed |
|
||||
| Python 3.9 / 3.12 / 3.13 server suites | 1,639 tests each; passed with platform/optional skips |
|
||||
| Linux wireless doctor, app syntax/tests, website tests/syntax | Passed |
|
||||
| `npm ci`, `npm run dist:linux` | Passed; AppImage and deb built without publishing |
|
||||
| AppImage launch verification | Passed |
|
||||
| `scripts/e2e.sh` on x86_64 Docker | Passed: 50 tests, one optional catalog audit skipped; not native ARM64 hardware proof |
|
||||
| Publish dry runs for v0.4.47 and v0.4.48 | Passed, including all ten installer digests and SHA256SUMS; no mutation |
|
||||
| Native PC host build and required-native tests | Blocked/failed: GStreamer/GLib development packages absent; required native adapter unavailable |
|
||||
|
||||
The workflows name system GStreamer packages but do not pin package versions.
|
||||
They were left uninstalled under the owner's pinned-versions-only constraint.
|
||||
Resolve that dependency policy before claiming full Linux native readiness.
|
||||
Main was clean and matched origin/main on the final 21:59 UTC fetch.
|
||||
|
||||
## How a takeover should resume
|
||||
|
||||
1. Read this file, `docs/testing.md`, the current roadmap/evidence and the
|
||||
existing coordinator's recorded work through supported read-only tooling.
|
||||
Verify remote releases, PR states and workflow conclusions again.
|
||||
2. Check lxso2 health and disk headroom. Disk-full recovery requires capacity
|
||||
decisions; do not delete protected data or alter T3 state databases.
|
||||
3. Have Alex settle coordinator ownership. Preserve uncommitted changes and
|
||||
active worktrees; do not run competing coordinator/release jobs.
|
||||
4. Fetch origin and inspect local status before updating main. Resume the
|
||||
roadmap from recorded gaps and existing PRs, not from assumptions about
|
||||
what an interrupted worker completed.
|
||||
5. Work on an isolated branch and use PRs. Validate the actual candidate
|
||||
commit with every release gate above; record hardware/platform blockers.
|
||||
6. Publish only under an explicit release task after all required gates pass.
|
||||
|
||||
The lxso1 five-minute `fleet-t3-lxso2-health.timer` only checks and alerts; it
|
||||
does not start takeover threads. Automatic stand-in launch is not configured
|
||||
or proven by this recovery deployment. It would need supported gateway
|
||||
capability and authorized credentials; do not copy or mint gateway secrets.
|
||||
|
||||
An identical local handoff copy is maintained at
|
||||
`/home/saphid/frame-control-handoff/STANDING_GOAL.md` on lxso1.
|
||||
@@ -1790,7 +1790,7 @@
|
||||
},
|
||||
"backend": "Python + native payload",
|
||||
"hardware": "No specific hardware requirement detected statically; runtime requirements unverified.",
|
||||
"nativePort": "A source-matched ARM64 bin/hash helper matched the official x86_64 helper on one synthetic ROM on the real Frame (docs/evidence/framey-emuchievements-arm-2026-10-26.md). The official ZIP still bundles x86_64 bytes and remains blocked; format coverage, packaging, plugin backend/UI, login and worn VR are unverified.",
|
||||
"nativePort": "A source-matched ARM64 helper matched one synthetic ROM on the real Frame (docs/evidence/framey-emuchievements-arm-2026-10-26.md). The pinned upstream source proposed for packaging also has unsafe archive extraction and cleanup paths (docs/evidence/framey-native-port-blockers-2026-10-26.md); fix and test those before shipping an ARM64 binary. The official x86_64 ZIP remains blocked; format coverage, plugin backend/UI, login and worn VR are unverified.",
|
||||
"uiSurfaces": [
|
||||
"local/Steam routes",
|
||||
"toasts",
|
||||
@@ -3593,7 +3593,7 @@
|
||||
"https://github.com/GedasFX/decky-cloud-save.git"
|
||||
],
|
||||
"status": "broken",
|
||||
"reason": "Unsafe plugin archive member.",
|
||||
"reason": "The exact official ZIP contains a 60,776,600-byte x86_64 rclone member, above the 30 MiB member limit and unusable on ARM64. Installation remains blocked.",
|
||||
"blockInstall": true,
|
||||
"verification": [
|
||||
"static archive",
|
||||
@@ -3628,7 +3628,7 @@
|
||||
},
|
||||
"backend": "Python + native payload",
|
||||
"hardware": "No specific hardware requirement detected statically; runtime requirements unverified.",
|
||||
"nativePort": "rclone needs an ARM64 artifact; this ZIP also fails safe member validation. Cloud writes were not exercised.",
|
||||
"nativePort": "An ARM64 rclone artifact and safe package policy are needed; the official 60,776,600-byte x86_64 member fails archive validation. No cloud writes were run (docs/evidence/framey-native-port-blockers-2026-10-26.md).",
|
||||
"uiSurfaces": [
|
||||
"local/Steam routes",
|
||||
"toasts",
|
||||
|
||||
Reference in new issue
Block a user