Repository navigation
v0.3.0
This feature release has reviewers check each change against a drafted statement of its intent, re-reviews only what changed since the last run, tags pre-existing findings and caps them separately, adds per-repo review instructions and diffloupe runs stats, fixes walkthrough stops that pointed at the wrong lines, and fixes a long-running server carrying one run's setup into the next.
Changelog
Intent Draft Before Reviewing
Each reviewer agent only sees its own slice of the change. It often couldn't tell what the rest of the change was for, so it flagged code that was correct given the parts it couldn't see.
Before the reviewers start, a small model now reads the whole diff and writes a short draft: a title, the goal, and the changes it expects. Large diffs are compacted to fit, and every file is kept. Each slice reviewer, the coordinator and the walkthrough get the draft. It is labelled as inferred, so they check it against the code instead of trusting it. The draft is cached per target, so re-running the same target doesn't pay for it again.
The intent model is a new stage. It defaults to Claude Haiku 5.5 when the walkthrough model is an Anthropic model, and to the walkthrough model otherwise. Set it with --model intent=<id>, models.intent in the settings file, or REVIEW_MODEL_INTENT. The draft costs about $0.01 per run.
In a paid comparison on 8 review slices, slices given the draft found 12.0 good issues per sample, against 10.0 without it. We haven't confirmed that the draft adds no cost: those runs cost more per run than the baseline, but they ran a day apart from the baseline runs, and the sample is small.
--intent text is now shown to reviewers as its own block, labelled as yours, next to the PR description. Before, it was appended to the end of the PR body.
Re-Reviews Focus on What Changed
Reviewing the same target again (round 2 and later) now sends only the files that changed since the previous run's head to the reviewers. Each reviewer sees the full diff plus the diff since the last review, and is told to focus on the new lines. The cap on new findings drops from 10 to 5 on these rounds. Grouping and the walkthrough still cover the whole change.
If more than half the files changed, or the previous head is no longer available, the round falls back to a full review. Use --full to force a full review. From round 4 on, the CLI warns that later rounds mostly find smaller problems. The headless summary now shows the round number.
Pre-Existing Findings
Findings about code the change didn't add or modify are now tagged pre-existing. They have their own cap of 3, so they can't push findings about the new code out of the review. They are listed after the other findings, don't count toward merge risk, and are shown muted in the web UI and in the markdown export.
Per-Repo Review Instructions
The settings file has a new instructions field: one string or an array of lines. Every reviewer and the coordinator get it, and where it conflicts with the built-in review guidance, it wins. Use it for things the code can't tell a reviewer: what counts as breaking in this repo, invariants that a diff doesn't show, and what not to report.
{
"instructions": [
"## What failure looks like here",
"A change that breaks runs already saved on disk.",
"## Don't report",
"Styling in src/web/."
]
}We also tightened the built-in review prompts. A mistake repeated across several places is now reported once, as a pattern. Reviewers flag lines in AGENTS.md, CLAUDE.md or the README that the change made stale. There is an explicit list of things not to report, and the coordinator drops the same categories and merges repeated findings.
diffloupe runs stats
diffloupe runs stats reports on each chain of re-reviews of the same target. For each round it shows findings raised, carried forward and fixed. It also shows findings dismissed and still open, cost per fixed finding, and totals across chains: how many findings on the change get resolved, the mean number of rounds, and the share of chains that go past three rounds. Filter with --repo and --since.
Each run now records a hash of the review prompts and of the repo's instructions. --by-version splits the counts by those hashes, so you can see whether a prompt change helped.
Walkthrough Stops on the Right Lines
Walkthrough stops often pointed at lines that didn't match what the stop described. In one case, a stop about a dispose() function was anchored 63 lines above it. In the saved runs we checked, about 60% of diff-run walkthrough stops and 40% of review-run stops missed their target.
DiffLoupe placed each stop exactly where the model said. The model had been counting down from the @@ hunk headers to work out line numbers, and on long hunks, especially new files, it lost count by tens of lines. The walkthrough diff now prints each line's number in the new file, and the model cites those numbers. Each stop location also names the symbol on its line. If the cited line doesn't contain that symbol, DiffLoupe moves the stop to the nearest line in the diff that does. Re-running the same diff put every stop location on the right line.
Other Fixes
A long-running diffloupe serve reused the agent configuration from its first run. A later run against a different repository could get the wrong repository name in its prompts and the wrong scratch directory. The configuration is now reset when each run ends, so one server can review several repos.
diffloupe runs show <id> --json now prints JSON. The parent runs command had been taking the --json flag for itself.
The code map now caches parsed files by their git blob id, so runs after the first one in a repo skip re-parsing unchanged files. That takes about 5-10 seconds off the first stage.
Startup detects the OpenCode version in the path and enforces v2 as a requirement.
Full Changelog: v0.2.1...v0.3.0