From 428b8adcbab0548fc506af4f5d1546791242980c Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Wed, 18 Mar 2026 14:50:18 +0200 Subject: [PATCH 1/2] fix(code-reviews): pass owner id to incremental flag isFeatureFlagEnabled(FEATURE_FLAG_INCREMENTAL_REVIEW) was using the default distinctId 'server-config-fetch' instead of the owner's userId, making the flag evaluate globally rather than per-user/org. This matches the pattern already used for the 'code-review-pr-gate' flag on line 398. --- src/lib/code-reviews/triggers/prepare-review-payload.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/lib/code-reviews/triggers/prepare-review-payload.ts b/src/lib/code-reviews/triggers/prepare-review-payload.ts index e0ad075c8d..853c763868 100644 --- a/src/lib/code-reviews/triggers/prepare-review-payload.ts +++ b/src/lib/code-reviews/triggers/prepare-review-payload.ts @@ -322,7 +322,10 @@ export async function prepareReviewPayload( // continuation) are derived from the same review row to avoid mismatches. let previousHeadSha: string | null = null; let previousCloudAgentSessionId: string | undefined; - const incrementalEnabled = await isFeatureFlagEnabled(FEATURE_FLAG_INCREMENTAL_REVIEW); + const incrementalEnabled = await isFeatureFlagEnabled( + FEATURE_FLAG_INCREMENTAL_REVIEW, + owner.userId + ); if (incrementalEnabled) { try { From 77c22dd83a8434411515cad0e79cb5eaac901cdd Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Wed, 18 Mar 2026 14:51:39 +0200 Subject: [PATCH 2/2] fix(code-reviews): log incremental review decisions Add observability for the incremental review decision path: - Log feature flag evaluation result with owner ID in prepareReviewPayload, so Axiom shows whether the flag was on/off for a given review. - Log when no previous completed review is found (flag on but no incremental base available). - Log in generateReviewPrompt when the three-way gate (previousHeadSha + incrementalTemplate + summaryComment) falls back to full workflow despite having a previousHeadSha, including which condition failed. Previously, the entire incremental decision path was silent, making it impossible to debug from Axiom why a review used full mode. --- src/lib/code-reviews/prompts/generate-prompt.ts | 14 ++++++++++++++ .../triggers/prepare-review-payload.ts | 11 +++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/lib/code-reviews/prompts/generate-prompt.ts b/src/lib/code-reviews/prompts/generate-prompt.ts index aff24aaa6e..da6880b587 100644 --- a/src/lib/code-reviews/prompts/generate-prompt.ts +++ b/src/lib/code-reviews/prompts/generate-prompt.ts @@ -273,8 +273,22 @@ export async function generateReviewPrompt( .replace(/{PREVIOUS_SUMMARY}/g, existingReviewState.summaryComment.body) .replace(/{ACTIVE_COMMENT_COUNT}/g, String(activeCount)); prompt += replacePlaceholders(incrementalWorkflow) + '\n\n'; + logExceptInTest('[generateReviewPrompt] Using incremental workflow', { + reviewId, + previousHeadSha: previousHeadSha.substring(0, 8), + }); } else { prompt += replacePlaceholders(template.workflow) + '\n\n'; + if (previousHeadSha) { + logExceptInTest( + '[generateReviewPrompt] Falling back to full workflow despite previousHeadSha', + { + reviewId, + hasIncrementalTemplate: !!template.incrementalReviewWorkflow, + hasSummaryComment: !!existingReviewState?.summaryComment, + } + ); + } } // 6. What to review diff --git a/src/lib/code-reviews/triggers/prepare-review-payload.ts b/src/lib/code-reviews/triggers/prepare-review-payload.ts index 853c763868..d9e2fc9702 100644 --- a/src/lib/code-reviews/triggers/prepare-review-payload.ts +++ b/src/lib/code-reviews/triggers/prepare-review-payload.ts @@ -327,6 +327,12 @@ export async function prepareReviewPayload( owner.userId ); + logExceptInTest('[prepareReviewPayload] Incremental review flag evaluated', { + reviewId, + incrementalEnabled, + ownerId: owner.userId, + }); + if (incrementalEnabled) { try { const previousReview = await findPreviousCompletedReview( @@ -348,6 +354,11 @@ export async function prepareReviewPayload( previousCloudAgentSessionId, } ); + } else { + logExceptInTest( + '[prepareReviewPayload] No previous completed review found, using full review', + { reviewId } + ); } } catch (error) { // Non-critical - fall back to full review