never-again

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.

1
stars
2,074
clones · all time
since 13 Sep, counted daily
425
clones · last 14 days
-13 vs the week before
408
unique cloners · 14 days

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.

13
total hook fires
8 here · 4 on client one · 1 on client two
1
prevented
declined at a warn prompt on client one
2 / 11
hooks, blocking / warn
6 here · 4 on client one · 3 on client two
11 · 25 · 7
rules loaded per turn
warns above 60

// 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

How these are produced.