614 tests green, no regressions. That is what the guardrail cost in test churn: zero.
The problem was straightforward, even if the fix required touching five files across four packages. I run content engines on X, Bluesky, Threads, and LinkedIn. All of them generate posts and comments, all of them go through a two layer quality gate (regex lint floor plus a Claude critic). None of them had an explicit rule against personal attacks.
That sounds obvious in hindsight. You build a system that generates sharp, opinionated content and you assume the model knows not to be cruel. Sometimes it does. Sometimes it produces something that attacks the person instead of the idea, and "the person" is exactly what you cannot touch. Critique the argument, the claim, the track record, the logic. Never the human.
So I added it at two seams.
Generation. In core/voice_prompts.py, inside _hard_rules(), a universal rule now ships with every build_voice_block() call. Every engine already imports this, so one edit covers all four platforms. The rule is explicit: attack ideas, arguments, logic, and track records as hard as you want. No insults, no name calling, no slurs, no content that targets a person or group.






