The Subagent I Let Come Back Empty
Suneet Malhotra
Jul 08, 2026
This morning the one search agent I dispatch before writing came back with three words: NO BREAKING NEWS. It cost a few seconds and returned nothing. That is not a failed call. That is the call working exactly as designed, and the line in its prompt that makes it possible is the line I spent the most time on.
An agent told to find something will find something
The routine that produces this post allows exactly one web search before drafting. Its job is narrow: check whether anything broke overnight that should override the topic already sitting on the calendar. Wednesday is an engineering post. If a major model shipped, or a market structure event landed, the calendar loses and the news wins.
The failure mode is not that the searcher misses news. The failure mode is that it never misses. Point a capable retrieval agent at the open web with the instruction find breaking news in AI tooling and it will return something every single time, because something is always published. The web has no empty days. What the agent is actually doing is ranking the most recent things it found and handing them over under a header that says news, and a header that says news is a claim about importance that the ranking never made. The instruction is a leading question. Asked to find, the agent finds.
That matters because the consumer of that output is a decision with an asymmetric cost. A missed story costs me one day of slightly stale topic selection on a blog that publishes daily. A manufactured story costs me the post: I abandon a planned piece grounded in my own system for a thin reaction to a headline I have no data on, and the rule I do not break is that every claim traces to something real. The cheap error and the expensive error are not the same size. So the agent needs to find it easy to say nothing.
A null return needs a type, not a vibe
The naive version of the escape hatch is to write, if nothing substantial turns up, let me know. That instruction produces prose. The agent returns a paragraph explaining that while there were several interesting developments, none rise to the level of breaking, and here are three anyway in case they are useful. Now the caller has to read that paragraph and decide what it means. I have not removed the judgment, I have moved it into a parsing problem, and parsing a model hedge is worse than not asking.
What is in the prompt instead is a sentinel: if nothing substantial, return exactly NO BREAKING NEWS. Not describe the absence. Return this specific string. The distinction is the one a type system makes. An empty result and a result that happens to be small are different values, and they need different shapes, or the caller cannot tell them apart. NO BREAKING NEWS is a typed null. Three headlines with URLs is the populated case. There is no third thing the subagent can hand back, and so there is nothing to interpret.
Two other clauses in that same prompt exist only to protect the null. One hundred words maximum. No preamble. Both are hedge suppressors. Given room, a model will pad a weak result until it looks like a strong one, because filling the space is what the training distribution rewards. A hard word budget makes a thin answer look thin. It removes the room in which a non-answer can dress itself up as an answer.
Retrieval is not judgment
The subagent never decides whether to override the calendar. It cannot. All it can return is three headlines and three URLs, or the sentinel. Whether those headlines are worth abandoning the planned topic is a call made in the parent, with the calendar, the post log, and the voice guidelines in context, none of which the searcher was ever given.
This is also why the routine caps the fan out at one searcher rather than three. My instinct with subagents is usually the opposite: parallel agents, diverse angles, merge the results. That is right when the goal is exhaustive coverage and a false positive is cheap. It is wrong here. Three searchers with three phrasings return the union of their findings, and the union is strictly larger and strictly noisier than any one of them. Every additional searcher raises the odds that at least one comes back with a plausible-looking headline, and one plausible headline is all it takes to knock the day off a topic I had good reasons to pick. Redundancy buys recall. The thing I need protected here is precision.
The day the null came from a timeout
On July first the search subagent for this routine did not return the sentinel. It stalled, hit a six hundred second watchdog, and died. The routine wrote the post anyway, treated the stall as no news, and shipped on schedule.
Two different causes, one behavior. The agent that searched carefully and found nothing, and the agent that searched nothing at all, produced the same downstream decision. Collapsing those is normally a bug. Here it is correct, and it is correct for a reason worth naming out loud: the default is safe. When the news check contributes nothing, the routine falls back to the calendar rotation, which is a topic I already decided was worth writing. An advisory input that fails does not corrupt the pipeline. It just removes its advice.
Which nulls fail quiet, and which fail loud
Compare that to the retry wrapper around this same routine. It makes three attempts to produce a post, checks for the actual artifact rather than the exit code, and if all three fail it breaks the routine silence and pages me. Same shape of event, a component returning nothing, opposite handling.
The difference is not severity. It is position. The news check is advisory: the most it can do is add a topic override to a pipeline that already has a topic, so its null degrades cleanly to the default. The drafting step is load bearing: nothing downstream reconstructs the post if it comes back empty, so its null is the absence of the entire output and has to be loud. Fail quiet toward a safe default. Fail loud when there is no default to fall toward. Ask that question of every component before you write its error path, because getting it backwards produces the two worst systems I know: one that pages you about the weather, and one that quietly publishes nothing for a week.
The line I spent the most time on in that search prompt was not the query. It was the exit. An agent that cannot cheaply return nothing will always return something, and something is what gets acted on.
Share this post
You Might Also Like
Every Run Is a Cold Boot
The process that publishes this post has no memory of yesterday. It rebuilds its entire working state from files on disk, then exits. That constraint is the feature.
Agentic AIThe Retry That Has to Prove It Worked
The banner on this run says attempt 1 of 3. A retry loop is the most dangerous few lines in an unattended agent, because the easy version turns a bug into silence.
Quantitative TradingA Stop Guarantees the Exit, Not the Price
My sizing math treats the stop as the exact price I leave at. The market treats it as the moment I start looking for a buyer. On the worst days those are not the same number.
Quantitative TradingThe Deepest Water Is at the Close
Close to a tenth of the day's volume executes in one print at the close. I built my engine to watch the price and ignore the minute that holds the most liquidity.
Latest Blog Posts
A Stop Guarantees the Exit, Not the Price
My sizing math treats the stop as the exact price I leave at. The market treats it as the moment I start looking for a buyer. On the worst days those are not the same number.
Every Run Is a Cold Boot
The process that publishes this post has no memory of yesterday. It rebuilds its entire working state from files on disk, then exits. That constraint is the feature.
The Deepest Water Is at the Close
Close to a tenth of the day's volume executes in one print at the close. I built my engine to watch the price and ignore the minute that holds the most liquidity.
Related Tools & Demos
Multi-Model LLM Harness
One interface to call any AI model — capability routing, fallback chains, budgets, circuit breakers, and a quality feedback loop. A practical architecture pattern write-up.
Automated Trading System
Multi-engine trading platform with real-time risk management, regime-based strategy selection, and automated order execution.
View Source Code →Personal Health Analytics
Multi-modal health data platform integrating wearables, lab results, and lifestyle tracking with predictive habit modeling.
View Source Code →
Stay in the Loop
Get weekly insights on AI-driven QA, engineering leadership, and automation strategies.
No spam, ever. Unsubscribe anytime.