Skip to content
All posts
3 min read

Reviewing at machine pace

This repo got 38 commits in its first three days, most of them typed by a model. My actual job was reading every line, and the rules file is what made that possible.

AIEngineering

This repository is three days old and has thirty-eight commits. I typed a minority of the code in them, and I have read every line. Both halves of that sentence are the story.

The three days, for the record: day one was the Next.js scaffold, a token-driven theme system, and the brand. Day two was navigation, admin auth with signed cookies, TOTP two-factor, and a VPS monitor. Day three moved the whole data layer to MySQL with seed fallbacks and grew an owner console and link-drop shares. One person did not type that in three days. One person reviewed it in three days while a model typed. The commit trailers say Co-Authored-By: Claude, and the first such trailer in this project sits on the design spec itself, dated May 29, before any code existed. The collaboration started at the whiteboard, not the keyboard.

What actually changed this spring is where the bottleneck lives. Generation used to be the slow part of building software. Now the slow part is judgment, and if you do not restructure around that, the speed converts directly into debt. My restructuring is unglamorous: a rules file the model reads before working. Routes register in one registry. Colors exist only as tokens. Logic lives in core modules; route handlers stay thin. Those conventions get pitched as consistency for teams, but solo with a model they do something more specific: they make deviation visible in seconds. I am not reading for style, because the rules pin style. I am reading for the one thing in the diff that does not fit, and a strict grid is what makes the one thing stand out.

The failure mode I am actually reading for is not wrongness. Wrong code announces itself; the compiler and the linter run before I do, and strict TypeScript plus Biome catch the honest mistakes. The model's characteristic failure is plausible code that quietly disagrees with the project's invariants: a page added without a registry entry builds green, runs fine, and silently never enters the sitemap. Nothing red appears anywhere. That class of bug is invisible to every automated reviewer I have and obvious to a human who knows the invariant, which is why the reviewer stack here is three deep: the compiler, the linter, and me. I am the slowest one and the only one with context.

Some code refuses the fast lane anyway, and choosing which is the actual skill. The 2FA state machine, the code that could lock me out of my own site, got read the old way: adversarially, line by line, twice, with me trying to construct the input that breaks it. Review speed is a budget, and I spend it deliberately unevenly. Skimming the scaffold is fine; the scaffold's failure mode is ugliness. Skimming auth is not; auth's failure mode is a locked door with me outside.

The opinion I will defend: if you are not reading the lines, you are not building at AI pace. You are borrowing at AI pace, and the rate is variable, and the statement arrives during an incident.

The model does not get tired at 2am, which is exactly when I do. That asymmetry is the whole reason the rules file exists: it is my 9am judgment, written down, still standing in the room after I have left it.

Remiel Shirazi

CTO & Co-founder | AI, Roblox & Piano