
A small team. 15+ PRs a day. Most of them agent-generated. Code was landing faster than people could review. Here's the experiment we built to fix it — and the open-source skill we're releasing to make it work.
We hit a wall earlier this year. Small team, 15+ PRs a day, most of them agent-generated. Code was landing faster than people could review. PRs piled up. Reviews got thinner. The thing that used to be the cleanest part of our workflow — open PR, get two reviews, merge — turned into the weakest link.
The interesting part isn't that this happened. It's that we couldn't fix it the way we used to. The old levers — bigger PRs "to save review time," required reviewer counts, SLA timers, bot reminders — were designed for a world where humans were the bottleneck on writing code, and humans were also doing the reviewing of code. When the writer side gets an order of magnitude faster, every one of those levers misfires.
So we ran an experiment. And it's working well enough that we packaged it
and open-sourced it: ver-pr-writer,
an agent skill that generates reviewer-focused pull request descriptions
using explicit PR signals. You can install it right now:
npx skills add Vermonster/ver-pr-writerThis post is half announcement, half postmortem. The why is the part we wish someone had written down a year ago, so we wrote it down now.
The first thing to internalize is that the bottleneck moved. It used to be code production. Now it's review.
For a long time, "PR review" was shorthand for "a human looks at every line of a diff and decides if it should land." That model is collapsing under agentic coding. When a single small team can produce 15+ PRs a day, and each PR is being generated in part by a model that also produces a perfectly formatted diff but no clue about why the change is correct, the problem isn't reviewer speed. It's that the reviewer's job changed and the process didn't.
Three things start going wrong, all at once:
The first lever people pull is "review faster." That's a trap. The constraint is reviewer attention, not reviewer time, and attention is not something you can buy more of. The real fix is to make each PR cheaper to review correctly. Stop optimizing for the click-through.
A short, honest list, in case you're considering them:
What all of these have in common is that they treat review as a queue-management problem. It isn't. It's a signal-density problem. The fix is upstream of the queue.
A thing started happening in the months leading up to the wall: a lot of what used to eat human review time stopped needing a human.
Agent reviewers and pre-merge checks were catching:
That's most of what a typical PR comment thread is. Not all of it — far
from it — but most of it. And if the machine concerns are handled
upstream, the human review job changes shape. A human reviewer in an
agentic pipeline shouldn't be re-checking that the formatting is
consistent or that the test file has a corresponding .test. They should
be doing the thing only humans are good at:
That's judgment work, not inspection work. The review process we had was built for inspection. So even with the upstream improvements, the PR descriptions themselves were still raw diffs and commit messages, and the reviewers were still trying to reconstruct intent from scratch. The upstream fixes helped; they weren't enough.
So we tried an experiment. Instead of making reviews faster, we made PRs more focused for humans to review.
The hypothesis was simple. A good PR description should let a reviewer answer five questions in under a minute:
If a PR carries all five, a reviewer — human or agent — can do much more than summarize. They can:
If a PR carries none of them, no amount of reviewer time fixes it. The diff is the same, the comments will be the same, and the rubber stamp is the same.
We called this structure PR signals, and we built a vocabulary around it. Nine categories, distilled from the patterns that kept showing up in real PRs — both good and bad:
| Signal | What it answers |
|---|---|
| Intent | What's the change trying to do, and why? What's the change type and scope? |
| Mental model | How does the change work at a system level? What's intentionally unchanged? |
| Change shape | Auto-derived from the diff: size, file count, modules touched, public API changes, test-to-code ratio. |
| Risk | Risk level, risk categories (business logic, data model, security, migration, etc.), blast radius, edge cases, known limitations. |
| Review targeting | Where to focus attention, what's mechanical/noise, suggested review order, questions for the reviewer. |
| Validation | Tests added/changed, kinds of validation (unit, integration, manual, perf), how to test locally, expected behavior. |
| Traceability | Linked issue/ticket/spec, acceptance criteria, follow-up work intentionally deferred, non-goals. |
| Operations | Rollout plan, feature flag status, migration sequencing, monitoring/rollback, config changes, downstream impact. |
| Uncertainty | Confidence level, what's assumed, what's not fully validated, what needs human judgment. |
Two of those — change shape and the mechanical parts of others — can be derived automatically. The rest are author-provided. The author-provided ones are the ones that change review quality the most.
We didn't adopt the whole thing on day one. We adopted the minimum viable set — the categories that consistently produced a real difference in review quality:
Purpose · Mental model · Main changes · Risk level · Risk areas · Review hotspots · How to test locally · Expected behavior · Non-goals · Rollout/migration notes if applicable
That was enough to transform the process. We started requiring those sections on every PR. We started teaching agents to generate them. And we started tracking review quality signals, not just review throughput.
The results, after a few months:
It was the smallest intervention that produced the largest change.
ver-pr-writerHere's the part where we admit we did eventually build a thing.
ver-pr-writer is an
agent skill that does the PR signal work for you. You point it at a
branch, and it inspects the diff, commit messages, changed files, and
test coverage, classifies the change, surfaces risk and uncertainty, and
produces a structured PR description that both humans and agents can act
on immediately.
npx skills add Vermonster/ver-pr-writerYou can also install it for a specific agent:
npx skills add Vermonster/ver-pr-writer -a github-copilot
npx skills add Vermonster/ver-pr-writer -a claude-code
npx skills add Vermonster/ver-pr-writer -a cursorIt runs in two modes:
gh CLI). Always confirms
before doing anything destructive. New PRs are created as drafts by
default.The skill ships with everything you need to make the workflow stick in your team:
| File | Purpose |
|---|---|
skills/ver-pr-writer/SKILL.md | Agent instructions for generating and validating PR descriptions |
skills/ver-pr-writer/reference/template.md | The output template the agent follows |
skills/ver-pr-writer/reference/pr-signals.md | Team-facing explanation of what PR signals are and why they exist |
skills/ver-pr-writer/reference/pr-template.md | A GitHub PR template your team can adopt |
skills/ver-pr-writer/reference/pr-signal-check.yml | A CI workflow that enforces the required sections |
The skill also has a built-in mismatch detector. After it drafts the description, it goes back and checks the generated signals against the actual diff — catching things like "stated as low risk, but the diff touches auth, config, and persistence," or "refactor that adds behavior and a migration." Those are the exact mismatches that turn into production incidents, and they're the ones human reviewers miss when they're tired at the 14th PR of the day.
You don't have to use the whole skill to get value. The shortest path that works:
reference/pr-template.md into your
repo as .github/pull_request_template.md. Now every PR has the
signal structure as the default scaffolding.reference/pr-signal-check.yml into
.github/workflows/. Now required sections are enforced, not
optional. The check is intentionally soft — it tells you what's
missing, it doesn't block the PR — but the visibility is enough.If you only do step 1, you'll get the structural effect (PRs carry context). If you do steps 1 and 2, you'll get the team-wide effect (every PR has the same shape, so reviewers know what to look for). If you do all three, you get the compound effect: humans and agents operate against the same signal contract.
We recommend doing all three. We've also found that the order matters — install the skill after the template is in place, so the agent has something concrete to follow rather than improvising.
A few things this isn't, so nobody's surprised:
We built this for ourselves first and shared it second. That order matters: the v1 reflects what we needed, not necessarily what you need. So:
You can find the project at
github.com/Vermonster/ver-pr-writer.
The full reasoning behind the signal categories lives in
MOTIVATION.md
in the repo — it's the long version of what we just walked through
here.
Here's the thing under the part: the AI coding wave didn't break PR review. It revealed that PR review was always the wrong shape. The old model — humans reading every line, catching every nit, slow and careful — was a luxury that a low-throughput development process could afford. As soon as code production sped up, the old model stopped working. The question was always going to arrive. It just arrived faster than we expected.
The fix isn't to slow code production back down. It's to redesign the review layer for the world we're actually in. Signal-structured PRs, agent-generated or human-authored, are a small part of that. Domain expert pairing, judgment-focused reviewer roles, agentic pre-merge checks, and a dozen other shifts are all part of it. None of them are optional, and none of them are a substitute for caring about what ships.
The PR bottleneck isn't a process problem. It's a signal problem. We've been treating it as a process problem. That's why the old fixes didn't work. Better signals do.
ver-pr-writer is one experiment in fixing it. Try it. Break it. Tell
us where it lands short. The next version should be shaped by the
teams using it, not just by the team that wrote it.
Thanks for reading. And if you're a small team drowning in PRs right now: you're not alone, and you're not doing it wrong. The system was doing it wrong. It's getting fixed.