Stop the run at the first wrong sentence
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.
4 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, and 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 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. It invents a constraint I did not give it. It answers a question I did not ask and treats that as progress. It reports a file as changed that it has not touched. I am describing a class of failure, and 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 built on the wrong turn, and reviewing a pile is slower than interrupting a sentence. Call the two modes what they are: streaming review and terminal review. Streaming review is cheap. Terminal review is expensive. That is the whole economic claim, stated as a claim, not a measured number of seconds.
The transcript beats 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 the other way. Background agents. Fan-out. Headless runs. A notification when the work is finished. The pitch is that you get your attention back: start several jobs, walk away, come back to completed branches. I understand the pitch, and I run a scheduled estate, so I am not against work happening while I am not in the chair. But a notification-on-complete interface is a terminal-review interface. It asks you to evaluate a finished artifact, which is the expensive review. We are building the expensive one and calling it a gift. And the runs are getting better at producing a plausible artifact just as the interfaces hide the words, which means losing the last cheap signal exactly when the artifacts get better at looking finished.
The counterargument I take seriously is that this does not scale. It does not. 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, and 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 for a narrow class: scheduled research and news drafts. They run, they write files, and I read them later, on my clock instead of the model's. Dark Factory's news pipeline is a real publishing system and editions exist. I read them after generation, not during. The 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.
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 want more parallel work like everyone else. I am not willing to buy it with the sentence that tells me to stop.
Related: Verification, Harness, The control arm