Summary
The "Re-run Gittensory review" checkbox in the PR panel comment does not force a fresh AI review. Checking it re-runs the deterministic gate/disposition pass but silently reuses whatever AI review result (or lack thereof) is already cached/frozen for the current head SHA, instead of producing a new one.
Reproduced live on #3702: the panel shows Code review: No blockers | No AI review summary (reviewerCount: 0). Toggling the rerun checkbox completes a genuine ~13s processing pass but still produces zero reviewers.
Root cause
maybeProcessPrPanelRetrigger in src/queue/processors.ts calls maybePublishPrPublicSurface without setting forceAiReview: true in its options. forceAiReview is a supported field on that function's options type specifically documented for this case (see the comment at its declaration: "an explicit manual re-gate can force a fresh AI opinion, bypassing BOTH the durable cache and the bounded non-cacheable-reuse cooldown"), and it's read in two places downstream:
- The "frozen for manual review" guard, which reuses the last published AI verdict for PRs held with a manual-review label unless
forceAiReview is true.
- The AI-review cache lookup, which reuses a stored review for the same head SHA + fingerprint unless
forceAiReview is true.
The only existing call site that ever sets forceAiReview: true is reReviewStoredPullRequest (the scheduled agent-regate-pr job), gated on that job's own optional force field — which, per its own doc comment, no production scheduler or webhook enqueues today. So the manual-retrigger checkbox path currently has no way to bypass a stale/cached/frozen AI review result.
Fix
Add forceAiReview: true to the options object maybeProcessPrPanelRetrigger passes to maybePublishPrPublicSurface. A user explicitly clicking "re-run review" is exactly the manual-override case forceAiReview was built for.
Summary
The "Re-run Gittensory review" checkbox in the PR panel comment does not force a fresh AI review. Checking it re-runs the deterministic gate/disposition pass but silently reuses whatever AI review result (or lack thereof) is already cached/frozen for the current head SHA, instead of producing a new one.
Reproduced live on #3702: the panel shows
Code review: No blockers | No AI review summary(reviewerCount: 0). Toggling the rerun checkbox completes a genuine ~13s processing pass but still produces zero reviewers.Root cause
maybeProcessPrPanelRetriggerinsrc/queue/processors.tscallsmaybePublishPrPublicSurfacewithout settingforceAiReview: truein its options.forceAiReviewis a supported field on that function's options type specifically documented for this case (see the comment at its declaration: "an explicit manual re-gate can force a fresh AI opinion, bypassing BOTH the durable cache and the bounded non-cacheable-reuse cooldown"), and it's read in two places downstream:forceAiReviewis true.forceAiReviewis true.The only existing call site that ever sets
forceAiReview: trueisreReviewStoredPullRequest(the scheduledagent-regate-prjob), gated on that job's own optionalforcefield — which, per its own doc comment, no production scheduler or webhook enqueues today. So the manual-retrigger checkbox path currently has no way to bypass a stale/cached/frozen AI review result.Fix
Add
forceAiReview: trueto the options objectmaybeProcessPrPanelRetriggerpasses tomaybePublishPrPublicSurface. A user explicitly clicking "re-run review" is exactly the manual-override caseforceAiReviewwas built for.