Claude writes in invisible ink.
uncovr is the lamp. It lights up the lines Claude wrote that no test runs.
Free, open source, warn-only.
src/orders/checkout.ts
Claude wrote it
and no test runs it
Claude writes.
A hook notes every line, the moment it is written.
You push.
The notes ride along to a hidden ref. Never in a branch, commit or diff.
CI lights it up.
Every Claude line no test ran, marked on the pull request.
On your PR. Right on the line.
src/orders/checkout.ts
+12
10+ const charge = await stripe.charges.create({ amount: total, source: card.token });
11+ if (charge.status === "failed") {
12+ await refundPartial(order);
13+ return { status: "retry", orderId: order.id };
uncovr · warning · lines 12 to 13
Untested AI-authored code in a high-risk area (payments)
2 AI-authored lines added in this PR are not executed by any test.
Why high-risk area (payments): imports stripe; line 10 uses stripe.charges.create from stripe.
14+ }
- Never fails the build
- Payments, auth and migrations first
- lcov, Cobertura, coverage.py
It never guesses.
- It is source code.
- This PR added it.
- Claude wrote it, and nobody rewrote it since.
- No test ran it.
All four, or silence.
Set up in a minute. No app. No token.
1Each developer, once
$ npm install -g uncovr
Node 22+, git, Claude Code.
2Each repository
$ uncovr init
Commit .claude/settings.json. The team is covered.
3Your workflow, after tests
- uses: uncovrhq/uncovr@v1
with:
coverage: coverage/lcov.info
The ink stays with your code.
- Pushed only to your own remote.
- Untracked files like
.envnever leave your machine. - Worth knowing: the notes keep snapshots of files from Claude's edits. A secret typed into a tracked file during one is in there.
Remove everything, local and remote:
$ uncovr uninstall $ rm -rf .ai-provenance $ git push origin --delete \ refs/uncovr/ledgers/$(git config uncovr.id)