← ryanday. ~/ writing / looks-ready ~5 min read

On coding agents, batched decisions, and code review

When AI Makes the Wrong Design Look Ready

Agent code arrives in minutes, before anyone has a reason to stop and ask the design questions. My reviewers had to ask them for me.


My pull request was small and looked ready. To derive the timestamp I needed, my coding agent had found two candidate sources, a filename and a configuration value. It used the filename first and kept configuration as a fallback, explaining that CI required the filename while local runs used the configuration value. That sounded reasonable, so I opened the pull request and assigned some reviewers to it.

The reviewers saw the two sources and asked a question I had skipped. Why were there two sources at all?

I reached out to the team that owned the data. After we discussed it, they decided to embed the timestamp in the data and put the change on their roadmap. My task had to wait.

The conversation was necessary to finish the task, but it began only after the code looked finished. The reviewers had to uncover the unresolved design question first.

Slower Implementation Would Have Made Me Ask Earlier

Before coding agents, I probably would have talked to the team that owned the timestamp well before writing the change. Understanding the repository well enough to find both candidate sources would have taken an hour or two. At that point, asking someone who knew the system about the timestamp would have been cheaper than continuing to dig.

With the agent, I had it make a plan, and then the implementation took minutes. I spent about half an hour reading the diff and making edits, then sent it to reviewers. I had checked what the code did, but I had not traced why the agent had made each choice.

The speed of agent-generated code changes how design decisions arrive. When writing code by hand, they tend to appear one at a time as the implementation runs into ambiguity. Each question creates a chance to stop and resolve it before continuing. An agent can choose a path through several ambiguities in minutes and return those answers implicitly inside one coherent diff.

The finished code gave me several choices to evaluate at once. I had to work backward from the code to find where the agent had encountered ambiguity, then decide whether the agent had enough information to choose. Some of those decision points were absent from its explanation because the agent had treated them as ordinary implementation details.

That is what happened with the timestamp source. The missing contract was already there, but the final code made one interpretation look settled before I had asked what the producer promised.

Plan mode seems like the obvious way to restore the missing pause. It helps by exposing the approach before implementation, but it surfaces only the choices the agent recognizes as choices. In my case, the plan the agent produced specified the filename and configuration fallback without asking whether either source was guaranteed.

Some choices become visible only after implementation produces more evidence. Types, tests, failure paths, and operating conditions can change what the next decision requires. Several decisions made before coding are therefore not equivalent to the same decisions made as that evidence emerges.

The plan also made that assumption feel more deliberate than it was. It presented the filename as an implementation step, so I read the choice as settled instead of as a question for the producing team.

When design decisions arrive: writing by hand versus with a coding agent using plan mode Writing by hand  ·  hours of implementation each ambiguity surfaces mid-implementation, a natural point to stop and ask review With a coding agent plan, then minutes plan one finished-looking diff review the plan surfaces only the choices the agent recognizes; the rest arrive at review decision surfaced to the author decision resolved silently by the agent time →
Writing by hand, decisions surface one at a time. Plan mode adds an early checkpoint, but it catches only the choices the agent recognized as choices; the rest still arrive together, inside a diff that already looks finished.

A Diff Hides the Questions Behind the Choices

A diff records the choices that became code. It rarely records the questions that produced them.

Take a fallback added when an operation fails. In the diff, it may look like a one-line decision about what to return. Reviewing that line requires asking what else the fallback commits the system to. Should its use be logged? If repeated use indicates a degraded state, should the code emit a metric? Should that metric trigger an alarm? Who would own the response? Or should the operation fail instead?

A one-line diff and the design questions it decided without surfacing them THE ONE-LINE CHANGE, AS REVIEWED - value = fetch_value(source) + value = fetch_value(source) or FALLBACK WHAT THAT LINE DECIDED Should its use be logged? If it repeats, should it emit a metric? Should that metric trigger an alarm? Who would own the response? Or should the operation fail instead?
A diff records the choices that became code, not the questions that produced them.

The answers determine both failure behavior and operational responsibility. They depend on whether the fallback is normal behavior or a condition someone needs to notice. Yet the diff may show only a reasonable-looking fallback.

In my pull request, the diff showed why CI used the filename and local runs used configuration. It did not show whether the filename format was guaranteed. That answer required knowledge from another team.

Review then becomes an exercise in reconstruction. Someone must infer the decisions from the diff and decide whether the repository contains enough evidence to validate them. When it does not, the code needs a wider conversation.

Reviewers Inherit the Discovery Work

Code review has always done more than find defects. In a study of code review at Microsoft, Alberto Bacchelli and Christian Bird found that reviews were “less about defects than expected.” Developers described finding defects as the goal, but reviews also produced knowledge transfer, team awareness, and alternative solutions. The study also found that understanding the code and the change was central to review and that developers met that need mostly outside their tools.

AI changes when and how much of that work reaches reviewers. An author can arrive at review before working through each design question, so the unresolved questions appear together and without the context that would have accumulated while coding by hand.

The reviewer has to verify the behavior while checking assumptions (that may depend on contracts outside the repository). That is a heavier review even when the diff is small.

The reviewers' confusion signaled that a cross-team conversation had been skipped. By then, the pull request was open and they had spent time reconstructing a decision I should have resolved before review.

Authors Need More Than One Decision Checkpoint

Reviewers should validate design decisions without being responsible for discovering all of them. Before opening an AI-assisted pull request, the author needs to review what the agent decided as carefully as what it changed.

That requires checkpoints across the change. Before coding begins, I ask what is ambiguous and which external contracts the approach assumes. During implementation, I compare the code with the plan and ask what the agent learned or decided along the way. Before review, I separate the choices supported by evidence in the repository from those that need agreement from another person or team.

No set of prompts will expose every hidden assumption. The author still has to notice when a local-looking choice requires knowledge the code cannot supply. My reviewers noticed this one before I did.

So to finish the anecdote that I introduced in the beginning, the pull request never shipped. The reviewer's question was the most useful thing that came from it:

What does the producing system guarantee?

I should have asked it before I started coding.