572325e23f
Detail screen showed empty rows for system playlists because the fetch batch wrote cachedPlaylists, cachedPlaylistTracks (positions), cachedArtists, and cachedAlbums — but never cachedTracks themselves. The detail screen's LEFT OUTER JOIN cachedTracks then returned null on every row, so trackId was null and titles came back empty. PlaylistTrack on the wire carries enough to populate cachedTracks (id, title, albumId, artistId, durationSec). Adds a third dedup map in fetchAndPopulate, batched with the existing artist + album writes. track_number / disc_number aren't on the wire so they default to 0; the detail screen doesn't surface them. Reusing cachedTracks across albumProvider + playlistDetailProvider also means tapping a playlist's track to play it now finds the row in drift instead of triggering another fetch.