We wanted to know, precisely, what happens to ambiguity once it reaches implementation. So we took a ticket we knew was underspecified — "add a way for admins to bulk-edit prices" — and gave it, unedited, to three engineers separately and to a coding agent, then compared the four results.
The ticket's actual gaps
It did not say what happens to a price that fails validation partway through a batch, whether the edit is logged, or whether it applies immediately or needs approval. Four competent readers, four different reasonable guesses.
What the humans did
Two of the three engineers stopped and asked. The third made an assumption, flagged it clearly in the pull request description, and moved on. None of the three silently guessed without saying so.
What the agent did
It picked the first reasonable interpretation for each gap — apply immediately, log nothing, stop the whole batch on the first failure — and wrote confident, clean code implementing exactly that. Nothing in the diff signalled that a decision had been made. The pull request read like a settled specification had been followed.
Why that difference matters more than the guesses themselves
- A wrong guess with a flag is cheap. Someone reads it in review, corrects it, done in a comment thread.
- A wrong guess with no flag is expensive. It looks finished. It often is finished, in the sense that it compiles and passes its own tests, which is precisely what makes it dangerous.
- Reviewers read generated code as more authoritative than it is, an effect nobody intends and everybody is a little susceptible to.
What we changed as a result
We now ask agents, as a standing instruction, to list the assumptions they made at the top of any pull request touching an ambiguous ticket, in plain language, before the diff. It costs a paragraph and it recovers the exact signal a careful human gives for free.
The problem was never that the agent guessed. Humans guess too. The problem was that nothing told us it had.
The ticket, rewritten
We rewrote the original ticket with the three missing decisions made explicit — stop-on-first-failure, immediate application, full audit log — and reran it. All four implementations converged. The gap was never in the tool. It was in the four pages we didn't write.
