09102dc615
android / Build + lint + test (push) Failing after 3m3s
Failed loads used to stay failed forever: no screen ViewModel listened to server-health recovery, and the cache-first screens swallowed refresh errors so a cold load against a down server looked like an empty account. - connectivity/Recovery.kt: recoveries() — per-collector flow of down→Healthy transitions; the screen-level half of the idiom SyncController/MutationReplayer/DiagnosticsUploader already use. - Every screen VM now re-runs its load on recovery (cache-first screens unconditionally; direct-load screens when sitting in Error). - Cache-first error surfacing: Home / Playlists / Liked track refresh failure; Library reads SyncController.lastSyncError (new) — empty cache + failed refresh now renders Error-with-Retry, not welcome copy. - Requests: 12s poll also retries from Error (was structurally unable to escape it — the in-flight predicate required a Success state). - Search: retry() bypasses the distinctUntilChanged query pipeline so a same-text resubmit after a transient failure actually re-runs. - ArtistDetail: secondary sections (similar artists / top tracks) re-fetch on recovery instead of staying silently absent. - ErrorRetry: LazyColumn wrapper (pull-to-refresh works on error states, same rationale as EmptyState) + optional title; adopted on every error branch; PlaylistDetail's one-shot ErrorBlock removed in its favor. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TsF3cNoKrqCYsU78cXC8U6