At 02:10 on day two of a 48-hour debugging window, a generation stopped at event 37 of 60 and my consumer printed JSONDecodeError: Expecting value: line 1 column 1 (char 0) . The model had done nothing wrong, the payload was simply cut in half somewhere between the socket and my parser. Why does a network failure always arrive dressed as a syntax error, and why was I so quick to believe the error message?
I spent the first several hours treating this as a parser problem, then as a prompt problem, then as a provider problem. All three were wrong. The interesting part is not that a stream died — streams die all the time — but that my recovery path made the failure permanent. Here are the field notes, the artifact that fixed it, and the parts I would do differently next time.
What actually failed: three failures behind one message
The first failure was conceptual. Truncation and corruption are indistinguishable to json.loads , so the exception told me nothing about where the damage happened.…