<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pyor</title>
    <description>The latest articles on DEV Community by Pyor (pyor).</description>
    <link>https://dev.to/pyor</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F13903%2F44c40a22-0c32-45f2-8583-e9d15712826d.png</url>
      <title>DEV Community: Pyor</title>
      <link>https://dev.to/pyor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pyor"/>
    <language>en</language>
    <item>
      <title>Reviewing PRs Locally vs. in the Browser</title>
      <dc:creator>Othman Shareef</dc:creator>
      <pubDate>Wed, 24 Jun 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/pyor/reviewing-prs-locally-vs-in-the-browser-3d07</link>
      <guid>https://dev.to/pyor/reviewing-prs-locally-vs-in-the-browser-3d07</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; &lt;br&gt;
&lt;strong&gt;Pull the branch&lt;/strong&gt; 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. &lt;strong&gt;Stay in the browser&lt;/strong&gt; for small, self-contained diffs where inline comments and speed matter more. The deciding question: &lt;em&gt;do I need to see more than the diff shows?&lt;/em&gt; If yes, pull.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What local review actually buys you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Navigation.&lt;/strong&gt; Go-to-definition, find-references, the call hierarchy: the diff shows what changed; the editor shows what the change &lt;em&gt;touches&lt;/em&gt;. For judging a refactor or an API change, that difference is the review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution.&lt;/strong&gt; Run the tests, poke the feature, profile the hot path. The web diff asks you to trust; the checkout lets you verify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your tools.&lt;/strong&gt; Your keybindings, your linters, your search. Reviewing in an environment tuned over years beats any vendor’s viewer for raw reading throughput.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context switching.&lt;/strong&gt; Stash or commit your work, switch branches (or maintain a second worktree), restore state afterward. &lt;code&gt;gh pr checkout&lt;/code&gt; makes the fetch cheap; nothing makes the interruption cheap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The transcription tax.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No shared state.&lt;/strong&gt; Viewed-file tracking, resolved threads, suggested changes: the collaborative review machinery doesn’t follow you into the editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A decision rule that holds up
&lt;/h2&gt;

&lt;p&gt;Pull the branch when the review question is &lt;em&gt;architectural or behavioral&lt;/em&gt;: does this design hold, does this actually work, what does this break elsewhere. Stay in the diff when the question is &lt;em&gt;local correctness&lt;/em&gt;: is this logic right, are the edges handled, is it consistent. Mixed PRs (most &lt;a href="https://pyor.review/blog/how-to-review-large-pull-requests" rel="noopener noreferrer"&gt;large ones&lt;/a&gt;) often deserve both: a browser pass for triage and threads, a checkout for the two files where the real decision lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap both modes leave
&lt;/h2&gt;

&lt;p&gt;Notice the shape of the trade: one mode has the &lt;em&gt;context&lt;/em&gt; (editor) and the other has the &lt;em&gt;conversation&lt;/em&gt; (browser), and review needs both. That gap is the design brief we started &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt; 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) &lt;em&gt;and&lt;/em&gt; 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: &lt;a href="https://pyor.review/security" rel="noopener noreferrer"&gt;your code never passes through our servers&lt;/a&gt;. 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 &lt;em&gt;read&lt;/em&gt; comfortably.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you take one habit from this
&lt;/h2&gt;

&lt;p&gt;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 &lt;em&gt;what does this change need from me?&lt;/em&gt; 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.&lt;/p&gt;

&lt;h2 id="faq"&gt;Frequently asked questions&lt;/h2&gt;

&lt;h3&gt;How do I check out a PR branch quickly?&lt;/h3&gt;

&lt;p&gt;With GitHub’s CLI: gh pr checkout &amp;lt;number&amp;gt; fetches and switches to the PR branch in one step. Add --detach to avoid creating a local branch you’ll forget to delete.&lt;/p&gt;

&lt;h3&gt;Do I lose the ability to comment when reviewing locally?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>github</category>
      <category>codereview</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop Losing Review Requests: Fixing the PR Review Inbox</title>
      <dc:creator>Othman Shareef</dc:creator>
      <pubDate>Mon, 22 Jun 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/pyor/stop-losing-review-requests-fixing-the-pr-review-inbox-4oa1</link>
      <guid>https://dev.to/pyor/stop-losing-review-requests-fixing-the-pr-review-inbox-4oa1</guid>
      <description>&lt;p&gt;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 &lt;em&gt;everything&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; 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 &lt;strong&gt;filtered view that shows only what waits on you&lt;/strong&gt;, a &lt;strong&gt;team SLA for first response&lt;/strong&gt; (Google’s guidance: one business day, maximum), and &lt;strong&gt;scheduled review blocks&lt;/strong&gt; so the queue gets drained on purpose instead of by guilt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why the default funnel fails
&lt;/h2&gt;

&lt;p&gt;The notification stream is unranked and unbounded: a review request, the one item where a teammate is &lt;em&gt;blocked on you&lt;/em&gt;, 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make a view that answers “who waits on me?”
&lt;/h2&gt;

&lt;p&gt;GitHub’s own search can build a serviceable inbox; most developers just never wire it up. Bookmark these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;is:open is:pr review-requested:@me archived:false&lt;/code&gt;: everything explicitly waiting on your review, across all repos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;is:open is:pr reviewed-by:@me -review-requested:@me&lt;/code&gt;: PRs you reviewed that may have replied to you (re-review limbo, the second-biggest leak).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;is:open is:pr author:@me review:changes_requested&lt;/code&gt;: your own PRs blocked on &lt;em&gt;your&lt;/em&gt; response; authors leak too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The discipline is checking the views on a schedule, which is the next fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  An SLA plus review blocks beats heroics
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://google.github.io/eng-practices/review/reviewer/speed.html" rel="noopener noreferrer"&gt;Google’s review-speed guidance&lt;/a&gt; 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 &lt;strong&gt;scheduled review blocks&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drain the queue by unblock value, not arrival order
&lt;/h2&gt;

&lt;p&gt;When the block starts, don’t review oldest-first. Triage by what unblocks the most: PRs with &lt;em&gt;no&lt;/em&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling: this is a solved-shape problem
&lt;/h2&gt;

&lt;p&gt;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 &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt; (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 &lt;em&gt;you&lt;/em&gt; 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 &lt;a href="https://pyor.review/blog/how-to-review-large-pull-requests" rel="noopener noreferrer"&gt;reviewing large PRs&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="faq"&gt;Frequently asked questions&lt;/h2&gt;

&lt;h3&gt;What’s a reasonable SLA for first review response?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;Should reviewers be interrupted by every review request?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>github</category>
      <category>codereview</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AI Writes Code Faster Than You Can Review It</title>
      <dc:creator>Othman Shareef</dc:creator>
      <pubDate>Sat, 20 Jun 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/pyor/ai-writes-code-faster-than-you-can-review-it-3kfm</link>
      <guid>https://dev.to/pyor/ai-writes-code-faster-than-you-can-review-it-3kfm</guid>
      <description>&lt;p&gt;In GitHub’s controlled experiment, developers using Copilot completed a coding task &lt;a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/" rel="noopener noreferrer"&gt;55% faster&lt;/a&gt; than the control group. That was 2022-era tooling: autocomplete, not agents. Nobody has published the companion number, because it doesn’t exist: &lt;em&gt;reviewing&lt;/em&gt; a line of code is exactly as expensive as it was in 2019. Human reading didn’t get a model upgrade.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; AI made writing code dramatically cheaper while the cost of &lt;strong&gt;understanding&lt;/strong&gt; 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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Amplifiers amplify both directions
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;The failure modes are predictable. Diffs grow, because generating is cheap and splitting is work, the trend that made us write &lt;a href="https://pyor.review/blog/how-big-should-a-pull-request-be" rel="noopener noreferrer"&gt;how big should a PR be?&lt;/a&gt; Reviewers rubber-stamp, because honest review of the incoming volume is impossible and &lt;em&gt;something&lt;/em&gt; has to give. Or reviewers hold the line and become the constraint, absorbing the team’s frustration for doing their job. Pick your dysfunction.&lt;/p&gt;

&lt;h2&gt;
  
  
  “Just review less” isn’t the answer: understanding is the product
&lt;/h2&gt;

&lt;p&gt;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 &lt;a href="https://www.microsoft.com/en-us/research/publication/expectations-outcomes-and-challenges-of-modern-code-review/" rel="noopener noreferrer"&gt;knowledge transfer and shared understanding&lt;/a&gt;, not just bugs caught. In the agent era that function gets &lt;em&gt;more&lt;/em&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three places to attack the asymmetry
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shrink the unit of review.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move review upstream.&lt;/strong&gt; The author (or their agent’s supervisor) reads the diff &lt;em&gt;before&lt;/em&gt; 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 &lt;a href="https://pyor.review/blog/reviewing-ai-generated-code" rel="noopener noreferrer"&gt;our AI-code review checklist&lt;/a&gt; applied.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop taxing the reviewer.&lt;/strong&gt; 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 &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt;: making the irreducible human part (reading and understanding a diff) as fast as the surface allows, especially for &lt;a href="https://pyor.review/blog/how-to-review-large-pull-requests" rel="noopener noreferrer"&gt;the large PRs&lt;/a&gt; that keep coming.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The uncomfortable conclusion
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2 id="faq"&gt;Frequently asked questions&lt;/h2&gt;

&lt;h3&gt;Won’t AI reviewers eventually close the gap themselves?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;What’s the single highest-leverage fix?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>codereview</category>
      <category>programming</category>
    </item>
    <item>
      <title>GitHub PR Review Alternatives in 2026: An Honest Comparison</title>
      <dc:creator>Othman Shareef</dc:creator>
      <pubDate>Thu, 18 Jun 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/pyor/github-pr-review-alternatives-in-2026-an-honest-comparison-4m0h</link>
      <guid>https://dev.to/pyor/github-pr-review-alternatives-in-2026-an-honest-comparison-4m0h</guid>
      <description>&lt;p&gt;First, the disclosure this genre usually buries: &lt;strong&gt;we build one of the tools in this comparison&lt;/strong&gt; , &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt;. 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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The map:&lt;/strong&gt; Four ways to escape the github.com review experience: &lt;strong&gt;prevent big diffs&lt;/strong&gt; (Graphite’s stacked PRs), &lt;strong&gt;add AI guidance to the diff&lt;/strong&gt; (Stage’s chapters, CodeRabbit’s bot reviews), &lt;strong&gt;upgrade the surface and let AI triage it&lt;/strong&gt; (Pyor), or &lt;strong&gt;pull the branch and review locally&lt;/strong&gt; (free, powerful, high friction). They’re mostly complementary, not exclusive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why teams look beyond github.com for review
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Graphite: don’t have big PRs in the first place
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://graphite.com/" rel="noopener noreferrer"&gt;Graphite&lt;/a&gt; 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 &lt;em&gt;team-wide workflow change&lt;/em&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage: let AI narrate the diff
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://stagereview.app/" rel="noopener noreferrer"&gt;Stage&lt;/a&gt; (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 &lt;em&gt;orientation&lt;/em&gt; (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.&lt;/p&gt;

&lt;h2&gt;
  
  
  CodeRabbit and the AI-reviewer bots: a first pass, not a reviewer
&lt;/h2&gt;

&lt;p&gt;Tools like &lt;a href="https://www.coderabbit.ai/" rel="noopener noreferrer"&gt;CodeRabbit&lt;/a&gt; (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 &lt;a href="https://pyor.review/blog/reviewing-ai-generated-code" rel="noopener noreferrer"&gt;reviewing AI-generated code&lt;/a&gt;: 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pyor: a fast surface, plus AI that organizes the diff
&lt;/h2&gt;

&lt;p&gt;Our entry, so the claims stay modest and checkable: &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;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).&lt;/p&gt;

&lt;h2&gt;
  
  
  The free option: pull the branch
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;git fetch &amp;amp;&amp;amp; git checkout&lt;/code&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  At a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Best when&lt;/th&gt;
&lt;th&gt;Pricing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Graphite&lt;/td&gt;
&lt;td&gt;Stacked PRs + merge queue + AI reviewer&lt;/td&gt;
&lt;td&gt;The team can adopt a stacking workflow&lt;/td&gt;
&lt;td&gt;Free trial, then per-seat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stage&lt;/td&gt;
&lt;td&gt;AI chapters + guidance over the diff&lt;/td&gt;
&lt;td&gt;Reviewers need orientation in unfamiliar changes&lt;/td&gt;
&lt;td&gt;14-day trial, then paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodeRabbit (and bots)&lt;/td&gt;
&lt;td&gt;AI comments posted on the PR&lt;/td&gt;
&lt;td&gt;Mechanical first pass before human eyes&lt;/td&gt;
&lt;td&gt;Per-seat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pyor&lt;/td&gt;
&lt;td&gt;Native surface + AI that triages, not narrates&lt;/td&gt;
&lt;td&gt;The reading itself is the bottleneck&lt;/td&gt;
&lt;td&gt;Free for individuals; per-seat orgs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pull locally&lt;/td&gt;
&lt;td&gt;Full editor + run the code&lt;/td&gt;
&lt;td&gt;One gnarly architectural change&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How to actually choose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Team can adopt a new workflow?&lt;/strong&gt; Graphite’s stacking attacks the root cause.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewers feel lost in unfamiliar changes?&lt;/strong&gt; Stage’s chapters give them a map.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want mechanical issues caught before humans look?&lt;/strong&gt; Add an AI reviewer bot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drowning in big diffs but allergic to walls of AI text?&lt;/strong&gt; That’s Pyor: the AI triages and points, you read the code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One brutal change, once?&lt;/strong&gt; Pull it locally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2 id="faq"&gt;Frequently asked questions&lt;/h2&gt;

&lt;h3&gt;Do these tools replace GitHub?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;Which alternative is best for large pull requests?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;Can I try these without asking my whole team?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>github</category>
      <category>codereview</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Reviewing AI-Generated Code: A Practical Checklist</title>
      <dc:creator>Othman Shareef</dc:creator>
      <pubDate>Tue, 16 Jun 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/pyor/reviewing-ai-generated-code-a-practical-checklist-4017</link>
      <guid>https://dev.to/pyor/reviewing-ai-generated-code-a-practical-checklist-4017</guid>
      <description>&lt;p&gt;Most working developers now have an AI assistant in the loop: &lt;a href="https://survey.stackoverflow.co/2024/ai" rel="noopener noreferrer"&gt;Stack Overflow’s 2024 survey&lt;/a&gt; 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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The checklist:&lt;/strong&gt; &lt;/p&gt;
&lt;ol&gt;

&lt;li&gt;Intent match: does it solve the actual ticket, or a plausible nearby problem?&lt;/li&gt;

&lt;li&gt;Hallucination scan: do all APIs, options, and imports actually exist?&lt;/li&gt;

&lt;li&gt;Edge honesty: error paths, empty states, concurrency. Generated code loves the happy path.&lt;/li&gt;

&lt;li&gt;Test the tests: do they assert requirements, or just mirror the implementation?&lt;/li&gt;

&lt;li&gt;Codebase fit: does it duplicate an existing helper or invent a new pattern?&lt;/li&gt;

&lt;li&gt;Security surface: injected strings, permissive defaults, secrets handling.&lt;/li&gt;

&lt;li&gt;Provenance: did a human read this before requesting review?&lt;/li&gt;

&lt;/ol&gt;

&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1. Intent match comes first
&lt;/h2&gt;

&lt;p&gt;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 &lt;em&gt;observable behavior&lt;/em&gt; against it. Everything else on this list is cheaper to check than this, which is exactly why it gets skipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Verify that everything it calls exists
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Audit the edges, not the middle
&lt;/h2&gt;

&lt;p&gt;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 &lt;code&gt;catch&lt;/code&gt; and every default value, and ask whether a human with context would have chosen it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Test the tests
&lt;/h2&gt;

&lt;p&gt;When the same model writes the code and its tests, the tests often assert what the code &lt;em&gt;does&lt;/em&gt;, not what it &lt;em&gt;should do&lt;/em&gt;: 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Check codebase fit
&lt;/h2&gt;

&lt;p&gt;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 &lt;a href="https://www.gitclear.com/coding_on_copilot_data_shows_ais_downward_pressure_on_code_quality" rel="noopener noreferrer"&gt;GitClear’s code-quality reports&lt;/a&gt; have flagged rising duplication and churn alongside AI adoption. Review is where that trend gets stopped, one duplicate helper at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Sweep the security surface
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Ask whether a human read it first
&lt;/h2&gt;

&lt;p&gt;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 &lt;em&gt;before&lt;/em&gt; it becomes a pull request. It’s a workflow we believe in enough to have built into &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt; (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.&lt;/p&gt;

&lt;p&gt;For the size dimension of the same problem (agents make big diffs cheap), see &lt;a href="https://pyor.review/blog/how-big-should-a-pull-request-be" rel="noopener noreferrer"&gt;how big should a pull request be?&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="faq"&gt;Frequently asked questions&lt;/h2&gt;

&lt;h3&gt;Should AI-generated code be labeled in pull requests?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;Can I use an AI to review AI-generated code?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;Is AI-generated code lower quality than human code?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>codereview</category>
      <category>programming</category>
    </item>
    <item>
      <title>How Big Should a Pull Request Be?</title>
      <dc:creator>Othman Shareef</dc:creator>
      <pubDate>Sun, 14 Jun 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/pyor/how-big-should-a-pull-request-be-5hkk</link>
      <guid>https://dev.to/pyor/how-big-should-a-pull-request-be-5hkk</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; Aim for &lt;strong&gt;under ~400 changed lines of code per pull request&lt;/strong&gt;, and treat smaller as better. &lt;a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" rel="noopener noreferrer"&gt;SmartBear’s study of peer review at Cisco&lt;/a&gt; found defect-detection ability drops beyond roughly 400 lines, and &lt;a href="https://google.github.io/eng-practices/review/developer/small-cls.html" rel="noopener noreferrer"&gt;Google’s engineering practices&lt;/a&gt; push for small changes as the default. Count only lines a human must understand, lockfiles and generated code aside.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Where the ~400-line figure comes from
&lt;/h2&gt;

&lt;p&gt;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 &lt;em&gt;reviewing&lt;/em&gt; and start &lt;em&gt;skimming&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why size matters more than ever
&lt;/h2&gt;

&lt;p&gt;AI assistants lowered the cost of &lt;em&gt;producing&lt;/em&gt; lines dramatically. In a controlled GitHub experiment, developers with Copilot finished a task &lt;a href="https://github.blog/news-insights/research/research-quantifying-github-copilots-impact-on-developer-productivity-and-happiness/" rel="noopener noreferrer"&gt;55% faster&lt;/a&gt; than the control group. Nothing comparable happened to the cost of &lt;em&gt;understanding&lt;/em&gt; 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it’s fine to break the rule
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mechanical bulk:&lt;/strong&gt; renames, formatting, codemods, lockfiles, generated artifacts. Reviewers verify legitimacy, not logic, so flag these in the description.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrations and schema changes&lt;/strong&gt; that lose meaning when fragmented.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coherence beats arithmetic:&lt;/strong&gt; a 600-line change with one clear idea reviews better than five 120-line fragments nobody can evaluate alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The test isn’t the line count; it’s whether a reviewer can hold the &lt;em&gt;idea&lt;/em&gt; of the change in their head. Size is a proxy: a good one, but a proxy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to split a PR that grew
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Refactor first, behavior second.&lt;/strong&gt; The classic two-PR split: a no-behavior-change refactor that makes the feature diff small, then the feature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slice vertically.&lt;/strong&gt; One thin end-to-end path first (schema → API → UI for one case), then the variations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Land the leaves.&lt;/strong&gt; Utilities, types, and tests that stand alone can merge ahead of the trunk change that uses them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  And when the big PR ships anyway
&lt;/h2&gt;

&lt;p&gt;It will; agents are prolific and deadlines are real. For the review side of that problem, we wrote a separate field guide: &lt;a href="https://pyor.review/blog/how-to-review-large-pull-requests" rel="noopener noreferrer"&gt;how to review large pull requests&lt;/a&gt;. And if the bottleneck is the review surface itself, that’s the problem &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt; 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.)&lt;/p&gt;

&lt;h2 id="faq"&gt;Frequently asked questions&lt;/h2&gt;

&lt;h3&gt;Is there an official maximum PR size?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;Do generated files and lockfiles count toward PR size?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;My AI assistant produces large changes. Should I force-split everything?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>github</category>
      <category>codereview</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Review Large Pull Requests (Without Losing Your Mind)</title>
      <dc:creator>Othman Shareef</dc:creator>
      <pubDate>Fri, 12 Jun 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/pyor/how-to-review-large-pull-requests-without-losing-your-mind-2bg1</link>
      <guid>https://dev.to/pyor/how-to-review-large-pull-requests-without-losing-your-mind-2bg1</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The method in brief:&lt;/strong&gt; &lt;/p&gt;
&lt;ol&gt;

&lt;li&gt;Read the description and commits first. Never start at file one.&lt;/li&gt;

&lt;li&gt;Triage: sort files into core logic, supporting changes, and mechanical noise.&lt;/li&gt;

&lt;li&gt;Review the core deeply, in passes (correctness → design → style).&lt;/li&gt;

&lt;li&gt;Mark files as viewed as you go; protect your place.&lt;/li&gt;

&lt;li&gt;Timebox sessions (~1 hour) and split the review across them.&lt;/li&gt;

&lt;li&gt;Say what you reviewed deeply and what you skimmed.&lt;/li&gt;

&lt;/ol&gt;

&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 1: Don’t start at file one
&lt;/h2&gt;

&lt;p&gt;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 &lt;em&gt;why&lt;/em&gt;, 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Triage the files and find the three that matter
&lt;/h2&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core:&lt;/strong&gt; new logic, changed behavior, anything touching state, money, auth, or concurrency. This is where your attention goes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporting:&lt;/strong&gt; call-site updates, types, wiring. Scan for surprises, not for line-by-line correctness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mechanical:&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tests deserve a special mention: read them &lt;em&gt;early&lt;/em&gt;, 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Review in passes, not in one sweep
&lt;/h2&gt;

&lt;p&gt;Trying to judge correctness, design, and style simultaneously is how reviewers burn out and miss things. Make separate passes over the core bucket:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Correctness:&lt;/strong&gt; does it do what it says? Edge cases, error paths, off-by-ones, assumptions that don’t survive concurrency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design:&lt;/strong&gt; is this the right shape? Will the next person extend it or fight it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style and nits:&lt;/strong&gt; last, quickly, and labeled as non-blocking. The &lt;a href="https://conventionalcomments.org/" rel="noopener noreferrer"&gt;Conventional Comments&lt;/a&gt; convention (&lt;code&gt;nit:&lt;/code&gt;, &lt;code&gt;question:&lt;/code&gt;, &lt;code&gt;issue:&lt;/code&gt;) keeps these from reading like blockers.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 4: Protect your place
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Timebox, then come back
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" rel="noopener noreferrer"&gt;SmartBear’s peer-review research&lt;/a&gt; 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 &lt;em&gt;designed&lt;/em&gt; to span sessions. Plan it that way instead of discovering it at minute ninety.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Report honestly
&lt;/h2&gt;

&lt;p&gt;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 &lt;em&gt;their&lt;/em&gt; attention, and keeps “approved” meaning something.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where tooling earns its keep
&lt;/h2&gt;

&lt;p&gt;Everything above works in any tool, and is less painful in a surface built for it. This is the use case we designed &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt; 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 &lt;a href="https://pyor.review/blog/why-are-pull-requests-so-hard-to-review" rel="noopener noreferrer"&gt;our earlier piece on the review bottleneck&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="faq"&gt;Frequently asked questions&lt;/h2&gt;

&lt;h3&gt;Should I just ask the author to split a large PR?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;How long should a review session be?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;Is it okay to approve a large PR without reading every line?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>github</category>
      <category>codereview</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Are Pull Requests So Hard to Review?</title>
      <dc:creator>Othman Shareef</dc:creator>
      <pubDate>Wed, 10 Jun 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/pyor/why-are-pull-requests-so-hard-to-review-2813</link>
      <guid>https://dev.to/pyor/why-are-pull-requests-so-hard-to-review-2813</guid>
      <description>&lt;p&gt;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?&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The short answer:&lt;/strong&gt; Pull requests are hard to review for four compounding reasons: &lt;strong&gt;reading code is cognitively harder than writing it&lt;/strong&gt;, &lt;strong&gt;diffs are too large&lt;/strong&gt; to hold in your head, &lt;strong&gt;the “why” is missing&lt;/strong&gt; from most PRs, and &lt;strong&gt;the review surface itself&lt;/strong&gt; (a browser tab built for hosting code, not understanding change) fights you on all three.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Reading code is harder than writing it
&lt;/h2&gt;

&lt;p&gt;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, &lt;a href="https://www.microsoft.com/en-us/research/publication/expectations-outcomes-and-challenges-of-modern-code-review/" rel="noopener noreferrer"&gt;Expectations, Outcomes, and Challenges of Modern Code Review&lt;/a&gt;, found exactly this: the number-one challenge reviewers report isn’t finding defects; it’s &lt;em&gt;understanding the change&lt;/em&gt; in the first place.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diffs outgrew our working memory
&lt;/h2&gt;

&lt;p&gt;Review effectiveness falls off a cliff with size. &lt;a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" rel="noopener noreferrer"&gt;SmartBear’s analysis of peer review&lt;/a&gt; (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. &lt;a href="https://google.github.io/eng-practices/review/developer/small-cls.html" rel="noopener noreferrer"&gt;Google’s engineering practices&lt;/a&gt; push the same direction: small changes get reviewed faster, more thoroughly, and with less back-and-forth.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The “why” never made it into the PR
&lt;/h2&gt;

&lt;p&gt;Most PR descriptions describe the &lt;em&gt;what&lt;/em&gt; (“Add retry logic to sync”), not the &lt;em&gt;why&lt;/em&gt; (“Sync fails on flaky hotel wi-fi; we retry 3× with backoff; the risky part is the idempotency assumption in &lt;code&gt;applyBatch&lt;/code&gt;”). 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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The review surface fights you
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;None of these is fatal alone. Together they tax exactly the thing review depends on: sustained attention on an unfamiliar change.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually helps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smaller PRs, enforced socially or by tooling.&lt;/strong&gt; The single highest-leverage change, per both Google and the Cisco data above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authors review first.&lt;/strong&gt; A self-review pass catches the cheap stuff before it costs a reviewer’s attention, and writing the “why” down halves the archaeology.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A review surface built for understanding.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is the bet we’re making with &lt;a href="https://pyor.review/" rel="noopener noreferrer"&gt;Pyor&lt;/a&gt;: 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.)&lt;/p&gt;

&lt;h2 id="faq"&gt;Frequently asked questions&lt;/h2&gt;

&lt;h3&gt;Why do pull requests sit unreviewed for days?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;Is AI-generated code making review harder?&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

</description>
      <category>github</category>
      <category>pr</category>
      <category>review</category>
      <category>code</category>
    </item>
  </channel>
</rss>
