A family-safe companion can receive unsafe material indirectly even when the current user message is harmless. Shared history, retrieved memories, another companion's turn, or a cached topic can all become hidden input.
The protection therefore sits at every context boundary. The request builder skips disallowed local memory and topic context, while Together mode can have a childlike companion sit out instead of forwarding the turn.
What was actually going wrong
Relying on a final instruction alone left earlier context layers capable of carrying material that should never reach Natalia, Atreus, or Luna.
What I tried
- Filtering only the user's current message
- Cleaning only the final displayed reply
- Assuming separate character prompts implied separate histories
Pre-generation checks filter recent history, memory, retrieval, and multi-companion routing, with permanent E-for-Everyone rules for the three childlike companions.
Why it worked
Unsafe context is removed before the model can condition on it, and the same boundary is applied across every route.
Safety is an information-flow property, not a sentence added to a prompt.
Where EACI uses this today
Natalia, Atreus, and Luna remain permanently E-for-Everyone across Main chat and Together mode.
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.