6a43227315
Backlog item 2. CreateSuggestedJob, RelinkThread, and UnlinkThread each upserted exactly one GmailReviewDecision by ThreadId but loaded every review decision for the owner (GmailReviewDecisions.Where(OwnerUserId == x).ToList()) just to linear-scan for the one match. Replaced with FirstOrDefaultAsync filtered on both OwnerUserId and ThreadId, and added a single-row UpsertReviewDecision overload alongside the existing dictionary-based one (still used by the review-queue endpoints, which genuinely need every decision at once to render the queue). 169/169 green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>