• v2026.06.30 — Device diagnostics & debug reporting (M9) + follow-ups
    test-go / test (push) Successful in 38s
    test-web / test (push) Successful in 47s
    android / Build + lint + test (push) Successful in 4m18s
    test-go / integration (push) Successful in 4m39s
    release / Build signed APK (tag releases only) (push) Successful in 3m46s
    release / Build + push container image (push) Successful in 16s
    Stable

    bvandeusen released this 2026-06-30 19:24:58 -04:00 | 15 commits to main since this release

    Per-day mutable CalVer, re-cut forward to 61171515 (M9 + same-day diagnostics follow-ups, PRs #104 #105).

    Toggleable per-account device diagnostics: remotely enable debug mode on an account → its phone(s) stream a timeseries of device state → an admin timestamp view with copy/export for analysis. Targets roaming/poor-data recovery and locked-phone UPnP/Sonos desync.

    Install this APK to get the diagnostics reporter + the follow-up fixes below; the prior build had only the index-level capture.

    Diagnostics core (M9)

    • Migration 0036: diagnostic_events + per-account users.debug_mode_enabled. POST /api/diagnostics (gated batch ingest), GET /api/admin/diagnostics (account/device/kind/time-window filters + export), /diagnostics/devices, PUT /api/admin/users/{id}/debug-mode. 30-day retention.
    • Android DiagnosticsReporter (connectivity, server-health, UPnP, power/Doze/screen, lifecycle, heartbeat) → Room ring buffer → DiagnosticsUploader (offline-buffered, batched). Per-device OFF switch in Settings.
    • Web /admin/diagnostics: timeline (auto-polls), remote toggle, Copy-JSON / Download-NDJSON.

    Same-day follow-ups

    • Web: diagnostics defaults to recent-500; time window under "Advanced"; newest-first sort.
    • playback kind: route + player-state events relabeled out of upnp_sync (they fire for any output); migration 0037.
    • Output-picker fix: connected Bluetooth now reads "Connected" (was "Available") — isConnected no longer derived from the wrong connectionState signal.
    • Per-skip track_change event + track-identity enrichment (local_track_id + sonos_uri) so a re-cast desync is unambiguous; sonos_* zeroed when not casting.

    Use it

    Install the APK, enable debug mode for the account at /admin/diagnostics, open the app on that account, reproduce the issue, then export the window.

    🤖 Generated with Claude Code

    Downloads