Skip to content

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_dashes remains 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-dashes check: 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.py for 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]