Someone (usually an AI) just changed your code and made claims about it: "all tests pass", "empty input is covered", "no breaking changes". Paste the claims. Claimcheck copies your repository, actually runs the tests, reads the files, and tells you which claims were true, which were false, and which nobody could check. Every answer comes with the proof.
"All tests pass after this change."
"Division by zero now throws an error."
A coding agent rewrote a divide function and summarized its work. Sounds finished. The test suite is right there in the repo.
✕ REFUTED · "All tests pass"
node --test → "# pass 2 / # fail 1"
✓ VERIFIED · "throws an error"
math.js:3 → if (b === 0) throw new Error(...)
One run of the real test suite decided both. No reading between the lines.
A review queue full of agent-authored changes does not get re-derived by hand. The claims travel with the diff; the evidence stays behind.
Claims come from anywhere: the agent's PR description, the ticket it was supposed to close, the release notes, or your own suspicions. One claim per line.
"all tests pass"
"no new dependencies were added"
It copies your repository into a sandbox, runs the actual test suite, reads the actual files, and searches the actual code. Nothing is taken on faith.
run_tests -> "# pass 2 / # fail 1"
search "fetchUser" -> still exported
Each claim gets VERIFIED, REFUTED, or UNVERIFIABLE, with the exact output that decided it. Undecidable claims say what would settle them. It never guesses.
REFUTED · "tests pass": 1 test failed
UNVERIFIABLE · "2x faster": add a benchmark
Two claims from the sample run below. Every verdict opens into its full evidence trail: the exact commands and their raw output.
EVIDENCE 1 (run_tests): all 3 tests passed, 0 failures
cache.test.js:1-9 shows only a set/get test, no eviction scenario exercised
The mock run executes the same planner-executor-verifier loop with a deterministic stand-in model: it scores what claim-checking-by-vibes scores, and it runs anywhere Node runs.
$ git clone <repo> claimcheck && cd claimcheck $ npm install && npm run build && npm test $ node eval/build-cases.mjs $ CLAIMCHECK_MOCK=1 node dist/cli.js eval --label mock --mode advanced
Add CLAIMCHECK_API_KEY to .env for model-driven runs (any OpenAI-compatible endpoint; free tiers work). Full steps in REPRODUCTION.md.
Some claims cannot be decided from a repository: "twice as fast", "more readable", "cuts memory by 30 percent". Claimcheck refuses to guess and marks them UNVERIFIABLE. A verdict that cannot be backed by evidence is treated as a bug, not a disclaimer.
Any OpenAI-compatible endpoint: OpenAI, Groq's free tier, OpenRouter, local servers. Model and pricing are one environment variable each. The executor itself is deterministic TypeScript with no runtime dependencies.
Each claim costs a handful of small model calls (a plan, then a judgment per claim). The live report shows the exact figure for every run; the reported sample run came in under half a cent. The mock mode costs nothing.
The 13-case benchmark (28 claims with planted ground truth) is regenerated deterministically by one script. Every reported number traces to committed artifacts under eval-results/, and the mock path needs no key at all.
One repository, one claims file, one command. The report you just saw regenerates from your own change with citations you can re-derive.