From 3e4da9226202987cce37563beeede2bb21f37325 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 10:52:51 +0000 Subject: [PATCH 1/2] Initial plan From e87b04e89febd1ae0742ceef3b059a3dcaa325d1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 21 Feb 2026 10:59:20 +0000 Subject: [PATCH 2/2] Fix off-by-one in SpellingBeeEvaluator: take(len-1) instead of take(len) Co-authored-by: DASPRiD <233300+DASPRiD@users.noreply.github.com> --- src/evaluator/spelling_bee.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/evaluator/spelling_bee.rs b/src/evaluator/spelling_bee.rs index c32478c..b38cdc2 100644 --- a/src/evaluator/spelling_bee.rs +++ b/src/evaluator/spelling_bee.rs @@ -128,7 +128,7 @@ impl Evaluator for Spellin .global_bloops() .filter(ctx.filter_within_window(self.max_time)) .filter(ctx.filter_current_player()) - .take(self.client_ids.len()) + .take(self.client_ids.len() - 1) .map(|bloop| &bloop.client_id); last_client_ids.eq(self.client_ids.iter().skip(1)) @@ -179,6 +179,32 @@ mod tests { ); } + #[test] + fn matches_correct_sequence_with_prior_bloops() { + let word = "hey"; + let client_map = char_map! { + 'h' => "client1", + 'e' => "client2", + 'y' => "client3" + }; + + let (player, _) = MockPlayer::builder().build(); + let bloops = vec![ + make_bloop(&player, "client1", 20), + make_bloop(&player, "client2", 10), + // Extra older bloop from a previous unrelated sequence + make_bloop(&player, "client3", 30), + ]; + let mut builder = TestCtxBuilder::new(make_bloop(&player, "client3", 0)).bloops(bloops); + + let evaluator = + SpellingBeeEvaluator::new(word, &client_map, Duration::from_secs(25)).unwrap(); + assert_eq!( + evaluator.evaluate(&builder.build()).into(), + EvalResult::AwardSelf + ); + } + #[test] fn fails_on_wrong_order() { let word = "hey";