Stop the engine's task and todo list reminders from reaching the model

Claude Code mods: in-process TypeScript plugin hooks, published as a plugin marketplace.
Mods need Claude Code 2.1.287 or later. The module hook API is early access and changes between releases, so expect breakage on upgrade.
/plugin marketplace add mark-liu/cc-mods
/plugin install dash-scrub@cc-mods
/plugin install reminder-trim@cc-mods
Rewrites em and en dashes in assistant prose before the message is stored, so the transcript and the rendered reply never carry them.
110 + dash + 155 reads 110-155- bullet; a trailing dash is droppedScope: assistant text blocks only (session.append, response door). Files, commit messages and tool inputs are not touched.
Layout: pure logic in hooks/scrub.ts, the hook in hooks/register.ts, tests in hooks/scrub.test.ts.
Keeps the engine's task and todo list reminders ("The task tools haven't been used recently...") out of the model's context. They fire every few turns in any session that does not use the task tools: about 2,500 injections a month on one heavy user's machine.
task_reminder and todo_reminder through prompt.attachment; every other attachment passes throughclaude plugin validate plugins/<name>
claude plugin test plugins/<name>
Load a working copy without installing: CLAUDE_CODE_PLUGIN_DIRS=/path/to/plugins/<name> claude.
MIT
hooks/register.ts 9 lines1import type { Register } from 'claude-code'
2
3import { DROPPED } from './trim.ts'
4
5export const register: Register = on => {
6 // The transcript keeps the engine's record; only the model's copy is left out.
7 for (const type of DROPPED) on('prompt.attachment', { type }, () => ({ text: null }))
8}
9hooks/trim.ts 3 lines1// Nags to use the task/todo tools; noise for anyone who tracks work elsewhere.
2export const DROPPED = ['task_reminder', 'todo_reminder'] as const
3