8cb9a8b797
Multi-artist surfaces (home Rediscover, Library Artists tab, Liked Artists carousel) were all rendering the music-notes placeholder instead of real artist covers. Root cause: CachedArtist.toRef() returned an ArtistRef with empty coverUrl — the cache doesn't store the representative album id the server derives at query time, and the adapter never reconstructed it. The artist detail screen worked coincidentally because it derives its header cover from `artist.albums[0].id` directly rather than the ArtistRef's coverUrl field. Fix: * CachedArtistAdapter.toRef() now accepts an optional coverAlbumId and reconstructs `/api/albums/<id>/cover` when given. Matches the pattern AlbumRef uses (deterministic URL from entity id). * artistTileProvider, libraryArtistsProvider, and artistProvider (single-artist) each LEFT JOIN cached_albums ordered by sort_title. First row per artist carries the alphabetically-first album id; toRef projects that into the cover URL. * Multi-artist queries dedup in toResult since the join multiplies rows by album count. Artists with no albums yet in drift come through with empty coverUrl — UI falls back to the music-notes placeholder, same behavior as before for that legitimately-coverless state.