CCLearn

Writer, reviewer, and the findings that are not real

verified against Claude Code 2.1.261 · 2026-09-0915 min

By the end you can

  • Run a Writer/Reviewer pass across two separate contexts
  • Explain why a fresh context reviews better than the context that wrote the code
  • Write a review brief bounded to correctness and the stated requirements
  • Triage reviewer findings as claims that need evidence before you act on them
  • Ask for a second pass from the same reviewer, and say which built-in agents cannot be resumed

The diff is finished and you have spent an hour getting it there. Lesson 5.5 already made the argument that the grader must not be the writer, and handed you /code-review for the correctness case. This lesson is the other case: the check you want is not "are there bugs" but "does this do what we agreed", so you have to arrange the second reader yourself.

Level 8 changes two things about that. The reviewer's context is now something you choose rather than something you get. And its report lands in your main window and is paid for out of it, which makes the brief a budget as well as an instruction.

Two contexts, one change

The docs give the pattern two shapes, and the difference between them is who carries the findings back.

WriterReviewerHow findings reach the writer
Two sessionsSession ASession B, its own windowYou paste them
Writer plus review subagentYour sessionA subagent it spawnsDirectly, no copying

In the two-session version, Session A gets Implement a rate limiter for our API endpoints, Session B gets a brief naming the file, and then Session A gets a third message — Here's the review feedback: [Session B output]. Address these issues. That third message is you, acting as the transport. The subagent version removes it:

Because the reviewer runs as a subagent, the implementing session receives the gaps directly and can fix them and re-review without you copying findings between windows. — Best practices

Neither shape is better in general. Two sessions when the review is a separate piece of work you want to sit with; a subagent when the point is a round trip that ends with the gaps closed.

Why the author is the wrong reviewer

The reason is not that the writing context is careless. It is that it is convinced. A fresh context reviews better precisely because Claude is not biased toward code it just wrote — Lesson 5.5 quoted the mechanism, that a reviewer in a fresh subagent context sees only the diff and your criteria, not the reasoning that produced the change, and Lesson 8.3 aimed that same sentence at forks. Read it against Lesson 8.2 and it inverts. Everything 8.2 listed as missing from a subagent — the conversation history, the skills already invoked, the files Claude already read — is here the entire point. Isolation was the thing you had to write a brief around. In a review it is the product.

Which makes one option in Lesson 8.3 the wrong one. A fork inherits the entire conversation instead of starting fresh, dropping exactly the input isolation this section is asking for; 8.3 has the definition and the trade in full. So a fork inherits the argument you had about why this approach was chosen. It is an excellent way to hand off a side task without re-explaining the situation, and a poor reviewer, because the thing you wanted withheld is exactly what it starts with. Do not review your own diff in a fork.

The brief that produces useful findings

The documented example is four clauses long, and every clause is load-bearing:

text
Use a subagent to review the rate limiter diff against PLAN.md. Check that
every requirement is implemented, the listed edge cases have tests, and
nothing outside the task's scope changed. Report gaps, not style preferences.
ClauseWhat it settles
review the rate limiter diffThe artefact. Not "the code", not "my changes"
against PLAN.mdThe standard. A named file the reviewer can open
every requirement … edge cases have tests … nothing outside scope changedWhat counts as a finding
Report gaps, not style preferencesWhat does not

The second row is where 8.2's rule bites. The reviewer has no conversation history, so "check it against what we agreed" names a standard it cannot open — and nothing in the arrangement makes it say so. What comes back is a review against whatever standard the diff itself implies, which is the one you were trying to check. A file path is a fact it can act on; a memory of your afternoon is not.

The correctness variant is more specific still:

Review the rate limiter implementation in @src/middleware/rateLimiter.ts. Look for edge cases, race conditions, and consistency with our existing middleware patterns. — Best practices

Three named classes of problem rather than "look for problems". That is Lesson 2.3's pattern-anchoring applied to a delegate: an unscoped reviewer searches the space of everything that could be wrong, which is exactly the space where invented findings live.

Scope the reviewer's tools too

The doc's own code-reviewer example is "a read-only subagent that reviews code without modifying it", with "limited tool access that excludes Edit and Write" (Subagents):

text
---
name: code-reviewer
description: Expert code review specialist. Proactively reviews code for quality, security, and maintainability. Use immediately after writing or modifying code.
tools: Read, Grep, Glob, Bash
model: inherit
---

The point of that list is not what the reviewer will do, it is what it can. A tools list containing Edit leaves nothing between a finding and a fix, and a fix made during the review is a second change inside the one you were about to review — unreviewed, because its author was the reviewer. Lesson 8.4 called a permissive tools list the standing temptation; this is the case where it costs you the whole exercise.

The adversarial-review caveat

Lesson 5.5 taught you to discount findings after they arrive. Level 8's version of the same fact is that the discount belongs in the brief, before any finding exists.

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: extra abstraction layers, defensive code, and tests for cases that can't happen. Tell the reviewer to flag only gaps that affect correctness or the stated requirements, and treat the rest as optional. — Best practices

Two instructions in one paragraph. Flag only gaps that affect correctness or the stated requirements goes in the brief. Treat the rest as optional is a disposition you need afterwards, because a bounded brief reduces manufactured findings without eliminating them.

Now put that together with 8.1's warning about fan-out — many subagents each returning a detailed result consume significant context, because every one of those results lands back here. Three reviewers on an unbounded brief is not three times the assurance. It is three sets of findings you did not need, each one paid for in the window you still have to do the fixing in.

Triaging what comes back

Every finding is a claim. The reviewer read the diff; unless its brief and its tools let it run something, it did not execute anything, and a claim about behaviour that nobody ran is a hypothesis with a confident voice. Lesson 5.1's distinction applies unchanged to a delegate's report.

The finding saysWhat settles itIf nothing settles it
This branch is unreachableThe test that covers it, or the line that calls itAsk for the call path, not a fix
This races under concurrent writesA test that fails todayRecord it; do not defend against it blind
This is inconsistent with the codebaseThe file that does it the other wayStyle, unless you asked for consistency — the correctness brief above does
This requirement is not implementedThe line in PLAN.md and the absence in the diffThis is the finding you asked for

The last row is worth staring at. A brief bounded to "the stated requirements" produces findings you can check against a document, which is the only kind of finding that closes cleanly.

Asking for the second pass

You rarely want one review. You want a review, some fixes, and a re-read of the same diff by the same reader. Ask Claude to continue rather than describing the job again:

text
Use the code-reviewer subagent to review the authentication module
[Agent completes]

Continue that code review and now analyze the authorization logic

Claude resumes the subagent with the full context from the previous conversation rather than spawning a cold one. One limit to know before you build a habit on it: "the built-in Explore and Plan agents are one-shot and return no agent ID, so Claude can't resume them. Use general-purpose or a custom subagent when you need to continue the work" (Subagents). Explore is the natural reflex for a read-only task and the wrong one here.

What you are actually arranging

Independence is not a quality the reviewer has. It is four decisions you make before it starts: a context that never saw the reasoning, a standard that lives in a file, a definition of a finding narrow enough to be checkable, and a tool list that cannot turn a review into an edit. Get those wrong and the review still runs, still returns a tidy list, and still costs you the window — which is why this one fails quietly rather than loudly.

Checkpoint

  1. You ask for a review of a 60-line diff and get nine findings, four of them proposing new abstraction layers. Which clause was missing from your brief, and which of the nine are you obliged to act on?

    Show answer

    The clause that bounds what counts as a finding: "Report gaps, not style preferences", or in the fuller form, flag only gaps that affect correctness or the stated requirements. Without it 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, and chasing them produces exactly what you got — extra abstraction layers, defensive code, and tests for cases that cannot happen.

    None of the nine, as they stand. Treating the rest as optional is the disposition you need afterwards, because a bounded brief reduces manufactured findings without eliminating them. Each finding is a claim: act on the ones that fail against correctness or a stated requirement you can check against a document, and for the others ask for the evidence — the call path, a test that fails today, the line in PLAN.md — rather than a fix.

  2. A colleague suggests forking your current conversation — /subtask from v2.1.212, or /fork where agent view is off, as Lesson 8.3 sorted out — to review the diff you just finished, "because it already knows the context". What is wrong with that, in one sentence?

    Show answer

    A fork inherits the entire conversation, so the reasoning that produced the change — the one thing you wanted withheld — is exactly what the reviewer starts with, and the independence a fresh context buys is gone.

    The habit that avoids it: name the reviewer agent, so the isolation follows from a definition you wrote rather than from a setting you did not check.

  3. Your reviewer subagent reports that a config value is never read. Name the evidence that would settle the claim, and say what you do if you cannot get it.

    Show answer

    The read site: the line or test that consumes the value, or a demonstration that no such line exists. Until then it is a claim, not a fact — unless its brief and its tools let it run something, the reviewer read the diff and executed nothing, and a claim about behaviour that nobody ran is a hypothesis with a confident voice.

    If you cannot get that evidence, ask for the call path rather than a fix, and record the finding instead of acting on it blind. Deleting a config value on an unverified claim turns the review into a second, unreviewed change — the same reason the reviewer's tools list should not contain Edit.

  4. You are about to fan out four reviewers over four modules to save time. What does that cost, and where does the cost land?

    Show answer

    Four detailed reports, all of which return to your main conversation. Running many subagents that each return a detailed result consumes significant context, and it lands in the one window you still have to do the fixing in. You bought wall-clock time with the budget you need for the repair.

    It is also not four times the assurance. On an unbounded brief, four reviewers give you four sets of findings you did not need, each paid for in full. If you fan out anyway, bound every brief to correctness and the stated requirements before you spawn anything, because the reports arrive whether the findings were real or not.

Sources