Migrated from aoagents/ReverbCode/issues/395
Source: aoagents/ReverbCode#395
Original assignees: neversettle17-101
Summary
Extend AO reviews so one worker session can have multiple PRs reviewed by a single shared reviewer terminal. Keep review session-level because it represents the reviewer terminal/handle for the worker session. Store PR-specific review state in review_run.
Split the work into two PRs:
- Backend/storage/API/CLI support for multi-PR review execution.
- Frontend UI for showing eligible and up-to-date PR review state.
PR 1: Backend Multi-PR Review Support
- Keep
review as one row per worker session:
session_id remains unique.
reviewer_handle_id remains the single reviewer terminal handle.
review.pr_url should no longer drive behavior; leave it as legacy/deprecated or stop updating it.
- Make
review_run the PR-scoped record:
- Always persist
pr_url.
- Add a migration replacing uniqueness with
(session_id, pr_url, target_sha) where target_sha != "" AND status != "failed".
- Rename store lookup from session/SHA to session/PR/SHA.
- Add a pure planner in
backend/internal/review:
- Output per-PR items with
prUrl, prNumber, targetSha, status, latestRun.
- Status values:
needs_review, running, up_to_date, changes_requested, ineligible.
- Eligible PRs are open, non-draft, and not already AO-approved for the current
pr_url + head_sha.
- Update trigger flow:
Trigger(sessionID) evaluates all worker PRs.
- Create runs for
needs_review and current-head changes_requested.
- Reuse/skip
running and up_to_date.
- Spawn one reviewer terminal if needed, then send one review task per created run to that same terminal.
- Return batch results with reviewer handle, items, and created runs.
- Update submit flow:
- Keep
ao review submit --session --run ....
runID identifies the PR through stored review_run.pr_url.
- Worker changes-requested messages include the PR URL and GitHub review id.
- Add API fields in an additive way:
ListReviewsResponse.items.
TriggerReviewResponse.items.
TriggerReviewResponse.createdReviews.
- Keep
reviewerHandleId and reviews history for compatibility.
- Regenerate OpenAPI and frontend schema with
npm run api.
PR 2: Reviews UI
- Update the Reviews tab to consume
items.
- Show PR review rows/cards with status:
needs_review
running
changes_requested
up_to_date
- optionally muted
ineligible
- Use one session-level action:
Run needed reviews.
- Keep one
Open terminal action for the shared reviewer terminal.
- Do not create terminal controls per PR.
Test Plan
- Planner table tests for open, draft, merged, closed, approved-current-SHA, changes-requested-current-SHA, running-current-SHA, different SHA.
- Trigger creates multiple runs for multiple eligible PRs.
- Two PRs with the same head SHA do not collide.
- Approved current-head PR is skipped.
- Running current-head PR is reused.
- Failed current-head PR is retryable.
- Only one reviewer terminal is spawned per worker session.
- Submit includes PR URL in changes-requested worker notification.
- Storage test verifies unique index is
(session_id, pr_url, target_sha).
- API tests verify
items and batch trigger response.
- PR 2 frontend tests verify eligible/up-to-date display and one shared terminal.
Assumptions
- AO approval means a completed AO
review_run with verdict=approved for the current pr_url + head_sha.
- External GitHub approval does not skip AO review unless explicitly added later.
- Draft, merged, and closed PRs are ineligible in v1.
Migrated from aoagents/ReverbCode/issues/395
Source: aoagents/ReverbCode#395
Original assignees: neversettle17-101
Summary
Extend AO reviews so one worker session can have multiple PRs reviewed by a single shared reviewer terminal. Keep
reviewsession-level because it represents the reviewer terminal/handle for the worker session. Store PR-specific review state inreview_run.Split the work into two PRs:
PR 1: Backend Multi-PR Review Support
reviewas one row per worker session:session_idremains unique.reviewer_handle_idremains the single reviewer terminal handle.review.pr_urlshould no longer drive behavior; leave it as legacy/deprecated or stop updating it.review_runthe PR-scoped record:pr_url.(session_id, pr_url, target_sha)wheretarget_sha != "" AND status != "failed".backend/internal/review:prUrl,prNumber,targetSha,status,latestRun.needs_review,running,up_to_date,changes_requested,ineligible.pr_url + head_sha.Trigger(sessionID)evaluates all worker PRs.needs_reviewand current-headchanges_requested.runningandup_to_date.ao review submit --session --run ....runIDidentifies the PR through storedreview_run.pr_url.ListReviewsResponse.items.TriggerReviewResponse.items.TriggerReviewResponse.createdReviews.reviewerHandleIdandreviewshistory for compatibility.npm run api.PR 2: Reviews UI
items.needs_reviewrunningchanges_requestedup_to_dateineligibleRun needed reviews.Open terminalaction for the shared reviewer terminal.Test Plan
(session_id, pr_url, target_sha).itemsand batch trigger response.Assumptions
review_runwithverdict=approvedfor the currentpr_url + head_sha.