A deterministic gate. The model cannot talk its way past it. Register in settings.json: ```json { "hooks": { "PostToolUse": [ { "matcher": "Edit|Write|MultiEdit", "hooks": [ { "type": "command", "command": "node .claude/hooks/no-emdash.mjs" } ] } ] } } ``` The script greps the edited file for em and en dashes and exits non-zero with a message if it finds any, which feeds the failure back to the model as a correction.