Reviewing code you did not write: what catches problems
The bottleneck moved. Writing code stopped being the slow part around 2025; reading it never got faster, and that is where the hours go now.
The bottleneck moved. Writing code stopped being the slow part somewhere around 2025, and reading it never got any faster. A team that produces four times as much code produces four times as much reading, and human reading speed has not changed since the first pull request.
So the useful question is which checks find defects, and which ones only feel like diligence.
Line-by-line reading finds the wrong class of bug
Reading every line catches typos, obvious logic inversions, and style drift. Machines rarely make those mistakes now, and a linter catches them for free when they happen.
What machine-written code gets wrong is different. It calls an API that does not exist but is plausibly named. It handles the case it was told about and silently drops the one it was not. It writes a function that passes its own tests because the tests were written from the same misunderstanding. None of that shows up as a suspicious line. Every line looks reasonable.
Four checks that find things
Run it against the real system. Use the actual database, the queue, the third-party endpoint. A generated integration is confident about response shapes it has never seen. Ten minutes of running beats an hour of reading.
Read the tests before the implementation. If the tests only assert what the implementation happens to do, they prove nothing. Ask what a wrong version would fail, and check that a test covers it. Tests written alongside the code by the same process share its blind spots.
Check the boundaries, ignore the middle. Where does untrusted input enter, and what validates it? What happens on empty, on null, on the value one past the limit? Defects concentrate at edges, and generated code is fluent in the middle and vague at the edges.
Diff the behaviour. For a change to existing code, the question is what changes at runtime, whatever the number of lines moved. A refactor that keeps every test green while changing an error path is the failure mode nobody sees in a text diff.
The habit that catches nothing
Approving because the tests pass. Passing tests written by the same run that wrote the code only tells you the two agree with each other. It is the software equivalent of marking your own homework, and it is the single most common way a defect reaches production in an AI-assisted team.
What we build on top of this
StrucTime Code runs the checks a careful reviewer would run, and hands back what it found rather than a claim that everything is fine: the type check, the test run, the security analysis, and the trace of the software running. The mechanical part of reviewing should not cost an engineer an afternoon.
The judgement stays with you. Whether the feature is the right feature, whether the boundary is in the right place, whether this belongs in the codebase at all: no harness answers that, and none should pretend to.
Tests written by a machine: when they help and when they lie
A generated test suite arrives with the feature and every test is green. That tells you less than it appears, and sometimes nothing at all.
Why coding agents get worse as the codebase gets bigger
Agents demo well on a new project and disappoint on a real one. The gap comes from what the model was shown before it started writing.
Running several coding agents at once without them colliding
Four agents on one working copy give you four processes overwriting each other's files, with no record of who won.