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.
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.
what the parent sees
The corpus
| last block on the 97 | count | reading |
|---|
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
| verdict | meaning | hook behaviour |
|---|---|---|
| delivered | final block is assistant text | silent |
| empty | final block is anything else | loud marker |
| unobservable | transcript missing or unreadable | silent |
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.