Most talk about verifiable AI is about the model: proofs of inference, attested hardware, reproducible weights. That matters. But most of the AI output people act on every day isn't a model call they could audit. It's a claim: in a doc, a README, an answer, a config someone copied.
I write about Claude Code. In February, I published a long guide to building with it, plus a companion GitHub repo of the configs I actually use. The repo is the part a reader can copy straight into their own setup, which turns out to matter. As Veera Ravindra Divi put it here on HackerNoon, Claude Code doesn't ship production code: your config does. A wrong config does more damage than a wrong sentence.
Since then I've re-checked every claim in it twice, once in August against Claude Code v2.1.234 and again this month against v2.1.311, the second time with four Claude Code agents working in parallel. I expected stale facts. What I didn't expect was ten claims that were wrong on the day I wrote them. One of them was a correction from the August pass.
This month, the agents did most of the checking. Some of their findings looked like errors until I traced the source, and some of my old claims looked fine until I did the same. Either way, what mattered was whether a verdict could be checked by someone other than whoever produced it.
A verified claim needs four things. I learned each one by watching a check fail without it.
|
Property |
Question it answers |
Failure without it |
|---|---|---|
|
Source |
Where does this come from? |
Plausible numbers nobody measured |
|
Version |
True as of when? |
"Corrections" that were never true |
|
Reproducibility |
Can someone else re-run the check? |
Works on my machine, fails on yours |
|
Independence |
Is the evidence separate from the claim? |
A checker citing the article it's checking |
None of these is about the model. You can run the best model available and still get output you can't verify. You can also run a cheaper one and get output anyone can audit, if the process makes it leave a trail.
From the August pass:
Shift+Tab)." It never existed. Shift+Tab cycles permission modes. I'd described a feature that sounded right in three different files.@-imports defer loading. They don't. Imported files are expanded into context at launch. Imports organise your instructions; they don't save context.From the October pass:
auto." This one hurts most, because I added it in August as a correction. No changelog entry supports it./autocompact sets an earlier trigger.model and CLAUDE_CODE_SUBAGENT_MODEL.Every one of these is fluent, specific, and plausible. That is the kind of claim language models produce easily, and agents repeat confidently. It is also the kind a reader can't check without a source.
Look at numbers 5, 7 and 8. A version number, a percentage, and a line count. Each one survived review because it was specific.
"Compaction triggers at about 95%" sounds like someone measured it. "Before v2.1.179" sounds like someone read the changelog. Nobody had. The precision did the persuading, and the precision was invented.
My rule now: every number gets a source next to it, or it gets rewritten as a range or removed. When the first correction pass suggested "fixed around v2.1.63" for a GitHub issue, there was no changelog entry behind it. That number came out too. The guide now says the behaviour is no longer reproducible and tells readers to check it themselves with /context.
Checking against official documentation sounds definitive until two official sources disagree.
In August, Claude Code's subagents page still listed a 200-subagent-per-session cap. The changelog said it was removed in v2.1.224. The docs hadn't caught up.
In October, Anthropic's API models page listed Sonnet 5.5's default effort as high. Claude Code's model configuration page says the 5.5 models default to medium. Both are right: one describes the API, the other describes Claude Code. An agent that reads only one of them will "correct" a true claim into a false one.
So provenance has to include which system and which version a source describes. For anything version-specific, I treat the changelog as the primary source. When sources disagree, the verdict says which surface each one describes rather than quietly picking one.
The worst error in the February guide isn't on the list above. Nothing I wrote was false; I left something out.
Agent Teams is experimental and disabled by default. It needs CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1. I never mentioned it, because the flag had sat in my own settings.json so long I'd stopped seeing it. Every Agent Teams pattern in the guide worked on my machine and did nothing on yours.
Reading docs can't catch that. The docs are right, and the claim is right. What's missing is the environment. The only check that works is re-running the instructions somewhere that isn't your machine.
The same applies to the repo's example configs. This month's pass ran them instead of reading them, and two hooks were broken:
PostToolUse hook that runs Prettier piped file paths through xargs, which splits on spaces. My own project lives in a directory called "Ben Ryan".PreToolUse guard against destructive commands blocked git push --force-with-lease, the safe variant. It missed rm -fr / and rm -r -f /. It blocked rm -rf on any absolute path, including /tmp/build.The README told readers to test the guard by asking Claude to run rm -rf /tmp/something. If the hook is wired up wrong, that command runs. The demo now pipes test JSON straight into the script, so anyone can reproduce the check without risk:
echo '{"tool_input":{"command":"rm -rf ~"}}' | .claude/hooks/block-destructive.sh
The rewritten guard passes 18 test cases, including the ones that should be allowed. Testing only what you mean to block is how you end up blocking the safe cases too. Sonar's walkthrough of Claude Code hooks covers the stdin and exit-code contract in more depth.
The same lesson shaped the Claude Code toolkit I built for checking copy traders: rules in a prompt help, but missing abilities are stronger. A guard you can test is worth more than an instruction you hope the model follows.
This one came from my content pipeline rather than the guide, and it's the clearest failure of the four.
My pipeline has an automated fact-checker that searches the web to verify claims. In September it "verified" two statistics by finding them on benryan.com.au, in the very article it was checking. The search ranked my own page, the summariser quoted it back, and two claims attributed to sources that never said them passed as confirmed.
Nothing in the check was technically broken. The search worked, and the model summarised accurately. The evidence just wasn't independent of the claim. If your verification can find your own writing, it will eventually use it to confirm itself.
Here's how the October pass ran. It works for any AI-assisted docs, not just mine.
--help output, then GitHub issues.Step 6 caught something useful, too. One agent reported that effort now defaults to medium on the 5.5 models. That looked like a conflict with the API docs until I read Claude Code's own page. If you moved to the 5.5 models and Claude feels a bit shallower, check /effort before you blame the model.
Step 7 is the one most people skip. Quietly editing a doc makes it impossible for readers to know which of your past claims to distrust. A public correction log is the cheapest audit trail there is.
The agents did most of the work here, and they did it well. But "an AI checked it" carried no weight on its own. What made the result trustworthy was a trail any reader could follow: a source per claim, a version per source, checks that re-run, and evidence that isn't the claim itself.
That is the same standard we should want from AI systems in general. As agents write more of the docs, configs, and answers we act on, verification can't stay a property of the model. It has to be a property of the output, and the output has to be open enough that someone else can check it.
The full guide is updated for v2.1.311. The companion repo has the configs, the fixed hooks, and a changelog listing every correction from both passes. If you find something I got wrong a third time, open an issue. Apparently, I'm due.