The Re-Review Tax

AI code review went from novelty to default in about two years: 47% of developers used one in the past year per Stack Overflow's survey. The 2023 figure was 11%, and GitHub's Octoverse counted 1.3 million repos running an AI reviewer, a 4x jump in a year. That adoption curve created a line item almost nobody priced: most review bots resend the full diff and repo context on every push, not just the first one, so a four-commit PR bills up to four full reviews for one PR's worth of changes. Leading tools are already fixing it with incremental, commit-aware re-review, and the same severity-tiered routing that governs a cost-aware LLM gateway maps cleanly onto which finding needs which model. This post builds the cost model, at 1,600 PRs a month the naive version runs $2,688; incremental re-review alone cuts it 67%; adding severity routing and cached repo context gets to an 86% reduction.

Published 2026-08-28 by Dor Amir on the Nadir blog.

Filed under Agents.

Abstract.

AI code review went from novelty to default in about two years: Stack Overflow's Developer Survey found 47% of professional developers had used AI-assisted code review in the past year, up from 22% in 2024 and 11% in 2023, and GitHub's Octoverse 2025 counted 1.3 million repositories running at least one AI code review integration, a 4x jump from roughly 300,000 in late 2024. That adoption curve created a new, mostly invisible line item: an LLM call on every pull request, and on most tools, on every push to that pull request. A four-commit PR does not get reviewed once. It gets reviewed up to four times, and by default, most of those passes resend the same diff and the same repo context they just billed for on the previous push. This post covers what that redundant pass actually costs at scale, why the leading tools are quietly moving to incremental re-review to fix it, and how the same severity-tiered routing that already governs a cost-aware LLM gateway maps cleanly onto "which finding needs which model" inside a review bot.

All dollar figures beyond the cited adoption and pricing data are illustrative, built from a stated cost model, not measured production traces from any specific vendor.

The pattern nobody priced.

A pull request review is not one LLM call. It is one call per meaningful push, because a reviewer, human or automated, has to see the latest code before it can comment on it. The naive way to build that is stateless: on every push, resend the diff, resend the touched files, resend enough of the repo (imports, related tests, style config) for the model to have real context, and generate a fresh set of comments.

That design has a specific, avoidable waste built into it. A PR that gets pushed to four times over its review cycle, once initially and three more times addressing feedback, does not need four independent full reviews. It needs one full review and three checks: did the new commit fix what was flagged, and did it introduce anything new in the diff since the last pass. Re-running the full pipeline on every push bills for repo context that has not changed at all, on top of the small slice of diff that has.

The leading tools have started fixing exactly this. Rewind's Diff Vader runs in verifier mode by default on a re-push: instead of re-scanning the whole diff, it checks whether prior findings are now resolved, which the team describes as roughly ten times cheaper than a full re-review, and which avoids review loops where every push surfaces a fresh, unrelated set of comments. Cloudflare's internal review pipeline does the same thing structurally: an incremental re-review that is aware of its own previous findings, rather than a stateless restart. The pattern is the same one this blog has covered on the token-generation side, where retrying blind on the cheap tier bills full price for zero new information: a re-review that does not know what changed pays full price to relearn what it already knew.

Methodology.

This is an illustrative cost model, not a benchmark run against any specific vendor's production traffic. The point is the shape of the tradeoff, not the exact dollar figure your team would see.

ParameterValueMeaning
Full review pass (diff + repo context)$0.42One stateless pass: full diff, touched files, related tests, style config
Incremental re-review pass$0.042Only new commits since the last review, checked against prior findings (≈10x cheaper, per Diff Vader's published ratio)
Review passes per PR41 initial + 3 follow-up pushes addressing feedback (representative, not a measured average)
Org size200 developersRepresentative mid-size engineering org
PRs per developer per month8Representative volume assumption
PRs per month1,600200 × 8

Three configurations follow from these inputs: a naive bot that re-runs a full pass on every push, an incremental-aware bot that only re-scans what changed, and an incremental bot that also routes each candidate finding to a model tier sized for its severity, on top of a cached repo/file context.

What the re-review tax costs at 1,600 PRs a month.

Chart 1: AI code review adoption. Left panel: developers who used AI-assisted code review, 11% in 2023, 22% in 2024, 47% in 2025, per the Stack Overflow Developer Survey. Right panel: repos with an AI code review integration, roughly 300,000 in late 2024 to 1.3 million in 2025, a 4x increase, per GitHub Octoverse 2025.
Chart 1: AI code review adoption. Left panel: developers who used AI-assisted code review, 11% in 2023, 22% in 2024, 47% in 2025, per the Stack Overflow Developer Survey. Right panel: repos with an AI code review integration, roughly 300,000 in late 2024 to 1.3 million in 2025, a 4x increase, per GitHub Octoverse 2025.

Adoption did not plateau after the first wave of tools; it compounded. Every one of those 1.3 million repos is now generating LLM calls on a schedule set by push frequency, not by a human reviewer's calendar, which is exactly why the per-push cost of review deserves the same scrutiny that per-request routing already gets everywhere else in a stack.

Chart 2: The re-review tax at 1,600 PRs a month. 200 developers, 8 PRs/dev/month, 4 review passes per PR. Naive full re-review on every push costs $2,688/month. Incremental re-review, only new commits get re-scanned, costs $880/month, a 67% reduction. Adding severity-routed model selection and cached repo context brings it to $384/month, an 86% reduction. Illustrative model, not measured production data.
Chart 2: The re-review tax at 1,600 PRs a month. 200 developers, 8 PRs/dev/month, 4 review passes per PR. Naive full re-review on every push costs $2,688/month. Incremental re-review, only new commits get re-scanned, costs $880/month, a 67% reduction. Adding severity-routed model selection and cached repo context brings it to $384/month, an 86% reduction. Illustrative model, not measured production data.
ConfigurationCost / month (1,600 PRs)vs. naive
Naive: full re-review on every push$2,688baseline
Incremental re-review (only new commits re-scanned)$880−67.3%
+ severity-routed model tier, cached repo context$384−85.7%

Two-thirds of the naive bill disappears just from not re-sending unchanged context on every push, the same mechanical fix Diff Vader and Cloudflare's pipeline both landed on independently. The remaining gap between $880 and $384 is not about scanning less, it is about matching the model to the finding: most of what a review bot flags does not need a frontier model to catch it, and the passes that do need one are a small, identifiable share of the traffic.

Not every comment needs the same model.

A code review bot's output is a mix of severities, and treating all of them as one undifferentiated LLM call is the same mistake as sending every request to the same model regardless of difficulty.

Finding typeShare of flagged issues (illustrative)Model tierWhy
Style, formatting, naming, lint-adjacent~70%Small/cheap modelPattern-matchable against a style guide, low ambiguity, cheap to verify
Logic and correctness bugs~25%Mid-tier modelNeeds function- or file-level reasoning, moderate context
Security or architecture-impacting~5%Premium model, verifier-checkedCost of a miss is high enough to justify a second, more expensive pass

The 70/25/5 split is representative, not a measured average across tools, but the shape holds across most review workloads: the bulk of what gets flagged is mechanical, and the findings that actually justify a frontier model's price are a minority. A bot that runs every finding through the same expensive model is paying premium prices for the 70% that a small model would have caught identically.

Implementation framework.

Step 1: Make re-review commit-aware, not PR-aware. Diff the new commits against the last reviewed SHA, not the PR's base branch. If nothing changed outside what was already reviewed, don't re-run the pipeline at all, just re-check whether prior findings still apply.

Step 2: Separate "check if this is resolved" from "review from scratch." A resolution check only needs the specific hunk a prior finding pointed at plus the new commit, not the full file and repo context a first pass needs.

Step 3: Route findings by severity, not by PR. A single review pass can and should call more than one model tier: a cheap model drafts candidate issues, and only the subset flagged as logic-level or security-relevant escalates to a stronger model for confirmation.

Step 4: Cache what does not change between pushes. Style guides, lint config, and the parts of the repo map that are stable across a PR's lifetime are exactly the kind of static prefix prompt caching is built for; resending them fresh on every push is paying the cache-miss price for content that never moved.

def review_push(pr, prior_review, cheap_model, mid_model, premium_model, verifier):
    """Only re-scan what changed since the last reviewed commit; route each
    candidate finding by severity instead of running the whole diff through
    one model."""
    new_hunks = pr.diff_since(prior_review.commit_sha)
    if not new_hunks:
        return prior_review.reconfirm_open_findings()  # verifier mode, no full rescan

    findings = []
    for hunk in new_hunks:
        draft = cheap_model.flag_issues(hunk)
        for issue in draft.issues:
            if issue.severity == "style":
                findings.append(issue)
            elif issue.severity == "logic":
                findings.append(mid_model.confirm(hunk, issue))
            else:  # security or architecture
                confirmed = premium_model.confirm(hunk, issue)
                findings.append(verifier.check(confirmed))

    return prior_review.merge(findings, resolved=prior_review.check_resolved(new_hunks))

Step 5: Instrument cost per PR, not just per review call. A dashboard that shows cost per individual API call hides the multiplier from repeated pushes. Cost per PR, including every re-review it triggered, is the number that tracks what a heavily-iterated PR actually costs versus one that merged clean on the first pass.

What this doesn't solve.

Incremental, hunk-scoped review can miss issues that only become visible with full-file or cross-file context, a variable renamed in one hunk that breaks an assumption three files away won't show up in a diff-only pass. Tools that ship incremental re-review generally still run a full pass at PR open and often before merge, for exactly this reason; incremental mode is for the iteration in between, not a full replacement for a whole-file read. The severity split used here is also a simplification: a real classifier needs calibration against your own codebase's false-positive rate, and a cheap model that under-flags security-relevant patterns is a worse outcome than one that costs slightly more.

Conclusion.

The interesting thing about the re-review tax is that it is not a new failure mode. It is the same one this blog has tracked in agent loops and retry logic, applied to a category that grew fast enough that almost nobody priced it before shipping it: a stateless pass that re-sends everything it already saw, on a schedule it doesn't control, billed at whatever the single model behind it costs regardless of what it's actually looking at.

If you're running an in-house review bot on top of an LLM API, which plenty of teams do to keep diffs and findings inside their own infrastructure, the fix doesn't require building a new routing layer from scratch. Point its OpenAI-compatible calls at Nadir with model=auto, and the cheap-model-first, verifier-escalated pattern in the code above runs on every request without a separate classifier to maintain, while cached, unchanged context (style guides, repo maps, system prompts) stops getting billed twice. The 1.3 million repos already running an AI reviewer are proof the category isn't going away. Whether the bill scales with how much actually changed, or with how many times someone pushed, is still a design choice.


Data and charts beyond the cited adoption figures are illustrative, built from a stated cost model, not measured production traces. Sources: [Stack Overflow, "2025 Developer Survey"](https://survey.stackoverflow.co/2025/). [GitHub, "Octoverse 2025"](https://github.blog/news-insights/octoverse/). [Rewind, "Review is the bottleneck now: How we let AI approve pull requests (safely)"](https://rewind.com/blog/ai-approve-pull-requests-safely/). [Cloudflare Blog, "Orchestrating AI Code Review at scale"](https://blog.cloudflare.com/ai-code-review/). [Sourcegraph, "AI Code Review in 2026: How It Works and How to Adopt It"](https://sourcegraph.com/blog/ai-code-review).

More on agents

What Nadir is

Nadir is an LLM router. Nadir sizes every prompt and routes it to the cheapest model that still clears your quality bar. A small decision model reads each prompt against your model menu and picks the lowest-cost model it expects to handle it. When the decision model is uncertain or unavailable, the request goes to the strongest model on the menu. The routing step makes no call to your model provider.

Nadir runs two ways. The decision API returns a model, reasoning-effort, cache, context, and policy recommendation without calling a model provider, beside the gateway you already run. That is how a shadow-mode evaluation works, and its projected savings stay advisory. The OpenAI compatible managed proxy executes the route, and migration is a two-line change: point the base URL at api.getnadir.com and set model to auto. On that path an optional verifier can score a complete non-streaming answer and escalate to a stronger model when it misses the configured bar. Streaming bypasses post-generation verification. BYOK is supported on every tier.

For coding agents, Nadir Auto is a terminal launcher for Claude Code or Codex that asks Nadir for the main-session model before each turn, with your configured model as the fallback and cost ceiling. Delegation integrations for Claude Code, Codex, or Cursor instead recommend a model tier for subagent work, and the agent decides. Either way inference runs on your own provider account, so Nadir holds no provider keys on that path.

What the numbers are, and what they are not

Nadir publishes each evaluation with its scope. On checkable code, run-check-escalate solved 392 of 395 common HumanEval and MBPP problems (99.2%), graded by running the canonical tests; that applies only to tasks with runnable deterministic tests. Nadir-Tumbler posts an arena_score of 72.3 on RouterArena's public scorer, 5th of 23 routers, which measures the routing decision on RouterArena's own model pool. A reference-assisted RouterBench evaluation over 11,420 held-out triples produced a 60% lower projected cost than always-Opus with about 98% retained quality and a 1.7% catastrophic-route rate. That experiment gave the verifier the expensive-model reference answer, which production does not have, so it is a research ceiling and not the deployed path.

None of these is a production guarantee, a universal savings rate, or a forecast for any particular workload. Customer savings are reported from measured execution against a declared baseline, and customer quality only from outcome-labelled traffic. Projected savings and realized savings are separate artifacts and are never blended.

Design-partner program

Three rungs, picked by risk appetite. Rung 0 Shadow runs advisory decision calls alongside live traffic and returns a projected receipt, with nothing in the request path changed. Rung 1 Hosted is the two-line swap on a production slice and returns a realized receipt. Rung 2 On-prem is a supervised six-week proof of concept inside the partner's VPC, where no prompt, response, or usage reaches Nadir. The commitments are the same at every rung. Apply for a rung directly: Rung 0 Shadow, Rung 1 Hosted, or Rung 2 On-prem. Not sure which fits? Start at getnadir.com/contact/?reason=design-partner.

Licensing

NadirClaw is the self-hosted core, source-available under the PolyForm Noncommercial License. Source-available is the correct label; NadirClaw is not open source. Nadir Route's hosted plan has no base fee and charges a variable fee only on measured savings from requests Nadir executed.

Pages on this site

Machine-readable summaries of this site: llms.txt and llms-full.txt.