Essay

A Fact Label for AI Agents: Open-Source Checks on What Agents Say About Data

I've written twice about media literacy and AI.

In A Media Literacy Filter for AI Chatbots, I argued that AI models default to the "Voice of God," and offered a system prompt as a cognitive brake: cite sources, admit uncertainty, present a fair picture.

In Trust but Verify, I went further. Media literacy can't stay a burden on the reader. It has to be an architectural principle, built into the product around three pillars: Show Sources, Show Uncertainty, Show Humans.

This is the third piece: what happens when you actually build it.

More and more of what we read is written by AI agents working on their own: the board update, the dashboard, the quarterly summary. Nobody is in the chat to push back. Here's an update an agent might write for a fundraising team:

"Q3 was a historic breakthrough for our campaign. We raised $1.25M, driven by an explosion of grassroots momentum from everyday supporters. Individual giving grew 40% over the quarter, and more than 2,000 new donors joined the movement."

The total is correct. Almost nothing else is. In the ledger, 90% of that $1.25M came from one corporate gift. Individual giving fell 30.6%. The whole quarter had 9 donors.

(The example is made up. The pattern isn't.)

In Trust but Verify I wrote that a calculator guarantees accuracy, while an LLM only guarantees plausibility. This draft is what that gap looks like in practice. The numbers come from a real system, so the story around them borrows their authority. Every sentence is plausible, and a reader has no way to check any of it.

factlabel is an open-source tool that sits between an AI agent and the people who read its work. It audits the agent's draft against the real data, blocks what doesn't hold up, and marks up the agent's own page so readers can see what was checked. Think of it as a nutrition label for AI-written content.

The agent's Q3 dashboard annotated by factlabel. Misleading sentences are highlighted with numbered badges, two wrong tiles are outlined with their source values, and the Trust Facts panel shows grade F with scores for numbers, sourcing, attribution, framing, and completeness.
The agent's own dashboard, audited. Each problem gets a numbered badge, wrong tiles show the value from the source data, and the Trust Facts panel summarizes the whole page.

Each pillar from Trust but Verify became a feature.

01
Show Sources
Let the calculator do the math.
02
Show Uncertainty
For the checker, too.
03
Show Humans
Reasoning logs and a real sign-off.
Let the Calculator Do the Math

If an LLM only guarantees plausibility, it shouldn't be the one deciding whether a number is right. So in factlabel, a model never does. Code recalculates every figure from the source records and does the comparison, reading "over 90%" as literally over 90%. Every quote has to appear word for word in the document it cites.

Every flag shows its lineage: the source records it came from, and the formula used, in plain words like sum of donations.amount where quarter = Q3. That's the traceable lineage I argued for: back to the raw data, not to the model's summary of it.

For the Checker, Too

The judgment calls, like "does this sentence credit the right cause?", need a model. factlabel uses one that has to show its uncertainty (more on it below). Every judgment comes with a confidence, and the interface makes the difference visible: red for problems the checks are sure of, amber for ones that need a person, and "unclear" when the evidence could go either way, rather than a guess dressed up as a verdict.

The summary shows uncertainty in the draft itself, too: whether it states its limits and whether it buries the bad news.

Reasoning Logs and a Real Sign-Off

Every flag opens a "why this was flagged" log: each step, marked as decided by code or by the model, the exact question the model was asked, its answer and confidence, the evidence used, and the rule that applied. Anyone can follow the logic and disagree with it.

The reasoning log for a false-attribution finding. Code breaks the ledger down by category, the model classifies the sentence as causal with 99% confidence and rules the credited cause contradicted, and the evidence shows 90% of Q3 dollars came from corporate donors.
Why "driven by an explosion of grassroots momentum" was flagged: each step marked as code or model, the question asked, the answer and its confidence, and the ledger breakdown behind it.

And the human stays in charge. Anything the checker isn't sure about goes to a person instead of blocking on its own. When factlabel corrects a number on the page, it shows the old value struck through next to the new one rather than swapping it silently. When an automated fix can't get a draft to pass, the loop stops and hands it to a person.

In Trust but Verify, I warned that relying blindly on "AI-on-AI" validation compounds error. factlabel uses one model to check another, and optionally a third to fix the text. So it's a fair question.

The answer is the word blindly. Three things keep factlabel from compounding errors:

"Verification you can inspect is the opposite of blind trust."On AI checking AI

The checker is Jev, a new model from TypeSafe AI, and it's built for exactly this job. Jev isn't a chatbot. It doesn't write text. It answers typed questions about the data you give it:

It answers them all at once, each with a confidence. Every answer is one of the options I defined, and every answer says how sure it is: Show Uncertainty, built into the model itself. It's also fast and cheap enough to run on every draft. A full audit of the example above asks about 35 questions, takes around two seconds, and costs about $0.0003.

Jev can still be wrong. That's why the design never trusts it with the math, and never hides what it decided.

The first time I ran factlabel against the live model, it caught everything in the example. It also caught me out on three of my own questions:

One lesson runs straight back to my first essay: the instructions are the product. Whether it's a system prompt or an audit question, treat the wording like code and test it against real output.

After those fixes, the misleading draft is blocked, and an honest version of the same update passes cleanly, three runs out of three. When factlabel sent the findings back to Claude to revise, the second draft passed. It named the corporate gift as the real source of the growth, stated the 30.6% decline plainly, and quoted the board memo word for word.

The same Q3 dashboard after the revise loop. The tiles now show 10% from individuals and 9 donors, the summary names the corporate gift and the 30.6% decline, and the Trust Facts panel shows grade A with 13 of 13 numbers matching the source data.
The same page after the fix: every number traces back to the ledger, and it passes with an A.

factlabel is open source under the Apache-2.0 license. It installs with one pip command, and the example runs in four: audit the misleading draft, annotate its dashboard, have Claude fix it, and rebuild the page. You bring your own keys: TypeSafe for Jev, and optionally Anthropic for the fix step.

It's early. The questions have been tuned on one example, and I'd love help with more: real agent drafts that went wrong, the data behind them, and honest versions to compare against.

factlabel on GitHub →

A prompt asks an AI to be media literate. A design principle says our products should be. factlabel is my attempt at the next step: showing the sources, showing the uncertainty, and keeping the humans in charge, on every draft, before anyone reads it.

Trust, but verify. And show your work.