feat(metrics): provenance as standard — pick_kind for all system mixes
The #1249 mechanism (stamp WHY a track is in the snapshot at build time, freeze it onto the play at ingestion, break it down in metrics) generalizes from a For You one-off to the standard for every system mix (#1270): - Migration 0039 widens both pick_kind CHECKs (drop + re-add in the same change) to taste/fresh + Discover's dormant/cross_user/random + tier1-3 for the rule-#131 eligibility ladders. - GetForYouPickKindForTrack becomes GetSystemPickKindForTrack (user, variant, track); ingestion stamps any systemPlaylistSources play from its own variant's live snapshot, live + offline paths. - Discover stamps its candidate bucket on discoverTrack before the interleave, making the 40/30/30 allocation measurable; dedup keeps the taking bucket's stamp. - Metrics replace the for_you special-case with one pick-kind vocabulary — any family with attributed plays gets a breakdown, future stamping mixes need no metrics change. - Web: breakdown sub-rows are now toggled per surface (collapsed by default) so eight stamping mixes don't swamp the card. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TsF3cNoKrqCYsU78cXC8U6
This commit is contained in:
@@ -161,3 +161,27 @@ func TestInterleaveBuckets_DedupsAcrossBuckets(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestInterleaveBuckets_PreservesBucketPickKind(t *testing.T) {
|
||||
// Bucket provenance (#1270) is stamped on discoverTrack before the
|
||||
// interleave and must survive it — including dedup, where a track in
|
||||
// two buckets keeps the stamp of the bucket it was taken from.
|
||||
dormant := []discoverTrack{
|
||||
{ID: uuidN(1), PickKind: pickKindDormant},
|
||||
{ID: uuidN(2), PickKind: pickKindDormant},
|
||||
}
|
||||
random := []discoverTrack{
|
||||
{ID: uuidN(1), PickKind: pickKindRandom}, // shared with dormant
|
||||
{ID: uuidN(3), PickKind: pickKindRandom},
|
||||
}
|
||||
got := interleaveBuckets(dormant, nil, random)
|
||||
if len(got) != 3 {
|
||||
t.Fatalf("len = %d, want 3", len(got))
|
||||
}
|
||||
want := map[byte]string{1: pickKindDormant, 2: pickKindDormant, 3: pickKindRandom}
|
||||
for _, tr := range got {
|
||||
if w := want[tr.ID.Bytes[15]]; tr.PickKind != w {
|
||||
t.Errorf("track %d pick_kind = %q, want %q", tr.ID.Bytes[15], tr.PickKind, w)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user