The model endpoint could finish normally while producing no text that survived parsing and cleanup. From the browser's point of view, the send worked; from the user's point of view, the companion simply disappeared.
The August 14 sanitized export grouped 63 events as `blank_eaci_reply`. That count mattered because it separated an empty visible result from a network exception and made the failure reproducible.
What was actually going wrong
Success was inferred from HTTP completion, while stream parsing, hidden reasoning removal, and final text cleaning could still reduce the displayed payload to an empty string.
What I tried
- Showing a generic network error even when the request had completed
- Letting the empty bubble render and relying on the next turn
- Adding fallback punctuation before confirming where text vanished
The display pipeline now validates cleaned visible text, logs `blank_eaci_reply`, and supplies a controlled recovery response when nothing usable remains.
Why it worked
Validation happens at the user-visible boundary, after every transformation that can remove text.
Transport success and conversational success are different signals.
Where EACI uses this today
The guard protects Main chats for Caelum, Chad, Natalia, Atreus, Luna, Roxy, and Cael.
This journal covers real engineering on EACI Companion / The Veil. Companions include Caelum, Chad, Natalia, Atreus, Luna, Roxy, and Cael. Journal articles stay family-safe in content. See Privacy and Ethics.