From 05a9a36c77470d6cf26f0ce4c3900223cd940053 Mon Sep 17 00:00:00 2001 From: Jeffrey Phillips Freeman Date: Sun, 5 Apr 2026 06:18:40 +0000 Subject: [PATCH] chore(agents): add milestone-based PR prioritization to reviewer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Approved proposal: #3069 Pattern: workflow_improvement — review/merge throughput optimization Evidence: With 89 open PRs across milestones v3.2.0-v3.7.0, PRs were reviewed in arbitrary order. Earlier milestones (months overdue) competed equally with v3.7.0 PRs for reviewer attention. Only 1 PR merged in 90 minutes of operation. Fix: Add Step 2b (prioritization) that sorts work items by: merge retries first, earlier milestones first, CI-passing PRs first, smaller PRs first. ISSUES CLOSED: #3069 --- .opencode/agents/ca-continuous-pr-reviewer.md | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.opencode/agents/ca-continuous-pr-reviewer.md b/.opencode/agents/ca-continuous-pr-reviewer.md index 1c1589de3..190368c5a 100644 --- a/.opencode/agents/ca-continuous-pr-reviewer.md +++ b/.opencode/agents/ca-continuous-pr-reviewer.md @@ -321,8 +321,30 @@ LOOP FOREVER: stale_count = 0 + # ── Step 2b: Prioritize work items ─────────────────────────── + # Sort work items so the most impactful PRs are reviewed first. + # This ensures earlier milestones (which are overdue) get reviewed + # before later milestones, and merge retries (which take seconds) + # are processed before full reviews (which take minutes). + work_items.sort(key=lambda item: ( + # Priority 1: Merge retries first (already approved, just need merge) + 0 if item.type == "merge_retry" else 1, + # Priority 2: Earlier milestones first (v3.2.0 before v3.7.0) + # Extract version tuple from milestone title, e.g. "v3.2.0" → (3, 2, 0) + # PRs without a milestone sort last (999, 999, 999) + milestone_sort_key(item.pr.milestone if hasattr(item, 'pr') else None), + # Priority 3: PRs with passing CI before PRs with pending CI + 0 if item.type == "ci_fix" else 1, + # Priority 4: Smaller PRs first (faster to review) + (item.pr.additions + item.pr.deletions) if hasattr(item, 'pr') else 0, + )) + # Helper: milestone_sort_key(milestone) → + # if milestone is None: return (999, 999, 999) + # parse version from milestone.title, e.g. "v3.2.0" → (3, 2, 0) + # return parsed tuple, or (999, 999, 999) if unparseable + # ── Step 3: Dispatch parallel reviewers via prompt_async ───── - # Take up to N work items + # Take up to N work items (now sorted by priority) batch = work_items[:N] # Claim all PRs in the batch using two-phase locking protocol -- 2.52.0