release / govulncheck (push) Successful in 32s
release / web (push) Successful in 1m21s
release / go (push) Successful in 1m37s
release / android (push) Failing after 3m58s
release / Attach APK to the Release (tag releases only) (push) Canceled after 0s
release / Build + push container image (push) Canceled after 0s
release / Verify release artifacts (tag releases only) (push) Canceled after 0s
release / integration (push) Canceled after 4m38s
release / Build signed APK (releases and dev) (push) Canceled after 4m39s
The server returns at most 1000 changes per /api/library/sync call and expects clients to loop with the returned cursor. SyncController took one page per trigger (cold start, reconnect), so the cache fell behind a log that a full re-read grows by ~26,000 rows and, past the 30-day compaction, reset through 410 to cursor 0 without ever reaching the merge deletes of 2026-10-09/10. The freshness sweep then re-asked for those tracks every 30 minutes: the same ~100 404s on every pass. - SyncController pages until 204, storing the cursor after each page, and stops on a cursor that does not advance. - MetadataProvider drops a cached album, artist or track the server answers 404 for, so rows orphaned before this fix stop being refetched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>