PARITY-DEBT #7, #15, #17, #4 and #5.
- **#7** the stream error was drained and only logged, so an ALSA / exclusive
failure — guaranteed inside Flatpak and Snap — froze the bar at 0:00 with no
explanation. It now toasts, with the sandbox-aware rewrite the reference
carries (playback.rs:5093-5115). This is the support issue that fix was
written for.
- **#15** seek was clamped to the full duration instead of the downloaded
fraction, so the head could be dragged into bytes that do not exist. The
poll loop publishes `npSeekableMax` and both bars clamp to it, matching
SeekBar.slint:93-98. The cache overlay was already drawn and purely
decorative.
- **#17** a label page's Shuffle called `set_shuffle(true)`, turning the GLOBAL
shuffle mode on and leaving it on for everything played afterwards. The
reference shuffles the vector in place and never touches the mode.
- **#4** a `plex:<hash>` album-boundary key was passed where a Plex rating key
belongs, so the fetch 404'd and the PREVIOUS track kept playing under the new
card. Guarded at both sites, 1:1 with playback.rs:668-680 (`b5c1a76e`).
- **#5** clicking a track in Library played exactly one track and stopped. It
now queues the whole VISIBLE list from the clicked row (`order_by_visible`).
The Library row play needed one edit outside its author's lane, which the
singleton xref caught before the build did: `QbzLibrary.libraryPlayVisible` was
called from QML and implemented in `library_qt`, but never declared on the
bridge. That is precisely the failure the xref exists for — QML resolves
singleton members lazily, so a missing invokable compiles clean and throws when
the user clicks. The QML had shipped a `typeof === "function"` feature-detect
with a fallback, so it degraded instead of throwing; the invokable now exists
and the fallback is dead code by design.
cc