From 77cdccb26ccc8ed1daf1e033be2ce306c868c708 Mon Sep 17 00:00:00 2001 From: Marcel Raddatz Date: Thu, 9 Apr 2026 12:47:41 +0200 Subject: [PATCH] fix(planning): hasConflict only when scoreDelta strictly negative MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neutral suggestions (scoreDelta = 0) are not conflicts — they simply don't improve variety. Changing scoreDelta <= 0 to scoreDelta < 0 lets empty-plan additions and quality-neutral swaps show without a misleading ⚠ Variationskonflikt warning. Co-Authored-By: Claude Sonnet 4.6 --- .../java/com/recipeapp/planning/PlanningService.java | 2 +- .../java/com/recipeapp/planning/SuggestionsTest.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/com/recipeapp/planning/PlanningService.java b/backend/src/main/java/com/recipeapp/planning/PlanningService.java index ab13e33..aeff635 100644 --- a/backend/src/main/java/com/recipeapp/planning/PlanningService.java +++ b/backend/src/main/java/com/recipeapp/planning/PlanningService.java @@ -152,7 +152,7 @@ public class PlanningService { double simulatedScore = simulateVarietyScore( plan, candidate, slotDate, config, recentlyCookedIds); double scoreDelta = simulatedScore - currentScore; - boolean hasConflict = scoreDelta <= 0; + boolean hasConflict = scoreDelta < 0; return new SuggestionResponse.SuggestionItem(toSlotRecipe(candidate), scoreDelta, hasConflict); }) .sorted((a, b) -> Double.compare(b.scoreDelta(), a.scoreDelta())) diff --git a/backend/src/test/java/com/recipeapp/planning/SuggestionsTest.java b/backend/src/test/java/com/recipeapp/planning/SuggestionsTest.java index da4c673..e86ff86 100644 --- a/backend/src/test/java/com/recipeapp/planning/SuggestionsTest.java +++ b/backend/src/test/java/com/recipeapp/planning/SuggestionsTest.java @@ -180,10 +180,10 @@ class SuggestionsTest { assertThat(result.suggestions()).hasSize(3); // Empty plan → currentScore = 10.0; no penalties → scoreDelta = 0.0 for all - // hasConflict = (scoreDelta <= 0) = true even for neutral recipes + // hasConflict = (scoreDelta < 0) = false for neutral recipes assertThat(result.suggestions()).allSatisfy(s -> { assertThat(s.scoreDelta()).isEqualTo(0.0); - assertThat(s.hasConflict()).isTrue(); + assertThat(s.hasConflict()).isFalse(); }); } @@ -255,9 +255,9 @@ class SuggestionsTest { class ScoreDeltaAndHasConflict { @Test - void recipeWithNoConflictsOnEmptyPlanShouldHaveZeroDeltaAndHasConflict() { + void recipeWithZeroDeltaOnEmptyPlanShouldNotHaveConflict() { // Empty plan → currentScore = 10.0. Clean recipe → simulatedScore = 10.0. - // scoreDelta = 0.0, hasConflict = (0.0 <= 0) = true + // scoreDelta = 0.0. No worsening → hasConflict = false. var plan = createPlan(); var recipe = createRecipe("Clean Recipe"); stubPlan(plan); @@ -271,7 +271,7 @@ class SuggestionsTest { assertThat(result.suggestions()).hasSize(1); var item = result.suggestions().getFirst(); assertThat(item.scoreDelta()).isEqualTo(0.0); - assertThat(item.hasConflict()).isTrue(); + assertThat(item.hasConflict()).isFalse(); } @Test