I'm not a developer. Is this for me?
Yes, if you build with Claude Code. You can ask Claude Code to install it for you. After that it runs in the background and only asks you a quick yes-or-no question when a rule is triggered.
What's a "hook"?
A tiny check that runs before your AI takes an action. If the check fails, the action is stopped. It works like a spell-checker that won't let you hit send until the typo is fixed.
Do I need to write rules myself?
No. When you fix a bug, never-again decides whether the fix can become an automatic check or should stay a short note, and it writes that rule for you.
Does this replace CLAUDE.md?
No. It adds a marked block to your existing CLAUDE.md that points at LESSONS.md, and it never edits outside that block. Rules that need judgement still live in prose. What changes is that rules a script can check stop being prose.
What happens when a hook is wrong?
Every new hook starts in warn mode. It asks instead of blocking. Your answer is recorded on its own: stopping counts as the hook being right, going ahead does not. If it was a false alarm, na wrong L001 says so and resets its streak. A hook that cries wolf gets narrowed, not promoted. Promotion to deny is always a human command, and na demote always reverses it.
Will it slow down every command?
No. One dispatcher runs for commits only, and it runs just the hooks that watch the file types you changed. A commit hook never runs on a file read. Ten hooks or two hundred cost the same one setup. A hook that fires on everything gets resented within a day, and the skill says so.
Does it work on Windows?
Yes, from v0.1.1. Before that it did not work. On Windows, command -v python3 finds the Microsoft Store alias stub, which exits without running anything, and every hook swallowed the failure and stayed silent. Hooks looked 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.
What leaves my machine?
Two requests to GitHub, both about releases, and nothing else. na upgrade fetches a release when you run it. After a commit, at most once a day, the after-commit hook asks which release is newest and remembers the answer; it sends nothing but the request, and "updates": "off" in state.json turns it off. There is no account and no telemetry. na is a Python script that counts lines in files you already have. The fire log stays local and gitignored. LESSONS.md and the hooks are committed, because they are team knowledge.
What happens when LESSONS.md hits the cap?
You cannot add another rule until one is promoted to a hook or retired, and Claude has to say so plainly and suggest which one to drop. The default is 40 per file. The number that really 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.
Can hooks promote themselves to blocking?
No, and that is on purpose. After five right calls in a row the tool says so once. You run na promote L001 or you do not. By default that command only works on a branch, so the change gets reviewed like code. Nothing in the tool raises enforcement on its own.
Is it really free?
MIT licensed, no paid tier, nothing hosted to pay for later. It is a skill, a few shell scripts and a Python script in your repo.