From 899dc5ebd86a6ac5f90c97d39faa3ca70ccc4c3a Mon Sep 17 00:00:00 2001 From: Teddy Tennant Date: Tue, 1 Sep 2026 21:55:54 -0400 Subject: [PATCH] Compute cold-start boost target after MoE suppression cold_start_target ranked the pre-suppression scores while apply_cold_start worked on the post-suppression vector, so the boost target could be the score of a candidate that had already been zeroed out of contention. --- home-mixer/scorers/author_cold_start.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/home-mixer/scorers/author_cold_start.rs b/home-mixer/scorers/author_cold_start.rs index a00202ca..007825d7 100644 --- a/home-mixer/scorers/author_cold_start.rs +++ b/home-mixer/scorers/author_cold_start.rs @@ -365,7 +365,7 @@ impl AuthorColdStart { let arm = params.arm; let mut effective = apply_moe_ranking_policy(arm, candidates, &corpus, scores); - if let Some(target) = cold_start_target(¶ms, scores) { + if let Some(target) = cold_start_target(¶ms, &effective) { effective = apply_cold_start(¶ms, candidates, &effective, &corpus, target); } effective @@ -697,6 +697,27 @@ rust_home_mixer: assert_eq!(result, vec![10.0, 40.0, 30.0, 20.0]); } + #[test] + fn cold_start_target_skips_scores_zeroed_by_moe_policy() { + let author_cold_start = cold_start_with_arms(vec![], vec![]); + let candidates = vec![ + cold_start_candidate(1, minutes(10), 3), + moe_candidate(2, minutes(10), 3), + cold_start_candidate(3, minutes(10), 5000), + cold_start_candidate(4, minutes(10), 5000), + cold_start_candidate(5, minutes(10), 5000), + ]; + + let mut query = codivert_query(false, false); + let mut results = query.params.0.expect("params set"); + results.override_fs("rust_home_mixer_cold_start_slot_min".to_string(), "2"); + results.override_fs("rust_home_mixer_cold_start_slot_max".to_string(), "3"); + query.params = results.into(); + + let result = author_cold_start.apply(&query, &candidates, &[10.0, 100.0, 90.0, 80.0, 70.0]); + assert_eq!(result, vec![70.0, 0.0, 90.0, 80.0, 70.0]); + } + #[test] fn ts_top_k_zero_falls_back_to_argmax_score() { let author_cold_start = cold_start_with_arms(vec![1, 2], vec![]);