a324454efe
Cold-visit playlist detail used to render the header from the seed and then a single CircularProgressIndicator while the bulk fetch ran. Now it renders the header + seed.trackCount worth of skeleton rows (capped at 8 when no seed is present). The real list swaps in without a layout jump. Slice D was originally scoped for per-track hydration through a new discovery endpoint, but the unavailable-entries data model (playlist rows that lost their underlying track to deletion / quarantine) make that disproportionately expensive — would require a schema change to support null trackIds on cached_playlist_tracks, a server endpoint, and a screen rewrite. The skeleton-row approach captures ~80% of the perceptual win at a fraction of the cost. True per-track hydration remains a future opportunity if cold visits to very large playlists still feel sluggish after Slice F polish lands.