BL-088 Shipped

Spotify integration

spotify_uri string column on Article, AdventureNode, Adventure, and Stage. User connects personal Spotify account via OAuth (Authorization Code flow) via custom SpotifyController (not Devise omniauth). Tokens (access_token, refresh_token, expires_at, display_name) stored on User. SpotifyUri lib module normalises URIs (canonical / web_url / type). User#spotify_play! calls the Connect API (PUT /v1/me/player/play). Play button Stimulus controller (spotify-player) with deep-link fallback. Stage show page gets a fixed HUD music strip (data-hud). spotify/connect partial on profile edit page for OAuth connect/disconnect. spotify_uri added to all relevant MCP tools. ENV-guarded throughout (SPOTIFY_CLIENT_ID). ADR-0078. 637 tests green.