Agentic AI6 min read

The Subagent I Let Come Back Empty

S

Suneet Malhotra

Jul 08, 2026

1 views
The Subagent I Let Come Back Empty - Agentic AI blog post
🤖Claude Code🔧Subagents🔧Prompt Engineering

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

Stay in the Loop

Get weekly insights on AI-driven QA, engineering leadership, and automation strategies.

No spam, ever. Unsubscribe anytime.