feat(playlists): For You composition v2 — multi-seed blend + weighted fresh tail
Two approved composition changes (#1269), mechanism only — the taste/fresh share stays data-decided (#1252) and pick_kind attribution is unchanged. Multi-seed blending: each day's build now seeds from up to 3 of the user's top-5 tracks (pickDailySeeds, the generalized daily shuffle) instead of one rotating anchor, so the mix spans neighborhoods within a day and stops feeling bipolar as the rotation swings between dissimilar seeds. Per-seed pools merge first-seen-deduped; the head is filled best-first under 50/30/20 per-seed quotas (60/40 for two seeds) so one neighborhood can't monopolize it, with thin-seed quota spilling best-first. Score-weighted fresh tail: the tail sample (rank 2*headN onward) was uniform — the 380th-best candidate as likely as the 101st. It now uses deterministic Efraimidis-Spirakis keys with weight halving every 50 ranks, so freshness keeps its "you'll probably enjoy this" half while still rotating daily. The retired single-seed picker's one other caller, You-might-like, moves to pickDailySeeds(n=1) — a single neighborhood per day is right for a short shelf, and the behavior note is inline. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TsF3cNoKrqCYsU78cXC8U6
This commit is contained in:
@@ -131,10 +131,10 @@ SELECT c.artist_id,
|
||||
-- tier 1 (only if tier 0 empty) all-time top non-skip plays
|
||||
-- tier 2 (only if tiers 0+1 empty) liked tracks
|
||||
-- Returns up to 5 ids; tie-break by track_id for determinism. The
|
||||
-- Go-side picker (pickForYouSeedForDay) rotates one per day via
|
||||
-- userIDHash. Widened from a hard 7-day window, which made For-You
|
||||
-- disappear after a week of not listening and never recover on a
|
||||
-- self-hosted library with sparse history.
|
||||
-- Go-side picker (pickDailySeeds) draws the day's seeds from these.
|
||||
-- Widened from a hard 7-day window, which made For-You disappear
|
||||
-- after a week of not listening and never recover on a self-hosted
|
||||
-- library with sparse history.
|
||||
WITH recent AS (
|
||||
SELECT t.id, COUNT(*) AS c, 0 AS tier
|
||||
FROM play_events pe
|
||||
|
||||
Reference in New Issue
Block a user