In defense of reading every word
The highest-value thing I do with an agent is read its output in real time and stop it the second it says something incongruent. Every trend in tooling pushes the other way.
5 min read
The highest-value thing I do with an agent is read its output as it streams and stop it at the first sentence that does not fit.
I should say what I cannot put next to that sentence. I do not have a specific incongruent line I wrote down. I do not have a stopwatch on the gap between the tell and the bad commit. If I invented either one, this would be a better story and a worse receipt. The mechanism is still the argument. The anecdote is not.
Incongruent, as I mean it, is not "I dislike the style." It is a sentence that does not follow from the files, the request, or the last true thing the run said. The model has left the job and started narrating a nearby job. Sometimes it invents a constraint I did not give it. Sometimes it answers a question I did not ask and treats that as progress. Sometimes it reports a file as changed that it has not touched. I am describing a class of failure, not a scene. The class is common enough that I do not need a trophy example to believe it is real.
The tell arrives in the transcript, not in the finished diff. By the time you have a diff, the run has already spent itself. The cheap moment to stop is the sentence that does not belong. After that, you are reviewing a pile of work that was built on the wrong turn. Reviewing a pile is slower than interrupting a sentence. That is the whole economic claim, and I am stating it as a claim, not as a measured number of seconds.
The transcript is a better signal than the diff for a second reason. A diff can look locally reasonable after a globally wrong decision. Tests can be green on the wrong feature. The sentence that went wrong is often ordinary prose: a plan, a status line, a confident "next I will." If you only look at the product of the run, you are looking at the part the model had time to make tidy.
Everything in the tooling is moving away from that view.
Background agents. Fan-out. Headless runs. A notification when the work is finished. The pitch is that you get your attention back. You start several jobs, you walk away, you come back to completed branches. I understand the pitch. I run a scheduled estate. I am not against work happening when I am not in the chair.
The cost of that pitch, for the work I still sit with, is the only review channel that works while the work is still cheap to interrupt. A notification-on-complete interface is a terminal-review interface. It asks you to evaluate a finished artifact. That is the expensive review. Streaming review is the cheap one. We are building the expensive one and calling it a gift.
I also think model prose is drifting in an unhelpful direction relative to model capability. The runs get more competent at producing a plausible artifact, and less useful as a place to watch the reasoning happen. If the interface hides the words, you lose the last cheap signal just as the artifacts get better at looking finished.
The counterargument I take seriously is that this does not scale.
It does not scale past one or two concurrent runs. I cannot read two streams at once with the same quality, and I cannot read five at all. Reading everything is exactly the bottleneck agents are supposed to remove. If the point of the tools is to give me more output than I can produce by hand, then insisting on a human eye on every token is a way of refusing the point. That is the honest part, and it fights the story that the job is now parallel orchestration. I am leaving it in.
I accept unread output only for a narrow class. Scheduled research and news drafts are in that class. They run, they write files, and I read them later. Dark Factory's news pipeline is a real publishing system. Editions exist. I do read them. I am not going to claim I sit on every generation as it happens, and I am not going to claim I read none of the news. The unread-at-generation part is real. The later reading is also real. That is the concession in practice: I let some work finish in the dark, then I read the artifact on my clock, not the model's.
That class is narrow because the cost of a wrong news draft is a draft I do not publish. The cost of a wrong coding turn is a branch I now have to understand. I will let a research file wait. I will not let a refactor wait for a notification.
What I would build, if I were building the interface instead of using the ones I am given, is interrupt-first. Streaming review, not terminal review. A run that is easy to stop in the first bad paragraph, and hard to hide behind a "done" badge. I have not shipped that interface. I am describing the shape I keep looking for.
I am still working out how much I can let run without watching. One or two concurrent streams is the honest capacity I will own. Beyond that I am pretending, or I am accepting a class of unread output I have not actually defined. I know the scheduled news draft is in the defined class. I do not yet have a clean rule for the rest. I am still figuring out how to want more parallel work without giving up the sentence that tells me to stop.
Related: Verification, Harness, The control arm