Writing
Claude Code vs Cursor vs Codex: reviewing what they write
The three agents produce differently shaped changes with different failure modes. What to look for in a pull request from each, and what does not change.
A question that comes up often enough to be worth answering directly: does reviewing a pull request from Claude Code differ from reviewing one from Cursor, or from Codex?
The short answer is that the code does not differ in any way you should review differently, but the circumstances do — and the circumstances are what decide how much review a change actually gets.
To be precise about what is and is not being claimed here, because this is a topic where confident comparisons usually outrun the evidence: we have no measured data showing that one agent produces better or worse code than another, and we are not going to invent any. What is observable, and what actually matters, is how a change reaches you.
The variable that matters is not the model
Three agents, three delivery models:
Claude Code runs in your terminal and works in long autonomous stretches. You give it a task, it goes away, and it comes back having touched whatever it needed to touch. It will often commit as it goes. The distinguishing feature for a reviewer is that you were not watching — the change arrives whole, and the intermediate reasoning that produced it is in a session log rather than in the diff.
Cursor lives in your editor. In its more incremental modes you see edits as they land, which means some review already happened, informally, as you accepted them. In its agentic modes it behaves much more like the first case. The trap here is specific: partial familiarity feels like review. You watched eleven of the forty edits and your brain files the change as "seen".
Codex runs asynchronously, off your machine, and hands you a finished pull request. This is the most honest of the three, because nothing about the workflow tempts you into thinking you already reviewed it. It arrives exactly as a stranger's PR would, and gets treated accordingly.
Notice that none of those differences are about code quality. They are about how much unearned confidence you bring to the review.
The specifics of each, one page per agent: Claude Code, Cursor, Codex.
The failure mode each one encourages
After a long autonomous run, the risk is scope. The agent solved the task, and also fixed three things it noticed on the way, and also refactored a helper it found awkward. Each is defensible; together they are a change that does four things, and a change that does four things is one you cannot describe in a sentence.
What to check: count the distinct structural changes. If there are more than two or three, the PR should probably be split, no matter how coherent it looks.
After an in-editor session, the risk is the unwatched remainder. You accepted the edits you were shown and the agent made others. Nothing feels unreviewed, because the parts you remember were reviewed.
What to check: the files you do not remember. Sort the changed files by whether you can recall seeing them, and read the ones you cannot. This is a genuinely uncomfortable exercise and it is the single most valuable one on this list.
After an async task, the risk is context. The agent could not ask you anything, so it made assumptions and encoded them in code. They are usually reasonable and occasionally load-bearing and wrong.
What to check: new files and new dependencies. Assumptions crystallise into files. A new abstraction is the agent deciding your architecture needed one.
The failure mode all three share
Every one of them creates files very easily, and none of them knows what your codebase already has.
The concrete shape of this is a second abstraction beside an existing one:
TokenService in a repository that already has TokenManager, a new caching
layer beside a cache, a second way to construct the same object. Each is locally
reasonable — the agent wrote a sensible class to solve the problem in front of it
— and each is a slow structural problem that nothing in the diff flags, because
the existing abstraction does not appear in the change at all. Accumulated over a
few hundred such changes, that is architecture drift,
arriving faster than it used to because the changes arrive faster.
That is the review question worth carrying to all three: does this introduce something that already exists?
Why the tooling should not care which agent wrote it
Every question above is answered by reading the code and the repository around it — which components changed, what is new, what it connects to, what already existed. None of them is answered by knowing which agent was responsible.
That is why Cutplane reads the code and not the agent. A pull request from Cursor, Codex, Claude Code, a teammate, or you is analysed identically, and there is no per-agent mode, because there is no per-agent fact that would change the analysis. Which agent wrote it changes what you should be suspicious of. It does not change what the parser finds.
If a tool in this category advertises agent-specific analysis, it is worth asking what it does differently and how it knows. Usually the answer is that it reads the commit trailer.
The one method
Same for all three:
- Which components changed, and which of those is the change rather than its spread?
- What is new, where does it sit, and does it duplicate something?
- What do the modified parts reach that is not in the diff?
- Routes, migrations, dependencies — checked explicitly, every time.
- Stop when you can describe the change without looking.
The longer version of that is in how to review a pull request your AI agent wrote, and the version for when the file count is genuinely alarming is in your agent changed 60 files.
← All writing