Em-dash Enforcement Retirement¶
Date: 2026-05-11 Decision by: Justin
What changed¶
The automated enforcement layer for the no-em-dashes rule was retired. 684 survivors persisted despite the eval harness check and periodic purge script; Sonnet drift via auto-dream and auto-capture regenerates em dashes faster than any purge removes them.
Justin: "still good to have in system prompt but I don't care having all these systems to purge them. It doesn't work."
What stays¶
- Rule in doctrine: FORGE-DOCTRINE.md Section 9 and CLAUDE.md Doctrine Hard Rules still say "No em dashes." This is a system-prompt instruction; zero infra to maintain.
- Boundary sanitize:
forge_text_sanitize.strip_em_dashesremains wired into all Telegram bot output paths (forge_telegram_brain.py,forge_telegram_inbox_brain.py,forge_telegram_format.py, and the full Telegram/coordinator/proactive chain) and any email-draft path. This is a hard pipeline filter that empirically works because it runs deterministically at the outbound boundary, not as a vibes-based prompt check.
What is retired¶
- eval.json
no-em-dashescheck: made a no-op (pragma: retired,command: echo 0). Always passes. File:/home/justinwieb/forge/eval.json. forge_em_dash_purge.py: no systemd timer existed, so no timer to disable. Script left in place at/home/justinwieb/forge/scripts/forge_em_dash_purge.pyfor manual one-off runs.- LESSONS.md tracking: entry at 2026-04-28T20:30 amended 2026-05-11 with retirement note. Not a regression we track anymore.
Guidance going forward¶
Do not propose re-wiring a purge cron or eval threshold for em dashes. If Justin asks to clean em dashes from a specific file, run the purge script manually on that path. The rule in CLAUDE.md is the only enforcement layer that matters.
[Claude Code]