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