Skip to content

config.json schema

config.json lives at the repository root (or wherever --config points). A config.example.json is committed; the real one is gitignored. All path fields resolve relative to the config file’s directory.

Top-level fields

FieldTypeDescription
reviewersarrayReviewer entries. At least one must be enabled.
synthesizerobjectWhich reviewer synthesizes, and the synthesis prompt path.
rubric_filestringPath to the markdown rubric injected into every review prompt.
output_dirstringWhere run artifacts are written. Default .aireview/runs.
max_parallelintMax reviewers running concurrently. Default 3.
poll_interval_msintOptional. How often the runner polls processes for completion, in ms. Default 25. --poll-interval overrides it per run.

Reviewer entry

FieldTypeDescription
idstringUnique id. Used in output filenames and to reference the synthesizer.
enabledboolIf false, skipped entirely.
commandstringBinary to run (must be on PATH).
argsstring[]Argument template. May contain {prompt} and {model} tokens.
prompt_viaarg/stdinHow the prompt reaches the process. arg: substituted into {prompt}. stdin: piped in.
modelstring/nullSubstituted into {model}. Only used if {model} appears in args.
result_pathstring/nullDot-path into a single-object JSON stdout. null = use entire stdout as text. No array indexing.
timeoutintSeconds before the process is killed and recorded as failed.
paidboolOptional, default false. Marks the reviewer as per-token billed; drives a warning at checkpoint 1.

Placeholder rules

  • {prompt} is replaced with the assembled review (or synthesis) prompt when prompt_via is arg. When prompt_via is stdin, do NOT put {prompt} in args; the prompt is piped in.
  • {model} is replaced with the entry’s model. If args has no {model} token, model is ignored.

result_path semantics

Assumes stdout is a single JSON object. For CLIs that emit JSONL or streaming events, either configure the tool’s non-streaming flag, or set result_path: null and treat the stream as the review text. The orchestrator will NOT collapse JSONL into a single value.

Dot-path navigation supports nested keys (data.text). It does NOT support array indexing, in either bracket (choices[0].text) or numeric-segment (choices.0.text) form, and will refuse such paths with an error. Keys that merely contain digits (data.item2) are fine; a segment that is entirely digits is treated as an index and rejected.

Synthesizer

{
"synthesizer": {
"reviewer_id": "claude",
"prompt_file": "config/synthesis.md"
}
}

reviewer_id must match a configured reviewer. The same process-running machinery is reused; only the prompt differs.

The synthesizer may be a disabled reviewer. A disabled reviewer is not a panel voice but can still synthesize, giving you a “neutral arbiter”: a model that consolidates the reviews without also judging its own review. --dry-run PATH-checks the synthesizer even when it is disabled, and checkpoint 1 names it (flagging it when it is an out-of-panel arbiter).