feedBack-desktop/tests
Matthew Harris Glover 2a4396b7b7
Some checks are pending
Addon CI / addon (arm64, macos-14, mac) (push) Waiting to run
Addon CI / addon (x64, ubuntu-22.04, linux) (push) Waiting to run
Addon CI / addon (x64, windows-latest, win) (push) Waiting to run
Ship CI / CI (push) Waiting to run
Linux AppImage self-update on the nightly channel (#119)
* feat(update): Linux AppImage self-update on the nightly channel

Adds a self-update engine for the Linux AppImage build. There's no
Velopack pipeline for Linux (Windows/macOS use it, Linux doesn't), so
this is a small, purpose-built GitHub-releases checker instead:

- On the nightly channel, compares the commit baked into the running
  build (dist/main/build-info.json, written at build time) against the
  published nightly's target_commitish. A mismatch means the running
  build is behind, so it's offered as an update — this sidesteps the
  fact that the AppImage's filename and app.getVersion() never change
  between nightly builds, so semver comparison can't detect a new one.
- The check returns immediately and the ~1.5GB download runs in the
  background with live progress (a new update:progress IPC event), so
  the UI never blocks or freezes waiting on it.
- The download streams straight to disk (no buffering the whole file in
  memory) and is swapped in with an atomic rename next to the running
  AppImage. The stale-generation check (a channel switch or new check
  invalidating an in-flight download) runs before that swap, and a
  failed or superseded download always cleans up its temp file.
- Applying the update spawns the (already-swapped-in) AppImage as a
  detached process and waits for a real 'spawn' confirmation before
  quitting this one, rather than assuming success — child_process.spawn
  can fail asynchronously, and quitting on an unconfirmed relaunch could
  leave the user with nothing running.
- The pure idle/staged/download decision is split into
  linux-update-decision.ts with a small truth-table test, and every
  main-process decision point (and the equivalent renderer-side
  actions, in the companion feedBack PR) is traced through a new
  update:diag IPC event that lands in the app's existing "Export
  Diagnostics" console-capture bundle — this is how the handful of real
  bugs below were actually root-caused, from real device captures
  rather than guesswork.

Also removes a forgotten, dead second implementation of the
update-channel UI (src/renderer/screen.js's
setupUpdateChannelControls() + its markup in settings.html), left over
from before this work discovered the real, visible System-tab update
UI lives in the feedBack repo. It was still wired up in the
audio_engine plugin's own settings panel and silently called
setChannel() with a stale channel value every time that panel
rendered — invisibly corrupting the real UI's state. This was the
actual root cause of several rounds of flaky, hard-to-reproduce
on-device behavior (a stuck "unsupported" warning, downloads starting
without an explicit check, etc.) chased down via the diagnostic
tracing above; once found, no other logic needed to change.

Dev tooling only, not used by CI: forces --platform linux/amd64 in the
local Docker build wrapper (the Linux target is x86_64-only end to
end — needed on Apple Silicon, where Rosetta chokes on a foreign-arch
binary inside an otherwise-native container) and adds a SLOPSMITH_REPO
override so a contributor without push access to the core repo can
bundle a fork branch for a local test build.

Verified end-to-end on a Steam Deck across many build/deploy rounds:
fresh launch, channel selection, check, background download with live
progress, atomic swap, and relaunch onto the new build — confirmed via
a real Export Diagnostics capture showing a clean, fully-accounted-for
trace with zero orphaned state transitions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(update): fail safe when nightly release isn't pinned to a commit SHA

GitHub sets a release's target_commitish to whatever it was published
against — a 40-char SHA only if pinned, otherwise a branch name like
"main". The Linux update decision compares it SHA-vs-SHA, so a branch
name would never match the baked SHA and would re-download the ~1.5GB
AppImage on every check forever, never reaching idle. Add isCommitSha()
(pure, unit-tested) and have checkNowLinux() surface an error instead of
entering that loop.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: Byron Gamatos <xasiklas@gmail.com>

---------

Signed-off-by: Byron Gamatos <xasiklas@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Byron Gamatos <xasiklas@gmail.com>
2026-07-19 12:15:55 +02:00
..
audio_sanitize Clean release snapshot 2026-06-16 18:48:12 +02:00
chordscorer Clean release snapshot 2026-06-16 18:48:12 +02:00
contracts feat(audio): getLatencyBreakdown — one owner for every latency term 2026-07-14 03:05:19 +02:00
engine_units test(audio): keep rate-match checks active in release 2026-07-17 13:22:48 +02:00
mlnotedetector perf(audio): gate ML note-detection pipeline (default OFF, arm on demand) (#51) 2026-06-29 23:12:31 +02:00
sandbox audio: per-slot postGain for parallel-branch loudness leveling (#58) 2026-07-02 12:50:47 +02:00
spike Clean release snapshot 2026-06-16 18:48:12 +02:00
_load-ts.js feat(config): real config reset/repair + migration framework (drop manual-delete) (#38) 2026-06-26 22:13:24 +02:00
audio-chain-persistence.test.js fix(renderer): keep Rig Builder's tone out of the user's manual VST chain (#73) 2026-07-03 15:59:34 +02:00
audio-effects-executor.test.js test: fix two Windows-environment-dependent failures (suite now fully green) 2026-07-14 03:18:33 +02:00
chain-mutation-storm.test.js fix(audio): serialize chain mutations + chainGeneration (phase 7a) 2026-07-14 01:45:01 +02:00
CMakeLists.txt fix(audio): sanitize input/chain/output/backing gains at the engine setters 2026-07-13 23:28:34 +02:00
config-bootstrap.test.js feat(config): real config reset/repair + migration framework (drop manual-delete) (#38) 2026-06-26 22:13:24 +02:00
config-migrations.test.js feat(config): real config reset/repair + migration framework (drop manual-delete) (#38) 2026-06-26 22:13:24 +02:00
config-paths.test.js test: fix two Windows-environment-dependent failures (suite now fully green) 2026-07-14 03:18:33 +02:00
config-reset.test.js feat(config): real config reset/repair + migration framework (drop manual-delete) (#38) 2026-06-26 22:13:24 +02:00
contract-check.test.js test(contracts): Phase 0.a contract snapshots for audio surface 2026-07-13 23:21:21 +02:00
device-setup-lifecycle.test.js fix(audio): gate strict buffer-size verification to ASIO; review cleanups 2026-07-17 22:20:03 +02:00
input-source-selection-sync.test.js fix(audio): don't let "Default" wipe the capability input selection 2026-07-16 14:59:39 +02:00
juce-exclusive-type-name.test.js test: pin JUCE WASAPI exclusive device-type name (#90) 2026-07-09 22:18:04 +02:00
library-path-config.test.js fix(library): keep the resolved env fallback on failure statuses 2026-07-17 23:16:55 +02:00
linux-update-decision.test.js Linux AppImage self-update on the nightly channel (#119) 2026-07-19 12:15:55 +02:00
ml-note-detection.test.js Clean release snapshot 2026-06-16 18:48:12 +02:00
monitor-mute-suppression.test.js fix(renderer): roll back the mute-suppression latch when the IPC fails 2026-07-14 14:52:34 +02:00
multi-source.test.js Clean release snapshot 2026-06-16 18:48:12 +02:00
napi-arg-fuzz.test.js fix(audio): close the PR #107 review findings 2026-07-14 14:29:03 +02:00
renderer-capability-migration.test.js Clean release snapshot 2026-06-16 18:48:12 +02:00
window-bounds.test.js fix(panes): only the main window may drive the tray; clamp fallback defaults 2026-07-12 21:18:05 -04:00