reference

Every flag, key and field

The terse version. The documentation explains why each of these behaves the way it does.

Flags #

flagdefaultdescription
--task=<id>name of the task directory holding the review context
--run=<name>name for this round of the review
--lenses=<a,b>lens set replacing the profile roster, as one agent
--workdir=<dir>working directorydirectory the review subprocesses run in
--min-confidence=<n>0drop findings below this confidence
--no-synthesisskip the synthesis stage
--no-verifyskip the verification stage
--no-tuidisable the terminal UI
--markdownwrite the report as markdown instead of JSON
--preserve-anthropic-api-keypass ANTHROPIC_API_KEY to the model CLIs
--idle-timeout=<d>2mkill and retry an agent after this long with no output. Also a config key
--hard-timeout=<d>20mkill an agent after this long, per attempt. Also a config key
--stagger-delay=<d>30show long to wait for the first agent before releasing the rest. Also a config key
--max-parallel=<n>4how many agents run at once. Also a config key
--verify-groups=<n>6cap on the number of verifier groups. Also a config key
--verify-group-by=<k>dirdir or source. Also a config key
--tasks-dir=<dir>./.revmux/tasksroot directory holding task directories. Also a config key
--auto-exit=<d>0sclose the terminal UI this long after the report arrives; 0 never closes it. Also a config key
--profile=<name>comprehensiveprofile naming the roster to run. Also a config key
--config-dir=<dir>~/.config/revmuxdirectory holding the config file and the prompt tree
--initmaterialize the resolved prompt tree and a config template into ./.revmux/
--dump-defaults=<dir>extract the embedded prompt tree into a directory
--versionshow version and exit

Config keys #

The nine runtime knobs above also read from ./.revmux/config and ~/.config/revmux/config, under the same name as the flag, in INI format. Command line wins, then project, then user, then the default, merged per key. Every other flag is command line only.

keydefaultdescription
idle-timeout2mkill and retry an agent after this long with no output
hard-timeout20mkill an agent after this long, per attempt
stagger-delay30show long to wait for the first agent before releasing the rest
max-parallel4how many agents run at once
verify-groups6cap on the number of verifier groups
verify-group-bydirdir or source
tasks-dir./.revmux/tasksroot directory holding task directories
auto-exit0sclose the terminal UI this long after the report arrives; 0 never closes it
profilecomprehensiveprofile naming the roster to run

--task and --run are not config keys: a config file naming the round to write would make the same command review different context in different directories.

Subcommands #

All print JSON on stdout and exit before any review starts. None of them ever exits 1.

commanddoes
revmux config reports the resolved configuration: knobs with their precedence layer, every profile with its roster and stage runners, every lens and stage description, the executor and effort vocabularies, and the task store
revmux new creates a task, a commented-out task.md, a round and its input/, and prints every path plus a created list. Never overwrites
revmux init materializes each prompt file into ./.revmux/ from the layer that won it, reporting which one that was, and writes the config from the shipped commented template rather than from what resolved. --init is the same thing behind a flag
revmux stats arithmetic over the archive: per agent, per lens, per stage and per task. Reads only, and accepts an optional --task
revmux cleanup removes one named task and everything under it. The only command that deletes anything

Environment #

variablehandling
ANTHROPIC_API_KEY stripped from the child environment so claude uses interactive subscription auth. --preserve-anthropic-api-key passes it through
CLAUDECODE always stripped: a claude child refuses to start when it thinks it is a nested session

Front matter #

keyaccepted invalue
descriptionprofile, stage, lensa one-liner, reported by revmux config
modelprofile, roster entry, stage, stage override<binary>[/<model>][:<effort>]
lensesroster entrynames of lens files, at least one
colorroster entryan ANSI-16 name or #RRGGBB
stagesprofilesynthesis and verify, each taking a model string
agentsprofilethe roster, a list of entries

task.md

keyvalue
descriptionwhat this task is about, echoed by revmux config and revmux stats
urlthe pull request, issue or page the task tracks
branchthe branch under review
basewhat it is being compared against

All four are optional and are stored and reported, never resolved. revmux runs no git command against branch or base and fetches nothing from url.

Model string #

<binary>[/<model>][:<effort>]

claude                   claude, its own default model and effort
claude/opus:high         fully specified
codex/gpt-5.6-sol        effort falls back to the profile's, then the binary's
codex:high               codex's default model at high effort
claude/                  refused: a second spelling of `claude`
claude/opus:hgih         refused: not an effort
vocabularyvalues
executorsclaude, codex
effortslow, medium, high, xhigh, max

Parses on the first / and the last :. A stage resolves through its stages: override, then the stage file's own model:, then the profile's. An entry naming a different binary than the profile brings its own model rather than inheriting one belonging to the other; effort carries across, since it belongs to neither model. Ask revmux config for what a given invocation resolves to.

Profiles #

profileneedsroster
comprehensiveboththree claude lens splits plus an adversarial codex peer. The default
focusedbothone bugs agent plus the codex peer
finalbothbugs+impl plus the codex peer, nothing below major reported
claude-onlyclaudethe four lens splits on claude alone
codex-onlycodexthe four lens splits on codex, both stages with them
grill-mebothtwo lens splits, each run once on claude and once on codex
expertbothtwo agents at the highest effort, each carrying all eight code lenses
triagebotha four-way panel over a filed item; wants --no-synthesis

Lenses #

reviewing a change

lenscovers
bugscorrectness defects: logic and boundaries, nil and bounds, concurrency, resource lifetime, error handling
implgoal fit: whether the change does what it set out to do, is wired up, and is proportionate
architectureconventions and organization: the project's own rules, established patterns, dependency and interface shape
qualitystyle, over-engineering, error handling and accidental duplication in code that already works
docsdocumentation accuracy: doc comments against the code, and the project docs the change leaves stale
testswhether tests exist where a defect can hide, actually exercise the code, and survive concurrency
commentsthe code's own stated rules: doc comments and inline notes the change was supposed to obey
adversarialattacks the change looking for what a sympathetic reader would accept

reading a filed item

lenscovers
groundingwhether what a filed item claims is true of the code as it stands today
precedenthow comparable asks were decided here before, and whether that bears on this one
thesisthe strongest honest case that a filed item should be done or that its report is real
antithesisthe strongest case against, and whether something simpler reaches the same goal
costwhat implementing a filed item reaches into, and whether the work is proportionate

Prompt variables #

The vocabulary is closed. A prompt file naming anything else fails at load. Every context variable expands to a path, never to the file's contents.

variableexpands towhere
{{SCOPE}}path of the round's input/scope.mdany prompt
{{GOAL}}path of input/goal.md, or none providedany prompt
{{PROFILE}}path of input/profile.md, or none providedany prompt
{{CONTEXT}}path of input/context/, or none providedany prompt
{{WORKDIR}}the directory the subprocesses run inany prompt
{{FINDINGS}}the findings that stage receivessynthesis, verify
{{SOURCES}}the true source roster, degrades includedsynthesis only

Prior rounds are appended to every composed prompt as a block rather than a variable, because a variable would be opt-in per file and any prompt omitting it would silently lose the history.

Colors #

A roster entry's color sets its prefix color in both the TUI and the plain renderer, and is filled from a palette by roster position when omitted. Accepted values are the ANSI-16 names (red, bright-blue and so on) or #RRGGBB. An unknown value is a startup error.

Report JSON #

fieldmeaning
scopetask, run and scope_path for this round
sources.expectedhow many sources the roster named
sources.reportedhow many came back
sources.degradedagent names that failed twice
sources.agents[]per agent: lenses, executor, requested and actual model, effort, tokens, raised, degraded
findings[]the report, filtered by --min-confidence
findings[].filepath relative to the working directory
findings[].linethe anchor; 0 means a file-level finding
findings[].end_lineoptional; 0 means a single line
findings[].severityhow bad it is, calibrated by the profile's severity bar
findings[].confidence0 to 100, boosted where distinct sources corroborate
findings[].title, body, fixwhat it is, why, and what to do about it
findings[].sourcesagent names. The only input to the confidence boost
findings[].lensesthe lens names that raised it. Informational, never a vote count
findings[].verdictthe verify stage's answer, see below
open_questions[]what a reviewer could not settle from the code
pre_existing[]real, but not introduced by this change
immaterial[]true and not worth acting on
statstimings, total tokens, and per-stage duration with the runner each resolved to

Empty lists are emitted as arrays rather than null. The three side arrays are not filtered by --min-confidence and do not affect the exit code.

Verdicts #

verdictmeans
confirmedchecked against the code and it stands
refinedreal, with the severity, the location or the claim corrected
rejecteddoes not hold; dropped from the report
immaterialtrue and not worth acting on; moved to immaterial
pre_existingreal but not introduced here; moved to pre_existing
unverifiednobody checked it: the stage was skipped with --no-verify, its verifier group failed, or the model returned no usable verdict for it

Exit codes #

codemeaning
0no findings above --min-confidence
1findings above --min-confidence. A normal outcome
2 tool error: bad config, unreadable prompt tree, an omitted --run, a round with no input/ or an empty scope.md, a round that already ran or is being written by another run, an unwritable artifact, every source degraded, or a delivered SIGINT or SIGTERM

Task layout #

<tasks-dir>/<task>/
├── task.md              optional front matter about the task
└── <run>/               a round
    └── input/           caller-written
        ├── scope.md     required
        ├── goal.md      optional
        ├── profile.md   optional
        └── context/     optional directory

Take these paths from revmux new rather than joining them: the layout is revmux's own detail, and a caller that reimplements it breaks silently when it changes.

Run archive #

<tasks-dir>/<task>/<run>/
├── manifest.json      resolved roster, prompt provenance and hashes, requested vs actual model,
│                      timings. Created empty as the run starts and filled in when it finishes,
│                      so it doubles as the marker claiming the round
├── prompts/agents/    the composed prompt each agent received, post-substitution
├── prompts/stages/    synthesis and one file per verify group
├── stages/            1-found.json, 2-synthesized.json, 3-verified.json
├── events.jsonl       stalls, retries, degrades, stage transitions
├── agents/            verbatim tees: <agent>.jsonl, <agent>.log, <agent>.retry.jsonl
└── report.md, findings.json

A failed archive write fails the run. The one exception is a per-agent tee under agents/, which degrades that one source instead.

Name rules #

TUI keys #

keysaction
tab shift+tab h lswitch pane
1-9, then a letterfocus that pane directly
fjump to the findings browser
ishow the startup input snapshot, or return
k jscroll
pgup pgdn ctrl+b ctrl+fpage
home end g Gtop, bottom
/filter findings
escleave the input viewer or a filter; never quits
qquit, once the report is in
ctrl+cquit, at any point