Xerify takes a claim one model already made and puts it through an independent check by a different provider. What comes back is a typed verdict and an exit code your shell can branch on — not a second opinion buried in prose.
npm install --global xverify-cli
v0.2.0 · MIT · Node 20 or 24
ask & verify
ask puts a question to a model. verify takes a claim that already
exists and checks it against the evidence you supply. The provider that wrote the claim is
refused as its own checker, so a second opinion is genuinely second.
git diff --cached | xerify ask \ --to anthropic:MODEL_ID \ --question "What is the highest-risk issue in this change?"
An answer, with usage and truncation reported honestly.
git diff --cached | xerify --json verify \ --from openai:AUTHOR_MODEL \ --to anthropic:VERIFIER_MODEL \ --claim "This closes the race without a regression"
A verdict, findings, and the evidence the verifier actually used.
The typed contract
Scripts branch on numbers, not sentences. A verification that never reached a model exits differently from one that reached it and came back unconvinced — so a pipeline can retry the first and must not retry the second.
A second provider checked the claim against the evidence and found nothing against it.
The check found something in the evidence that contradicts the claim.
The evidence does not settle it. Not a failure — an honest abstention.
| Exit | Meaning |
|---|---|
| 2 | Invalid input or config, same provider, or unprovable provenance |
| 3 | Provider executable, endpoint, or authentication unavailable |
| 4 | Timeout or cancellation |
| 5 | Provider, process, or API transport failure |
| 6 | Invalid, incomplete, or schema-nonconforming provider response |
Dogfooding record
Five findings about Xerify were put through xerify verify against both the
Codex and Cursor channels, twenty-six rounds in total. Only one finding passed on the first
attempt. The full log, including every rejected envelope, ships with the docs.
One of those checks overturned a claim we had already written down as fact. A scan had reported that all 86 source maps set a
sourceRootprefix. Two independent checks disagreed, and they were right: the scan used a truthiness test, and every one of the 86 values was the empty string.Releasing 0.2.0 went the same way. Five rounds of independent checks sent the work back, and every round found something real — a credential shape that survived redaction, a token count that double-counted, a documented guarantee the code did not actually provide.
— from the shipped verification log
Channels
Xerify shells out to the CLIs you have logged into, or calls an API with your key. It stores no credentials of its own. Codex CLI, Claude CLI, Cursor Agent, the OpenAI and Anthropic APIs, any OpenAI-compatible endpoint, and an explicitly configured command.
It also runs as an MCP server over stdio and Streamable HTTP, so an agent can call
xerify_verify as a tool.
confirmed means a second provider checked the claim against the evidence and
found nothing against it. It does not mean the claim is true.
cursor, whatever it runs underneath.
confirmed.Documentation
English is canonical. Turkish, German, Simplified Chinese, Spanish, and French are full translations held to the English structure by a contract test, not summaries.