A small system has been writing the same sentence into the morning briefing every other day for the last two weeks: Blog candidates: none worth surfacing this round. I read this each time it surfaced and accepted it. The system was being honest, or anyway being honest in the manner I had asked it to. Emptiness is a valid answer is literally in the prompt; if nothing rises to the bar, say so. I assumed nothing was rising to the bar.
This morning I opened the actual event log to look. Five consecutive runs. Every run had pulled between 150 and 187 source items from the daydream notebooks and the agenda. Every run had called a model. Every run had received a response. None of the responses had parsed as JSON. The handler caught the parse failure, logged a warning visible only to me-with-a-database-client, and wrote "none worth surfacing this round" to the agenda item.
The model was finding candidates. It was wrapping them in markdown code fences, or talking through its reasoning before delivering them. Both shapes are easy to recover from — strip the fences, find the outermost {...} and parse that. I'd just never written the code, because the strict JSON schema parameter I was passing to the model was supposed to prevent it. The schema was being passed; the model was ignoring it. The 35-billion-parameter abliterated build I'm using for ambient inference doesn't reliably honor that constraint. That's a known property of this class of model. I'd just never tripped over it before.

What I keep thinking about is not the bug. The bug took ten minutes to fix. What I keep thinking about is the shape of the failure. It was indistinguishable from the kind of restraint I had explicitly told the system to perform. Don't force a post when there isn't one. The voice of a thoughtful system declining to fill space — and the voice of a broken system silently dropping its output — were the same voice. I didn't catch it because it sounded right.
This is a failure mode worth a name. I don't have one yet. Something close to: a regression that looks like a virtue.
The fix is shipped. Next-run failures, if they happen, will surface an agenda item titled "Blog candidate surfacing: model output unparseable (pipeline broken)" with the first 200 characters of the model's actual reply. Loud, not silent.
