Three review workflows, and what each one is worth
By the end you can
- Target a local /code-review at the right diff and choose an effort level on purpose
- Tell a local review, a cloud ultrareview and PR-time Code Review apart by scope, cost and confidence
- Tune what a reviewer flags with REVIEW.md, and know which reviewer reads it
- Classify a finding as real, stylistic or unfounded rather than acting on all of them
- Say where each review's fixes land, and which of them /rewind can take back
- Name the review layer that runs without being invoked, and the commit it never sees
The branch is finished and it is bigger than you wanted. Lesson 5.5 gave you
/code-review as the second opinion that stops the writer grading itself;
Lesson 8.5 had you brief a reviewer of your own. Neither said that "review" now
names three separate products: one that runs on your plan's normal usage, one
that bills usage credits per run, and one your organisation may not have. They
read different files, verify to different standards, and put their findings in
different places.
Self-review first: seeing your own diff
/diff reviews "the changes in your working tree, including the edits Claude
has made so far" (Commands). In
practice it is the step that catches what no reviewer is placed to catch — this
file should not be in the diff at all. A reviewer reads what the change does;
only you know what it was supposed to do.
The local review: scope, effort, and where the fixes land
The local command "reviews a diff in your terminal without installing the
GitHub App" and reports "correctness bugs and reuse, simplification, and
efficiency cleanups"
(Code review). Its default target
is narrower than people assume — your branch's commits ahead of its upstream plus
uncommitted changes, "so it needs work on the branch or in the working tree to
have something to report". On a branch already merged, nothing is ahead of
upstream and the review has nothing to report, which is not a clean bill of
health. You can pass a file path, a PR number, a branch name, or a ref range such
as main...my-feature, so /code-review 1234 reviews a colleague's pull request
before you approve it, and --comment posts what it found back as inline PR
comments.
/code-review high main...my-feature
/code-review 1234 --comment
/code-review ultra develop/review is an alias of it, taking the same effort levels and flags. It was not
always: before v2.1.223 it was a separate command running a single-pass,
read-only review of a GitHub pull request by number, and from v2.1.186 through
v2.1.201 it ran the same multi-agent engine as /code-review medium
(Commands). A script or a finger
habit that types /review expecting a PR-only reviewer now gets your working
diff instead.
Effort is the confidence-versus-coverage dial from Lesson 5.5, with one detail
that also landed in v2.1.223: type no level and the review reuses the last level
from low through max you typed, even from an earlier session, saying so
with a notice such as Reusing high effort, the level you typed last time.
ultra neither updates nor uses that memory, and a level passed in a -p run
does not update it. Before v2.1.223, and if you have never typed a level at all,
the review uses the session's current effort instead.
--fix applies the findings to your working tree after the review. From v2.1.218
that review runs in the background by default, which is where Lesson 11.4's undo
boundary — built there in full — reappears somewhere it looks safe: a background
review applies its --fix edits outside your session's checkpoints, so /rewind
does not undo them and git is what reverts them. A foreground review edits
during your own turn and /rewind restores it as usual — which is what you get
when you start a second review while one is running, in a -p or Agent SDK run,
or with CLAUDE_CODE_DISABLE_BACKGROUND_TASKS set to 1. Before v2.1.218 every
review ran inside your conversation, so this boundary arrived with an upgrade, in
a command whose own text never changed.
Its neighbour /simplify applies cleanup fixes but "doesn't look for
correctness bugs" (Commands) — a
clean /simplify says nothing about whether the code works.
The cloud review: verified findings, real money
/code-review ultra sends the change to a fleet of reviewer agents in a remote
sandbox. One property is the reason to pay:
every reported finding is independently reproduced and verified, so the results focus on real bugs rather than style suggestions — Ultrareview
Its scope is its own, not the local default: your current branch against the repository's default branch, plus uncommitted and staged changes. Pass a branch name for a different base, or a PR number — in PR mode nothing is uploaded from your machine.
A local review takes seconds to a few minutes and counts toward normal usage. This one takes roughly 5 to 10 minutes and costs: 3 free runs on Pro and Max, then roughly $5 to $25 per review in usage credits. The free runs are a one-time allotment that does not refresh, Team and Enterprise get none, and a free run is spent on starting rather than on succeeding — "A review you stop early or that fails to complete still uses a free run", while a paid review bills only for the portion that ran. Before launching, Claude Code shows a confirmation dialog with the scope, your remaining free runs and the estimated cost, and "Claude doesn't start an ultrareview on its own" (Ultrareview) — unlike the local command, which Claude can start for you and a scheduled task can run, a behaviour that needed a feature flag before v2.1.246.
There is a ceiling too: up to 500 changed files and 8,000 changed lines by default for a branch review, values that can change, with the refusal naming the limits in effect. A refusal is information — the change is too big for one pass, which is usually also true of the human asked to approve it.
PR-time Code Review: severities that do not block
The managed surface, and the first question is whether you can have it: "Code Review is in research preview, available for Team and Enterprise subscriptions. It is not available for organizations with Zero Data Retention enabled" (Code review).
It runs on GitHub pull requests: agents analyse the diff and surrounding code in parallel, a verification step checks candidates against actual code behaviour to filter out false positives, and survivors post as inline comments on the lines where they were found. By default it aims at "correctness: bugs that would break production, not formatting preferences or missing test coverage". It is not the cheap one either: reviews complete in 20 minutes on average and each averages $15 to $25, billed as usage credits separately from your plan's included usage. That bill lands on the organisation, which is why whether every push gets reviewed is an Owner's setting and not yours.
| Severity | Meaning |
|---|---|
| Important | A bug that should be fixed before merging |
| Nit | A minor issue, worth fixing but not blocking |
| Pre-existing | A bug that exists in the codebase but was not introduced by this PR |
The third row is a triage instrument, not a decoration: a pre-existing finding is real and is not yours, and treating it as PR feedback is how a two-file change becomes a week. The check it writes is deliberately toothless:
The check run always completes with a neutral conclusion so it never blocks merging through branch protection rules. — Code review
Gating is something you build: the Details text ends in a machine-readable
comment carrying per-severity counts, which your CI can parse with gh and jq.
And replying to an inline comment does not prompt Claude to respond — to act on a
finding, fix the code and push.
Tuning the reviewer: CLAUDE.md versus REVIEW.md
CLAUDE.md | REVIEW.md | |
|---|---|---|
| What it is | Shared project instructions, used for all tasks | Review-only instructions |
| In a managed review | Read as project context; newly introduced violations flagged as nits | "given to the agents that find and verify findings", and consulted by those that rank and report |
In local /code-review | Followed, like any session | Not read at all |
That last cell is the trap: the local review follows your CLAUDE.md like any
session, "but it doesn't read REVIEW.md", so every calibration rule you put
there is invisible to the command you run in your terminal and visible only to
the product you may not have. REVIEW.md is freeform markdown at the repository
root, and the lever to reach for first attacks noise at its source:
Verification bar: require evidence before a class of finding is posted. For example, "behavior claims need a
file:linecitation in the source, not an inference from naming" cuts false positives that would otherwise cost the author a round trip. — Code review
That is Lesson 8.5's discount, moved into a file the finding agents read. Other
levers the page names: redefine what Important means here, cap nits per review,
skip paths CI already enforces, add repo-specific checks, set re-review
convergence, and shape the summary. Imports are not expanded there and
referenced files are not read along with it, so put the rules in the file — and
keep it short, because
"a long REVIEW.md dilutes the rules that matter most", the economy Lesson 6.6
made about CLAUDE.md.
Real, stylistic, unfounded: triaging a findings list
A findings list is a list of claims. What was already done to each claim before it reached you differs by surface:
| Where it came from | What was already done | What is left to you |
|---|---|---|
Local, low or medium | Filtered to the findings it is most confident in | Fewer false positives, and coverage you traded away |
Local, high through max | Coverage broadened; "may include findings the review is less sure about" | Check before acting on any of it |
| Ultrareview | Every reported finding independently reproduced and verified, "so the results focus on real bugs rather than style suggestions" | The verification already ran; decide whether the bug matters here |
| PR-time Code Review | Candidates checked against actual behaviour; severity assigned | Severity is the triage; expand the reasoning on anything surprising |
And one disposition applies to every row:
A reviewer prompted to find gaps will usually report some, even when the work is sound, because that is what it was asked to do. Chasing every finding leads to over-engineering — Best practices
Read that precisely. The documentation's word for what gets filtered out is false positive — a finding that does not hold up. It does not say reviewers invent problems, and neither should you; it says a reader instructed to find gaps returns a list whose length is partly a property of the instruction. In this course's terms: sort each finding into real, stylistic (it differs from how you would have written it) and unfounded (it does not survive being checked). The last two are cheap to ignore and expensive to chase.
The security layer that runs whether you ask or not
With the security guidance plugin installed there is a fourth reviewer you never
invoke: a pattern match on each file edit, a background model review of the diff
at the end of each turn, and a deeper agentic review on each commit or push
Claude makes. Its independence is designed in — "The plugin does not ask the
same Claude instance that wrote the code to grade itself". Two limits decide its
worth. "None of the layers block writes or commits": findings reach the writing
Claude as instructions, and the review model can miss issues. And the deepest
layer has a blind spot — it "fires only on commits and pushes Claude
makes through its Bash tool. Commits you run from your own shell, including the
! shell escape inside a session, are not reviewed"
(Security guidance). So the
careful habit of committing by hand at the end of a session is exactly the one
that skips it: the end-of-turn review still saw the diff, the commit review never
ran.
Choosing, on purpose
| Situation | Reach for |
|---|---|
| About to hand anything off | /diff, first, yourself |
| Mid-iteration, did I break something | /code-review at low or medium |
| A miss is expensive and you will read every finding | /code-review high through max |
| Pre-merge confidence on a substantial change | /code-review ultra |
| A colleague's PR, before you approve it | /code-review 1234, add --comment to post back |
| A PR in a Team or Enterprise repo | Managed Code Review, tuned with REVIEW.md |
None of these is a gate. Each is an opinion in a confident voice, and --fix
applies that opinion to your working tree before you have read it — on a local
run, and on an ultra run when the findings arrive back in your session. The
discipline is Lesson 11.4's: know what the tool covers before you rely on having
been covered.
Checkpoint
-
You run
/code-review ultrain a Bedrock-backed session, get findings back in ninety seconds, and merge. What did you actually run, and which two details in that sentence should have told you?Show answerAnswer
You ran a local review in your own session. Ultrareview needs a claude.ai sign-in and is unavailable on Amazon Bedrock — as it is on Google Cloud's Agent Platform, Microsoft Foundry, and to organisations with Zero Data Retention — and when it is not available,
/code-review ultraruns a local review instead. That is why this is easy to miss: the failure is not an error, it is quietly receiving the cheaper product. So you merged on findings that were never independently reproduced and verified, which was the entire reason to pay.The two tells are Bedrock, which is on the unavailable list, and ninety seconds, which is a local review's timescale — seconds to a few minutes — where an ultrareview takes roughly 5 to 10 minutes. A third tell is the one that never arrived: a real run shows a confirmation dialog first, with the scope, your remaining free runs and the estimated cost.
-
Your team's
REVIEW.mdrequires afile:linecitation for behaviour claims. A colleague reports that their local/code-reviewstill infers behaviour from naming. Is this a bug?Show answerAnswer
No. The local review follows your
CLAUDE.mdlike any session, but it does not readREVIEW.mdat all — that is the documented split, and it is the trap of this section. Every calibration rule in that file is invisible to the command your colleague runs in the terminal and visible only to the managed PR-time Code Review, the product your organisation may not even have.If the verification bar is meant to apply locally, it has to live where the local review reads:
CLAUDE.md. Weigh that before moving it, becauseCLAUDE.mdis shared project instructions used for all tasks, so a review-only rule put there is carried by every session — the same economy that says a longREVIEW.mddilutes the rules that matter most. -
You run
/code-review max --fix, come back to a modified tree, and dislike two of the edits./rewinddoes not offer them — yet a colleague who runs the same command withCLAUDE_CODE_DISABLE_BACKGROUND_TASKSset to1finds that it does. What accounts for the difference, and what should both of you have done before running it?Show answerAnswer
Where the review ran. From v2.1.218
/code-reviewruns in the background by default, and a background review applies its--fixedits outside your session's checkpoints, so/rewindhas nothing to offer and git is what reverts them.CLAUDE_CODE_DISABLE_BACKGROUND_TASKSset to1forces the review into the foreground, where it edits during your colleague's own turn and is checkpointed like any other edit — the same effect they would get by starting a second review while one was running, or in a-por Agent SDK run.Both of you should have committed first, or run without
--fixand read the findings before anything touched the tree. That is the half that never depended on where the review ran: the edits are applied from findings you have not read. Your colleague's working/rewindis luck, not a plan — before v2.1.218 every review ran inside the conversation and a rewind always took the fixes back, so the upgrade removed the recovery without changing a character of the command, and a habit formed then is now wrong in the expensive direction. -
A managed review posts one Important, three Nit and two Pre-existing findings on your two-file bug fix. Which are yours to act on before merging, and what does the neutral check run mean for whether you can merge at all?
Show answerAnswer
The Important one, and only that one is defined as needing to be fixed before merging. The three Nits are minor — worth fixing but not blocking — so fix them if they are cheap, not because they appeared on a list. The two Pre-existing findings are real bugs that this PR did not introduce; severity is doing triage work there, and treating them as PR feedback is how a two-file change becomes a week. Chasing every finding leads to over-engineering: a reviewer prompted to find gaps will usually report some even when the work is sound.
The neutral check run means it never stops you. It "always completes with a neutral conclusion so it never blocks merging through branch protection rules", so you can merge with all six findings open — nothing here is a gate. Gating is something you build: the Details text ends in a machine-readable comment carrying per-severity counts that your CI can parse with
ghandjq. And when you do fix the Important one, fix the code and push — replying to the inline comment does not prompt Claude to respond.