-- Recommendation observability (#796 phase 4). Per-source play outcomes so the -- operator can see whether each recommendation surface is landing and tune the -- taste weights. Source is stamped on play_events when a play is launched from -- a system-playlist surface ('for_you' | 'discover' | the discovery mixes); -- NULL for library / radio / user-playlist plays, which are excluded here. -- name: RecommendationSourceMetricsForUser :many -- $1 user_id, $2 window_days. plays/skips are counts; avg_completion is the -- mean completion ratio over plays that recorded one (0 when none did). SELECT pe.source, count(*)::bigint AS plays, count(*) FILTER (WHERE pe.was_skipped)::bigint AS skips, COALESCE( avg(pe.completion_ratio) FILTER (WHERE pe.completion_ratio IS NOT NULL), 0)::float8 AS avg_completion FROM play_events pe WHERE pe.user_id = $1 AND pe.source IS NOT NULL AND pe.started_at > now() - ($2::float8 * INTERVAL '1 day') GROUP BY pe.source ORDER BY plays DESC;