Silence is a failed delegation, not an empty result

A subagent can finish with status: completed and emit no final assistant text. The parent sees a completion notification with an empty result, which reads as "the agent found nothing". It actually means the delegation failed and whatever the agent did is stranded. In one session that cost four agents, two of which had done real work, and one had committed a fix locally that was never pushed.

2,735real transcripts measured
97completed with no final text
3.5%base rate
0unobservable

Where the transcript stops

Click the block a transcript ends on and see how the detector classifies it. This mirrors the shipped classifier, which reproduced the corpus split exactly.

delivered

what the parent sees


  

The corpus

delivered 2,638 empty 97
last block on the 97countreading
Denials are a minority trigger, which refuted the first hypothesis that this was purely a guard-denial artefact. The dominant shape is an agent stopping the moment a tool returns.

Why it does not force the agent to speak

Returning continue: false would block the stop and hand the reason back to the model, which is the shape that caused the CC 2.1.78 infinite loop. It would also short-circuit sync-subagent-stop-dispatcher and starve every hook queued behind it, which is the #3200 starvation class this repo already paid for once.

The text is unrecoverable from this position anyway: by the time the hook runs, the agent's turn is over. So the job is not recovery, it is making the failure impossible to misread.

The distinction that keeps it honest

verdictmeaninghook behaviour
deliveredfinal block is assistant textsilent
emptyfinal block is anything elseloud marker
unobservabletranscript missing or unreadablesilent
Collapsing unobservable into empty is exactly what turned output-validator into a kill-switch in #3200, by reporting an absent payload field as an error on every row. A warning that fires on everything trains the reader to ignore the one that matters.