PR review as a leadership lever

What it is

Code review is usually treated as a quality gate. It is also the largest hidden cost in a team's cycle time and the highest-frequency cultural artifact the team produces, which makes it one of the few things a lead can change that affects delivery speed, code quality and how people treat each other at the same time.

Four settings, each with a defensible number:

REVIEW SLA        first response within 4 business hours,
                  published. Not "reviewed", RESPONDED TO.

PR SIZE           under ~400 lines changed. Review quality
                  collapses beyond that, and large PRs get
                  approved rather than reviewed.

COMMENT TAXONOMY  prefixes: blocking: / suggestion: / nit: /
                  question: / praise:
                  Cheap to introduce, and it removes the
                  ambiguity that causes most review friction.

REVIEW ORDER      correctness -> design and boundaries -> tests ->
                  readability -> nits. In that order, explicitly.

What this is confused with: review as gatekeeping. A gate asks "should this be allowed in." A review that works asks "is this correct, is the design right, and what will the next person need to know." The gate framing produces reviewers who look for reasons to object and authors who write defensively.

Also confused: review latency and review thoroughness. They are independent, and teams routinely trade the wrong one: a review that takes two days and then rubber-stamps a 900-line diff has the worst of both.

The problem it solves

Review latency is usually the single largest component of cycle time, and it is invisible because nobody measures the waiting.

An item with a 14-day cycle time, sampled:

  2.5 days   active development
  4.1 days   waiting for review
  1.2 days   waiting for re-review after changes
  6.2 days   other waiting

Review accounts for 5.3 of 14 days: 38% of the item's life,
spent on work that is finished.

And the cost compounds: a PR waiting two days is a PR the author
has context-switched away from, so responding to comments now
costs a re-orientation, and the branch has drifted from main.

And unreviewed ambiguity produces interpersonal cost that nobody attributes to the review process.

A comment: "Why not use a map here?"

Author reads it as: you must change this.
Reviewer meant:     I'm curious, this is fine either way.

Result: the author rewrites, the reviewer is surprised, and both
conclude the other is difficult. Between two seniors this
escalates, because each assumes the other's intent is clear.

The prefix `question:` costs seven characters and removes the
entire failure mode.

Mechanics

The review SLA

Published: "First response within 4 business hours."

Two deliberate details:

RESPONSE, NOT APPROVAL. The commitment is that the author is not
  waiting in silence. A response can be an approval, a set of
  comments, or "this needs an hour of focus, I'll do it at 3pm."
  All three unblock the author's planning; silence does not.

BUSINESS HOURS. A PR opened at 5pm is not late at 9am. Making
  this explicit prevents an SLA from becoming an evening
  expectation.

Making the SLA achievable is the lead's job, not the reviewers':

- A scheduled review slot on everyone's calendar. 20 to 30
  minutes, daily, at a fixed time. This is the single highest-
  impact change, because it converts review from an interruption
  into planned work.
- Explicit reviewer assignment. "Anyone can review" means nobody
  does, and round-robin assignment with a bot removes the
  social cost of asking.
- Review is counted as work. If a person reviewed six PRs and
  shipped nothing, they had a productive day, and saying so in
  public is what makes the SLA real.
- Measure: time-to-first-review (p50 and p90), review queue
  depth, and PRs older than 24 hours. Three numbers on the
  team's dashboard.

The reason a scheduled slot works where exhortation does not is that review competes with focused work, and focused work always wins in the moment. Putting it on the calendar makes it lose once, in advance, which is the same governance move as any other declared budget.

PR size

Under ~400 lines changed. The specific number comes from the
review-effectiveness research (see production evidence), which
consistently finds defect-detection rate falling sharply past a
few hundred lines and review speed becoming implausible past
about 500.

The observable symptom of an oversized PR:

   120 lines   14 comments, 3 substantive
   450 lines    9 comments, 4 substantive
   900 lines    2 comments ("LGTM", "nit: typo")
  2,100 lines   1 comment ("approved")

Comment count per line falls off a cliff, and the reason is
that past a certain size the reviewer cannot hold the change in
their head, so they check the parts they understand and approve
the rest.

How to actually get small PRs, since "write smaller PRs" is not an instruction anyone can follow:

- STACKED PRs: a chain of small PRs each based on the previous,
  reviewed and merged bottom-up. Tooling exists because git does
  not model the chain.
- SEPARATE MECHANICAL FROM SEMANTIC. A rename touching 60 files
  and a behaviour change should never be the same PR. Land the
  rename first, alone, and say so in the description.
- FEATURE FLAGS. Incomplete work merges behind a flag, so a
  feature is five small PRs rather than one large one.
- A SIZE WARNING, NOT A BLOCK. A bot that comments "this is 780
  lines; consider splitting" is useful. A hard block produces
  three PRs with an artificial split and a broken main.

The comment taxonomy

blocking:    I will not approve until this changes. Use sparingly
             and always with a reason.
suggestion:  I think this would be better. Author decides.
nit:         trivial, take it or leave it, and I do not need a
             reply.
question:    I genuinely do not know. Not a disguised objection.
praise:      this is good and I want you to keep doing it.

The taxonomy does three things that are hard to get otherwise:

1. It makes the reviewer's authority explicit, so the author
   knows what they must do versus what they may do.
2. It forces the reviewer to decide how strongly they feel,
   which reduces the number of blocking comments, because
   typing `blocking:` on a stylistic preference feels wrong,
   correctly.
3. `praise:` gets used. Without a prefix inviting it, review
   comments are 100% criticism by construction, which is a
   strange thing to do to people every day.

question: is the one that resolves senior-to-senior friction, because the ambiguity between "I'm curious" and "you should change this" is exactly where two experienced engineers most reliably annoy each other.

A convention worth adding: a blocking comment must say why in terms of consequence.

Weak:     "blocking: don't use a mutable default here."
Better:   "blocking: mutable default argument, so the list
           persists across calls and the second caller sees the
           first caller's items."

The second is teachable and unarguable. The first is an
assertion of authority.

Automate everything mechanical

Humans should never comment on:
  formatting            -> formatter, enforced in CI and on save
  import order          -> linter with autofix
  naming conventions    -> linter where mechanical
  line length           -> formatter
  trailing whitespace   -> formatter
  test coverage floor   -> CI check
  dependency licences   -> CI check

Every one of these as a human comment costs a round trip, and
each round trip costs hours of latency for something a machine
decides deterministically.

The argument to make when someone resists the formatter: it is not about which style is better, it is that no human minute should ever be spent on it. Adopt the language's default (gofmt, black, rustfmt, prettier) so the style choice itself is not a discussion.

Review order, said out loud

1. CORRECTNESS       does it do what it claims? edge cases, error
                     paths, concurrency, the failure modes
2. DESIGN AND        is this the right place for this code? does
   BOUNDARIES        it put a dependency where it does not belong?
                     will the next change be harder?
3. TESTS             do they test behaviour? would they fail if
                     the code were wrong?
4. READABILITY       will the person who reads this in a year
                     understand it?
5. NITS              everything else

The order matters because reviewer attention is finite and front-loaded. A reviewer who starts with naming has spent their attention before reaching the concurrency bug.

And it matters because of what a review comment costs the author: a design comment on the first pass is a redesign, and a design comment after three rounds of nit fixing is a demoralising rewrite. Get the expensive comments out first.

Reviewer assignment

ROTATE, deliberately:
  - spreads context, so the bus factor on each area rises
  - prevents the single-owner bottleneck, where one person
    reviews everything in an area and becomes the constraint
  - is a growth mechanism: reviewing a system is one of the
    cheapest ways to learn it

PAIR-REVIEW FOR ONBOARDING: a new joiner reviews alongside an
  experienced reviewer for their first weeks. They learn the
  codebase and the review norms simultaneously, and it is far
  more effective than reading the style guide.

TWO REVIEWERS only where it earns its cost: security-sensitive
  paths, migrations, anything touching money. Everywhere else it
  doubles latency and produces diffusion of responsibility, where
  each reviewer assumes the other looked properly.

A worked example: 38 percent of cycle time spent on finished work

A team of eight, median cycle time 14 days, complaints in both directions: engineers said reviews were slow, and the lead's read from the retro was that people were "not prioritising review."

Measured for three weeks, 96 PRs:

time to first response      p50  9.4 hours   p90  38 hours
time to merge               p50  2.8 days    p90  6.1 days
PR size                     p50  340 lines   p90  1,180 lines
comments per PR             p50  4           p90  9
PRs merged with 0 or 1
  substantive comment                        41%
review round trips          p50  2           p90  5

Reviewer distribution: 2 of 8 people did 61% of all reviews.

Three findings, and the second one inverted the retro's conclusion:

1. The 9.4-hour p50 was almost entirely queueing, not reviewing.

Sampled 20 reviews, measuring actual time spent in the review:
  median time spent reviewing:    11 minutes
  median time the PR waited:      9.4 hours

So the cost was not reviewer effort, it was that review had no
scheduled place and lost every contest against focused work.

2. Forty-one percent of PRs merged with no substantive comment, concentrated in large PRs.

By size bucket, share merged with 0-1 substantive comments:

  < 200 lines       12%
  200-400           19%
  400-800           47%
  > 800             81%

Reading: past about 400 lines the review stops being a review.
The team was not under-reviewing because people were lazy; they
were under-reviewing because the artifact was unreviewable.

"Not prioritising review" was the wrong diagnosis, and the measurement is what changed it.

3. Two people did 61 percent of reviews, and both were the ones complaining loudest about interruption.

Cause: informal norm that the two most senior engineers reviewed
"anything important", which had grown to mean everything. Both
were the single reviewer for their areas, so both were a
bottleneck AND a bus factor.

The changes, in order of effect:

1. A DAILY 25-MINUTE REVIEW SLOT on everyone's calendar, 10:35,
   after standup. Not optional, and counted as work.
   -> time to first response p50 9.4h -> 2.1h, p90 38h -> 7h
   This was one calendar change and it was the largest single
   improvement in the whole programme.

2. A SIZE WARNING BOT at 400 lines, plus a stacked-PR workflow
   and a rule that mechanical changes ship separately.
   -> p50 PR size 340 -> 180, p90 1,180 -> 410
   -> PRs merged with 0-1 substantive comments 41% -> 17%

3. THE COMMENT TAXONOMY, introduced in one 10-minute standup and
   added to the PR template.
   -> review round trips p90 5 -> 3, because `nit:` comments
      stopped triggering a re-review cycle and `suggestion:`
      stopped being read as mandatory
   -> two specific recurring conflicts between senior engineers
      stopped, which the lead had previously been mediating
      about once a fortnight

4. ROUND-ROBIN REVIEWER ASSIGNMENT with a bot, excluding the
   author, weighted lightly toward people who had not touched
   that area.
   -> reviewer concentration 61% by 2 people -> 34%
   -> the two senior engineers' review load halved
   -> a side effect nobody predicted: two engineers who had
      never touched the streaming code reviewed it enough over
      a quarter to become secondary responders for it

5. FORMATTER AND LINTER made blocking in CI, with autofix on
   save.
   -> style comments per PR 2.1 -> 0.1

The formatter change was the least interesting and removed about a tenth of all comments, each of which had been costing a round trip.

Results after one quarter:

                            before      after
time to first response       9.4h        2.1h
time to merge (p50)         2.8 days     0.9 days
median cycle time            14 days     8 days
PR size (p50)               340 lines    180 lines
merged with 0-1
  substantive comments        41%         17%
review round trips (p90)       5           3
reviewer concentration
  (top 2 people)              61%         34%
escaped defects per
  month                        6.2         3.8

Escaped defects fell while review latency fell, which is the counter-intuitive part and the point of the exercise: the team was reviewing faster and better, because smaller changes are both quicker to review and possible to review properly.

One thing that did not work:

An initial attempt at a hard 400-line block in CI, before the
stacked-PR workflow existed, produced three PRs split at
arbitrary boundaries that individually did not compile, and one
merge that broke main.

Replaced with a warning plus tooling. The lesson: do not
constrain an artifact before providing the workflow that makes
the constraint achievable.

Production evidence

Cisco's large-scale code review study (Cohen et al., via SmartBear's published analysis) examined roughly 2,500 reviews across 50 developers and found defect-detection effectiveness dropping sharply with review size, with the practical recommendations of reviewing fewer than 200 to 400 lines at a time and limiting review sessions to about 60 minutes. Those are the numbers behind the 400-line guidance.

Google's code review practice, documented in its engineering practices guide, specifies both a fast response expectation (respond within one business day, and faster is better) and a change-size preference for small changes, with the explicit rationale that small changes are reviewed more thoroughly and merged faster.

Conventional Comments (conventionalcomments.org) is the published form of the prefix taxonomy, with labels including praise, nitpick, suggestion, issue and question, and its stated purpose is removing ambiguity about how strongly a comment is held.

Microsoft's and Google's published research on modern code review consistently finds that the dominant benefits reported by practitioners are knowledge transfer and design feedback rather than defect detection, which is the argument for reviewer rotation as a capability-spreading mechanism rather than only a quality one.

The DORA research programme's findings on batch size and lead time provide the systems-level version of the small-PR argument: smaller changes flow faster and fail less.

Automated formatting as a settled question is the position taken by Go (gofmt, with the explicit stance that the formatter's style is nobody's favourite and that is the point), Rust (rustfmt), and Python's black, all of which exist so that formatting stops being a review topic.

The debate

Is a review SLA realistic? Yes, if it is a response SLA rather than an approval SLA and if a scheduled slot exists. Without the calendar slot it is exhortation, and review loses every contest against focused work in the moment, which is exactly what the 9.4-hour p50 against 11 minutes of actual review time shows. The counter-argument, that scheduled review interrupts flow, is real and is why the slot goes immediately after an existing interruption like standup.

Should PR size be enforced? As a warning, yes; as a hard block, only after the workflow exists. A block without stacked-PR tooling produces artificial splits that do not compile, which is worse than a large PR. The observation that carries the argument is that past about 400 lines the comment rate collapses, so an unenforced norm plus visible data usually changes behaviour without a gate.

Is the comment taxonomy worth the ceremony? It is five prefixes, learned in a standup. The return is disproportionate because it removes the specific ambiguity that causes senior-to-senior friction, and because praise: is the only mechanism that makes review comments something other than uniformly negative. The failure is enforcing it with a bot, which makes it feel like process rather than a shared vocabulary.

Should two reviewers be required? Only where the cost is earned: security-sensitive paths, migrations, money. Everywhere else it doubles latency and produces diffusion of responsibility, where each reviewer assumes the other looked carefully, which measurably reduces the depth of both reviews.

Is code review the right place to catch defects? Partly, and the published research suggests the larger benefits are knowledge transfer and design feedback. That reframing matters for the lead, because it means reviewer rotation is a capability investment rather than an overhead, and it justifies assigning reviews to people who need the context rather than to whoever is fastest.

Should a lead review everything? No, and the instinct to is the same one that keeps a lead writing code. A lead who reviews everything is a bottleneck and a bus factor, and the two engineers doing 61 percent of reviews in the worked example were both the constraint and the ones most frustrated by it.

Follow-up Q&A

"Why is review latency the largest hidden cost in cycle time?"

Because it is time spent on work that is already finished, and nobody measures the waiting. In one measurement an item with a 14-day cycle time spent 5.3 days waiting for review and re-review, 38 percent of its life. The cost also compounds: a PR waiting two days is one the author has context-switched away from, so responding to comments requires re-orientation and the branch has drifted from main. The waiting was not reviewer effort at all: median actual review time was 11 minutes against a 9.4-hour median wait.

"How do you actually make a review SLA hold?"

Put a 20-to-30-minute review slot on everyone's calendar at a fixed time, immediately after an existing interruption like standup, and count review as work in public. Review competes with focused work and loses every contest in the moment, so the calendar makes it lose once, in advance. Then assign reviewers explicitly rather than relying on "anyone can review," which means nobody does. Commit to a response rather than an approval, so "this needs an hour of focus, I'll do it at 3pm" satisfies the SLA and still unblocks the author's planning. In one case that single calendar change took time to first response from 9.4 hours to 2.1.

"Why 400 lines?"

Because defect-detection effectiveness falls sharply past a few hundred lines, and the observable symptom is that comment density collapses. Measured by size bucket in one team, the share of PRs merged with zero or one substantive comment was 12 percent under 200 lines, 47 percent between 400 and 800, and 81 percent above 800. Past that size the reviewer cannot hold the change in their head, so they check the parts they understand and approve the rest. The team was not under-reviewing out of laziness; the artifact was unreviewable.

"What does the comment taxonomy buy?"

Three things. It makes the reviewer's authority explicit, so the author knows what they must change versus what they may. It forces the reviewer to decide how strongly they feel, which reduces blocking comments because typing blocking: on a stylistic preference feels wrong, correctly. And it makes praise: a thing that happens, which matters because without a prefix inviting it, review comments are 100 percent criticism by construction. The highest-value prefix is question:, because the ambiguity between "I'm curious" and "you should change this" is exactly where two senior engineers reliably annoy each other.

"What is the right review order and why?"

Correctness, then design and boundaries, then tests, then readability, then nits. Two reasons. Reviewer attention is finite and front-loaded, so a reviewer who starts with naming has spent it before reaching the concurrency bug. And the order matters for what a comment costs the author: a design comment on the first pass is a redesign, while the same comment after three rounds of nit-fixing is a demoralising rewrite. Get the expensive comments out first.

"Why rotate reviewers?"

It spreads context, so the bus factor on each area rises; it removes the single-owner bottleneck, which is usually also the person most frustrated by review load; and it is one of the cheapest ways to learn a system. The published research on modern code review finds that knowledge transfer and design feedback are the benefits practitioners report most, more than defect detection, which reframes rotation as a capability investment rather than an overhead. In one case round-robin assignment took the top two reviewers from 61 percent of all reviews to 34, and two engineers who had never touched the streaming code reviewed it enough over a quarter to become secondary on-call responders for it.

Common misconceptions

"Reviews are slow because people are not prioritising them." In one measurement the median review took 11 minutes and waited 9.4 hours. It is a scheduling problem, not a willingness problem.

"A thorough review takes a long time." Latency and thoroughness are independent. A two-day wait followed by a rubber stamp on a 900-line diff is the worst of both.

"Big PRs get more scrutiny because they matter more." Comment density collapses with size: above 800 lines, four in five merge with essentially no substantive comment.

"Requiring two reviewers is safer." It doubles latency and produces diffusion of responsibility. Reserve it for security, migrations and money.

"A comment is a comment." Without a prefix, a curious question reads as a mandate, which is the most common source of review friction between experienced engineers.

"The lead should review everything." That makes the lead a bottleneck and a bus factor, and it is the same instinct as a lead who keeps writing the code.

Interview delivery note

Say this verbatim: "Review latency is usually the largest hidden cost in cycle time, and it is a scheduling problem rather than a willingness problem. We measured the median review at eleven minutes of actual work and a nine-and-a-half-hour wait, so we put a 25-minute review slot on everyone's calendar after standup and time-to-first-response went to two hours." A measurement that reframes the problem and a fix that is one calendar change.

The senior-versus-staff separator is using the comment-density-by-size data to reject the obvious diagnosis. A senior lead asks people to review faster. A staff lead measures the share of PRs merged with no substantive comment by size bucket, finds it at 81 percent above 800 lines, and concludes that the team was not under-reviewing out of laziness but because the artifact was unreviewable, so the fix is PR size and the stacked-PR workflow rather than exhortation.

The second signal is not constraining an artifact before providing the workflow. Saying "we tried a hard 400-line block first, got three PRs split at arbitrary boundaries that did not individually compile and one broken main, and replaced it with a warning plus stacked-PR tooling" shows you learn from your own failed intervention and that you understand a constraint without an enabling workflow just relocates the problem.

Further reading

  • SmartBear's published analysis of the Cisco code review study, for the defect-detection curve against review size and the 200-to-400-line guidance.
  • Google's engineering practices guide on code review, for response-time expectations, small changes, and the reviewer's standard.
  • Conventional Comments (conventionalcomments.org), for the published prefix taxonomy.
  • Bacchelli and Bird, "Expectations, Outcomes, and Challenges of Modern Code Review" (ICSE 2013), for the finding that knowledge transfer and design feedback dominate the reported benefits.
  • The capacity math and forecasting page, for flow efficiency, which is where review latency shows up as a system-level number.