From 5c41b97f63f47873ef46faa429d6fde13e7a8a34 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:28:41 +0000 Subject: [PATCH 1/3] Initial plan From 97d653805b259a30d7d2541703f0f4a5c5f43fce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 17:42:36 +0000 Subject: [PATCH 2/3] Fix missing CMAB bucketing reasons in decision process Added merge of bucketing reasons for CMAB experiments to ensure traffic allocation information is included in decision responses. Co-authored-by: Mat001 <1386553+Mat001@users.noreply.github.com> --- .../main/java/com/optimizely/ab/bucketing/DecisionService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java b/core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java index 572d28981..58ca67d16 100644 --- a/core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java +++ b/core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java @@ -173,7 +173,8 @@ public DecisionResponse getVariation(@Nonnull Experiment experiment, decisionVariation = bucketer.bucket(experiment, bucketingId, projectConfig, decisionPath); if (decisionPath == DecisionPath.WITH_CMAB && isCmabExperiment(experiment) && decisionVariation.getResult() != null) { // group-allocation and traffic-allocation checking passed for cmab - // we need server decision overruling local bucketing for cmab + // we need server decision overruling local bucketing for cmab + reasons.merge(decisionVariation.getReasons()); DecisionResponse cmabDecision = getDecisionForCmabExperiment(projectConfig, experiment, user, bucketingId, options); reasons.merge(cmabDecision.getReasons()); From 2fc5ec5d5beab7d4db979accf19e96215313190e Mon Sep 17 00:00:00 2001 From: FarhanAnjum-opti Date: Wed, 7 Jan 2026 18:15:57 +0600 Subject: [PATCH 3/3] fix: missing decision reasons added in cmab flow --- .../main/java/com/optimizely/ab/bucketing/DecisionService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java b/core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java index 586c721ed..a753078e2 100644 --- a/core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java +++ b/core-api/src/main/java/com/optimizely/ab/bucketing/DecisionService.java @@ -171,10 +171,10 @@ public DecisionResponse getVariation(@Nonnull Experiment experiment, String bucketingId = getBucketingId(user.getUserId(), user.getAttributes()); String cmabUuid = null; decisionVariation = bucketer.bucket(experiment, bucketingId, projectConfig, decisionPath); + reasons.merge(decisionVariation.getReasons()); if (decisionPath == DecisionPath.WITH_CMAB && isCmabExperiment(experiment) && decisionVariation.getResult() != null) { // group-allocation and traffic-allocation checking passed for cmab // we need server decision overruling local bucketing for cmab - reasons.merge(decisionVariation.getReasons()); DecisionResponse cmabDecision = getDecisionForCmabExperiment(projectConfig, experiment, user, bucketingId, options); reasons.merge(cmabDecision.getReasons()); @@ -190,7 +190,6 @@ public DecisionResponse getVariation(@Nonnull Experiment experiment, } } else { // Standard bucketing for non-CMAB experiments - reasons.merge(decisionVariation.getReasons()); variation = decisionVariation.getResult(); }