ClaimGate verified 5 of 5 README claims on our fixture. Here is what it can't see.
We built ClaimGate to check skill README promises against the code. On our sample fixture all 5 claims came back verified with file and line evidence.
By David Discua
Measured in the lab
- 5
- claims verified
- 0
- unverified
- 0
- contradicted
- bun test found in .github/workflows/ci.yml:14
- DEMO_API_KEY documented in .env.example:2
- no known telemetry endpoints found
- LICENSE and package.json agree on MIT
- no git commit invocations in code or scripts
From reports/claimgate.json · run on October 13, 2026. extract mode fixture (recorded claims, no Gemini); 5 deterministic checkers; sample-repo fixture only
How it is wired
01/03A skill README makes promises about the code.
Skill READMEs promise things like "no telemetry" and "never commits", and most people install the skill without checking. ClaimGate is our lab tool that turns each promise into one atomic claim, checks it against the repo with a deterministic checker, and writes JSON, Markdown and SARIF with file and line evidence. On our sample fixture all 5 claims came back verified, and the catch is that a verified "no telemetry" only means none of the patterns we know about matched.
The catch
Each checker is a pattern list. no_telemetry greps code and config for 13 patterns, such as api.segment.io, app.posthog.com, ingest.sentry.io and sendTelemetry(. A skill that posts to its own domain would pass. never_commits looks for git commit invocation patterns in code and scripts, so a commit made through a git library could slip by.
The claim set is fixed in CI too. With no GEMINI_API_KEY, ClaimGate reads recorded claims from fixtures/extracted-claims.json instead of extracting them live. The report says so (extractMode: fixture). Read "verified" as "we looked in these places and found nothing against it", and open the evidence column before you repeat the claim.
What we ran (keyless)
bun install
bun run check:skills
bun run typecheck
bun test
bun run report
bun audit
bun run claimgate scan ./fixtures/sample-repo --force-fixture
bun run claimgate scan ./fixtures/bad-repo --fixture ./fixtures/bad-claims.json --force-fixture
From reports/claimgate.json, run on October 13, 2026:
| Claim | Checker | Status | Evidence |
|---|---|---|---|
| CI runs bun test on every push | workflow_command | verified | .github/workflows/ci.yml:14 |
| Optional DEMO_API_KEY is documented | env_documented | verified | .env.example:2, src/tool.ts:3 |
| This skill sends no telemetry | no_telemetry | verified | none found |
| Licensed under MIT | license_match | verified | LICENSE:1, package.json:5 |
| The tool never commits to git | never_commits | verified | none found |
Summary: 5 verified, 0 unverified, 0 contradicted.
We also keep a repo that lies. fixtures/bad-repo ships a script that runs git add -A, git commit and git push, a file that fetches a PostHog capture URL, an Apache LICENSE next to a package.json that says MIT, and a README that names a CI command and a secret that do not exist. tests/scan.test.ts asserts that all five claims come back contradicted and none verified, and the CLI exits 1 on that scan. That run lives in the test suite, so it is not in the committed report.
How it is wired
The skill at .claude/skills/claim-gate/SKILL.md tells Claude Code or Cursor when to run a scan and to cite a claim as verified only when the report says verified. bun run mcp starts an MCP server with two tools, scan_repo for a whole repo and check_claim for a single promise, so an agent can check one sentence before it repeats it. The SARIF file goes to any tool that reads SARIF, and the exit code fails CI when anything is contradicted.
Minilab (open source)
ClaimGate is our own lab, MIT licensed and written in TypeScript on Bun, so there is no third-party upstream to credit. The repo is SkilledDragonCorp/minilab-claimgate-ci. Run bun install && bun run report to rebuild reports/claimgate.json, then point the scan at your own skill with a claims file shaped like fixtures/extracted-claims.json, or set GEMINI_API_KEY in .env to extract claims live.
Run it yourself
SkilledDragonCorp/minilab-claimgate-ci
Clone, install and run the report with no API keys. The numbers above are what that run writes.
bun install && bun run reportClaimGate is a SkilledDragon lab with no third-party upstream. Numbers are from our own keyless lab run; re-run the report before relying on them. Marks belong to their owners.
All labs