Skip to content
GitHub stars

Subagent Review Panels

Subagent review panels let one daemon review target run through several named reviewer specs, then produce one synthesis parent review. Use panels when a branch, PR, or risky change needs more than one review perspective without creating a pile of separate jobs for humans to track.

Panels are the system behind the 0.57 CI poller. The poller now creates panel runs for PR reviews. If you do not configure a named CI panel, the existing agents, review_types, and [ci.reviews] matrix is adapted into an implicit panel so old CI configs keep working.

Define reusable subagents and panels in either ~/.roborev/config.toml or .roborev.toml:

[review]
default_panel = "branch_final"
hook_review_panel = "quick"
[review.subagents.bug]
agent = "codex"
review_type = "default"
instructions = "Focus on correctness, regressions, edge cases, and missing tests."
[review.subagents.security]
agent = "claude-code"
review_type = "security"
reasoning = "thorough"
instructions = "Focus on authn/authz, secret handling, injection, and unsafe file access."
[review.subagents.design]
agent = "codex"
review_type = "design"
[review.panels.quick]
members = ["bug"]
[review.panels.branch_final]
members = ["bug", "security", "design"]
synthesis_agent = "codex"
synthesis_model = "gpt-5.5"
synthesis_backup_agent = "claude-code"
synthesis_backup_model = "claude-opus-4-8"

Run a panel explicitly:

Terminal window
roborev review --branch --panel branch_final
roborev review --dirty --panel quick

Force a normal single agent review, even when default_panel or hook_review_panel is configured:

Terminal window
roborev review --branch --panel none

Panels require the daemon. roborev review --local --panel branch_final prints a note and runs a single agent review because local mode does not use daemon side panel resolution.

A panel run creates one member job per configured reviewer and one synthesis parent job. The synthesis job is blocked until all members reach a terminal state. Normal job lists and roborev list show the synthesis parent as the actionable review. The TUI can expand that parent row to inspect individual reviewers.

The parent review is what you close, fix, cancel, rerun, and wait on. Member jobs are implementation details for the panel run. Rerunning the parent starts a fresh panel run; member rows cannot be rerun directly.

Synthesis avoids extra agent work when it can:

  • If all successful members pass, the parent output is No issues found.
  • If exactly one member produced output, that output can be passed through directly.
  • If multiple members produced findings, a read only synthesis agent verifies, deduplicates, preserves file and line references, groups by severity, and writes one combined result.
  • If no member succeeds, roborev records a durable all failed review instead of pretending the code passed.

When a panel uses min_severity, synthesis may still run for a single failed member so findings below the threshold can be filtered consistently.

SelectorApplies ToBehavior
--panel <name>Manual daemon reviewsRuns the named panel. This takes priority over config defaults.
--panel noneManual daemon reviewsForces single agent review.
[review] default_panelForeground daemon reviewsUsed when no --panel flag is set.
[review] hook_review_panelAutomatic post commit reviewsUsed for hook sourced reviews. default_panel is not consulted for hook reviews.
[ci] panelCI poller PR reviewsRuns the named panel instead of the implicit CI matrix.

Panels apply to code review targets: single commits, ranges, branch reviews, and dirty working tree reviews. Stored prompt jobs, including roborev run, analysis tasks, compact, and insights, do not fan out into panels.

KeyTypeDescription
default_panelstringNamed panel for manual daemon reviews when --panel is not set.
hook_review_panelstringNamed panel for automatic post commit reviews.
subagentstableNamed reviewer specs referenced by panels.
panelstableNamed panel specs.

Global and repo level review configs are merged. Repo level default_panel and hook_review_panel override global values. Repo level subagents and panels are merged with global maps by name, and repo entries override global entries with the same name.

[review.subagents.security]
agent = "claude-code"
model = "claude-opus-4-8"
provider = "anthropic"
reasoning = "thorough"
review_type = "security"
instructions = "Focus on authentication and authorization."
KeyTypeDescription
agentstringAgent for this member. Empty means use the workflow default.
modelstringModel for this member. Empty means use the workflow model resolution.
providerstringProvider for agents that support provider selection, currently used by Pi.
reasoningstringReasoning level for this member. Empty means use review reasoning.
review_typestringdefault, security, or design. review and general are accepted as aliases for default.
instructionsstringAdditional instructions appended only to this member prompt.

The member workflow is chosen from review_type: default uses review workflow config, security uses security workflow config, and design uses design workflow config. If a member sets agent but omits model, roborev inherits only a workflow specific model. It does not pair that explicit agent with an unrelated generic default_model.

[review.panels.branch_final]
members = ["bug", "security", "design"]
synthesis_agent = "codex"
synthesis_model = "gpt-5.5"
synthesis_backup_agent = "claude-code"
synthesis_backup_model = "claude-opus-4-8"
KeyTypeDescription
membersarrayOrdered list of subagent names. Required and must not be empty.
synthesis_agentstringAgent for synthesis. Empty means use fix workflow agent resolution.
synthesis_modelstringModel for synthesis. Empty means use fix workflow model resolution.
synthesis_backup_agentstringExplicit backup agent for synthesis if the primary fails.
synthesis_backup_modelstringExplicit backup model for synthesis backup.

Panel validation fails if default_panel or hook_review_panel names an undefined panel, a panel has no members, or a panel references an undefined subagent.

Set [ci] panel = "name" to run a named panel for daemon CI poller reviews:

[ci]
enabled = true
repos = ["myorg/myrepo"]
panel = "ci"
[review.subagents.bug]
agent = "codex"
review_type = "default"
[review.subagents.security]
agent = "claude-code"
review_type = "security"
[review.panels.ci]
members = ["bug", "security"]
synthesis_agent = "codex"

For repo specific CI behavior, put the same [ci] panel = "ci" override and panel definitions in that repo’s .roborev.toml. The CI poller loads .roborev.toml from the repo’s default branch before resolving panels, so a PR cannot change its own CI reviewer panel by modifying .roborev.toml on the feature branch.

If [ci] panel is empty, the poller uses the compatible matrix settings:

  • agents
  • review_types
  • [ci.reviews]

That matrix becomes an implicit panel. Synthesis still produces one PR comment, and one member output can pass through without an extra synthesis agent call.

CI panel posting has additional safety checks. Before posting or retrying, roborev verifies the PR is still open, the HEAD SHA is unchanged, and the repo identity still matches. Stale runs are retired without posting a misleading comment. See GitHub Integration for CI retry behavior and status checks.

The TUI shows a panel run as one synthesis parent row. Press Space or Right to expand the row and inspect member reviewers; press Space or Left to collapse it. The parent row shows progress while reviewers are running and a compact member summary after completion.

roborev show includes a reviewer summary above the synthesized output for panel parents:

3 reviewers: bug P, security F, design -

roborev show --json adds a panel block for synthesis parents:

{
"panel": {
"run_uuid": "run-uuid-1",
"name": "branch_final",
"synthesis_job_id": 99,
"members": [
{
"job_id": 40,
"name": "bug",
"agent": "codex",
"review_type": "default",
"status": "done",
"verdict": "P"
}
]
}
}

When token usage is available, panel parent cost in the TUI includes member costs plus synthesis cost after the run is complete.

Panels consume normal worker capacity. A three member panel can run up to three member jobs concurrently if max_workers allows it; the synthesis parent runs after the members finish.

Synthesis is read only. It may inspect the reviewed checkout to verify member findings, but it does not run in agentic mode and must not edit files.

Panel member instructions are appended after the normal review prompt. They are best for focus areas and review boundaries, not for replacing the base roborev review format.