Your instructions file is a subscription you forgot you were paying.
A 200-line CLAUDE.md costs roughly 2,500 tokens on every turn. Over a 100-turn session that's 250,000 tokens spent re-reading advice.
basis: ~12 tokens per line
v0.1.2 · free · open source · MIT
Your coding agent fixes a bug, then makes the same mistake next week.
never-again writes that fix down as a rule the agent cannot skip. When a script can catch the mistake, it becomes a Claude Code hook that blocks the wrong action before it happens. When the rule needs judgement, it becomes one short line in LESSONS.md instead of another paragraph in CLAUDE.md that the agent re-reads, and pays for, every single turn.
git clone --depth 1 https://github.com/malaysherasia-ai/claude-never-again.git && bash claude-never-again/install.shmacos, linux, wsl and windows · python 3.7+ · runs entirely on your machine
how it works
Can a script catch this before it happens? If it can, the lesson becomes a hook, and a hook costs nothing to carry. If it cannot, the lesson becomes one line in a rule file. That file is capped, ordered by what fires most, and scoped per package, because models follow fewer of their instructions as the list gets longer.
install
If you have not installed a Claude Code skill before, this is the whole process. Open a terminal in your project folder, pick the column that matches your computer, and run the commands in order. You can run the installer again whenever you want a newer version: it adds a marked block to CLAUDE.md instead of overwriting the file, and it leaves an existing LESSONS.md alone.
requires git, bash, python 3.7+
# from your project root $ git clone --depth 1 https://github.com/malaysherasia-ai/claude-never-again.git $ bash claude-never-again/install.sh .
LESSONS.md, .claude/ and the hooks are team knowledge. Only fires.log stays local, and the installer gitignores it for you.na ok L001 or na wrong L001. Five correct fires make a hook eligible for promotion from ask to deny.requires git for windows, python 3.7+ · fixed in v0.1.1
python -c "import sys" must exit 0. If Windows opens the Microsoft Store instead, that is the alias stub — disable it under Settings → Apps → App execution aliases, or point NA_PYTHON at a real interpreter.git clone --depth 1 https://github.com/malaysherasia-ai/claude-never-again.git & "C:\Program Files\Git\bin\bash.exe" claude-never-again/install.sh .
python .claude\never-again\na.why it exists
Five reasons the same lesson works better as a script than as a sentence.
A 200-line CLAUDE.md costs roughly 2,500 tokens on every turn. Over a 100-turn session that's 250,000 tokens spent re-reading advice.
basis: ~12 tokens per line
The protection is the same either way. A hook lives outside the context window, so it never competes with your code for room.
permissionDecision: deny runs before every permission mode, including --dangerously-skip-permissions.
IFScale (Distyl AI, 2025) measured 20 models against 10 to 500 concurrent instructions. At 500 the best model followed 68% of them, and instructions placed earlier were followed more reliably than later ones.
So the rule file has a cap, na sort puts the most-fired rules first, and rules load per package.
There is no account to create and no network call anywhere in the tool. The fire log is a single local file.
comparison
Often you should, and never-again will tell you when. The difference is what happens to the rule after you write it.
| A line in CLAUDE.md | A never-again hook | |
|---|---|---|
| Cost per turn | ~12 tokens, on every turn, forever | 0until it fires |
| When it is wrong | The agent may follow it anyway | The tool call is denied and Claude is told why |
| Survives a long session | Competes with everything else in context | Outside the context window entirely |
| Survives a permission bypass | No | deny runs before every permission mode |
| Ordering | Whatever order it was written in | na sort ranks by real fire counts |
| Scope | Loaded everywhere, always | Per package, and only for matching tool calls |
| Evidence it works | None | A fire log, counted by na |
| Best for | Judgement: taste, naming, architecture, tone | Anything a script can check |
None of this is an argument against CLAUDE.md. Plenty of rules need judgement that no script can make, and those belong in prose. never-again keeps its own LESSONS.md for exactly that, capped and ordered, and one of the four rungs on its triage ladder is to file nothing at all. The narrower claim is that when a script can check a rule, paying tokens to remember it is a choice.
questions
No. It adds a marked block to your existing CLAUDE.md pointing at LESSONS.md, and never edits outside that block. Rules needing judgement still live in prose. What changes is that enforceable rules stop being prose.
Every new hook starts in warn mode. It asks rather than blocks. You answer the prompt and grade it with na wrong L001, which resets its promotion count. A hook that cries wolf gets narrowed, not promoted. Promotion to deny is always a human command, and na demote always reverses it.
No. Hooks register with an if condition, so the process only spawns for the commands that matter. A commit hook never runs on a file read. A hook that fires on everything gets resented within a day, and the skill says so explicitly.
Yes, from v0.1.1. Before that it did not work. On Windows, command -v python3 resolves to the Microsoft Store alias stub, which exits without running anything, and every hook swallowed the failure and exited silently. Hooks appeared installed and never fired. The resolver now requires an interpreter that actually executes a statement and exits 0, and a hook with no usable interpreter says so instead of dying quietly.
Nothing. There is no account, no telemetry and no network call anywhere in the tool. na is a Python script that counts lines in files you already have. The fire log is local and gitignored; LESSONS.md and the hooks are committed, because they are team knowledge.
You cannot add another rule until one is promoted to a hook or retired, and Claude has to say so plainly and propose which to drop. The default is 40 per file. The number that actually matters is how many rules load per turn from where you are working. na reports that as "loaded here" and warns above 60. When the warning fires, split by package, retire or promote. Do not raise the threshold.
No, and that is deliberate. After five correct fires the tool offers promotion once; you run na promote L001 or you don't. Nothing in the tool escalates enforcement on its own.
MIT licensed, no paid tier, no hosted component to pay for later. It is a skill, a shell template and a Python script in your repo.