feat: subagent review panels with synthesis#762
Conversation
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: PassNo issues found. Review type: | Agent: codex | Job: 19309 |
roborev: FailReview findingsPanel review fanout needs fixes before merge: three Medium correctness issues can publish misleading or stale results, or ignore CI synthesis config. Medium
Review type: | Agent: codex | Job: 19315 |
roborev: FailMedium issue found: throttled PR re-pushes can leave stale panel runs active. Medium
Review type: | Agent: codex | Job: 19321 |
roborev: FailMedium: CI panel migration has two functional regressions that can cause stale or missing PR comments. No medium-or-higher security issues were reported. Medium
Panel: ci_default_security | Synthesis: codex, 9s, ~$0.04 | Members: codex_default (codex/default, done, 4m53s), codex_security (codex/security, done, 2m11s) | Total: 7m13s, cost partial ~$0.04 | Job: 19423 |
c96019e to
4950bf2
Compare
roborev: PassNo issues found. Panel: ci_default_security | Synthesis: codex | Members: codex_default (codex/default, canceled, 15m58s), codex_security (codex/security, done, 6m30s, ~$4.33) | Total: 22m28s, cost partial ~$4.33 | Job: 19486 |
roborev: FailMedium severity issues were found; no High or Critical findings reported. Medium
Panel: ci_default_security | Synthesis: codex, 7s, ~$0.04 | Members: codex_default (codex/default, done, 15m35s, ~$11.08), codex_security (codex/security, done, 4m29s, ~$2.82) | Total: 20m11s, ~$13.94 | Job: 19504 |
roborev: FailMedium issue found: panel reruns may reuse stale prompts. Medium
Panel: ci_default_security | Synthesis: codex, 8s, ~$0.04 | Members: codex_default (codex/default, done, 9m57s, ~$7.85), codex_security (codex/security, done, 7m7s, ~$5.36) | Total: 17m12s, ~$13.24 | Job: 19510 |
roborev: FailOne medium correctness issue remains; no medium-or-higher security issues were found. Medium
Panel: ci_default_security | Synthesis: codex, 7s | Members: codex_default (codex/default, done, 11m49s), codex_security (codex/security, done, 9m13s) | Total: 21m9s | Job: 19558 |
roborev: FailMedium issues remain in synthesis agent fallback and headed CI pass comments. Medium
Panel: ci_default_security | Synthesis: codex, 9s | Members: codex_default (codex/default, done, 8m59s), codex_security (codex/security, done, 4m27s) | Total: 13m35s | Job: 19573 |
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Combined Review (
|
|
The git stuff its workgin on feels very out of scope for ths pr. |
roborev: Combined Review (
|
Yeah, I scrubbed it out |
roborev: Combined Review (
|
roborev: Combined Review (
|
roborev: Review Failed (
|
roborev: Review Failed (
|
roborev: Review Failed (
|
roborev: Review Failed (
|
This reverts commit 2e9bec1.
f392170 to
79af1cb
Compare
roborev: Review Failed (
|
roborev: Review Failed (
|
roborev: Combined Review (
|
Summary
Adds subagent review panels: one review request can fan out to multiple
reviewer jobs that run in parallel, then a synthesis parent job produces the
single verdict/result users see. Panels are opt-in for foreground reviews and
configured in TOML. When no panel is selected, the existing single-agent review
path remains the default.
The CI poller now uses the same panel primitive instead of the legacy
ci_pr_batches/ci_pr_batch_jobstracking tables. CI and foreground reviewstherefore share the same member-job, synthesis, storage, posting, and TUI
machinery.
Runtime Model
A panel run creates N member jobs plus one synthesis parent job. All jobs
in the run share a
panel_run_uuid.model, provider, reasoning level, review type, and optional member-specific
instructions.
same commit/range/dirty base.
claim_blockeduntil members finish, thenstores the single synthesized review output and verdict.
result without calling an agent.
through and labels the result with that member's agent.
without calling an agent.
findings, preserves severity/file references, and applies
min_severityfiltering. The synthesis prompt is input-only: it tells the agent not to call
tools or run commands, and not to perform a fresh review beyond combining the
supplied member results.
Everything user-facing keys off the parent job:
roborev list,roborev wait, and fix discovery use/api/jobs, which hidespanel members by default. They show synthesis parents plus ordinary
single-agent jobs.
GET /api/jobs?panel_run=<uuid>&limit=0expands a run's members.roborev showprints a one-line member summary for a synthesis job;roborev show --jsonadds apanelblock with member job id, name, agent, reviewtype, status, and verdict.
right expands, and left collapses. The parent row shows panel status and
aggregated cost when enough token data is available.
Configuration
Panels live under
[review]in both global~/.roborev/config.tomland per-repo.roborev.toml. Per-repo scalar keys override global keys. Subagent and panelmaps are unioned, with per-repo entries overriding same-named global entries.
Every subagent field is optional. Empty fields inherit the existing workflow
resolution at run time.
Selection rules:
roborev reviewandroborev review --branchusedefault_panelunless a--panelflag is supplied.roborev review --panel <name>forces a named panel.roborev review --panel noneforces a single-agent review.roborev review --localremains single-agent; panels require the daemon.hook_review_panel; they never implicitlyuse
default_panel.Config validation reports all panel reference errors together: empty panels,
unknown subagents, and invalid
default_panel/hook_review_panelreferences.CI Poller
The CI poller creates one panel run per PR HEAD and posts one PR comment/status
from the synthesis parent.
There are two CI modes:
[ci].panelor per-repo[ci].panel. The poller loadsconfig from the PR's default branch and resolves
[review.panels.<name>]from that config.
panelis unset, the existingagents x review_typesmatrix, or explicit[ci.reviews]map, becomes the panelmembers.
For implicit matrix synthesis,
[ci].synthesis_agent,[ci].synthesis_model,and
[ci].synthesis_backup_agentare honored first. If unset, synthesis fallsback to fix-workflow resolution. Named panels use their own
[review.panels.<name>]synthesis fields.Per-repo
.roborev.tomlcan overridepanel,agents,review_types,reviews,reasoning,min_severity,upsert_comments, andinclude_costsunder its own
[ci]table.CI posting is claimed with compare-and-set semantics so only one daemon instance
posts a given panel. The poller handles superseded PR heads, throttled pushes,
restarts, batch timeouts, closed PRs, and failed/canceled members. If a PR is
closed/merged while a panel finishes, the mapping is removed rather than marked
posted so reopening the same HEAD can enqueue/review again.
CI comments use a combined-review title that includes the reviewed HEAD short
SHA. The footer includes panel name, synthesis agent/runtime, member statuses and
runtimes, total runtime, optional cost, and the synthesis job id. Oversized
comments are truncated to GitHub's comment limit while preserving a compact
footer.
Storage and Migration
This PR adds panel state to
review_jobsand replaces the legacy CI batchtracking tables with
ci_pr_panels.SQLite changes:
backup_agentandbackup_modeltoreview_jobsfor job-level failover.panel_run_uuid,panel_role,panel_name,panel_member_name,panel_member_index,panel_member_config_json, and local-onlyclaim_blockedtoreview_jobs.indexes after migration.
ci_pr_panelsfor PR HEAD to panel-run/synthesis-job mapping and postingstate.
ci_pr_batchesandci_pr_batch_jobsafter cancelingany queued/running legacy batch jobs. The drain/drop path is transactional and
idempotent so interrupted prior migrations can recover cleanly.
Postgres changes:
review_jobs.ci_pr_panelsand panel indexes.Panel columns are additive. The legacy CI batch tables are intentionally removed
as a one-way migration after draining.
UI and CLI
roborev reviewaccepts--panel <name>|noneand reports panel enqueuedetails while preserving the
Enqueued job <id>token skills depend on.roborev showandshow --jsonexpose panel metadata for synthesis jobs.expand/collapse behavior, parent status while members are running, parent cost
aggregation, and member rows without unsupported close affordances.
--paneland explains thatpanel review IDs refer to the synthesis parent.
Development and Test Safety Notes
This branch also includes supporting safety/test changes discovered while
validating the feature:
no runtime file or explicit
--serveris present.XDG_CONFIG_HOMEso user-level globalignores cannot affect tests.
object cleanup during parallel test runs.
AGENTS.mdnow warns agents not to install or overwrite the localroborevbinary without explicit permission.
does not change the shared
internal/git.ResolveSHAenvironment behavior.