Your coding agent says it's done. This tells you what it actually did.
npx agentfactsFree. Offline. Zero API tokens. Zero dependencies. Runs in about 150 ms.
Your agent finishes a task and writes a confident summary:
"Created 3 files, tests pass, fixed the bug."
You have two options, and both are bad:
- Believe it. Usually fine. Occasionally the tests never ran at all.
- Check it. Open the transcript, scroll through a few hundred tool calls, find the test command, find its output. Two to five minutes — for a task the agent was supposed to save you time on.
So in practice nobody checks. The claim goes in unverified, every time.
agentfacts makes option 2 cost two seconds.
$ npx agentfacts
agentfacts b1c43c50 · my-app · main · 29m 4s · 368 tool calls · 6 failed
FILES 12 files touched, 1 no longer on disk
TEST ran once, last passed
BUILD ran once, last passed
TYPECHECK never ran
LINT never ran
! 1 file was written here but is not on disk now
(moved, renamed or deleted since — or never actually created)
kestrel.html public/_tmp-compare/kestrel.html
! 3 files changed but never mentioned in the summary
kestrel.html public/_tmp-compare/kestrel.html
00_START_HERE.md docs/00_START_HERE.md
MARKET_RESEARCH.md docs/MARKET_RESEARCH.mdTYPECHECK never ran is the line you came for. So is that last block — three files changed that
the summary never mentioned.
Manual tools get used twice and forgotten. Install the Claude Code plugin and it runs by itself, the moment your agent claims to be finished:
/plugin marketplace add xr3less/agentfacts
/plugin install agentfacts@agentfacts
It stays quiet when there is nothing to say. It speaks up when a file went missing, a command actually failed, or files changed that the summary never mentioned. It can never block your agent or fail your session — that is enforced in the code, not just promised.
| agentfacts | Reading the transcript | An AI-powered checker | |
|---|---|---|---|
| Cost | $0, MIT, forever | your attention | tokens, per session |
| API tokens used | zero | — | thousands to millions |
| API key needed | no | — | yes |
| Time per check | ~2 seconds | 2–5 minutes | 10–60 seconds |
| Works offline | yes | yes | no |
| Can be wrong | only by staying quiet | no | yes, confidently |
On tokens specifically. A real session log this tool parses was 18.2 MB — call it four to five
million tokens if you asked a model to read it instead. Per session. agentfacts reads the same file
in 148 ms using about 20 MB of memory, and sends nothing anywhere. There is no API key to
configure because there is no API.
On being wrong. A verifier that hallucinates is worse than no verifier. This one does not reason about your session — it counts what is in the log. Where it cannot know, it says so instead of guessing.
| Check | The question | |
|---|---|---|
| 1 | Files | Which files were written or edited — and are they still on disk? |
| 2 | Tests | Did a test command actually run, and did it pass? |
| 3 | Build / typecheck / lint | Same question, same evidence. |
| 4 | Silent changes | Which files changed that the summary never mentioned? |
Check 4 is the one nothing else does. Everything else looks for claims that turned out false. This also looks for changes that were never claimed — the ones you would never think to look for, because nobody told you they happened.
A command that was cancelled counts as never ran, never as failed.
npx agentfacts # the most recent session for this directory
npx agentfacts --session <uuid> # a specific session (a unique prefix works)
npx agentfacts --json # machine-readable, for your own scripts
npx agentfacts --helpExit status is 0 whenever it ran, including when there is nothing to report — safe anywhere. It is 1 only if you ask for a session that does not exist.
Claude Code already writes a complete record of every session to your own disk: every command it ran, every file it touched, and whether each one succeeded. Nobody reads that file, because it is enormous.
agentfacts reads it for you. That is the whole trick — the evidence was already there.
The rule this is built on: a false accusation is worse than a miss. Telling you your tests never ran when they did is a bug you would never forgive, so everything is biased toward silence.
That bias is not a slogan — it is the result of an adversarial review that found three ways to make an earlier version say something false, each of which now has a regression test:
- Command detection is quote- and heredoc-aware, so a commit message that happens to contain the
words
npm testis not counted as a test run. (This was a real bug, found in real data.) npm test --helpis not a test run.- If the log does not record where the session ran, a relative path gets no verdict rather than a guessed one.
Known misses, reported as "never ran" rather than guessed at: commands run inside a container
(docker compose run app npm test) and project-specific wrapper scripts (./scripts/test.sh).
Not in this version: reading the agent's prose and contradicting it claim by claim. Today the tool prints the facts and you compare. Issues and ideas welcome — that is what the tracker is for.
Node 20+. Reads ~/.claude/projects/**/*.jsonl, which Claude Code writes on its own — nothing to
enable, nothing to instrument.
Developed on Windows. The code avoids platform assumptions and folds path case only where the filesystem actually does, but it has not yet been exercised on Linux or macOS. Reports very welcome.
- Never writes to your repository. Never writes anything, anywhere.
- Never makes a network request.
- Never blocks or fails your agent.
- Zero runtime dependencies — nothing in
node_modulesbut the tool itself.
MIT. Free forever, and not a trial for anything.