Skip to main content
New aislop v0.9.3: rule-precision release. Fewer false positives across docs, imports, eval, wrappers, JSON-LD, and bundled files. Read more →
← Blog
Opinion · 5 min read · reads

Nobody reads code anymore. Write for the linter.

When was the last time anyone on your team actually read the codebase? Some teams still do code review the old way. Some skim the diff. Some just deploy. Here is what we landed on after 25 real projects, and why the linter is the reader now.

When was the last time anyone on your team actually read the codebase? Not skimmed the diff, not glanced at the PR title. Sat with the file. Some teams still do it. Some say they don't have time. Some never really did. Here is what we landed on after running aislop scan on 25 real projects. Internal tools. Client repos. Open source apps. Median score before any cleanup, 15 out of 100. After one aislop fix pass, 32. After aislop fix --claude, 47.

The headline is 15. That's what every one of these codebases looked like when we showed up. All of them had passing tests. All of them were shipping. None of them had been read in any real way.

How review used to work

Five years ago, reading the codebase was a weekly thing. A senior handed a junior a subsystem and said "go read this." A bug report meant cloning the repo and following the call graph for an hour. Code review meant opening the file, jumping to definitions, scrolling through what lived next door.

That's gone. The agent spits out a thousand lines in a minute. The human skims two hundred before the next standup. The PR description is the artifact most reviewers actually read. The diff gets a glance.

That 981 line component buried in folder seven of one project? It got reviewed and approved. Somebody clicked merge. Nobody sat with it.

The damage nobody noticed

Four of the 25 projects had real TypeScript damage when we arrived. Compile errors sitting in committed code for weeks.

Nobody noticed because nobody ran tsc locally. CI either didn't have a type check, or had it muted. The agent wrote. The agent committed. CI ran whatever still passed. Ship.

If a human were reading the code, those errors would have been caught. The IDE underlines them in red. The deployment would have screamed. They sat there because the loop had degraded. The TypeScript compiler is the first reader. Nobody was listening to it.

The new reader

The new reader is deterministic. It does not get tired. It does not skim. Every line, every time.

In our stack the reader is aislop scan on top of TypeScript, biome, oxlint, and knip. Forty plus rules across six engines. None of them have an off day.

The reader produces a number. Zero to a hundred. That number is the new pull request artifact. The PR description says what changed. The score says whether the code itself got better, worse, or stayed flat.

Comments tell the same story. A comment above const MAGIC = 0.87 explaining the value used to be written for the next human in the file. There is no next human in the file. The comment is now aimed at the toolchain, which only reads directives. @deprecated. biome-ignore. ts-expect-error. Everything else gets removed by ai-slop/narrative-comment because nothing was reading it anyway.

What changes for code itself

Code has to become self describing. The linter cannot read intent. The human will not. Names carry the weight comments used to.

If your function is more than 80 lines, your agent is doing something wrong. That's what complexity/function-too-long catches. If your file is more than 400 lines, same story. complexity/file-too-large is the linter saying "this would have been split if anyone were reading it."

Type narrowing replaces narrative. A type Status = 'pending' | 'success' | 'error' tells the next reader more than a JSDoc paragraph, and it tells them in a language the reader actually parses.

Optimize for the reader you actually have

The reader is a linter. The linter has rules. Make the code pass them.

Name things so the agent summarizing the file gets it right. Keep files small enough that the next agent reasoning about them has a chance. Skip the narrative comments. Nothing reads them.

Lean into the score. It is the artifact of a working pipeline. One number that says whether the next person in the file, or the next agent, is starting from clean ground or from rubble.

See your score

$ npx aislop scan

Run it. You will see the number the linter has been trying to tell you about.

Star the AI Slop CLI on GitHub

if you want the next release in your feed.