<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>Pyor Blog</title>
    <link>https://pyor.review/blog</link>
    <atom:link href="https://pyor.review/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Notes from the pyor: on the review bottleneck, reviewing large and AI-generated PRs, and making code review fast again.</description>
    <language>en</language>
    <item>
      <title>Agentic Code Review: When Agents Write the Code</title>
      <link>https://pyor.review/blog/agentic-code-review</link>
      <guid isPermaLink="true">https://pyor.review/blog/agentic-code-review</guid>
      <pubDate>Sat, 18 Jul 2026 08:00:00 GMT</pubDate>
      <description>Agentic code review means reviewing code whose author is a model: absent intent, tiered rigor by blast radius, and a human who still owns the merge.</description>
      <enclosure url="https://pyor.review/blog/agentic-code-review/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/agentic-code-review/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The most useful essay written about code review this year is Addy Osmani’s <a href="https://addyosmani.com/blog/agentic-code-review/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">“Agentic Code Review”</a>, and its core observation deserves to be repeated plainly: code generation became cheap while understanding stayed expensive, so review quietly became the most leveraged skill in software engineering. We have made the same argument <a href="https://pyor.review/blog/ai-writes-code-faster-than-you-can-review" class="rule-link text-fg underline-offset-4 hover:text-add">from the velocity side</a>; this piece is about what reviewing actually looks like when the author of the code is a model.</p><blockquote><p><strong>The short answer:</strong> <strong>Agentic code review</strong> is reviewing code whose author cannot explain itself. Classic review validates a colleague’s reasoning; agentic review reconstructs reasoning that was never written down. The adaptations that follow from that one difference: capture intent at generation time, tier review rigor by blast radius instead of reviewing everything identically, treat tests with suspicion when the same model wrote them, and keep one rule absolute: <strong>a human owns the merge</strong>.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The data says the process already broke</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Osmani’s essay compiles the numbers, and they are stark. He cites a Faros analysis of 22,000 developers reporting code churn up 861%, defect rates jumping from 9% to 54%, and zero-review merges rising 31.3%. GitClear’s data, in his reading, shows roughly 4x the raw output for around a tenth of that in delivered value. Whatever error bars you put on any single figure, the direction is consistent with what <a href="https://pyor.review/blog/ai-prs-open-source-maintainers" class="rule-link text-fg underline-offset-4 hover:text-add">maintainers</a> and <a href="https://pyor.review/blog/do-code-reviews-find-bugs" class="rule-link text-fg underline-offset-4 hover:text-add">the research record</a> already showed: teams did not decide to stop reviewing. Volume overwhelmed a process designed for human-paced authorship, and the process failed silently.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The author is absent, so intent must be captured</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">When a colleague writes a confusing change you ask them why. When an agent writes it, the “why” lived in a prompt session that is gone. Developers are hitting this wall in the wild: a <a href="https://www.reddit.com/r/devops/comments/1ulm2o6/anyone_lose_the_reasoning_behind_an_aigenerated/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">recent r/devops thread</a> asks, verbatim, whether anyone else has lost the reasoning behind an AI-generated Terraform change after the session ended. The fix is procedural, not clever: the person who ran the agent writes the intent down while it still exists. What was asked for, what the agent chose, what was rejected, what is untested. That is <a href="https://pyor.review/blog/author-self-review" class="rule-link text-fg underline-offset-4 hover:text-add">author self-review</a> upgraded from good manners to load-bearing infrastructure, because it is the only place the missing context can come from.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Tier the rigor, or fatigue will tier it for you</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Osmani’s most practical frame is that review intensity should follow three variables: blast radius (what breaks if this is wrong), longevity (throwaway script or load-bearing system), and ownership (solo project or shared codebase). A config tweak in a prototype and a change to a payment path do not deserve the same reviewer attention, and pretending they do is how teams end up giving everything the same shallow glance. The honest version is explicit tiers: automated gates plus sampling at the bottom, full human verification with <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">the AI-code checklist</a> at the top. Review attention is the scarce resource; spend it where mistakes are expensive.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Watch the tests watching the code</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The failure mode Osmani flags that deserves its own alarm: agents modifying tests until they pass. When the same model writes the implementation and the assertions, green CI stops meaning what you think it means. Reviewers of agent PRs should read test diffs first and treat any test relaxation (deleted assertions, widened tolerances, skipped cases) as the highest-signal lines in the change. We will go deeper on this in a dedicated piece; for now, the rule of thumb is that in an agent PR, <em>the tests are part of the claim, not part of the evidence</em>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">A human owns the merge</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every adaptation above rolls up to one boundary that should survive any amount of automation: accountability does not transfer to a model. Review bots can pre-filter (we have <a href="https://pyor.review/blog/what-ai-should-do-in-code-review" class="rule-link text-fg underline-offset-4 hover:text-add">argued for exactly that division</a>), sampling can replace exhaustive reading on low-risk tiers, but the merge button is a human act by a person prepared to answer for the change in production. As Osmani put it in the LinkedIn discussion around his essay: reading code has always been the skill, and it is about to be <em>the</em> skill. The teams that hold that line while their tooling accelerates are the ones whose review process survives contact with the agent era.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The uncomfortable part for tooling (ours included, disclosure: we build <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a>) is that none of this is solved by adding more generated text to the PR. It is solved by making the irreducible human read fast enough to keep up: triage, provenance, risk-first ordering. That is the bar any review tool should be judged against now.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What is agentic code review?</h3><p>Agentic code review is the practice of reviewing code written wholly or largely by AI agents. It differs from classic review because the author cannot explain its intent: the reviewer reconstructs missing reasoning rather than validating a colleague’s. In practice it means tiered rigor by risk, explicit provenance, and a human who owns the merge.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Should every agent-written change get a full human review?</h3><p>No, and pretending otherwise is how teams end up rubber-stamping everything. The workable pattern is tiered: throwaway and low-blast-radius changes get sampling or automated gates, while long-lived code and risky paths (auth, payments, data) get full human verification. What matters is choosing the tier deliberately instead of by fatigue.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Does agentic review replace the reviewer?</h3><p>It changes what the reviewer does. Less line-by-line defect hunting (automation absorbs much of that), more judgment: does this match intent, does it fit the system, is the blast radius acceptable. Accountability does not transfer: a human owns the merge, because someone must answer for the change in production.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Greptile Alternatives in 2026: An Honest Comparison</title>
      <link>https://pyor.review/blog/greptile-alternatives</link>
      <guid isPermaLink="true">https://pyor.review/blog/greptile-alternatives</guid>
      <pubDate>Sat, 18 Jul 2026 08:00:00 GMT</pubDate>
      <description>Greptile alternatives compared honestly: CodeRabbit and GitHub Copilot code review, plus Pyor, a review surface that triages the diff instead of commenting.</description>
      <enclosure url="https://pyor.review/blog/greptile-alternatives/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/greptile-alternatives/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">If you are comparing <strong>Greptile alternatives</strong>, be clear about what you are replacing. Greptile’s whole-codebase graph context is a real differentiator, not marketing gloss, so the right alternative depends on whether you want that same depth cheaper, a lighter bot, or something that is not a bot at all. Disclosure first: <strong>we build Pyor</strong>, one of the options below, so read our take with that in mind. We will start with what Greptile genuinely does better than the pack.</p><blockquote><p><strong>The map:</strong> Greptile’s edge is whole-codebase context: a graph index plus a swarm of agents that reason across files. Its alternatives are other bots (<strong>CodeRabbit</strong>, the most built-out; <strong>GitHub Copilot code review</strong>, cheapest if you already pay for Copilot) and a non-bot approach (<strong>Pyor</strong>, a review surface whose AI triages the diff instead of commenting). Its $30-per-seat credit pricing is a real factor.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What Greptile is genuinely good at</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://greptile.com/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Greptile</a> calls itself the AI code reviewer, and its distinguishing move is context. Instead of reading only the diff, it builds a graph index of your codebase and runs a swarm of agents in parallel, so a review can reason across files. That is why it is good at multi-file logical bugs, the kind a single-file bot walks right past, alongside style, security, syntax, and logic checks on GitHub and GitLab across many languages. Pricing is transparent and part of the decision: 30 dollars per seat a month including 50 credits (one credit is one review), then 1 dollar per extra review, free for qualified open source with discounts for pre-Series-A startups. If cross-file reasoning is what you need, that context is a real reason to keep it.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The reasons to look around are the category-wide ones and the pricing one. A bot is a first pass, not a reviewer (it does not know your intent and shares blind spots with the code’s author, human or model), and the credit model means cost scales with review volume. We cover the trust question in <a href="https://pyor.review/blog/do-code-reviews-find-bugs" class="rule-link text-fg underline-offset-4 hover:text-add">do code reviews find bugs</a> and the noise cost in <a href="https://pyor.review/blog/ai-review-alert-fatigue" class="rule-link text-fg underline-offset-4 hover:text-add">review alert fatigue</a>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">CodeRabbit: the most built-out bot</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://www.coderabbit.ai/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit</a> is the closest like-for-like alternative if you want a bot but not Greptile’s pricing model. It posts AI review comments across GitHub, GitLab, Azure, and Bitbucket, reviews in the IDE (VS Code, Cursor, Windsurf) and from a CLI as well as on the PR, and adds bug detection, architectural-impact notes, one-click “Fix with AI”, summaries with walkthroughs and diagrams, 40-plus linters and security scanners, and a feedback loop it calls learnings. It is SOC 2 Type II with zero data retention after review, free to try with no credit card, and free for qualified open source. It does not advertise Greptile’s whole-codebase graph, but for breadth of platform and features it is the mainstream pick.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">GitHub Copilot code review: cheapest if you already pay</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">GitHub Copilot code review</a> is the value alternative for GitHub-native teams. The AI first pass is included in Copilot Pro (10 dollars a month), Pro+ (39 dollars a month), Business (19 dollars per user a month), and Enterprise (39 dollars per user a month), so if you already pay for Copilot, there is no new bill. Two caveats before you count on it: it is not in the free tier, it is disabled by default so an admin must enable it and turn on GitHub AI Credits billing, and review usage by non-licensed users bills to the org as AI Credits. It will not match Greptile’s cross-file depth, but if breadth of context is not your need, it is the lightest and cheapest bot to switch on.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Pyor: the different approach</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every alternative so far posts comments on the PR. <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> does not, on purpose. It is a review surface for existing GitHub pull requests, web first with a macOS and Windows desktop app, where you read, comment, approve, and merge in one window, with a file rail built for triage, folder-level viewed tracking, focus mode, and threads that survive a force-push. Where it uses AI, the AI organizes the diff rather than narrating it: it groups files by complexity, labels each group in one line, and points you at what deserves attention first, with an optional walkthrough. It does not generate the comment volume a bot produces. If the honest issue with Greptile is that even a smart bot still hands you more text to read, that is the disagreement Pyor is built around, and we make the case in <a href="https://pyor.review/blog/what-ai-should-do-in-code-review" class="rule-link text-fg underline-offset-4 hover:text-add">what AI should do in code review</a>.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Honest caveats: Pyor is young, it is a review surface and not a workflow platform, and it does not offer Greptile’s whole-codebase graph analysis, because it is not trying to be a reviewer bot at all. It is the answer when reading is the bottleneck, not when you want an automated cross-file audit. Free for individuals; paid per-seat for org features.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The credit model deserves its own moment, because it is the sharpest difference from a flat-rate bot. At 50 reviews per seat each month, a heavy reviewer on a busy repo can exhaust the included credits and start paying a dollar per extra review, while a light reviewer leaves most of them unused. That is neither good nor bad on its own; it just means Greptile rewards you for modelling your real review volume before you buy, in a way a flat per-seat bot does not. If your volume is spiky or hard to predict, a predictable subscription like CodeRabbit or Copilot code review can be easier to budget, and that tradeoff, not raw capability, is often what actually decides the switch.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">At a glance</h2><p><table class="w-full border-collapse text-left text-[0.95rem] leading-[1.5]"><thead><tr class="border-b border-line bg-bg-2/60"><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Tool</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Approach</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Best for</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Pricing</th></tr></thead><tbody class="divide-y divide-line-faint"><tr><td class="px-4 py-3 align-top font-medium text-fg">Greptile</td><td class="px-4 py-3 align-top text-fg-2">AI reviewer with whole-codebase graph</td><td class="px-4 py-3 align-top text-fg-2">Multi-file logical bugs</td><td class="px-4 py-3 align-top text-fg-2">$30/seat/mo, 50 credits; $1 per extra</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">CodeRabbit</td><td class="px-4 py-3 align-top text-fg-2">AI comments across four platforms</td><td class="px-4 py-3 align-top text-fg-2">A built-out, configurable bot</td><td class="px-4 py-3 align-top text-fg-2">Free trial; free for open source</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Copilot code review</td><td class="px-4 py-3 align-top text-fg-2">AI first pass native in the PR</td><td class="px-4 py-3 align-top text-fg-2">Teams already paying for Copilot</td><td class="px-4 py-3 align-top text-fg-2">Included in Copilot (from $10/mo)</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Pyor (ours)</td><td class="px-4 py-3 align-top text-fg-2">Review surface, AI triages not comments</td><td class="px-4 py-3 align-top text-fg-2">Reading big diffs is the bottleneck</td><td class="px-4 py-3 align-top text-fg-2">Free for individuals; per-seat orgs</td></tr></tbody></table></p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">How to choose among Greptile alternatives</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Cross-file context earns its keep?</strong> Greptile’s graph is the reason to stay.</li><li><strong>Want a bot without the credit model?</strong> CodeRabbit is the built-out alternative.</li><li><strong>Already paying for Copilot?</strong> Copilot code review is the cheapest first pass.</li><li><strong>More text is the last thing you need?</strong> Pyor triages the diff instead of adding to it.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">They all sync to GitHub, so try one on a single real PR first. For the wider bot comparison see <a href="https://pyor.review/blog/coderabbit-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit alternatives</a>, and for the native option see <a href="https://pyor.review/blog/copilot-code-review-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">GitHub Copilot code review alternatives</a>.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What is the best Greptile alternative?</h3><p>It depends on what you value in Greptile. If it is the AI-reviewer-bot pattern, CodeRabbit is the most built-out alternative and Copilot code review is the cheapest if you already pay for Copilot. If whole-codebase context is not the point and reading big diffs is, Pyor takes a different approach and triages the diff instead of commenting.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is Greptile worth $30 per seat?</h3><p>If whole-codebase context earns its keep, often yes. Greptile prices at 30 dollars per seat a month including 50 review credits, then 1 dollar per extra review. That credit model is worth modelling against your PR volume. Teams that mostly need a lighter first pass may find CodeRabbit or Copilot code review cheaper for their usage.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What makes Greptile different from other bots?</h3><p>Its differentiator is context. Greptile builds a graph index of your codebase and runs a swarm of agents in parallel, so a review can reason across files rather than just the diff. That helps it catch multi-file logical bugs a single-file bot misses. The tradeoff is its credit-based pricing and one more vendor in the loop.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Stop Reviewing Code on GitHub</title>
      <link>https://pyor.review/blog/stop-reviewing-code-on-github</link>
      <guid isPermaLink="true">https://pyor.review/blog/stop-reviewing-code-on-github</guid>
      <pubDate>Thu, 16 Jul 2026 08:00:00 GMT</pubDate>
      <description>GitHub hosts your PRs; it was never built to review them. Why the default web diff is the wrong surface for review, and where to read code instead.</description>
      <enclosure url="https://pyor.review/blog/stop-reviewing-code-on-github/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/stop-reviewing-code-on-github/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Here is the uncomfortable part: most teams review code on github.com not because it is the best place to read a change, but because it is where the change happens to live. Those are different things. GitHub is an excellent place to <em>host</em> pull requests. It was never designed to be the place you <em>review</em> them, and in 2026 the seams are showing.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">You do not have to take our word for it. In April 2026 GitHub shipped Stacked PRs, and the announcement is a quiet confession: <a href="https://www.infoworld.com/article/4158575/github-adds-stacked-prs-to-speed-complex-code-reviews.html" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">“Large pull requests are hard to review, slow to merge, and prone to conflicts. Reviewers lose context, feedback quality drops, and the whole team slows down.”</a> That is the platform describing its own review surface.</p><blockquote><p><strong>The short answer:</strong> Reviewing on github.com is a default, not a decision. The web diff was built to host and browse code, so it does the reading parts badly: big files hide behind “Load diff,” you lose your place between visits, threads detach from the code, and there is no triage. You can fix this without leaving GitHub: keep the PRs there, move the <strong>act of reviewing</strong> to a surface built for it, and sync everything back.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">GitHub is a host that grew a review tab</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The pull request was a distribution mechanism first: a way to propose and merge a branch. Review was bolted on, and it shows in the priorities. The diff paginates and collapses to protect the page, not your understanding. There is no notion of which files matter, so a lockfile and the one file that changes behavior get equal billing. The whole thing is tuned for <em>browsing</em> a change, which is a fundamentally different task than <a href="https://pyor.review/blog/why-are-pull-requests-so-hard-to-review" class="rule-link text-fg underline-offset-4 hover:text-add">reconstructing and judging</a> one.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The concrete failure modes</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">This is not an aesthetic complaint. The web diff actively taxes review in specific, repeatable ways (several catalogued in <a href="https://medium.com/@baristaGeek/the-github-for-code-review-ui-needs-serious-innovation-ec7a4ef40c09" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">this critique of the GitHub review UI</a>):</p><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>“Load diff” is where files go to die.</strong> The exact files heavy enough to collapse are the ones most worth reading, and the click-to-expand friction means they get skimmed or skipped. The UI hides the risk by default.</li><li><strong>You lose your place.</strong> Come back to a PR after lunch and there is no reliable record of what you already read. On a 40-file diff, re-orientation eats the session.</li><li><strong>Threads drift from the code.</strong> A reviewer comments, you push a fix, and whether they consider it resolved stays ambiguous. Re-review, <a href="https://pyor.review/blog/re-reviewing-pull-requests-interdiff" class="rule-link text-fg underline-offset-4 hover:text-add">the interdiff problem</a>, is where the most time quietly disappears, and the web diff has the weakest tools for it.</li><li><strong>No triage.</strong> Every file is presented as equally important, so the reviewer does the sorting by hand, every time, by scrolling.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">None of these is fatal on a 30-line PR. All of them compound on the <a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">large, AI-authored diffs</a> that now arrive several times a day, which is exactly why GitHub itself reached for stacking.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">“But everyone is already on GitHub”</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">This is the real objection, and it rests on a conflation. Leaving the github.com <em>review experience</em> is not the same as leaving GitHub. Your code, your pull requests, your CI, your permissions, your merge: all of it stays exactly where it is. The only thing that moves is the surface where a human reads the diff and leaves comments, and every serious review tool syncs those comments, approvals, and merges straight back to the PR. Your teammates who never leave github.com see a perfectly normal review. You just did the reading somewhere that respects your attention.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Where to review instead</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">There is no single answer, and we wrote an <a href="https://pyor.review/blog/github-pr-review-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">honest comparison of the options</a>. The short version:</p><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Pull the branch.</strong> <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">git fetch &amp;&amp; git checkout</code> gives you full editor navigation and the ability to run the code. Unbeatable context, real friction; best for the one architectural change that needs it, covered in <a href="https://pyor.review/blog/review-prs-locally-vs-browser" class="rule-link text-fg underline-offset-4 hover:text-add">local vs. browser review</a>.</li><li><strong>An AI-guidance layer</strong> (for example Stage) narrates the diff into chapters. Useful when orientation is your bottleneck, at the cost of more generated text to read and trust.</li><li><strong>A dedicated review surface</strong> (this is what we build with <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a>, disclosure) keeps the diff but fixes the reading: triage the files that matter, mark whole folders viewed, scope the diff to a single commit so re-review costs only the delta, and run the whole read-comment-approve-merge loop in one window. AI organizes the diff (groups by complexity, one-line labels, hints) rather than narrating it. Free for individuals, synced to GitHub.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">How to actually stop</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">You do not need a migration or a team meeting. Pick your next genuinely large PR, the kind you would normally dread in the web diff, and review it somewhere else once. Pull it locally, or open it in a dedicated surface, leave your comments, and let them sync back. One real PR is enough to feel the difference between a tool that hosts your code and a tool that helps you understand it. If reviewing has quietly become <a href="https://pyor.review/blog/ai-writes-code-faster-than-you-can-review" class="rule-link text-fg underline-offset-4 hover:text-add">the slowest part of shipping</a>, the surface you do it on is the cheapest thing you can change.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Does this mean leaving GitHub entirely?</h3><p>No. Keep your code, PRs, CI, and permissions on GitHub. The argument is narrower: stop doing the act of reading and judging the diff inside github.com&#x27;s web UI. Every serious alternative syncs comments, approvals, and merges back to GitHub, so the PR still lives where it always did.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Isn&#x27;t the GitHub review UI fine for small PRs?</h3><p>Largely, yes. For a 30-line change the web diff is quick and the friction never shows up. The case for reviewing elsewhere grows with size and frequency: it is the 800-line, 40-file, AI-authored PRs arriving several times a day where the surface starts costing you real review quality.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What should I review code on instead?</h3><p>Three honest options: pull the branch and read it in your editor (best context, high friction), an AI-guidance layer like Stage (a narrated map over the diff), or a dedicated review surface like Pyor (triage, viewed-state, commit-scoped diffs, synced back to GitHub). Try one on a single real PR before committing the team.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>GitHub Copilot Code Review Alternatives (2026)</title>
      <link>https://pyor.review/blog/copilot-code-review-alternatives</link>
      <guid isPermaLink="true">https://pyor.review/blog/copilot-code-review-alternatives</guid>
      <pubDate>Thu, 16 Jul 2026 08:00:00 GMT</pubDate>
      <description>GitHub Copilot code review alternatives compared honestly: CodeRabbit and Greptile go deeper, and Pyor takes a non-bot approach that triages the diff for you.</description>
      <enclosure url="https://pyor.review/blog/copilot-code-review-alternatives/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/copilot-code-review-alternatives/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">If you are looking at <strong>GitHub Copilot code review alternatives</strong>, the honest first question is whether you should leave at all. Copilot review is the cheapest AI first pass available to teams that already pay for Copilot, and it lives right in the pull request. Disclosure before we compare: <strong>we build Pyor</strong>, one of the options here, so read accordingly. We will give Copilot its due, then map the tools that either go deeper than it or skip the bot pattern entirely.</p><blockquote><p><strong>The map:</strong> GitHub Copilot code review is the cheapest AI first pass if you already pay for Copilot. Its alternatives split two ways: dedicated bots that go deeper (<strong>CodeRabbit</strong> across four platforms, <strong>Greptile</strong> with whole-codebase context), and a non-bot approach (<strong>Pyor</strong>, a review surface whose AI triages the diff instead of posting comments you still have to read).</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What GitHub Copilot code review does well</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">GitHub Copilot code review</a> gives you an AI first pass natively inside the PR, no extra vendor, no new surface. Its advantage is almost entirely economic and logistical: if your team already pays for Copilot, review is included in Copilot Pro (10 dollars a month), Pro+ (39 dollars a month), Business (19 dollars per user a month), and Enterprise (39 dollars per user a month). For a GitHub-native team that already has seats, nothing is cheaper to switch on. Two frictions are worth stating plainly before you rely on it: it is not in the free tier, it is disabled by default so an admin must enable it and turn on GitHub AI Credits billing, and review usage by non-licensed users bills to the org as AI Credits. If those apply, the alternatives below can be simpler to reason about.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The other reason to shop around is depth. Like any bot, Copilot review is a first pass, not a reviewer, and its analysis is scoped tightly to the change in front of it. As we argue in <a href="https://pyor.review/blog/what-ai-should-do-in-code-review" class="rule-link text-fg underline-offset-4 hover:text-add">what AI should do in code review</a>, the value of an AI pass is in what it lets a human skip, not in the comment count.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">CodeRabbit: a deeper, multi-platform bot</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://www.coderabbit.ai/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit</a> is the most built-out bot in the category and the natural step up if Copilot review feels thin. It posts AI review comments across GitHub, GitLab, Azure, and Bitbucket, reviews in the IDE (VS Code, Cursor, Windsurf) and from a CLI as well as on the PR, and adds bug detection, architectural-impact notes, one-click “Fix with AI”, change summaries with walkthroughs and diagrams, 40-plus linters and security scanners, and a feedback loop it calls learnings. It is SOC 2 Type II with zero data retention after review, free to try with no credit card, and free for qualified open source. If you want more coverage and more configurability than the native option, CodeRabbit is the mainstream upgrade.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Greptile: whole-codebase context</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://greptile.com/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Greptile</a> attacks the exact limitation of a single-diff bot: it builds a graph index of your codebase and runs a swarm of agents in parallel so a review reasons across files, which is where multi-file logical bugs hide. It covers GitHub and GitLab and many languages, and its pricing is transparent: 30 dollars per seat a month including 50 credits (one credit is one review), then 1 dollar per extra review, free for qualified open source with startup discounts. If your frustration with Copilot review is that it misses issues spanning several files, Greptile is the alternative built around that problem. The tradeoff versus Copilot is cost and one more vendor, against materially more context. Independent takes on how far to trust any bot are in <a href="https://pyor.review/blog/ai-code-review-accuracy" class="rule-link text-fg underline-offset-4 hover:text-add">AI code review accuracy</a>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Pyor: the non-bot approach</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every option so far posts comments on your PR. <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> deliberately does not. It is a review surface for existing GitHub pull requests, web first with a macOS and Windows desktop app, where you read, comment, approve, and merge in one window. Where it uses AI, the AI organizes the diff instead of narrating it: it groups files by complexity, labels each group in one line, and drops short steering hints so you review the important code first, with an optional walkthrough that orders the whole change. It does not add a wall of generated comments you then have to triage, which is the opposite of what a bot does. The bet, spelled out in <a href="https://pyor.review/blog/ai-writes-code-faster-than-you-can-review" class="rule-link text-fg underline-offset-4 hover:text-add">this piece on the review bottleneck</a>, is that AI should reduce what you read, not add to it.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Honest caveats: Pyor is young, it is a review surface rather than a workflow platform, and it is not a same-category swap for a bot. If what you want is AI comments on the PR, keep Copilot review or move to CodeRabbit or Greptile. If the bot output itself is the problem, Pyor is the different answer. Free for individuals; paid per-seat for org features.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">A practical note on cost, since it is the main reason Copilot review wins or loses a comparison. The included-with-Copilot framing only holds for licensed seats; the moment non-licensed users trigger reviews, that usage bills to the org as GitHub AI Credits, and the admin-enable step means the feature can be quietly off when you assume it is on. For a small team where everyone holds a seat, none of that matters and Copilot review is the obvious default. For a larger org with occasional reviewers, model the credits before you commit, because a dedicated bot with a flat per-seat price can end up both cheaper and easier to reason about. Match the billing shape to how your team actually reviews, not to which logo is already in your settings.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">At a glance</h2><p><table class="w-full border-collapse text-left text-[0.95rem] leading-[1.5]"><thead><tr class="border-b border-line bg-bg-2/60"><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Tool</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Approach</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Best for</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Pricing</th></tr></thead><tbody class="divide-y divide-line-faint"><tr><td class="px-4 py-3 align-top font-medium text-fg">Copilot code review</td><td class="px-4 py-3 align-top text-fg-2">AI first pass native in the PR</td><td class="px-4 py-3 align-top text-fg-2">Teams already paying for Copilot</td><td class="px-4 py-3 align-top text-fg-2">Included in Copilot (from $10/mo)</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">CodeRabbit</td><td class="px-4 py-3 align-top text-fg-2">AI comments across four platforms</td><td class="px-4 py-3 align-top text-fg-2">Deeper, configurable first pass</td><td class="px-4 py-3 align-top text-fg-2">Free trial; free for open source</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Greptile</td><td class="px-4 py-3 align-top text-fg-2">AI reviewer with whole-codebase context</td><td class="px-4 py-3 align-top text-fg-2">Multi-file logical bugs</td><td class="px-4 py-3 align-top text-fg-2">$30/seat/mo, 50 credits; $1 per extra</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Pyor (ours)</td><td class="px-4 py-3 align-top text-fg-2">Review surface, AI triages not comments</td><td class="px-4 py-3 align-top text-fg-2">When bot output is the problem</td><td class="px-4 py-3 align-top text-fg-2">Free for individuals; per-seat orgs</td></tr></tbody></table></p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Choosing among GitHub Copilot code review alternatives</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Already paying for Copilot and it works?</strong> Stay; nothing is cheaper to enable.</li><li><strong>Want more depth and platforms?</strong> CodeRabbit is the mainstream step up.</li><li><strong>Missing multi-file bugs?</strong> Greptile’s whole-codebase context targets that.</li><li><strong>Tired of triaging bot comments?</strong> Pyor triages the diff instead of adding to it.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">They all sync to GitHub, so try one on a single real PR before committing the team. For the bot side in more detail see <a href="https://pyor.review/blog/coderabbit-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit alternatives</a>, and for the platform angle see <a href="https://pyor.review/blog/graphite-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">Graphite alternatives</a>.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What is the best GitHub Copilot code review alternative?</h3><p>It depends on the gap you feel. If Copilot review is too shallow, dedicated bots like CodeRabbit and Greptile go deeper, with Greptile adding whole-codebase context. If the problem is that a bot adds comments you still have to triage, Pyor takes a non-bot approach and triages the diff itself instead of posting review comments.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is GitHub Copilot code review good enough?</h3><p>For many teams, yes, especially if you already pay for Copilot, since the review is included from Pro upward. It is a solid mechanical first pass native to the PR. You look for alternatives when you want deeper multi-file analysis, broader platform coverage, or when the admin-enable and AI Credits billing add friction you would rather avoid.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Why is Copilot code review not free?</h3><p>It is included in paid Copilot plans (Pro, Pro+, Business, Enterprise) but not the free tier, and it is disabled by default. An admin must enable it and turn on GitHub AI Credits billing. Review usage by non-licensed users bills to the org as AI Credits, so cost can grow with how widely you use it.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>What AI Should (and Shouldn’t) Do in Code Review</title>
      <link>https://pyor.review/blog/what-ai-should-do-in-code-review</link>
      <guid isPermaLink="true">https://pyor.review/blog/what-ai-should-do-in-code-review</guid>
      <pubDate>Tue, 14 Jul 2026 08:00:00 GMT</pubDate>
      <description>Where AI in code review actually helps: upstream as a quiet pre-filter, humans downstream on a fast surface. Why Pyor ships no AI summaries, by design.</description>
      <enclosure url="https://pyor.review/blog/what-ai-should-do-in-code-review/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/what-ai-should-do-in-code-review/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">This series looked at what AI reviewers <a href="https://pyor.review/blog/ai-code-review-accuracy" class="rule-link text-fg underline-offset-4 hover:text-add">actually catch</a>, what their noise <a href="https://pyor.review/blog/ai-review-alert-fatigue" class="rule-link text-fg underline-offset-4 hover:text-add">does to reviewer attention</a>, and what the generation flood is doing to <a href="https://pyor.review/blog/ai-prs-open-source-maintainers" class="rule-link text-fg underline-offset-4 hover:text-add">the people who review for free</a>. Time to put our own position on the record, including the part where we tell you what our product deliberately doesn’t do.</p><blockquote><p><strong>The short answer:</strong> The division of labor the evidence supports: <strong>AI belongs upstream</strong> of human review: helping the author ship a cleaner PR, and running as a quiet, high-precision pre-filter. <strong>Humans own the downstream</strong> (judgment, intent, accountability), and what they need there isn’t more generated text to read; it’s a surface that makes reading the actual code fast. Put AI where mistakes are cheap (before the PR), keep humans where mistakes are expensive (the approval).</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Upstream: where AI earns its keep</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>At authoring time:</strong> the agent that wrote the code drafting its own tests, the author using a model to interrogate their diff before anyone else sees it. This is <a href="https://pyor.review/blog/author-self-review" class="rule-link text-fg underline-offset-4 hover:text-add">self-review</a> with a power tool, and every defect caught here costs nobody’s attention but the author’s.</li><li><strong>As a pre-filter in CI:</strong> after the deterministic layer (linters, types) has taken everything decidable, a tuned-quiet AI pass on the risky paths. The Cotera numbers cut both ways: most suggestions duplicated a linter, but nine real catches in thirty PRs, <em>before any human looked</em>, is real money, provided the seven wrong ones didn’t cost the bot its credibility.</li><li><strong>As the author’s explainer, not the reviewer’s:</strong> generating the “why” and the review map for the description, where the author can verify it before publishing. Generated context the <em>author</em> vouches for is context; generated context pushed straight at the reviewer is homework.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Downstream: what we refuse to automate</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The approval is a human act (“I understand this well enough to co-own it”), and <a href="https://pyor.review/blog/do-code-reviews-find-bugs" class="rule-link text-fg underline-offset-4 hover:text-add">the research has been clear for a decade</a> that review’s deepest value is shared understanding, not defect yield. That value is produced by the reading itself. An AI summary that <em>replaces</em> the reading doesn’t speed the review up; it hollows it out. And when the summary is wrong (the category’s signature failure), it hollows it out <em>convincingly</em>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why Pyor ships no AI summaries</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">So when people ask where the AI features are in <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a>, this is the answer: the product is the downstream half of the division. File triage that puts the three files that matter first; <a href="https://pyor.review/blog/re-reviewing-pull-requests-interdiff" class="rule-link text-fg underline-offset-4 hover:text-add">commit-scoped diffs</a> so re-review costs only the delta; threads that survive force-pushes; focus mode; one window from read to merge. No generated prose between you and the diff, because our read of the evidence is that the prose is a tax, and because everything upstream can be done by tools that already exist, including the model you already pay for. We’d rather be the best place the human part happens than the fifth bot leaving comments.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The test for any AI review feature</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">One question sorts the catalog: <strong>does this need to be verified by the person it’s shown to?</strong> If yes, it spends reviewer attention and must out-earn its verification cost, a bar most generated commentary misses today. If no (because the author verified it upstream, or because it’s deterministic), it’s a free win. That test is vendor-neutral, model-agnostic, and it will still be the right question when the models are better than they are this year.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Will AI eventually do the whole review?</h3><p>It will keep absorbing the mechanical share. But an approval is a human taking ownership of a change on behalf of a team. That’s an accountability act, not a defect scan, and delegating it entirely means nobody on the team understands the system they ship. We’d bet on the mechanical share shrinking toward zero while the judgment share becomes the whole job.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Isn’t refusing AI summaries just contrarian positioning?</h3><p>It’s a falsifiable bet: that reviewers are net-faster reading well-presented code than reading AI prose about the code plus the code (since the prose must be verified against the code anyway, when it matters). If models become reliable enough that their summaries don’t need verification, the bet loses and we’ll revisit. The evidence today (false positives as the category’s #1 complaint) says it holds.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Graphite Alternatives in 2026: An Honest Comparison</title>
      <link>https://pyor.review/blog/graphite-alternatives</link>
      <guid isPermaLink="true">https://pyor.review/blog/graphite-alternatives</guid>
      <pubDate>Tue, 14 Jul 2026 08:00:00 GMT</pubDate>
      <description>Graphite alternatives compared honestly: GitHub native stacked PRs in private preview, CodeRabbit and Greptile for AI review, and Pyor as a review surface.</description>
      <enclosure url="https://pyor.review/blog/graphite-alternatives/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/graphite-alternatives/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Most people searching for <strong>Graphite alternatives</strong> are really asking one of two different questions: do I want the stacking workflow somewhere else, or do I want the AI review without adopting a whole platform? The honest starting point is that Graphite is good, and its stacking is a real moat. Disclosure before we go further: <strong>we build Pyor</strong>, one of the options below, so weigh our take accordingly. We will separate what Graphite uniquely does from what you can get elsewhere more cheaply.</p><blockquote><p><strong>The map:</strong> Graphite bundles three things: stacked pull requests, an AI reviewer, and a merge queue. The stacking is its moat. If you want stacking elsewhere, GitHub’s native stacked PRs are in private preview. If you want the AI review alone, CodeRabbit, Greptile, or Copilot fit. If you want a faster review surface without a platform, <strong>Pyor</strong> is the different approach.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What Graphite is genuinely good at</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://graphite.com/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Graphite</a> now calls itself the AI code review platform, but its durable idea is stacked pull requests: you break a large change into a sequence of small, dependent PRs, and Graphite makes the bookkeeping bearable with a CLI and a VS Code extension, a stack-aware merge queue, a PR inbox, a modernized PR page, and Slack, CI, automations, and insights around it. On top of that sits an AI reviewer and Graphite Chat, a conversational reviewer. The case for it is the research on <a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">pull request size</a>: small changes review better, full stop. It offers 30 days free, no credit card, synced with GitHub. If your team can adopt stacking, it attacks the root cause that most other tools only manage the symptoms of.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The honest caveat is the same thing that makes it powerful: stacking is a team-wide workflow change with a real learning curve, and you are adopting a platform, not a viewer. That is exactly why people look for alternatives, so let us split them by intent.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">If you want the stacking workflow: watch GitHub native</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The most interesting alternative to Graphite’s core feature now comes from GitHub itself: native stacked pull requests entered private preview in 2026, with GitHub acknowledging that large pull requests are hard to review. That matters because the biggest friction with third-party stacking is that it lives outside the host; a native implementation removes that seam. The honest status: it is private preview, not generally available, and Graphite is far more mature today, with the merge queue and inbox that a bare stacking primitive does not include. If stacking is why you are on Graphite, it is worth keeping while you watch the native feature graduate. Background on the pattern is in <a href="https://pyor.review/blog/how-to-review-large-pull-requests" class="rule-link text-fg underline-offset-4 hover:text-add">reviewing large pull requests</a>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">If you mainly want the AI review: dedicated bots</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">If Graphite Chat and its reviewer are what you actually use, a dedicated bot is a lighter adoption than a platform. <a href="https://www.coderabbit.ai/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit</a> posts AI review comments across GitHub, GitLab, Azure, and Bitbucket, with summaries, 40-plus linters and scanners, IDE and CLI reviews, and a free program for open source. <a href="https://greptile.com/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Greptile</a> builds a graph index of your codebase and runs a swarm of agents in parallel for whole-codebase context, priced at 30 dollars per seat a month including 50 review credits. <a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">GitHub Copilot code review</a> does the first pass natively if you already pay for Copilot, though an admin must enable it and it bills through AI Credits. All three are the same job Graphite’s reviewer does, without moving your workflow onto a new platform. The category caveat holds: a bot is a first pass, not a reviewer, as we cover in <a href="https://pyor.review/blog/do-code-reviews-find-bugs" class="rule-link text-fg underline-offset-4 hover:text-add">do code reviews find bugs</a>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">If you want a better surface without a platform: Pyor</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">There is a third intent Graphite does not directly serve: you do not want to change your team’s workflow or add a bot, you just want reviewing itself to be faster. That is what <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> is for. It is a review surface for existing GitHub pull requests, web first with a macOS and Windows desktop app: read, comment, approve, and merge in one window, with a file rail built for triage, folder-level viewed tracking, focus mode, and threads that survive a force-push. Where it uses AI, the AI organizes rather than narrates: it groups files by complexity, labels each group in one line, and points you at what deserves attention first, with an optional walkthrough. It does not generate summary prose you must read and re-verify.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Honest caveats: Pyor does not replace Graphite’s moat. There is no merge queue, and its own stacked-PR support is in private preview, not shipped. If stacking is the reason you adopted Graphite, Pyor is not a swap for that. It is the answer when the reading is the bottleneck and a whole platform is more than you want. Free for individuals; paid per-seat for org features.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">One nuance worth calling out: these alternatives are not mutually exclusive with Graphite, or with each other. A team can keep Graphite for stacking and still point a lighter surface at the occasional large, atomic change that stacking cannot shrink, migrations and codemods being the usual examples. The research favouring small diffs does not make every big diff avoidable; some changes are legitimately one unit, and you still have to read them. That is the seam where a triage-first surface earns its place next to a stacking platform rather than replacing it, and it is why we describe Pyor as a different approach rather than a head-to-head Graphite competitor. The point of the map is to match the tool to the bottleneck you actually have, not to crown one winner.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">At a glance</h2><p><table class="w-full border-collapse text-left text-[0.95rem] leading-[1.5]"><thead><tr class="border-b border-line bg-bg-2/60"><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Tool</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Approach</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Best for</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Pricing</th></tr></thead><tbody class="divide-y divide-line-faint"><tr><td class="px-4 py-3 align-top font-medium text-fg">Graphite</td><td class="px-4 py-3 align-top text-fg-2">Stacked PRs, merge queue, AI reviewer</td><td class="px-4 py-3 align-top text-fg-2">Teams adopting a stacking workflow</td><td class="px-4 py-3 align-top text-fg-2">30 days free, then paid</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">GitHub native stacking</td><td class="px-4 py-3 align-top text-fg-2">Stacked PRs inside the host</td><td class="px-4 py-3 align-top text-fg-2">Stacking without a third party</td><td class="px-4 py-3 align-top text-fg-2">Private preview</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">CodeRabbit</td><td class="px-4 py-3 align-top text-fg-2">AI review comments across platforms</td><td class="px-4 py-3 align-top text-fg-2">A multi-platform first pass</td><td class="px-4 py-3 align-top text-fg-2">Free trial; free for open source</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Greptile</td><td class="px-4 py-3 align-top text-fg-2">AI reviewer with whole-codebase context</td><td class="px-4 py-3 align-top text-fg-2">Multi-file logical bugs</td><td class="px-4 py-3 align-top text-fg-2">$30/seat/mo, 50 credits</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Pyor (ours)</td><td class="px-4 py-3 align-top text-fg-2">Review surface, AI triages not narrates</td><td class="px-4 py-3 align-top text-fg-2">Faster reading without a platform</td><td class="px-4 py-3 align-top text-fg-2">Free for individuals; per-seat orgs</td></tr></tbody></table></p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">How to choose among Graphite alternatives</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Stacking is why you are here?</strong> Keep Graphite; watch GitHub’s native preview mature.</li><li><strong>Only using the AI reviewer?</strong> Swap to CodeRabbit, Greptile, or Copilot and drop the platform.</li><li><strong>Reading is the real pain?</strong> Pyor upgrades the surface without changing your workflow.</li><li><strong>Want both stacking and a bot?</strong> Graphite still bundles them best today.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Because they all sync to GitHub, the cheapest test is one reviewer on one real PR. For a broader view, our <a href="https://pyor.review/blog/coderabbit-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit alternatives</a> piece covers the AI-bot side, and the <a href="https://pyor.review/blog/github-pr-review-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">GitHub PR review alternatives</a> roundup maps the whole field.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What is the best Graphite alternative?</h3><p>It depends on why you use Graphite. For the stacking workflow, GitHub native stacked PRs are in private preview and worth watching, though Graphite is more mature today. For the AI reviewer alone, CodeRabbit, Greptile, or Copilot code review fit. For a faster review surface without adopting a platform, Pyor takes a different approach.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is Graphite worth it for the AI review alone?</h3><p>Usually not by itself. Graphite ships an AI reviewer and Graphite Chat, but its real value is the stacked-PR workflow and merge queue. If you only want AI comments, a dedicated bot like CodeRabbit or Greptile is a lighter adoption than moving your team onto a whole platform for the reviewer feature.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Can I get stacked PRs without Graphite?</h3><p>Partly. GitHub added native stacked pull requests in private preview in 2026, and the git tooling to stack branches has always existed; Graphite mainly removes the bookkeeping pain. If you want stacking as an ergonomic daily workflow today, Graphite is still the most complete option, with the native feature maturing behind it.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>AI PRs Are Burning Out Open Source Maintainers</title>
      <link>https://pyor.review/blog/ai-prs-open-source-maintainers</link>
      <guid isPermaLink="true">https://pyor.review/blog/ai-prs-open-source-maintainers</guid>
      <pubDate>Sun, 12 Jul 2026 08:00:00 GMT</pubDate>
      <description>AI-generated PRs arrive in minutes; review still happens at volunteer speed. The data behind open source maintainer burnout, and what projects can do.</description>
      <enclosure url="https://pyor.review/blog/ai-prs-open-source-maintainers/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/ai-prs-open-source-maintainers/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Open source is where the review bottleneck stops being a process inconvenience and becomes a sustainability problem. Contributors, increasingly assisted by agents that produce a plausible PR in minutes, face essentially zero cost to submit. The cost lands entirely on the other side of the queue, on maintainers, where it was already concentrated to a degree most people underestimate.</p><blockquote><p><strong>The short answer:</strong> Three data points frame the squeeze: roughly <a href="https://survey.stackoverflow.co/2024/ai" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">three-quarters of developers use or plan to use AI tools</a> (Stack Overflow, 2024); <a href="https://arxiv.org/abs/2312.17236" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">research on OSS review workloads</a> shows a small fraction of contributors carries most review work; and <a href="https://www.coderabbit.ai/blog/ai-is-burning-out-the-people-who-keep-open-source-alive" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit’s analysis</a> reports AI-assisted PRs showing about <strong>1.7× more issues</strong> than human-written ones. Cheap generation, concentrated review, lower average quality: pick any two and you have friction; all three is burnout.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why “just review faster” fails hardest here</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">A company can hire reviewers or set policy; a volunteer maintainer can only spend evenings. The generated PR’s signature failure (locally plausible, globally wrong, as we cataloged in <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">our AI-code checklist</a>) is maximally expensive in exactly this setting, because rejecting it convincingly requires the project-specific context only the maintainer holds. A contributor spent four minutes; the explanation of why it’s wrong takes forty. Multiply by a queue that refills itself and the rational outcomes are the bad ones: rubber-stamping, ghosting, or quitting.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What projects are actually doing</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Disclosure requirements:</strong> state what was AI-assisted, so reviewers know <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">which failure modes to prioritize</a>.</li><li><strong>Proof-of-understanding gates:</strong> describe what you changed and why, show it ran; PRs whose authors can’t answer follow-up questions get closed without guilt.</li><li><strong>Tightened contribution funnels:</strong> issues-first workflows, maintainer-approval before large PRs, temporary limits on new contributors when the queue floods.</li><li><strong>AI pre-filtering:</strong> ironically, AI review bots make more sense here than anywhere: a first pass that rejects the obviously broken protects volunteer attention, provided it’s <a href="https://pyor.review/blog/ai-review-alert-fatigue" class="rule-link text-fg underline-offset-4 hover:text-add">tuned quiet enough to stay credible</a>.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The norm that matters most</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every durable fix above reduces to one principle: <strong>the author absorbs the review cost they used to externalize</strong>. Read your own diff before submitting (<a href="https://pyor.review/blog/author-self-review" class="rule-link text-fg underline-offset-4 hover:text-add">the self-review pass</a>), write the why, declare the provenance, keep it small. That norm was good manners in 2020; in the agent era it’s the difference between a commons that scales and one that eats its volunteers. Maintainers, for their part, deserve tooling that makes the irreducible human read as cheap as possible, which is the problem we work on at <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a>, free for individual use, maintainers included.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Should open source projects ban AI-generated contributions?</h3><p>Outright bans are hard to enforce and discard genuine value. The policies gaining traction instead: mandatory disclosure of AI assistance, proof the contributor ran and understood the change, stricter templates, and the right to summarily close PRs that show no human judgment. The target is unreviewed-by-author code, not AI per se.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Does this affect companies too, or just open source?</h3><p>The same asymmetry (generation is cheap, review is scarce and concentrated) exists inside companies. Open source just shows it first and louder, because maintainers are volunteers with no manager to absorb the pressure and contributors face zero cost to submit.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>CodeRabbit Alternatives in 2026: An Honest Comparison</title>
      <link>https://pyor.review/blog/coderabbit-alternatives</link>
      <guid isPermaLink="true">https://pyor.review/blog/coderabbit-alternatives</guid>
      <pubDate>Sun, 12 Jul 2026 08:00:00 GMT</pubDate>
      <description>CodeRabbit alternatives compared honestly: Greptile, GitHub Copilot code review, Graphite, and Pyor, a surface that triages the diff instead of commenting.</description>
      <enclosure url="https://pyor.review/blog/coderabbit-alternatives/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/coderabbit-alternatives/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">If you are weighing <strong>CodeRabbit alternatives</strong>, start by naming the job you actually want done. CodeRabbit is an AI reviewer bot: it reads a pull request and posts comments on it. Most of its rivals do the same thing with a different accent, and one option (ours) does something else entirely. Disclosure up front: <strong>we build Pyor</strong>, one of the tools below, so read the whole comparison with that in mind. We will be fair to CodeRabbit first, because it is genuinely good at what it does.</p><blockquote><p><strong>The map:</strong> CodeRabbit is a mature, multi-platform AI reviewer. Its closest alternatives are <strong>Greptile</strong> (whole-codebase context), <strong>GitHub Copilot code review</strong> (cheapest if you already pay for Copilot), and <strong>Graphite</strong> (a reviewer bundled with stacked PRs). <strong>Pyor</strong> is the different bet: a review surface whose AI triages the diff instead of commenting on it.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What CodeRabbit is actually good at</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://www.coderabbit.ai/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit</a> calls itself the leader in AI code reviews, and the breadth backs the swagger. It runs across GitHub, GitLab, Azure DevOps, and Bitbucket, reviews inside the IDE (VS Code, Cursor, Windsurf) and from a CLI as well as on the PR, and layers in bug detection, architectural-impact notes, one-click “Fix with AI”, change summaries with walkthroughs and diagrams, and 40-plus linters and security scanners behind a YAML config. It pulls Jira and Linear context, adapts to your feedback through what it calls learnings, and generates unit tests and docstrings. It is SOC 2 Type II with zero data retention after review, free to try with no credit card, and free for qualified open source. If you want one mature bot to cover many platforms, that is a strong reason to just keep it.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The reason people still shop around is the reason that applies to the whole category: a bot is a first pass, not a reviewer. It does not know your intent, it can share blind spots with whatever generated the code, and every comment it posts is volume a human still triages. We wrote about that tension in <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">reviewing AI-generated code</a> and about the noise cost in <a href="https://pyor.review/blog/ai-review-alert-fatigue" class="rule-link text-fg underline-offset-4 hover:text-add">review alert fatigue</a>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Greptile: the same bot, with whole-codebase context</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://greptile.com/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Greptile</a> is the most direct like-for-like swap. It bills itself as the AI code reviewer and its differentiator is context: it builds a graph index of your codebase and runs a swarm of agents in parallel so a review can reason across files, not just the diff in front of it. That makes it better at multi-file logical bugs, the kind a single-file bot misses, alongside the usual style, security, syntax, and logic checks, on GitHub and GitLab. Pricing is a real consideration and unusually transparent: 30 dollars per seat per month including 50 credits (one credit is one review), then 1 dollar per extra review, with a free tier for qualified open source and discounts for pre-Series-A startups. If CodeRabbit feels too shallow on large, interconnected changes, Greptile is the upgrade to try.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">GitHub Copilot code review: cheapest if you already pay for Copilot</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://github.com/features/copilot" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">GitHub Copilot code review</a> does the AI first pass natively inside the PR. The pitch is purely economic: if your team already pays for Copilot, the review feature is included in Copilot Pro (10 dollars a month), Pro+ (39 dollars a month), Business (19 dollars per user a month), and Enterprise (39 dollars per user a month). It is not in the free tier. Two frictions are worth knowing before you count on it: an admin has to enable it (it is off by default) and turn on GitHub AI Credits billing, and review usage by non-licensed users bills to the org as AI Credits. If everyone already has a seat, it is the lowest-effort bot on this list. If they do not, the credits math can surprise you.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Graphite: reach for it if you also want stacking</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://graphite.com/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Graphite</a> calls itself the AI code review platform, and it does ship an AI reviewer plus Graphite Chat, a conversational reviewer. But adopting Graphite only for the bot undersells it and oversells the switch. Its real moat is stacked pull requests (a CLI and VS Code extension) with a stack-aware merge queue, a PR inbox, and Slack and CI automations around it. The durable idea is that small changes review better, which the research on <a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">pull request size</a> supports. If you want an AI reviewer and a workflow that keeps diffs small, Graphite is the bundle. If you only want the bot, Greptile or Copilot is a lighter lift. It offers 30 days free, no credit card, synced with GitHub.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Pyor: a different approach, a review surface that triages</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Here is where we stop being another bot. <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> is not an AI reviewer that comments on your PR; it is a review surface for existing GitHub pull requests, web first with a desktop app for macOS and Windows. You read, comment, approve, and merge in one window. Where it uses AI, the AI organizes the diff rather than narrating it: it groups files by complexity, labels each group in one line, and drops short steering hints so on a big change you review the right code first, with an optional walkthrough that orders the whole thing. It deliberately does not generate prose summaries you have to read and then re-check against the code. That is the core disagreement with the bot category, which adds comments you then have to triage: as we cover in <a href="https://pyor.review/blog/ai-review-alert-fatigue" class="rule-link text-fg underline-offset-4 hover:text-add">alert fatigue in code review</a>, noisy AI review taxes attention rather than saving it.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Honest caveats: Pyor is young, it is a review surface and not a workflow platform (no merge queue; GitHub stacked PRs are in private preview, not here), and it is not a same-category swap for an AI reviewer. If what you want is a bot posting comments, one of the three above fits better. If your real pain is reading, this is the different answer. Free for individuals; paid per-seat for org features.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">At a glance</h2><p><table class="w-full border-collapse text-left text-[0.95rem] leading-[1.5]"><thead><tr class="border-b border-line bg-bg-2/60"><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Tool</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Approach</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Best for</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Pricing</th></tr></thead><tbody class="divide-y divide-line-faint"><tr><td class="px-4 py-3 align-top font-medium text-fg">CodeRabbit</td><td class="px-4 py-3 align-top text-fg-2">AI review comments across four platforms</td><td class="px-4 py-3 align-top text-fg-2">A mature multi-platform first pass</td><td class="px-4 py-3 align-top text-fg-2">Free trial; free for open source</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Greptile</td><td class="px-4 py-3 align-top text-fg-2">AI reviewer with whole-codebase graph context</td><td class="px-4 py-3 align-top text-fg-2">Multi-file logical bugs</td><td class="px-4 py-3 align-top text-fg-2">$30/seat/mo, 50 credits; $1 per extra</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Copilot code review</td><td class="px-4 py-3 align-top text-fg-2">AI first pass native in the PR</td><td class="px-4 py-3 align-top text-fg-2">Teams already paying for Copilot</td><td class="px-4 py-3 align-top text-fg-2">Included in Copilot (from $10/mo)</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Graphite</td><td class="px-4 py-3 align-top text-fg-2">AI reviewer bundled with stacked PRs</td><td class="px-4 py-3 align-top text-fg-2">You also want a stacking workflow</td><td class="px-4 py-3 align-top text-fg-2">30 days free, then paid</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Pyor (ours)</td><td class="px-4 py-3 align-top text-fg-2">Review surface, AI triages not comments</td><td class="px-4 py-3 align-top text-fg-2">Reading big diffs is the bottleneck</td><td class="px-4 py-3 align-top text-fg-2">Free for individuals; per-seat orgs</td></tr></tbody></table></p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">How to choose among CodeRabbit alternatives</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Want a mature bot across many platforms?</strong> Stay on CodeRabbit; the breadth is the feature.</li><li><strong>Bot missing multi-file bugs?</strong> Greptile’s whole-codebase context is the upgrade.</li><li><strong>Already paying for Copilot?</strong> Copilot code review is the cheapest first pass, minus the admin-enable and credits friction.</li><li><strong>Also fighting big diffs at the workflow level?</strong> Graphite’s stacking is the structural fix.</li><li><strong>Allergic to walls of AI text?</strong> Pyor triages the diff and points; you read the code.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">They all sync back to GitHub, so the cheapest experiment is one reviewer trying one tool on one real PR this week. For the wider field beyond the bots, see our <a href="https://pyor.review/blog/github-pr-review-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">GitHub PR review alternatives</a> roundup.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What is the best CodeRabbit alternative?</h3><p>There is no single winner because the job splits. If you want the same AI-reviewer-bot pattern, Greptile and GitHub Copilot code review are the closest. If you also want stacked PRs, Graphite bundles a reviewer. If your real bottleneck is reading big diffs, Pyor takes a different approach and triages the diff rather than commenting on it.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is CodeRabbit still worth it?</h3><p>Often yes. CodeRabbit supports GitHub, GitLab, Azure, and Bitbucket, ships IDE and CLI reviews, and runs a free program for open source. If you want a mature multi-platform bot as a mechanical first pass, it is a strong default. You look for alternatives when you want deeper context, lower cost, or less generated text to read.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Do these alternatives replace human review?</h3><p>No. Every tool here sits on top of your existing pull requests and syncs back to the host. AI bots are a first pass that catches obvious issues before a human looks; a review surface makes the human read faster. Neither removes the reviewer. You still have to read the code, so the goal is to read the right code sooner.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Alert Fatigue Comes for Code Review</title>
      <link>https://pyor.review/blog/ai-review-alert-fatigue</link>
      <guid isPermaLink="true">https://pyor.review/blog/ai-review-alert-fatigue</guid>
      <pubDate>Fri, 10 Jul 2026 08:00:00 GMT</pubDate>
      <description>AI review false positives don't just waste time; they teach your team to ignore the bot, real catches included. How to tune a reviewer for trust.</description>
      <enclosure url="https://pyor.review/blog/ai-review-alert-fatigue/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/ai-review-alert-fatigue/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Operations teams learned this lesson a decade ago and wrote it on the wall: a pager that cries wolf doesn’t get silenced; it gets <em>ignored</em>, and then the real page scrolls by unread. AI code review is now relearning it, one speculative comment at a time. False positives are the #1 complaint against every tool in the category, and the damage isn’t the wasted minute per dismissal: it’s what the dismissals do to the reader.</p><blockquote><p><strong>The short answer:</strong> Noise doesn’t just dilute review; it <strong>retrains the reviewer</strong>. Each dismissed false positive lowers the attention paid to the next comment, until the bot’s genuine catches get the same reflexive skim as its nonsense. A reviewer, human or machine, is only as useful as its <em>credibility</em>, and credibility is a budget that bad comments spend.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The mechanism, not the moral</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">When a bot leaves nine comments on a PR and two matter, the author must spend their own judgment to find the two, which is precisely the work the bot was bought to reduce. Worse, the triage is repetitive: the same speculative concerns recur on every PR (“consider handling the case where this config is undefined”; it can’t be), so developers build the only rational defense: a mental filter labeled <em>probably nothing</em>. The team that built one popular reviewer <a href="https://news.ycombinator.com/item?id=42451968" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">documented this exact arc</a>: they had to engineer nitpicking out of their own bot because noisy comments were burying the signal ones. We saw the same dynamic with <a href="https://pyor.review/blog/code-review-nitpicks" class="rule-link text-fg underline-offset-4 hover:text-add">human nitpicks</a>; machines just produce them at scale.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Tuning for trust</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Deterministic first.</strong> Anything a linter or type checker can decide should never reach the AI layer: it’s free precision, and it shrinks the surface the bot can be wrong about.</li><li><strong>Narrow the bot’s beat.</strong> Security-sensitive paths, error handling, concurrency: places where a speculative flag is worth reading. Silence elsewhere is a feature.</li><li><strong>Demand confidence, suppress hedging.</strong> Most tools accept custom instructions; “only comment when you can name the failing input” filters out the twenty-speculative-reasons genre.</li><li><strong>Measure dismissal rate per bot,</strong> visibly. What gets measured gets tuned; a bot nobody audits drifts noisy.</li><li><strong>One reviewer’s voice, not three.</strong> Stacking multiple AI reviewers multiplies noise faster than coverage: their false positives don’t overlap; their true positives mostly do.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Protect the scarce resource</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The thing alert fatigue actually destroys is the thing review runs on: reviewer attention. Every unit spent dismissing speculation is a unit not spent on the <a href="https://pyor.review/blog/how-to-review-large-pull-requests" class="rule-link text-fg underline-offset-4 hover:text-add">core files</a> of the change. That’s the lens we’d apply to any addition to the review loop, our own product included: does it <em>add</em> attention (by making reading faster, by triaging what matters first) or does it <em>tax</em> attention and call the tax a feature? Tools that can’t answer that cleanly end up in the mental spam folder, no matter what their benchmark said.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What dismissal rate means a review bot is too noisy?</h3><p>There’s no published standard, but the ops world’s alerting experience suggests the bar is high: once a clear majority of a bot’s comments get dismissed without action, developers stop reading them carefully, at which point even its valid findings underperform. Track resolved-vs-dismissed per bot comment and treat a sustained slide as an incident in your review process.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Should we just turn the AI reviewer off?</h3><p>Not necessarily: narrow it. Most tools accept path filters, severity thresholds, and custom instructions. A bot that only speaks on security-relevant paths and hard-error patterns, and stays silent elsewhere, keeps its credibility. The kill criterion is simple: if after tuning the team still skims past it, it’s costing more attention than it saves.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>AI Code Review Tools: What They Actually Catch</title>
      <link>https://pyor.review/blog/ai-code-review-accuracy</link>
      <guid isPermaLink="true">https://pyor.review/blog/ai-code-review-accuracy</guid>
      <pubDate>Wed, 08 Jul 2026 08:00:00 GMT</pubDate>
      <description>How accurate is AI code review? Independent testing shows most suggestions duplicate linters, some are wrong, a few are gold. How to evaluate a tool honestly.</description>
      <enclosure url="https://pyor.review/blog/ai-code-review-accuracy/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/ai-code-review-accuracy/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">AI code reviewers are the hottest aisle in dev tooling, to the point where <a href="https://news.ycombinator.com/item?id=46766961" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">one of the vendors wrote an essay titled “There is an AI code review bubble”</a> and 250 commenters mostly agreed. Strip away both the hype and the backlash and a real question remains: what do these tools actually catch?</p><blockquote><p><strong>The short answer:</strong> The most honest independent data point we’ve found: <a href="https://cotera.co/articles/ai-code-review-github" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Cotera’s evaluation</a> of GitHub Copilot review across 30 real PRs: 47 inline suggestions, of which <strong>31 would have been caught by their existing ESLint config</strong> with the right rules enabled, <strong>9 were genuinely useful</strong> catches linting couldn’t make, and <strong>7 were wrong or irrelevant</strong>. Read that as the category in miniature: mostly a linter with prose, a meaningful minority of real value, and a nonzero stream of confident noise.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What they’re genuinely good at</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The 9-in-47 is real value, and it clusters: forgotten error paths, mismatches between a comment and the code below it, obvious-but-easy-to-skim bugs in tedious code, missed null cases in languages without strict checking. AI reviewers read every line with identical attention, the one thing humans reliably don’t do. As a mechanical first pass that runs before any human looks, that’s legitimately useful, which is the role we recommended in <a href="https://pyor.review/blog/github-pr-review-alternatives" class="rule-link text-fg underline-offset-4 hover:text-add">our tools comparison</a>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Where the noise comes from</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Linter overlap:</strong> the bulk of suggestions duplicate what deterministic tools already encode, except slower, non-deterministically, and phrased as a paragraph you have to read.</li><li><strong>Speculative findings:</strong> the most-echoed complaint in the bubble thread. Paraphrasing one commenter, it’s hard to stop the tool giving you twenty speculative concerns wrapped around the one real error.</li><li><strong>Missing context:</strong> the tool doesn’t know your schema invariants, your deliberate design exceptions, or the incident that explains the weird retry logic, so it flags exactly those things, repeatedly.</li><li><strong>Run-to-run variance:</strong> the same diff reviewed twice yields different comments, which corrodes trust in subtle ways a static analyzer never does.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The benchmark problem</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every vendor publishes accuracy numbers; the numbers disagree wildly; and each benchmark’s winner tends to be its publisher. This isn’t (necessarily) bad faith: catch rate trades against false-positive rate, so any tool can look like the leader by choosing where on that curve to measure. The only benchmark that predicts your experience is your own repo: take a dozen merged PRs whose bugs you later found in production, run the candidate tool on them, and count three things: real catches, linter-duplicates, and confident nonsense. An afternoon of that beats every comparison page, including this one.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The economics test</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Dedicated AI reviewers run roughly $24 to $40 per seat monthly. The honest comparison isn’t “versus nothing.” It’s versus a tightened ESLint config (free, deterministic, zero hallucinations) plus the same model called directly in CI with your own rules. And one step further out: the bottleneck these tools address sits next to a bigger one: the speed at which <em>humans</em> can read and judge a change. That one doesn’t improve by adding more comments to triage; it improves by making the reading faster, which is <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">the bet we took instead</a>. More on that division of labor in the final piece of this series.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Are AI code review tools worth paying for?</h3><p>It depends what you’re replacing. If your repo lacks serious linting and CI, an AI reviewer adds value fast, but so would the linting. If your mechanical checks are already strong, the marginal real catches are fewer, and the per-seat price (typically $24 to $40/month) buys mostly a second opinion that needs verification. Trial it on your own merged PRs with known bugs before believing any benchmark.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Why do AI review benchmarks disagree so much?</h3><p>Most published benchmarks are run by vendors, on test sets they chose, with scoring they defined, and each tends to crown its publisher. Catch rate also trades directly against noise: tuning a tool to flag more catches more and annoys more. Treat any single accuracy number as marketing until it’s reproduced on your codebase.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Atomic Commits Make Reviewable PRs</title>
      <link>https://pyor.review/blog/atomic-commits-reviewable-prs</link>
      <guid isPermaLink="true">https://pyor.review/blog/atomic-commits-reviewable-prs</guid>
      <pubDate>Mon, 06 Jul 2026 08:00:00 GMT</pubDate>
      <description>Structure a pull request as a sequence of atomic commits and reviewers can read it like chapters. The craft of commit-by-commit review, and the squash debate.</description>
      <enclosure url="https://pyor.review/blog/atomic-commits-reviewable-prs/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/atomic-commits-reviewable-prs/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">There are two kinds of multi-hundred-line PRs: the kind reviewers dread, and the kind that reads like a well-edited essay, because the author structured it as a sequence of commits, each one a chapter. Same total diff, wildly different review cost. The difference is a craft most teams never discuss, though the squash-versus-history argument that surrounds it <a href="https://news.ycombinator.com/item?id=45371283" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">flares up reliably</a> whenever review workflow comes up.</p><blockquote><p><strong>The short answer:</strong> An <strong>atomic commit</strong> is one self-contained logical step with a message explaining why. A PR built from them can be reviewed <strong>commit by commit</strong>: “rename (mechanical)” skimmed in seconds, “extract helper (no behavior change)” verified quickly, “change retry semantics” read with full attention. The reviewer’s effort lands exactly where the risk is, instead of being spread evenly across a flattened 800-line wall.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why structure beats size</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">We’ve argued <a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">smaller PRs review better</a>, but some changes are legitimately medium-sized, and the next lever after size is <em>order</em>. A flattened diff mixes the mechanical with the meaningful: the rename touches 30 files, the real semantic change touches two, and the reviewer must discover which is which line by line. Commit structure is the author telling the reviewer, credibly: <em>these 30 files are the rename; trust them as a unit; spend yourself on these two.</em> It’s the same triage we recommend reviewers do <a href="https://pyor.review/blog/how-to-review-large-pull-requests" class="rule-link text-fg underline-offset-4 hover:text-add">on their side</a>, except the author, who knows the answer, does it once for everyone.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The recipe</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Separate refactor from behavior.</strong> The cardinal rule. “No behavior change” commits get verified structurally; behavior commits get scrutiny. Mixed, they poison each other.</li><li><strong>Mechanical bulk gets its own commit</strong> (renames, formatting, codemods, generated files), labeled as such in the message.</li><li><strong>Messages carry the why.</strong> As one HN commenter put it, commit messages are the developer docs for a change. “Switch to exponential backoff because the flat retry hammered the API during outages” reviews itself.</li><li><strong>Curate before requesting review.</strong> Your fifty “argh, forgot this bit” commits are fine while working. <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">git rebase -i</code> them into the story before asking for eyes. (During review rounds, switch to append-only fixups; see <a href="https://pyor.review/blog/re-reviewing-pull-requests-interdiff" class="rule-link text-fg underline-offset-4 hover:text-add">the interdiff piece</a>.)</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The squash debate, defused</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">“Why bother if we squash-merge anyway?” Because the commits’ job is during <em>review</em>: they’re the author’s table of contents for the reviewer. What main’s history looks like afterward (one squashed commit, or the curated sequence) is a separate policy decision with its own trade-offs (bisectability and revert granularity vs. a linear, tidy log). Both camps can be right at their own moment in the timeline. The only losing position is chaotic commits <em>and</em> a flattened review.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Reviewing commit-by-commit in practice</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The workflow needs tool support to stick: stepping through commits, and scoping the diff to a single commit or a span when you need to re-check one chapter. GitHub allows per-commit viewing but loses your thread positions between scopes; it’s one of the flows we built deliberately into <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> (ours, free for individuals): pick any commit or range in a PR and the diff re-scopes to it, threads intact. Author structures the story; reviewer reads it chapter by chapter; nobody re-reads the book.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Atomic commits or squash-and-merge: which is right?</h3><p>They answer different questions. Atomic commits make the PR reviewable round by round and step by step; what lands on main afterward is a separate policy choice. Many teams do both: structured commits during review, squash (or a curated history) at merge. The mistake is letting a squash-at-merge policy become an excuse for chaotic commits during review.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What makes a commit “atomic”?</h3><p>One logical change that stands alone: it has a single describable purpose, the code (ideally) builds at that point, and its message explains why. “Extract retry helper (no behavior change)” is atomic. “WIP” and “fix stuff + refactor + new endpoint” are not.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is this worth it for small PRs?</h3><p>For a 50-line single-purpose PR, one commit is atomic, and you’re done. The craft pays off from medium size upward, and especially when a refactor travels with a behavior change: separating those two into commits is the difference between a 10-minute review and a 40-minute one.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Do Code Reviews Actually Find Bugs?</title>
      <link>https://pyor.review/blog/do-code-reviews-find-bugs</link>
      <guid isPermaLink="true">https://pyor.review/blog/do-code-reviews-find-bugs</guid>
      <pubDate>Sat, 04 Jul 2026 08:00:00 GMT</pubDate>
      <description>Do code reviews find bugs? Yes, but fewer than you'd hope, and that's not their main value. What the research says reviews deliver, and when they pay off.</description>
      <enclosure url="https://pyor.review/blog/do-code-reviews-find-bugs/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/do-code-reviews-find-bugs/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every few months the argument reruns: a “code review is theatre” essay, a “reviews saved us” rebuttal, and a Hacker News thread titled something like <a href="https://news.ycombinator.com/item?id=40851895" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">“Code reviews do find bugs”</a> with a hundred-plus comments relitigating it. Both camps wave anecdotes. The research actually has an answer, and it’s more interesting than either camp’s version.</p><blockquote><p><strong>The short answer:</strong> Yes, reviews find real defects, but defect-finding is the <strong>minority</strong> of their delivered value. Microsoft’s large-scale study found review comments more often address code improvement, understandability, and knowledge transfer than outright bugs; Google’s published account of its review practice frames the primary goal as <strong>maintaining codebase health and shared understanding</strong>, with defects as one benefit among several. Judge review as a bug net and it disappoints; judge it as the team’s understanding-transfer mechanism and it’s load-bearing.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What the studies actually say</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Microsoft (Bacchelli &amp; Bird):</strong> across thousands of reviews, <a href="https://www.microsoft.com/en-us/research/publication/expectations-outcomes-and-challenges-of-modern-code-review/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">the study</a> found developers <em>expect</em> defect-finding to be the top outcome, but observed comments skew toward improvements, style, and understanding. The biggest obstacle to finding deep defects is reviewers not understanding the change.</li><li><strong>Google (Sadowski et al.):</strong> <a href="https://research.google/pubs/modern-code-review-a-case-study-at-google/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">their case study</a> describes review converging on small changes reviewed quickly by usually one reviewer, with education and codebase consistency as explicit goals: a system tuned for understanding-at-scale, not maximal defect yield per review.</li><li><strong>The older inspection data</strong> (the Cisco study popularized by <a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">SmartBear</a>) shows review <em>can</em> catch a substantial share of defects, but only under the conditions teams routinely violate: small scope, limited pace, fresh attention.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Both camps are right about the failure mode</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The skeptics aren’t hallucinating: a rushed glance at a 1,500-line diff finds nothing, and calling it quality assurance is <a href="https://pyor.review/blog/lgtm-culture-code-review-theatre" class="rule-link text-fg underline-offset-4 hover:text-add">theatre</a>. The defenders aren’t either: a real read of a scoped change catches the wrong-assumption bug no test suite was written to catch: tests verify what someone <em>thought</em> to verify; a reviewer questions the thinking. The variable isn’t whether review “works.” It’s whether the conditions for real review (<a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">size</a>, time, and a surface that doesn’t fight you) were present.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The agent-era update</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Two things changed since that research. Volume: <a href="https://pyor.review/blog/ai-writes-code-faster-than-you-can-review" class="rule-link text-fg underline-offset-4 hover:text-add">authoring accelerated and review didn’t</a>, so the conditions for real review are violated more often by default. And provenance: when an agent wrote the change, review is no longer a second pair of human eyes. It’s often the <em>first</em>, which raises the stakes of doing it honestly. The defect-finding share of review’s value is probably <em>rising</em> again, because generated code fails in ways <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">tests written by the same model miss</a>.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">So: worth it?</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Worth it: for the bugs it does catch, the worse designs it quietly prevents (knowing a human will read your code changes what you write), and above all for keeping the team’s understanding of its own system alive. That last one has no substitute, no bot replacement, and no shortcut. The actionable conclusion isn’t “review more” or “review less.” It’s <strong>create the conditions where review is real</strong>: small changes, honest re-review rounds, nits automated away, and reviewer attention treated as the scarce resource it is.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Should we drop review for low-risk changes?</h3><p>Calibrating rigor to risk is reasonable: many teams fast-track docs, config, and mechanical changes. But “low-risk” is exactly where untested assumptions hide, and review’s knowledge-transfer value applies to boring changes too. Lighten the process before you remove it.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Are AI reviewers a replacement for human review?</h3><p>They replace a slice of it: the mechanical defect hunt. They don’t replace the parts research says humans uniquely deliver: judging intent, transferring context across the team, and a human taking ownership of the change. Use bots to clear noise so humans can do that part.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Re-Reviewing a PR After Changes: The Interdiff Problem</title>
      <link>https://pyor.review/blog/re-reviewing-pull-requests-interdiff</link>
      <guid isPermaLink="true">https://pyor.review/blog/re-reviewing-pull-requests-interdiff</guid>
      <pubDate>Thu, 02 Jul 2026 08:00:00 GMT</pubDate>
      <description>How to review changes since your last review: the interdiff problem, force-push pain, git range-diff, and commit-scoped diffs that keep threads intact.</description>
      <enclosure url="https://pyor.review/blog/re-reviewing-pull-requests-interdiff/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/re-reviewing-pull-requests-interdiff/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">First reviews get all the attention; second reviews get the waste. You reviewed Tuesday, left eight comments, the author pushed “fixes”, and now you’re staring at the full 2,000-line diff again trying to reconstruct which parts you’ve already vouched for. A 278-point Hacker News thread titled <a href="https://news.ycombinator.com/item?id=41505266" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">“Some of us like interdiff code review”</a> exists because this, not the first pass, is where review time quietly dies.</p><blockquote><p><strong>The short answer:</strong> The re-reviewer’s question is never “is this change good?” It’s <strong>“what changed since I last looked?”</strong> That answer is an <em>interdiff</em>: version N vs. version N−1 of the same PR. GitHub approximates it with “changes since your last review,” but the approximation breaks on rebases and force-pushes. Protect it with workflow (fixup commits during review rounds) or recover it with <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">git range-diff</code>.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why re-review is uniquely wasteful</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The first review amortizes: you build the mental model once and spend it on the whole diff. The re-review <em>should</em> cost only the delta: the author changed forty lines in response to comments. But if you can’t isolate those forty lines reliably, you pay the full model-building cost again, on code you’ve already read. Multiply by two or three rounds per PR and the second-review tax exceeds the first review. This is also where <a href="https://pyor.review/blog/lgtm-culture-code-review-theatre" class="rule-link text-fg underline-offset-4 hover:text-add">rubber-stamping</a> sneaks in: “probably just the fixes” is the path of least resistance when the tooling can’t show you the fixes.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Where GitHub’s answer falls short</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">GitHub does offer “changes since your last review”, and when authors append normal commits, it mostly works. The gaps: it anchors to commits, so a rebase or squash force-push orphans the comparison; outdated comment threads detach from their lines; and there’s no view of how the <em>shape</em> of the change evolved (did the author restructure, or patch?). The thread above is full of Gerrit refugees for a reason: patchset-to-patchset comparison was a first-class feature there.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The workflow fix: fixups now, squash later</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>During review rounds:</strong> authors append (<code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">git commit --fixup</code> per addressed comment), never rewrite. Reviewers get an honest per-round delta.</li><li><strong>Before merge:</strong> <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">git rebase -i --autosquash</code> folds the fixups away; clean history and reviewable rounds both survive.</li><li><strong>When a rebase mid-review is unavoidable</strong> (conflicts with main): <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">git range-diff old-base..old-head new-base..new-head</code> compares the two versions <em>as patches</em>, surviving the rewrite. It is the closest thing Git ships to a true interdiff. (<a href="https://git-scm.com/docs/git-range-diff" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">docs</a>)</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The tooling fix: scope the diff to what’s new</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The general capability underneath all of this is <em>scoping the diff to a span of commits</em>: “show me only what changed in the commits since my review.” It’s the feature we leaned into with <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> (ours, free for individuals): pick any commit range in a PR and the diff re-scopes to exactly that span, with review threads kept anchored, including threads on lines that later changed, which get pinned to the version they were written against instead of vanishing as “outdated.” The re-review becomes what it always should have been: read the delta, check it against your comments, approve with confidence.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Close the loop explicitly</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">However you get the delta, end the round crisply: re-resolve the threads that were addressed, say what you re-checked, and approve mentioning the rounds (“round 2 reviewed: migration fix verified”). Re-review is the part of the process most likely to be invisible work; making it visible is how it stays funded.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What is an interdiff?</h3><p>A diff between two versions of the same change (version 1 of a PR vs. version 2 after review feedback) rather than between the change and its base branch. It answers the re-reviewer’s actual question: what did the author modify since I last looked?</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Why does force-pushing break re-review on GitHub?</h3><p>GitHub’s “changes since your last review” compares commits. When the author rebases or squashes and force-pushes, the old commits no longer exist, so the comparison loses its anchor, and the reviewer is often left re-reading the whole diff. git range-diff compares the two commit ranges as patches, which survives the rewrite.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Should authors avoid force-pushing during review?</h3><p>During an active review round, yes: append fixup commits so reviewers can see deltas, then squash before merge. Clean history and reviewable rounds aren’t in conflict; they just happen at different moments.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Nitpicks Are Killing Your Code Review</title>
      <link>https://pyor.review/blog/code-review-nitpicks</link>
      <guid isPermaLink="true">https://pyor.review/blog/code-review-nitpicks</guid>
      <pubDate>Tue, 30 Jun 2026 08:00:00 GMT</pubDate>
      <description>Code review nitpicking crowds out logic review, demoralizes authors, and slows merges. Automate the nits, label the rest, save attention for what matters.</description>
      <enclosure url="https://pyor.review/blog/code-review-nitpicks/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/code-review-nitpicks/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Ask developers what they dread about code review and the answer usually isn’t the hard feedback; it’s the twelve comments about naming conventions on a PR that fixes a race condition. A 300-comment Hacker News thread on <a href="https://news.ycombinator.com/item?id=31858604" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">review tone</a> and another on <a href="https://news.ycombinator.com/item?id=42451968" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">making an AI review bot stop nitpicking</a> say the quiet part: nits are the most common review comment and the least valuable one.</p><blockquote><p><strong>The short answer:</strong> Nitpicks are a triple tax: they <strong>crowd out logic review</strong> (style is easier to comment on, so it wins), they <strong>demoralize authors</strong> (feedback reads as fault-finding), and they <strong>add merge latency</strong> (a round-trip per bikeshed). The fix is structural: <strong>automate</strong> what a formatter can decide, <strong>label</strong> what remains (<code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">nit:</code> = non-blocking, author may decline), and <strong>budget</strong> human attention for correctness and design.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why nits win by default</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">It’s an attention-economics problem, not a character flaw. Evaluating logic requires reconstructing the author’s mental model (expensive). Spotting a naming inconsistency requires a glance (free). Under time pressure, reviewers produce what’s producible, and on teams where “thorough review” is measured by comment count, nits become how diligence is performed. (That performance problem is its own disease; see <a href="https://pyor.review/blog/lgtm-culture-code-review-theatre" class="rule-link text-fg underline-offset-4 hover:text-add">our piece on review theatre</a>.)</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Automate the automatable, ruthlessly</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every style rule a human enforces in review is a tooling failure. Formatters (Prettier, gofmt, Black) end whitespace and layout debates; linters encode naming and idiom rules; CI enforces both before a reviewer ever looks. The rule of thumb: if two reasonable people could be told the answer by a config file, the config file should do the telling. What’s left for humans is the stuff that genuinely needs judgment.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Label what remains</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">For judgment-call nits, severity must travel with the comment. <a href="https://conventionalcomments.org/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Conventional Comments</a> does this with prefixes: <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">nit:</code> (take it or leave it), <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">question:</code> (I might be missing context), <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">issue:</code> (this blocks). The author triages at a glance instead of treating every comment as a demand. Two norms make it stick: a <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">nit:</code> can be declined without justification, and approval is given <em>with</em> nits outstanding (“approve, two optional nits”) rather than holding the merge hostage to preferences.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Watch the bot, too</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">AI reviewers inherit the nit bias: style observations are the easiest tokens to generate. The team behind one popular bot <a href="https://news.ycombinator.com/item?id=42451968" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">wrote up the fix</a>: they had to deliberately engineer nitpicking <em>out</em>, because noisy comments trained developers to ignore the bot entirely, including its real catches. The same applies to humans: a reviewer known for nits gets skimmed.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What to do with the attention you save</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The point of killing nits isn’t kinder reviews; it’s <em>reallocated</em> reviews. The attention that was going to naming goes to the questions that prevent incidents: is this correct at the edges, is this the right shape, what happens under failure. That’s the review your authors actually want, and the one <a href="https://pyor.review/blog/how-to-review-large-pull-requests" class="rule-link text-fg underline-offset-4 hover:text-add">worth structuring your passes around</a>. Style should be table stakes settled by machines; judgment is the part worth a human’s signature.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Are nitpicks ever worth leaving?</h3><p>Yes, when they’re about clarity a future reader will pay for (a misleading name, a confusing structure), not personal preference. The discipline is labeling them non-blocking (nit:) and accepting the author may decline. If a “nit” must be fixed before merge, it isn’t a nit: say why it blocks.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What tone should review comments use?</h3><p>Comment on the code, not the person; prefer questions over verdicts when intent is unclear (“was X considered here?”); give the reason, not just the instruction. Prefixes like nit:, question:, issue: (Conventional Comments) carry severity so the author doesn’t have to guess what blocks.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Our AI review bot is the biggest nitpicker. What now?</h3><p>Tune or replace it. Teams that shipped AI reviewers found nitpicky output erodes trust in all the bot’s comments, including the good ones; one team wrote up how they specifically engineered their bot to stop nitpicking. A bot that comments rarely and correctly beats one that comments always.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Author Self-Review: The Cheapest Code Review You Skip</title>
      <link>https://pyor.review/blog/author-self-review</link>
      <guid isPermaLink="true">https://pyor.review/blog/author-self-review</guid>
      <pubDate>Sun, 28 Jun 2026 08:00:00 GMT</pubDate>
      <description>Self-review your pull request before requesting eyes: catch the cheap defects at the cheapest point and halve reviewer round-trips. A five-minute pass.</description>
      <enclosure url="https://pyor.review/blog/author-self-review/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/author-self-review/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The highest-leverage code review on your team costs nothing, blocks nobody, and is skipped daily: the author reading their own pull request, in the diff view, before requesting eyes. In the recent Hacker News <a href="https://news.ycombinator.com/item?id=45371283" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">thread on performative review</a>, the top-voted observation was blunt: the self-review saves the company the most money, because cost scales with the distance between making a bug and finding it.</p><blockquote><p><strong>The short answer:</strong> Read your own diff <strong>in the review UI, not your editor</strong>, before requesting review. You’ll catch the leftover debug line, the accidental file, the misleading name, each costing you a keystroke instead of costing a reviewer a round-trip. Then write down the <em>why</em> and the <em>where to look</em>. Ten minutes, and your reviewer starts at the interesting part instead of the embarrassing part.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why the diff view and not your editor</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">You’ve been staring at this code for days in the editor, so you see what you <em>meant</em>. The diff view shows what you <em>did</em>, in the exact frame your reviewer will see: the stray <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">console.log</code>, the formatting blast radius, the file that shouldn’t be there, the seven-line function that reads fine in context and cryptic in isolation. The medium switch is the point: it breaks author blindness the same way reading your writing aloud does.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The five-minute pass</h2><ol class="mt-5 list-decimal space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:font-mono marker:text-[0.9em] marker:text-add"><li><strong>Sweep for accidents:</strong> debug output, commented-out blocks, unrelated formatting, files that don’t belong, secrets and config meant for local only.</li><li><strong>Read as a stranger:</strong> for each hunk, would someone without your week of context understand why this line changed? If not, comment it, rename it, or annotate the PR at that line yourself.</li><li><strong>Check the seams:</strong> error paths, edge inputs, the one place you said “I’ll come back to this.” You remember where the bodies are; the reviewer has to dig.</li><li><strong>Write the map:</strong> what changed, why, where the risk is, what you’re unsure about. “Start with <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">applyBatch</code>, the rest is wiring” is the most valuable sentence in any large PR.</li><li><strong>Pre-empt the split question:</strong> if the self-review took ages or the map has two unrelated stories, <a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">split it</a> now, before a reviewer asks.</li></ol><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Self-review changes the economics, not just the defect count</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every issue the author catches converts a public round-trip (comment → notification → context switch → push → re-request) into a private keystroke. Authors who self-review consistently get reviewed <em>faster</em>; reviewers learn whose PRs respect their time, and an analysis of a popular r/ExperiencedDevs question about slow reviews <a href="https://loufranco.com/blog/question-on-r-experienceddevs-getting-code-reviewed-faster" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">reached the same conclusion</a>: authors control more of their wait time than they think. The polish is also contagious in the good direction: a clean, mapped PR makes a lazy LGTM feel out of place.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">In the agent era, self-review is the accountability line</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">When an AI wrote the change, “the author read it first” stops being hygiene and becomes the whole ballgame: it’s the moment a human takes ownership. That’s why we built pre-PR review into <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> (our tool, free for individuals): read your agent’s diff on your own branch, leave yourself notes, fix before anything becomes a pull request. Your reviewers receive code a human has vouched for, and our <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">AI-code checklist</a> gets shorter every time someone does it.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Isn’t self-review redundant if a reviewer will look anyway?</h3><p>No. It changes what the reviewer spends attention on. Defects found by the author cost a keystroke; the same defect found by a reviewer costs a comment, a context switch, a re-push, and a re-review round-trip. Self-review moves the cheap defects to the cheap finder, leaving reviewer attention for design and correctness.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">How long should a self-review take?</h3><p>For a normal-sized PR, five to fifteen minutes. If self-reviewing takes an hour, that is the PR telling you it’s too large: split it before requesting review.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Does self-review work for AI-generated changes?</h3><p>It’s even more important there. When an agent wrote the code, the author’s self-review is the first time any human has read it. Sending it to a reviewer unread outsources your accountability, and reviewers can tell.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>LGTM Code Review: When Approval Becomes Theatre</title>
      <link>https://pyor.review/blog/lgtm-culture-code-review-theatre</link>
      <guid isPermaLink="true">https://pyor.review/blog/lgtm-culture-code-review-theatre</guid>
      <pubDate>Fri, 26 Jun 2026 08:00:00 GMT</pubDate>
      <description>LGTM code review can mean real approval or rubber-stamping. How LGTM culture drifts into theatre, and how to make approval mean something.</description>
      <enclosure url="https://pyor.review/blog/lgtm-culture-code-review-theatre/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/lgtm-culture-code-review-theatre/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">A 416-comment Hacker News thread titled <a href="https://news.ycombinator.com/item?id=45371283" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">“The Theatre of Pull Requests and Code Review”</a> hit a nerve last year, and the nerve is real: on many teams, review has quietly become a ritual. The approval arrives in ninety seconds, or (the other face of the same problem) the reviewer feels <em>obligated to find something</em> and leaves three comments about naming. Both are performances. Neither is review.</p><blockquote><p><strong>The short answer:</strong> Review theatre has two costumes: the <strong>rubber stamp</strong> (approve without understanding, because pushing back feels pointless) and the <strong>obligation nitpick</strong> (comment on formatting to prove you looked). Both come from the same root: reviewing after the decision is already made, on changes too big or too opaque to truly evaluate. Fix the incentives and the surface, not the reviewers.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What LGTM should mean in code review</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><strong>LGTM</strong> means “looks good to me,” but in code review it should mean more than “I saw the diff.” A useful LGTM says: I understand the change, I checked the risky paths, and I am comfortable sharing ownership after merge. When teams use LGTM as a social shortcut instead, approval turns into a rubber stamp: fast, polite, and almost empty.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why rational people rubber-stamp</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Nobody decides to stop reviewing. The drift has mechanics. By the time a PR is up, the author has invested days; the feature is on a board with a date; the change is, as one engineer put it in a long-running debate about post-commit review, <em>already a done deal</em>: the reviewer isn’t in the hot path of the decision anymore, so pushing back feels like obstruction rather than contribution. Add a diff too large to genuinely evaluate (we’ve written about <a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">why size kills review</a>), and approval becomes the only move that doesn’t make you the bottleneck. The stamp is rational. That’s what makes it dangerous.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The obligation nitpick is the same failure</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The reviewer who <em>can’t</em> evaluate the logic but <em>must</em> demonstrate diligence reaches for what’s evaluable at a glance: names, formatting, comment style. The author gets busywork, the actual risk sails through untouched, and everyone involved can point at the thread as proof review happened. As a commenter on the Theatre thread put it, logic-and-architecture comments are the valuable ones, but nit comments are <em>easier to write</em>, so they win by default. (We go deeper on this in an upcoming piece on nitpicks.)</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What approval should mean</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The fix starts with making the stakes explicit. An approval is a statement: <strong>“I understand this change well enough to co-own it in production.”</strong> Not “I looked at it,” not “I trust the author.” Teams that adopt that definition (out loud, in their review norms) make rubber-stamping feel like what it is: signing a document you didn’t read.</p><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Let reviewers say what they actually did.</strong> “Reviewed the migration deeply, skimmed the call sites” is honest and useful; silent approval hides the gap.</li><li><strong>Make small PRs the norm</strong> so genuine evaluation is possible in the time people actually have. Theatre thrives on impossibility.</li><li><strong>Move review earlier.</strong> Feedback before the change is “a done deal” (on the design, or via <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">pre-PR review of generated code</a>) puts the reviewer back in the hot path, where pushing back is cheap.</li><li><strong>Kill the diligence-signaling channel.</strong> Auto-format, lint in CI, and label nits as non-blocking. When style can’t be the performance, attention goes to logic.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The surface matters more than teams admit</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Here’s the uncomfortable observation from building a review tool: a lot of rubber-stamping is <em>fatigue with the act of reviewing</em>, not indifference to quality. When finding the three files that matter takes ten minutes of scrolling, the stamp wins. When triage is instant and the diff keeps your place, genuinely reading the change stops being heroic. That’s the bet behind <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> (ours, free for individuals): make real review cheap enough that theatre loses its main excuse.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is a fast LGTM always rubber-stamping?</h3><p>No. A 40-line, well-described change from someone who knows the area deserves a fast approval; speed and rigor aren’t opposites on small changes. Rubber-stamping is approving without understanding. The tell is whether the reviewer could explain the change to a third person afterward.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">How do we measure whether our reviews are performative?</h3><p>Look at outcome-shaped signals rather than activity: how often review actually changes the code (revision rate), whether defects are caught before merge vs. after, and whether comments cluster on style versus logic. All-approvals-no-changes over weeks is the classic theatre signature.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Reviewing PRs Locally vs. in the Browser</title>
      <link>https://pyor.review/blog/review-prs-locally-vs-browser</link>
      <guid isPermaLink="true">https://pyor.review/blog/review-prs-locally-vs-browser</guid>
      <pubDate>Wed, 24 Jun 2026 08:00:00 GMT</pubDate>
      <description>Some reviewers pull the branch to review pull requests locally; others live in the web diff. The real trade-offs, when each wins, and the third option.</description>
      <enclosure url="https://pyor.review/blog/review-prs-locally-vs-browser/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/review-prs-locally-vs-browser/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every team has one: the reviewer who refuses the web diff, pulls the branch, and reads the change in their editor. They’re usually among the best reviewers on the team, and they’re paying a real tax for it. Some of the strongest engineers we know review this way; this piece is about what they’re getting, what it costs, and when each mode actually wins.</p><blockquote><p><strong>The short answer:</strong> <strong>Pull the branch</strong> when you need to navigate (jump to definition, find usages), run the change, or judge a refactor’s shape; the editor’s context is unbeatable. <strong>Stay in the browser</strong> for small, self-contained diffs where inline comments and speed matter more. The deciding question: <em>do I need to see more than the diff shows?</em> If yes, pull.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What local review actually buys you</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Navigation.</strong> Go-to-definition, find-references, the call hierarchy: the diff shows what changed; the editor shows what the change <em>touches</em>. For judging a refactor or an API change, that difference is the review.</li><li><strong>Execution.</strong> Run the tests, poke the feature, profile the hot path. The web diff asks you to trust; the checkout lets you verify.</li><li><strong>Your tools.</strong> Your keybindings, your linters, your search. Reviewing in an environment tuned over years beats any vendor’s viewer for raw reading throughput.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What it costs</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Context switching.</strong> Stash or commit your work, switch branches (or maintain a second worktree), restore state afterward. <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">gh pr checkout</code> makes the fetch cheap; nothing makes the interruption cheap.</li><li><strong>The transcription tax.</strong> Findings live in your head and the PR conversation lives in the browser. Every comment means re-finding the file and line on github.com and reconstructing your thought. This is where local reviewers quietly lose their time advantage, and why their feedback sometimes arrives as one big comment instead of anchored threads.</li><li><strong>No shared state.</strong> Viewed-file tracking, resolved threads, suggested changes: the collaborative review machinery doesn’t follow you into the editor.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">A decision rule that holds up</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Pull the branch when the review question is <em>architectural or behavioral</em>: does this design hold, does this actually work, what does this break elsewhere. Stay in the diff when the question is <em>local correctness</em>: is this logic right, are the edges handled, is it consistent. Mixed PRs (most <a href="https://pyor.review/blog/how-to-review-large-pull-requests" class="rule-link text-fg underline-offset-4 hover:text-add">large ones</a>) often deserve both: a browser pass for triage and threads, a checkout for the two files where the real decision lives.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The gap both modes leave</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Notice the shape of the trade: one mode has the <em>context</em> (editor) and the other has the <em>conversation</em> (browser), and review needs both. That gap is the design brief we started <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> from: a native review app with diff ergonomics built for reading (file triage, viewed tracking that includes whole folders, focus mode, a diff that keeps your place at any size) <em>and</em> the full review loop: inline threads, approvals, and merge, synced with GitHub. It talks to GitHub directly from your machine, so the privacy posture matches local review: <a href="https://pyor.review/security" class="rule-link text-fg underline-offset-4 hover:text-add">your code never passes through our servers</a>. Free for individuals. It won’t replace the checkout for “does this design hold” (nothing replaces running the code), but it retires the checkout you were doing just to <em>read</em> comfortably.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">If you take one habit from this</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Make the mode a deliberate choice per-PR instead of an identity. The reviewers who do this best aren’t “local people” or “browser people”; they ask <em>what does this change need from me?</em> and pick the cheapest surface that delivers it. The one identity worth keeping: never approve a change you couldn’t explain to the next reviewer, wherever you read it.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">How do I check out a PR branch quickly?</h3><p>With GitHub’s CLI: gh pr checkout &lt;number&gt; fetches and switches to the PR branch in one step. Add --detach to avoid creating a local branch you’ll forget to delete.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Do I lose the ability to comment when reviewing locally?</h3><p>On vanilla setups, mostly yes: findings have to be transcribed back to the PR by hand, which is the biggest hidden cost of local review. Editor extensions (like the GitHub PR extension for VS Code) close part of the gap; dedicated review apps close more of it.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Stop Losing Review Requests: Fixing the PR Review Inbox</title>
      <link>https://pyor.review/blog/stop-losing-review-requests</link>
      <guid isPermaLink="true">https://pyor.review/blog/stop-losing-review-requests</guid>
      <pubDate>Mon, 22 Jun 2026 08:00:00 GMT</pubDate>
      <description>Review requests die in GitHub notification noise. Build a PR query inbox with search filters, review SLAs, scheduled review blocks, and a real queue.</description>
      <enclosure url="https://pyor.review/blog/stop-losing-review-requests/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/stop-losing-review-requests/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Somewhere in your GitHub notifications is a review request from four days ago. The author pinged once in Slack, felt annoying, and stopped. The PR is rotting; the branch is drifting toward conflicts. Nobody decided this; it’s just what happens when review requests travel through a channel built for <em>everything</em>.</p><blockquote><p><strong>The short answer:</strong> Review requests get lost because GitHub notifications mix them with every mention, CI result, and issue update across every repo. The fix is a dedicated funnel: a <strong>filtered view that shows only what waits on you</strong>, a <strong>team SLA for first response</strong> (Google’s guidance: one business day, maximum), and <strong>scheduled review blocks</strong> so the queue gets drained on purpose instead of by guilt.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why the default funnel fails</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The notification stream is unranked and unbounded: a review request, the one item where a teammate is <em>blocked on you</em>, gets the same row as a bot comment. Email filters help until they file the request neatly into a folder nobody opens. And the morning sweep (“mark all as read”) is where review requests go to die. The structural problem: requests for your attention live mixed with information that merely mentions you.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Build a PR query inbox in GitHub</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">GitHub’s own search can build a serviceable <strong>PR query inbox</strong>; most developers just never wire it up. Bookmark these queries:</p><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">is:open is:pr review-requested:@me archived:false</code>: everything explicitly waiting on your review, across all repos.</li><li><code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">is:open is:pr reviewed-by:@me -review-requested:@me</code>: PRs you reviewed that may have replied to you (re-review limbo, the second-biggest leak).</li><li><code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">is:open is:pr author:@me review:changes_requested</code>: your own PRs blocked on <em>your</em> response; authors leak too.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The discipline is checking the views on a schedule, which is the next fix.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">An SLA plus review blocks beats heroics</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://google.github.io/eng-practices/review/reviewer/speed.html" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Google’s review-speed guidance</a> is blunt: respond within one business day at the slowest, because slow review taxes the whole team’s velocity and morale. The workable pattern isn’t interrupting deep work for every request; it’s two or three <strong>scheduled review blocks</strong> a day (start of day, post-lunch) plus the SLA as a backstop. Predictability is the actual product: an author who knows the longest possible wait can plan; one staring at silence pings, escalates, or gives up.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The first response doesn’t need to be the full review: “looked at the description, I’m the right reviewer, full pass by 3pm” unblocks more than it sounds like it should.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Drain the queue by unblock value, not arrival order</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">When the block starts, don’t review oldest-first. Triage by what unblocks the most: PRs with <em>no</em> reviewer yet beat PRs with two; a teammate’s release-blocker beats a refactor; a re-review (author already responded) usually costs minutes and clears a thread someone is anxiously refreshing. Five minutes of queue triage routinely saves a teammate’s afternoon.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Tooling: this is a solved-shape problem</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Everything above is workflow, and it works with bookmarks and a calendar. The tooling version is having the funnel built in, which is how we approached it in <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> (our product, free for individuals): a pull-request dashboard for everything that matters to you (authored, assigned, awaiting your review), a comments inbox that gathers every thread and reply across repos into one feed, and a team view that ranks open PRs by how much <em>you</em> can unblock, surfacing the ones with no reviewer first. The queue stops being something you remember to check and becomes something you look at once and act on. For what to do when the PR you open is enormous, see <a href="https://pyor.review/blog/how-to-review-large-pull-requests" class="rule-link text-fg underline-offset-4 hover:text-add">reviewing large PRs</a>.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What’s a reasonable SLA for first review response?</h3><p>Google’s engineering practices set the bar at one business day as the absolute maximum, and treat faster as materially better. Many teams aim for a few working hours for the first response, even if it’s “looked, will review properly after lunch.” The SLA is for responsiveness, not completed review.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Should reviewers be interrupted by every review request?</h3><p>No. Interrupting deep work for every request trades one team problem for another. The standard compromise is scheduled review blocks (start of day, after lunch) plus an SLA that makes the longest possible wait predictable. Authors can plan around predictable; they can’t plan around silence.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>AI Writes Code Faster Than You Can Review It</title>
      <link>https://pyor.review/blog/ai-writes-code-faster-than-you-can-review</link>
      <guid isPermaLink="true">https://pyor.review/blog/ai-writes-code-faster-than-you-can-review</guid>
      <pubDate>Sat, 20 Jun 2026 08:00:00 GMT</pubDate>
      <description>Authoring got 50% faster; reviewing didn't. Why the AI code review bottleneck is structural, what it does to teams, and the three places to attack it.</description>
      <enclosure url="https://pyor.review/blog/ai-writes-code-faster-than-you-can-review/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/ai-writes-code-faster-than-you-can-review/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">In GitHub’s controlled experiment, developers using Copilot completed a coding task <a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">55% faster</a> than the control group. That was 2022-era tooling: autocomplete, not agents. Nobody has published the companion number, because it doesn’t exist: <em>reviewing</em> a line of code is exactly as expensive as it was in 2019. Human reading didn’t get a model upgrade.</p><blockquote><p><strong>The short answer:</strong> AI made writing code dramatically cheaper while the cost of <strong>understanding</strong> code stayed flat. That asymmetry moves the bottleneck from authoring to review, and no amount of “review harder” fixes a structural imbalance. The fixes are structural too: smaller changes, review pushed upstream of the PR, and a review surface that wastes none of the reviewer’s attention.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Amplifiers amplify both directions</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">There’s a line making the rounds in engineering leadership circles: AI is an amplifier: teams with strong practices get stronger, teams with weak ones get worse. Review is where that cashes out. A team that already wrote small PRs with good descriptions now ships even faster, because review keeps up. A team that tolerated 1,500-line mixed-concern PRs now produces them twice as often, and the review queue, not the roadmap, sets their velocity.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The failure modes are predictable. Diffs grow, because generating is cheap and splitting is work, the trend that made us write <a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">how big should a PR be?</a> Reviewers rubber-stamp, because honest review of the incoming volume is impossible and <em>something</em> has to give. Or reviewers hold the line and become the constraint, absorbing the team’s frustration for doing their job. Pick your dysfunction.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">“Just review less” isn’t the answer: understanding is the product</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">It’s tempting to conclude review is now overpriced ceremony: let CI and the AI reviewer bots gate merges. But code review was never only defect-hunting. Microsoft’s research on review at scale found its biggest delivered values include <a href="https://www.microsoft.com/en-us/research/publication/expectations-outcomes-and-challenges-of-modern-code-review/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">knowledge transfer and shared understanding</a>, not just bugs caught. In the agent era that function gets <em>more</em> important: when a model writes the code, review is the moment a human takes ownership of it. Skip that, and you ship a system nobody on the team understands, a debt with compounding interest.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The three places to attack the asymmetry</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Shrink the unit of review.</strong> Size caps, stacked PRs, splitting norms: everything in the data says this is the highest-leverage move. Small changes are the one thing that makes every other fix cheaper.</li><li><strong>Move review upstream.</strong> The author (or their agent’s supervisor) reads the diff <em>before</em> it becomes a PR (pre-PR review), and an AI first pass clears mechanical noise. Human reviewers should see changes a human has already vouched for, with a checklist like <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">our AI-code review checklist</a> applied.</li><li><strong>Stop taxing the reviewer.</strong> If review is the scarce resource, every lost scroll position, collapsed file, and buried thread is waste of the exact thing you’re short on. This is the lever we work on at <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a>: making the irreducible human part (reading and understanding a diff) as fast as the surface allows, especially for <a href="https://pyor.review/blog/how-to-review-large-pull-requests" class="rule-link text-fg underline-offset-4 hover:text-add">the large PRs</a> that keep coming.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The uncomfortable conclusion</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Most teams’ effective shipping speed is now set by review throughput, not authoring speed, whether they’ve noticed or not. The teams that internalize that will redesign around it: smaller units, upstream review, surfaces that respect reviewer attention. The rest will keep buying faster code generation and wondering why the cycle time didn’t move. The bottleneck doesn’t care how fast you fill the queue.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Won’t AI reviewers eventually close the gap themselves?</h3><p>They’ll keep absorbing the mechanical share of review: bugs, style, obvious edge cases. But review is also the team’s understanding-transfer mechanism: a human vouching that the change is what the team intended. Outsourcing that entirely means nobody on the team understands the system, which is a different and worse bottleneck.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">What’s the single highest-leverage fix?</h3><p>PR size. Every line of evidence, from the Cisco review study to Google’s engineering practices, says small changes get reviewed faster and better. Most other fixes (self-review, AI first passes, better tooling) work best after size is under control.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>GitHub PR Review Alternatives in 2026: An Honest Comparison</title>
      <link>https://pyor.review/blog/github-pr-review-alternatives</link>
      <guid isPermaLink="true">https://pyor.review/blog/github-pr-review-alternatives</guid>
      <pubDate>Thu, 18 Jun 2026 08:00:00 GMT</pubDate>
      <description>GitHub PR review alternatives compared honestly: Graphite's stacks, Stage's AI chapters, Pyor's native surface, or just pulling locally. Which fits your team?</description>
      <enclosure url="https://pyor.review/blog/github-pr-review-alternatives/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/github-pr-review-alternatives/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">First, the disclosure this genre usually buries: <strong>we build one of the tools in this comparison</strong>, <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a>. Read accordingly. We’ll make the case for the others honestly, because they’re good tools attacking the same real problem from different directions, and the right pick genuinely depends on your team.</p><blockquote><p><strong>The map:</strong> Four ways to escape the github.com review experience: <strong>prevent big diffs</strong> (Graphite’s stacked PRs), <strong>add AI guidance to the diff</strong> (Stage’s chapters, CodeRabbit’s bot reviews), <strong>upgrade the surface and let AI triage it</strong> (Pyor), or <strong>pull the branch and review locally</strong> (free, powerful, high friction). They’re mostly complementary, not exclusive.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why teams look beyond github.com for review</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">GitHub is where the PRs live, but its review surface shows its priorities: it’s a code host first. Large diffs paginate and collapse, your place evaporates between visits, review requests drown in notification noise, and there’s no triage: every file gets equal billing whether it’s the core change or a lockfile. None of this is fatal for a 50-line PR. All of it compounds for the 2,000-line ones that keep arriving in the agent era.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Graphite: don’t have big PRs in the first place</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://graphite.com/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Graphite</a> is the workflow cure: stacked pull requests. Break a large change into a sequence of small, dependent PRs; their tooling (CLI, VS Code extension, stack-aware merge queue) makes the bookkeeping bearable, and an AI reviewer plus a PR inbox round out the platform. The case for it is the research: small changes review better, full stop. The honest caveats: stacking is a <em>team-wide workflow change</em> with a real learning curve, the cure doesn’t apply to changes that are legitimately atomic (migrations, codemods), and you’re adopting a platform, not a viewer. If your team has the discipline budget, it’s the structurally right answer. Free trial, then per-seat pricing.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Stage: let AI narrate the diff</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://stagereview.app/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Stage</a> (YC-backed, launched 2026) takes the opposite bet: the diff stays big, but AI organizes it into logical chapters with guidance (what changed, what to double-check), plus an assistant that answers “what’s risky here?” with line citations. Everything syncs back to GitHub. If your reviewers’ bottleneck is <em>orientation</em> (staring at an unfamiliar change with no map), the chaptering is genuinely clever. Our honest reservation (and it’s now a difference of degree, since we ship AI triage too): Stage leans on generated prose you read and trust, chapters plus an assistant, and when the narration and the code disagree you still have to read the code. We keep our AI pointing at the code (groups, one-line labels, hints) rather than narrating it, so there’s less generated text standing between you and the diff. Reviewers who want a fully narrated guide may prefer Stage, and that’s fair. 14-day trial, then paid.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">CodeRabbit and the AI-reviewer bots: a first pass, not a reviewer</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Tools like <a href="https://www.coderabbit.ai/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">CodeRabbit</a> (and GitHub’s own Copilot review) post AI-generated review comments directly on the PR. As a mechanical first pass (obvious bugs, style drift, missed edge cases) they’re cheap and useful, and they run before a human ever looks. The limits are the ones we covered in <a href="https://pyor.review/blog/reviewing-ai-generated-code" class="rule-link text-fg underline-offset-4 hover:text-add">reviewing AI-generated code</a>: the bot doesn’t know your intent, shares blind spots with whatever generated the code, and adds comment volume that someone still has to triage. Adopt one to clear noise; don’t let “the bot approved” become culture.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Pyor: a fast surface, plus AI that organizes the diff</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Our entry, so the claims stay modest and checkable: <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> is a native review surface for existing GitHub PRs (read, comment, approve, and merge in one window, without opening github.com), web first with a desktop app for macOS and Windows. The thesis is that the raw act of reviewing is the bottleneck, so the surface gets the engineering: a file rail built for triage, folder-level viewed tracking, inline threads that stay put, focus mode, and a diff that stays navigable at any size.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Where Pyor uses AI, it organizes rather than narrates. It groups the files by complexity, labels each group in one line, and drops short hints that point you at the parts worth your attention first, so on a big PR you review the right code first (there’s a walkthrough mode that orders the whole thing for you). What it deliberately does not do is generate walls of summary you have to read and then re-check against the code. The AI points at the diff; it never stands in front of it. Free for individuals; paid per-seat for org features. The honest caveats: it’s young, and it’s a viewer, not a workflow platform (no stacking, no merge queue).</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The free option: pull the branch</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><code>git fetch &amp;&amp; git checkout</code> remains a legitimate answer: full editor navigation, run the tests, zero dollars. The cost is friction: stash your work, lose inline commenting, transcribe findings back to GitHub by hand. It’s the power move for the gnarliest changes and overkill for the rest. We compare it properly in a future piece on local vs. browser review.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">At a glance</h2><p><table class="w-full border-collapse text-left text-[0.95rem] leading-[1.5]"><thead><tr class="border-b border-line bg-bg-2/60"><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Tool</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Approach</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Best when</th><th class="px-4 py-3 font-mono text-[11px] uppercase tracking-[0.1em] text-muted">Pricing</th></tr></thead><tbody class="divide-y divide-line-faint"><tr><td class="px-4 py-3 align-top font-medium text-fg">Graphite</td><td class="px-4 py-3 align-top text-fg-2">Stacked PRs + merge queue + AI reviewer</td><td class="px-4 py-3 align-top text-fg-2">The team can adopt a stacking workflow</td><td class="px-4 py-3 align-top text-fg-2">Free trial, then per-seat</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Stage</td><td class="px-4 py-3 align-top text-fg-2">AI chapters + guidance over the diff</td><td class="px-4 py-3 align-top text-fg-2">Reviewers need orientation in unfamiliar changes</td><td class="px-4 py-3 align-top text-fg-2">14-day trial, then paid</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">CodeRabbit (and bots)</td><td class="px-4 py-3 align-top text-fg-2">AI comments posted on the PR</td><td class="px-4 py-3 align-top text-fg-2">Mechanical first pass before human eyes</td><td class="px-4 py-3 align-top text-fg-2">Per-seat</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Pyor</td><td class="px-4 py-3 align-top text-fg-2">Native surface + AI that triages, not narrates</td><td class="px-4 py-3 align-top text-fg-2">The reading itself is the bottleneck</td><td class="px-4 py-3 align-top text-fg-2">Free for individuals; per-seat orgs</td></tr><tr><td class="px-4 py-3 align-top font-medium text-fg">Pull locally</td><td class="px-4 py-3 align-top text-fg-2">Full editor + run the code</td><td class="px-4 py-3 align-top text-fg-2">One gnarly architectural change</td><td class="px-4 py-3 align-top text-fg-2">Free</td></tr></tbody></table></p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">How to actually choose</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Team can adopt a new workflow?</strong> Graphite’s stacking attacks the root cause.</li><li><strong>Reviewers feel lost in unfamiliar changes?</strong> Stage’s chapters give them a map.</li><li><strong>Want mechanical issues caught before humans look?</strong> Add an AI reviewer bot.</li><li><strong>Drowning in big diffs but allergic to walls of AI text?</strong> That’s Pyor: the AI triages and points, you read the code.</li><li><strong>One brutal change, once?</strong> Pull it locally.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">And since they all sync to GitHub, the cheapest experiment is one reviewer trying one tool on one real PR this week, no team buy-in required.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Do these tools replace GitHub?</h3><p>No. Every tool in this comparison sits on top of GitHub pull requests: comments, approvals, and merges sync back to GitHub. You can adopt any of them (or stop using them) without changing where your code lives.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Which alternative is best for large pull requests?</h3><p>It depends on where you want to spend effort. Graphite prevents large PRs by making small stacked ones ergonomic. Stage and CodeRabbit add AI explanation on top of the diff. Pyor uses AI to triage the diff (group files by complexity, one-line group labels, steering hints) on a fast navigable surface, without generating prose you must read. Teams that can adopt stacking should; reviewers who still face big diffs need a better surface for them.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Can I try these without asking my whole team?</h3><p>Mostly yes. Graphite, Stage, and Pyor all work for an individual reviewer on existing GitHub PRs without requiring teammates to change workflow. AI reviewer bots like CodeRabbit are repo-level: they post comments everyone sees, so that one is a team decision.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Reviewing AI-Generated Code: A Practical Checklist</title>
      <link>https://pyor.review/blog/reviewing-ai-generated-code</link>
      <guid isPermaLink="true">https://pyor.review/blog/reviewing-ai-generated-code</guid>
      <pubDate>Tue, 16 Jun 2026 08:00:00 GMT</pubDate>
      <description>How to review AI-generated code: a practical checklist covering intent match, hallucinated APIs, untested edges, security surface, and testing the tests.</description>
      <enclosure url="https://pyor.review/blog/reviewing-ai-generated-code/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/reviewing-ai-generated-code/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Most working developers now have an AI assistant in the loop: <a href="https://survey.stackoverflow.co/2024/ai" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Stack Overflow’s 2024 survey</a> put it at three-quarters of respondents using or planning to use AI tools. That means most code review is now, at least partly, review of generated code. The awkward truth: generated code doesn’t fail the way human code fails, and a checklist tuned for human failure modes will miss it.</p><blockquote><p><strong>The checklist:</strong> <ol class="mt-5 list-decimal space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:font-mono marker:text-[0.9em] marker:text-add"><li>Intent match: does it solve the actual ticket, or a plausible nearby problem?</li><li>Hallucination scan: do all APIs, options, and imports actually exist?</li><li>Edge honesty: error paths, empty states, concurrency. Generated code loves the happy path.</li><li>Test the tests: do they assert requirements, or just mirror the implementation?</li><li>Codebase fit: does it duplicate an existing helper or invent a new pattern?</li><li>Security surface: injected strings, permissive defaults, secrets handling.</li><li>Provenance: did a human read this before requesting review?</li></ol></p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">1. Intent match comes first</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The signature failure of generated code is being a correct answer to a slightly different question. It compiles, it’s idiomatic, the tests pass, and yet it implements a subtly different behavior than the issue asked for, because the prompt (or the model’s reading of the codebase) drifted. Before reading any implementation, re-read the requirement, then check the change’s <em>observable behavior</em> against it. Everything else on this list is cheaper to check than this, which is exactly why it gets skipped.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">2. Verify that everything it calls exists</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Models still invent: a config option that was never real, a method from a different library’s API, an import that resolves only in the model’s memory of an older version. Types and CI catch most of it. The dangerous remainder is the call that exists but does something different than the generated comment claims. If a usage looks unfamiliar, check the docs, not the comment above it.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">3. Audit the edges, not the middle</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Generated code is strongest on the happy path, because that’s where the training data lives. Spend your attention where it’s weakest: error handling that swallows instead of propagating, empty and null inputs, timeouts, partial failures, and any shared state. A quick heuristic: find every <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">catch</code> and every default value, and ask whether a human with context would have chosen it.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">4. Test the tests</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">When the same model writes the code and its tests, the tests often assert what the code <em>does</em>, not what it <em>should do</em>: a tautology with good coverage numbers. Read the assertions against the requirement. The tell: tests with exact-value assertions copied from implementation output, and no test for the case the ticket was actually about.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">5. Check codebase fit</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Generators reach for the median solution from everywhere, not your conventions. Watch for re-implemented helpers that already exist, a third state-management pattern, or styles that fight the file around them. Industry analyses such as <a href="https://www.gitclear.com/coding_on_copilot_data_shows_ais_downward_pressure_on_code_quality" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">GitClear’s code-quality reports</a> have flagged rising duplication and churn alongside AI adoption. Review is where that trend gets stopped, one duplicate helper at a time.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">6. Sweep the security surface</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Generated code inherits the average security posture of its training data, which is not a compliment. String-built SQL or shell commands, permissive CORS, broad IAM defaults, tokens logged “temporarily”. None of these are exotic; all of them show up in generated diffs regularly. If the change touches input handling, auth, or anything that executes, slow down there.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">7. Ask whether a human read it first</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The cheapest quality gate for generated code is upstream of review: the author reading their own diff before requesting eyes. Teams adopting agents are formalizing this as pre-PR review: reading the agent’s work on your own branch <em>before</em> it becomes a pull request. It’s a workflow we believe in enough to have built into <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> (our product, free for individuals): review the agent’s diff locally, leave notes, land a cleaner PR. Your reviewers get changes a human has already vouched for, and this checklist gets shorter every time.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">For the size dimension of the same problem (agents make big diffs cheap), see <a href="https://pyor.review/blog/how-big-should-a-pull-request-be" class="rule-link text-fg underline-offset-4 hover:text-add">how big should a pull request be?</a></p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Should AI-generated code be labeled in pull requests?</h3><p>It helps. Knowing a change was largely generated tells the reviewer which failure modes to prioritize: plausible-but-wrong logic, invented APIs, tests that assert the implementation rather than the requirement. Many teams add a simple description field for it.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Can I use an AI to review AI-generated code?</h3><p>As a first pass, yes. AI reviewers are decent at mechanical issues and obvious bugs, and they’re cheap. But they share blind spots with the generator and don’t know your intent. Use them to clear noise before human review, not to replace it.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is AI-generated code lower quality than human code?</h3><p>It’s differently distributed. Generated code is often locally clean and idiomatic while being wrong about intent or context. Industry analyses (e.g. GitClear’s year-over-year reports) have flagged rising code churn and duplication alongside AI adoption, signals worth watching in your own repo rather than taking on faith.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>How Big Should a Pull Request Be?</title>
      <link>https://pyor.review/blog/how-big-should-a-pull-request-be</link>
      <guid isPermaLink="true">https://pyor.review/blog/how-big-should-a-pull-request-be</guid>
      <pubDate>Sun, 14 Jun 2026 08:00:00 GMT</pubDate>
      <description>The research-backed answer on pull request size: under ~400 changed lines, smaller is better. Where the number comes from, when to break it, how to split.</description>
      <enclosure url="https://pyor.review/blog/how-big-should-a-pull-request-be/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/how-big-should-a-pull-request-be/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every team eventually argues about this number. Here’s the honest version: the research points to a range, not a magic value, and the range is smaller than most teams’ habits.</p><blockquote><p><strong>The short answer:</strong> Aim for <strong>under ~400 changed lines of code per pull request</strong>, and treat smaller as better. <a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">SmartBear’s study of peer review at Cisco</a> found defect-detection ability drops beyond roughly 400 lines, and <a href="https://google.github.io/eng-practices/review/developer/small-cls.html" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Google’s engineering practices</a> push for small changes as the default. Count only lines a human must understand, lockfiles and generated code aside.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Where the ~400-line figure comes from</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The most-cited data point in this debate comes from a large study of peer review at Cisco, popularized by SmartBear: reviewers’ ability to find defects degrades as the change grows, with ~400 lines as the practical ceiling and ~200 as the comfortable middle. It’s old data, gathered on human-written code, but nothing about human working memory has improved since, and it matches what reviewers feel: past a few hundred lines, you stop <em>reviewing</em> and start <em>skimming</em>.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Google’s public review guidance arrives at the same place from experience rather than measurement: small changelists get reviewed faster and more thoroughly, are less likely to import bugs, and are easier to roll back. Their reviewer docs treat “can this be split?” as a standard first question.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Why size matters more than ever</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">AI assistants lowered the cost of <em>producing</em> lines dramatically. In a controlled GitHub experiment, developers with Copilot finished a task <a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">55% faster</a> than the control group. Nothing comparable happened to the cost of <em>understanding</em> lines. When authoring accelerates and review doesn’t, PR size is the valve where the pressure shows up. Holding the size line is how a team keeps review quality while adopting AI tooling.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">When it’s fine to break the rule</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Mechanical bulk:</strong> renames, formatting, codemods, lockfiles, generated artifacts. Reviewers verify legitimacy, not logic, so flag these in the description.</li><li><strong>Migrations and schema changes</strong> that lose meaning when fragmented.</li><li><strong>Coherence beats arithmetic:</strong> a 600-line change with one clear idea reviews better than five 120-line fragments nobody can evaluate alone.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The test isn’t the line count; it’s whether a reviewer can hold the <em>idea</em> of the change in their head. Size is a proxy: a good one, but a proxy.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">How to split a PR that grew</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Refactor first, behavior second.</strong> The classic two-PR split: a no-behavior-change refactor that makes the feature diff small, then the feature.</li><li><strong>Slice vertically.</strong> One thin end-to-end path first (schema → API → UI for one case), then the variations.</li><li><strong>Land the leaves.</strong> Utilities, types, and tests that stand alone can merge ahead of the trunk change that uses them.</li></ul><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">And when the big PR ships anyway</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">It will; agents are prolific and deadlines are real. For the review side of that problem, we wrote a separate field guide: <a href="https://pyor.review/blog/how-to-review-large-pull-requests" class="rule-link text-fg underline-offset-4 hover:text-add">how to review large pull requests</a>. And if the bottleneck is the review surface itself, that’s the problem <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> exists to fix: triage-first file rail, folder-level viewed tracking, and a diff that keeps your place at any size. (Our product; free for individuals.)</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is there an official maximum PR size?</h3><p>No standard body defines one. The most-cited guidance comes from SmartBear’s study of peer review at Cisco (keep reviews under ~400 lines) and Google’s engineering practices (small changes, reviewed quickly). Treat 400 changed lines as a soft ceiling, not a law.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Do generated files and lockfiles count toward PR size?</h3><p>Practically, no. Reviewers scan them for legitimacy rather than reading them. What matters is the number of lines a human must actually understand. A 2,000-line PR that is 1,800 lines of lockfile is a small PR wearing a big coat.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">My AI assistant produces large changes. Should I force-split everything?</h3><p>Split when there is a real seam (refactor vs. behavior change, layer by layer). Don’t manufacture artificial fragments that can’t be understood alone; a coherent 600-line change can beat five incoherent 120-line ones. When a large PR is unavoidable, review it with triage and passes instead.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>How to Review Large Pull Requests (Without Losing Your Mind)</title>
      <link>https://pyor.review/blog/how-to-review-large-pull-requests</link>
      <guid isPermaLink="true">https://pyor.review/blog/how-to-review-large-pull-requests</guid>
      <pubDate>Fri, 12 Jun 2026 08:00:00 GMT</pubDate>
      <description>A practical, step-by-step method for reviewing large pull requests: triage the files that matter, review in passes, and keep your place in a 40-file diff.</description>
      <enclosure url="https://pyor.review/blog/how-to-review-large-pull-requests/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/how-to-review-large-pull-requests/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The 2,000-line PR is in your queue. You didn’t write it, you can’t hold it in your head, and “LGTM” is starting to look morally acceptable. It isn’t, but neither is pretending you’ll read forty files with equal care. Here’s the method we use to review large pull requests properly: triage, passes, and keeping your place.</p><blockquote><p><strong>The method in brief:</strong> <ol class="mt-5 list-decimal space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:font-mono marker:text-[0.9em] marker:text-add"><li>Read the description and commits first. Never start at file one.</li><li>Triage: sort files into core logic, supporting changes, and mechanical noise.</li><li>Review the core deeply, in passes (correctness → design → style).</li><li>Mark files as viewed as you go; protect your place.</li><li>Timebox sessions (~1 hour) and split the review across them.</li><li>Say what you reviewed deeply and what you skimmed.</li></ol></p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Step 1: Don’t start at file one</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">The diff is ordered alphabetically; your understanding shouldn’t be. Read the PR description, then the commit list; commits often reveal the change’s real structure (“refactor first, then feature”) even when the description doesn’t. If the description is missing the <em>why</em>, ask for it before you read a single hunk. That’s not pedantry; it’s the cheapest possible round-trip, and it improves every minute you spend afterward.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Step 2: Triage the files and find the three that matter</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">In almost every large PR, a minority of files carry the actual decision-making. Sort the file list into three buckets before reading anything closely:</p><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Core:</strong> new logic, changed behavior, anything touching state, money, auth, or concurrency. This is where your attention goes.</li><li><strong>Supporting:</strong> call-site updates, types, wiring. Scan for surprises, not for line-by-line correctness.</li><li><strong>Mechanical:</strong> lockfiles, generated code, renames, formatting. Verify they are what they claim (a “rename-only” file with a logic edit hiding inside is a classic), then move on.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Tests deserve a special mention: read them <em>early</em>, not last. Good tests are the best description of intended behavior you’ll get; missing tests for the risky path tell you exactly where to look hardest.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Step 3: Review in passes, not in one sweep</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Trying to judge correctness, design, and style simultaneously is how reviewers burn out and miss things. Make separate passes over the core bucket:</p><ol class="mt-5 list-decimal space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:font-mono marker:text-[0.9em] marker:text-add"><li><strong>Correctness:</strong> does it do what it says? Edge cases, error paths, off-by-ones, assumptions that don’t survive concurrency.</li><li><strong>Design:</strong> is this the right shape? Will the next person extend it or fight it?</li><li><strong>Style and nits:</strong> last, quickly, and labeled as non-blocking. The <a href="https://conventionalcomments.org/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Conventional Comments</a> convention (<code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">nit:</code>, <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">question:</code>, <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">issue:</code>) keeps these from reading like blockers.</li></ol><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Step 4: Protect your place</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Large-diff review fails as much from lost state as from lost attention. Mark files as viewed the moment you finish them. If your tool can mark whole folders viewed, use it to clear the mechanical bucket in one stroke. If you get interrupted (you will), the viewed markers are what makes resuming cost seconds instead of minutes.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Step 5: Timebox, then come back</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2"><a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">SmartBear’s peer-review research</a> puts the practical limits at roughly 60-minute sessions and no more than ~500 lines per hour. Past that, defect detection falls off. For a genuinely big PR that means the review is <em>designed</em> to span sessions. Plan it that way instead of discovering it at minute ninety.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Step 6: Report honestly</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">End with a review summary that says what you actually did: “Read auth flow and migration deeply; scanned call-site updates; trusted generated files.” It calibrates the author’s confidence, tells co-reviewers where to spend <em>their</em> attention, and keeps “approved” meaning something.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Where tooling earns its keep</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Everything above works in any tool, and is less painful in a surface built for it. This is the use case we designed <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a> around: a file rail you can triage and group, folder-level viewed marking, inline threads that stay put, and a focus mode that collapses everything but the code. Full disclosure: we make it, and it’s free for individuals. If your method survives a 2,000-line PR but your tab doesn’t, that’s the gap it fills. For why PRs got this hard in the first place, see <a href="https://pyor.review/blog/why-are-pull-requests-so-hard-to-review" class="rule-link text-fg underline-offset-4 hover:text-add">our earlier piece on the review bottleneck</a>.</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Should I just ask the author to split a large PR?</h3><p>Often yes: splitting is the best outcome when the PR mixes concerns. But ask early (before reviewing in depth), be specific about the seam, and accept that some changes (migrations, generated code, mechanical renames) are legitimately large and better reviewed with triage than split artificially.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">How long should a review session be?</h3><p>SmartBear’s peer-review research recommends sessions of about 60 minutes and not reviewing faster than ~500 lines per hour. For a genuinely large PR, plan multiple short sessions rather than one heroic one; defect detection drops sharply as fatigue sets in.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is it okay to approve a large PR without reading every line?</h3><p>Be honest about what you reviewed. Triage means most attention goes to high-risk files, while mechanical changes get a lighter scan, and that is legitimate. Approving code nobody read is not. Say in your review what you covered deeply and what you skimmed.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
    <item>
      <title>Why Are Pull Requests So Hard to Review?</title>
      <link>https://pyor.review/blog/why-are-pull-requests-so-hard-to-review</link>
      <guid isPermaLink="true">https://pyor.review/blog/why-are-pull-requests-so-hard-to-review</guid>
      <pubDate>Wed, 10 Jun 2026 08:00:00 GMT</pubDate>
      <description>Pull request review is slow because reading code is harder than writing it, and the tools make it worse. The four real causes, and what actually helps.</description>
      <enclosure url="https://pyor.review/blog/why-are-pull-requests-so-hard-to-review/opengraph-image" type="image/png" length="0"/>
      <media:content url="https://pyor.review/blog/why-are-pull-requests-so-hard-to-review/opengraph-image" type="image/png" medium="image" width="1200" height="630"/>
      <content:encoded><![CDATA[<p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Every engineering team we talk to has the same queue: code that’s written, tested, and ready, waiting on review. The author moved on hours ago. The reviewer is dreading the tab. Why is reviewing a pull request so much harder than writing one?</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">It wasn’t always. For most of software’s history the economics ran the other way: writing code was the slow, expensive part (hours or days of design, typing, and debugging per change), and reviewing that change was the comparatively quick read at the end. AI inverted the ratio. Code is now cheap to produce in volume, and on many teams reviewing a change takes longer than writing it did. The bottleneck moved from authoring to review, while our habits and tools are still built for the old ratio.</p><blockquote><p><strong>The short answer:</strong> Pull requests are hard to review for four compounding reasons: <strong>reading code is cognitively harder than writing it</strong>, <strong>diffs are too large</strong> to hold in your head, <strong>the “why” is missing</strong> from most PRs, and <strong>the review surface itself</strong> (a browser tab built for hosting code, not understanding change) fights you on all three.</p></blockquote><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Reading code is harder than writing it</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">When you write code, you build the mental model first and the code falls out of it. When you review code, you’re handed the output and asked to reconstruct the model in reverse. Microsoft Research’s study of code review at scale, <a href="https://www.microsoft.com/en-us/research/publication/expectations-outcomes-and-challenges-of-modern-code-review/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Expectations, Outcomes, and Challenges of Modern Code Review</a>, found exactly this: the number-one challenge reviewers report isn’t finding defects; it’s <em>understanding the change</em> in the first place.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">That asymmetry is the root of everything else. A reviewer doing the job properly is doing archaeology: why this file, why this approach, what else does this touch? Every missing piece of context turns into either a round-trip question or a shrug-and-approve.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Diffs outgrew our working memory</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Review effectiveness falls off a cliff with size. <a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">SmartBear’s analysis of peer review</a> (drawn from a large study at Cisco) recommends keeping reviews under roughly 400 lines of code. Beyond that, the ability to find defects drops measurably. <a href="https://google.github.io/eng-practices/review/developer/small-cls.html" target="_blank" rel="noopener noreferrer" class="rule-link text-fg underline-offset-4 hover:text-add">Google’s engineering practices</a> push the same direction: small changes get reviewed faster, more thoroughly, and with less back-and-forth.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Meanwhile real-world PRs are heading the other way. AI assistants make it cheap to generate four hundred lines before lunch, and refactors ride along with features because splitting feels like overhead. The result: a forty-file diff where three files carry the actual change, and the reviewer has to find them by scrolling.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The “why” never made it into the PR</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Most PR descriptions describe the <em>what</em> (“Add retry logic to sync”), not the <em>why</em> (“Sync fails on flaky hotel wi-fi; we retry 3× with backoff; the risky part is the idempotency assumption in <code class="rounded-[3px] border border-line-faint bg-bg-2 px-1.5 py-0.5 font-mono text-[0.86em] text-fg">applyBatch</code>”). Without the why, a reviewer either reconstructs it from the diff (slow) or reviews superficially. Neither is the reviewer’s fault: nothing in the default workflow demands that context exist.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">The review surface fights you</h2><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">Here’s the part we think gets too little blame: the place where review happens. The standard web diff was designed for hosting and browsing code, and it shows. Files collapse and lose your place. There’s no triage: file one and file forty get equal billing. Comments vanish into resolved threads. Forty open tabs later, the review “session” is really an exercise in remembering where you were.</p><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">None of these is fatal alone. Together they tax exactly the thing review depends on: sustained attention on an unfamiliar change.</p><h2 class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">What actually helps</h2><ul class="mt-5 list-disc space-y-2.5 pl-6 text-[1.08rem] leading-[1.65] text-fg-2 marker:text-add"><li><strong>Smaller PRs, enforced socially or by tooling.</strong> The single highest-leverage change, per both Google and the Cisco data above.</li><li><strong>Authors review first.</strong> A self-review pass catches the cheap stuff before it costs a reviewer’s attention, and writing the “why” down halves the archaeology.</li><li><strong>A review surface built for understanding.</strong> Triage the files that matter, keep your place, see every thread in context, and run the whole read-comment-approve-merge loop without losing state between tabs.</li></ul><p class="mt-5 text-[1.08rem] leading-[1.7] text-fg-2">That last one is the bet we’re making with <a href="https://pyor.review/" class="rule-link text-fg underline-offset-4 hover:text-add">Pyor</a>: a review app where the diff, the conversation, and the merge live in one window, and your code never leaves your machine. We built it because we were the reviewer dreading the tab. (Yes, that’s a product plug. It’s also the reason this blog exists, so we’d rather say it plainly.)</p><h2 id="faq" class="mt-12 scroll-mt-24 font-display text-[clamp(1.5rem,2.6vw,2rem)] font-medium leading-[1.15] text-fg">Frequently asked questions</h2><p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Why do pull requests sit unreviewed for days?</h3><p>Mostly because reviewing feels expensive: large diffs, missing context, and notification noise push reviewers to defer. Reducing PR size and giving reviewers a faster surface for understanding the change shortens the queue more than reminders do.</p></p><p><h3 class="font-display text-[1.15rem] font-medium leading-snug text-fg">Is AI-generated code making review harder?</h3><p>It shifts the bottleneck. AI assistants speed up authoring, so more code arrives per reviewer-hour, and diffs trend larger. The review side (human understanding) has not sped up to match.</p></p></p>]]></content:encoded>
      <author>support@pyor.review (Othman Shareef)</author>
    </item>
  </channel>
</rss>
