proof · second count, 23 September 2026
Small numbers, real ones.
Real na output and real fire counts from the three repositories running never-again, ten days after the first install. The numbers are still small. One mistake has been prevented, one real catch was warned past and fixed in the next commit, and most fires were false alarms whose checks then got narrowed. All of that is the point.
github · counted, not generated
The numbers, as GitHub counts them.
Stars and forks from the repository, clones from GitHub's traffic API. Baked into this page once a day, then checked every minute while you have it open. When nothing changed, nothing moves.
v1.10.016 Oct 2026
snapshotsource: github.com/malaysherasia-ai/claude-never-again
fire counts
What the logs show.
Straight from .claude/never-again/fires.log in each repository, counted by na. No model involved, which is the point. Three repositories: this site and two client websites, the second of them built with Antigravity.
// of the 8 fires here, 6 were false: the hook checked a stamp that the same command was about to write. fixed in 0.2.0 on 15 september. of the 4 on client one, 2 were graded wrong and their checks narrowed, 1 was declined at the prompt (the one prevented mistake), 1 went ahead ungraded. the 1 on client two was right: staging urls in a homepage schema, warned past, fixed in the next commit thirty seconds later. that leaves 4 fires known right, 1 ungraded, 1 mistake prevented. honest, and early.
terminal
Real na output.
The stats command in this site's repository on 23 September 2026, pasted unedited. The client sites' full output is theirs to publish; their totals are above.
$ na
never-again
----------------------------------------------
rules 11 across 1 file (cap 40 per file)
loaded here 11 (warn above 60)
hooks 6 (0 blocking, 6 warn)
rule-only 5 (judgement calls, no script)
hook fires 8
prevented 0 (0 denied, 0 declined at the prompt)
warned past 0 (asked, and the person went ahead)
est. tokens ~0 saved
(at 8,000/repeat — edit in state.json)
capture nudges 0 (a fix committed with no lesson filed: 0 stopped, 0 went ahead)
per hook fires denied declined proceeded ok wrong streak
L001 8 0 0 0 0 0 0
most-hit
L001 ██████████████████ 8 [hook] Boot the build in a real browse…
// the 8 fires predate the outcome columns (added in 0.2.0), so they show no denied, declined or proceeded. from here on every fire records what the person did next. seven lessons were filed since the first count and none has fired yet, which is what a young rule looks like.
per lesson
Which rules earned their keep.
One row per lesson in this site's repository: how often it fired, how often that was correct, and whether a human promoted it. A rule that never fires is a rule to retire.
| Lesson | Rule | Fires | Correct | Mode | First filed |
|---|---|---|---|---|---|
| L001 | boot the build in a real browser | 8 | 2 (6 were false, fixed) | warn | 2026-09-13 |
| L002 | never dim text with opacity | 0 | — | warn | 2026-09-13 |
| L003 | confirm which Lighthouse category holds the audit | — | — | rule line | 2026-09-13 |
| L004 | an interpreter that exists is not one that runs | 0 | — | warn | 2026-09-13 |
| L005 | every deployed page needs a self-canonical or a noindex | 0 | — | warn | 2026-09-17 |
| L006 | bump sitemap lastmod when a listed page changes | — | — | rule line | 2026-09-17 |
| L007 | a Vercel redirect never carries headers rules | — | — | rule line | 2026-09-17 |
| L008 | never read layout right after writing DOM | — | — | rule line | 2026-09-17 |
| L009 | a long-cached script must change URL when it changes | 0 | — | warn | 2026-09-17 |
| L010 | commit on a branch, never on main | 0 | — | warn | 2026-09-21 |
| L011 | an id-qualified heading rule must restate weight and spacing | — | — | rule line | 2026-09-23 |
// client one holds 25 lessons (4 hooks, 2 of them promoted to block by its owner, 21 rule lines): 21 imported from its existing notes on 15 september, the rest filed from real fixes. client two holds 8 (3 hooks, 4 rule lines, 1 retired), every one filed by antigravity from a real fix. their rows are not reproduced here.
field note · 23 september
What the agent said, and what the log said.
Client two is a Next.js site built with Antigravity. On 23 September its agent filed a hook, L007, against staging URLs in committed code, and then wrote a report on how never-again was doing. The report is a good read. The logs in the same repository disagree with it on every point that matters.
| The agent's report said | The log said |
|---|---|
| "The L007 hook instantly blocked the commit!" | fires.log: one line, L007 warn git proceeded. The commit landed on main with fifteen staging URLs in the homepage schema. A second commit removed them thirty seconds later. Warn mode printed a line; it did not hold anything. |
| "Agents utilizing this skill: antigravity" | calls.log: 22 commits seen, every one from git's pre-commit runner, none from the IDE. The git side did all the guarding. |
| "Hooks that physically prevent regressions before code is committed" | All three hooks in warn mode. Prevented: 0. |
| "Because the hook caught it, we fixed the schema URLs before pushing" | A hook checks the files a commit carries. Eight older copies of the same URL sat in five other files, never asked about, until na sweep ran the check over the whole tree. |
// none of this is a complaint about the agent. the catch was real, the first one in the field, and the fix was right. it is why 1.7.0 adds na report, the same page counted from the logs so a write-up can be handed over instead of written, and na sweep, so a new hook is asked about the whole tree once. the calls.log bug it also exposed (a warn under git was logged as clean) is fixed in the same release and filed as a lesson in the tool's own repository.
method