AI coding agents can produce entire features in minutes. That’s the easy part. The hard part is figuring out if what they wrote is actually correct, secure, and maintainable — without spending more time reviewing than it would have taken to write it yourself.

This article is a practical guide to reviewing AI-generated code efficiently, whether you’re using Claude Code, Codex CLI, Gemini CLI, or any other agent.

## Why AI Code Is Harder to Review

Traditional code review works because humans write code incrementally. Each commit tells a story — small, logical steps that a reviewer can follow.

AI agents don’t work that way. They produce entire features in a single pass:

- **Large diffs** — hundreds of changed lines with no intermediate commits
- **Unfamiliar patterns** — the agent may use idioms you wouldn’t have chosen
- **No commit narrative** — there’s no sequence of “first I did X, then Y” to follow
- **Confident-looking bugs** — AI-generated code compiles and looks reasonable even when it’s subtly wrong

This means you can’t review AI code the same way you review human code. You need a more structured approach.

## A Practical Review Checklist

Work through these in order. Each step catches a different category of problems.

### 1. Does It Actually Work?

Run it. Don’t just read the diff — execute the code and verify the behavior matches what you asked for. AI agents are good at producing code that looks right but handles edge cases incorrectly.

### 2. Read the Tests First

If the agent wrote tests, start there. Tests tell you what the agent _thinks_ the code should do. If the tests are wrong or missing, the implementation is suspect regardless of how clean it looks.

Watch for:

- Tests that only cover the happy path
- Assertions that are too loose (`toBeTruthy()` instead of checking actual values)
- Missing error case coverage

### 3. Check for Security Issues

AI agents don’t think about security the way a human would. Scan for:

- SQL injection — raw string concatenation in queries
- XSS — unescaped user input rendered in HTML
- Command injection — user input passed to `exec()` or shell commands
- Exposed secrets — hardcoded API keys or credentials
- Missing auth checks — new endpoints without permission validation

### 4. Look for Silent Failures

AI agents love to swallow errors. Look for:

- Empty `catch` blocks
- Fallback values that hide problems (returning `[]` instead of throwing)
- Missing validation on function inputs
- `any` types in TypeScript that bypass the type system

### 5. Check the Boundaries

The implementation might be correct in isolation but wrong in context:

- Does it match the existing codebase patterns?
- Does it introduce new dependencies that aren’t needed?
- Does it handle the data formats your API actually returns?
- Are environment-specific assumptions (file paths, OS APIs) correct?

## Taming Large Diffs

A 500-line diff is overwhelming. Break it down:

**Read the file list first.** Before looking at any code, scan which files were changed. This gives you a mental map of the scope.

**Group by purpose.** Separate the structural changes (new files, imports, config) from the logic changes. Review logic first.

Use `--stat` and `--name-only` — these git flags give you the high-level shape of the change before you dive in:

```
git diff --stat main...feature/my-task
git diff --name-only main...feature/my-task
```

Review tests and implementation separately. Don’t try to cross-reference them in a single pass. Understand the tests, then check if the implementation satisfies them.

## How Parallel Code Makes Review Easier

When you’re running multiple AI agents, review becomes the real bottleneck. [Parallel Code](https://github.com/johannesjo/parallel-code) is designed around this problem.

**Every task is isolated from the start.** Each agent works on its own git branch in its own worktree. There’s no tangled mega-diff to untangle — each task produces a clean, focused diff against main.

**Built-in diff viewer.** Review changed files directly in the app. See which files were added, modified, or deleted, and inspect the diffs before anything touches your main branch.

**Review at your own pace.** Agents finish tasks at different times. Parallel Code keeps each result on its own branch until you explicitly merge. You can review task #3 while tasks #1 and #2 are still running.

**One-click merge when you’re satisfied.** Once a task passes review, merge it back to main from the sidebar. No manual `git merge` or branch juggling.

This turns the workflow from “review one giant AI output” into “review five small, isolated changes” — which is exactly how good code review is supposed to work.

## When to Reject and Re-prompt

Sometimes the output isn’t worth fixing. Signs you should discard and try again:

- The agent misunderstood the task and built the wrong thing entirely
- You’re editing more than you’re keeping — re-prompting is faster
- Auth logic, data validation, or encryption are done incorrectly

When re-prompting, be specific about what was wrong. “This is incorrect” is useless. “The auth middleware doesn’t check token expiry — add a check that rejects expired tokens with a 401” gets you a better result.

## Key Takeaways

- AI-generated code needs a structured review process, not a casual skim
- Run the code first, read tests second, check security third
- Break large diffs into file groups and review by purpose
- Isolate each agent’s work on its own branch so you get small, focused diffs
- Reject and re-prompt when the output is fundamentally wrong — don’t polish broken code
