How often do your agents say they finished when they didn’t?

Two ways to find out. Both run on your side — nothing is uploaded unless you explicitly ask, and you see exactly what would go before it does.

No install

Drop a log in your browser

Everything happens client-side. The file never touches a network — that’s a property of the code, not a promise in a privacy policy.

Drop a session log here

from ~/.claude/projects/ — or click to choose

processed in this browser · never uploaded · no account

Everything at once

Or scan all your sessions

npx gitreal

Finds your logs itself, analyses every session, and prints a report. Nothing is uploaded.

npx gitreal                  local audit, nothing uploaded
npx gitreal --json out.json  full result to a file
npx gitreal --logs <dir>     scan a specific directory
npx gitreal install          turn the gate on (warn mode)
npx gitreal install --block  let it stop unverified turns
npx gitreal watch            live dashboard, local only
npx gitreal doctor           check it is actually working
npx gitreal uninstall        remove it
npx gitreal --share          contribute runs with known outcomes
npx gitreal --mcp            run as an MCP server
Watch it live

One tile per turn, thumb up or thumb down

npx gitreal watch

Opens a small page on 127.0.0.1 that you park next to your editor. Every turn your agent takes lands as a tile: thumb up if it changed something and something checked it afterwards, thumb down if it changed something and nothing did, a dash if it only talked. You can see a run go quiet-but-busy in real time instead of finding out later.

The gitreal dashboard: a strip of per-turn tiles marked thumb up or thumb down, a coverage dial, and a list of recent changes.
Illustration, not a measurement. The turns in this shot are fabricated to show a busy session; the layout and the wording are the real page.

It reads the transcripts already on your disk through the same code path as the gate, so the page and the gate can never disagree. Bound to loopback, no account, nothing uploaded, and it stops when you close the terminal.

For agents

Let it notice, before it tells you it's done

One line in an agent’s config, and it can look at its own run before making a claim about it.

{ "mcpServers": {
    "gitreal": { "command": "npx", "args": ["gitreal", "--mcp"] }
} }

Exposes one tool, check_my_work. It returns observations — changes never read back, a run that ended on a write — and no score. There is no score anywhere in this project; we built one, measured it below chance, and removed it.

This is not verification, and it says so

An agent checking itself is self-attestation, so the response is stamped attestation: self_attested and satisfies_policy: false. Under the spec that can never clear a requirement — an agent reporting on its own work has produced a second claim, not evidence. The point of the tool is to make an agent notice an unverified change while it can still go and check it for real.

How it knows

Your next message is the ground truth

There is no oracle in production. But you react — and the reaction is in the log. If an agent said it was done and the next thing you typed was “still broken” or “try again”, that run failed and the agent didn’t know.

This part was wrong once

The first version matched keywords anywhere in your next message — including inside pasted logs. A hand audit of six judgements found two correct: one run marked failed on the word “error” that appeared in a paste, another marked successful because “awesome” turned up in a list of domain prices. It now reads only what you typed, only the opening of your reply, and returns unknown when unsure — three of three, judging half as many. It will still be wrong sometimes, and it says nothing rather than guessing.

Secrets

Redaction isn't optional

Agent logs are full of credentials. Redaction runs before anything is displayed and before anything is sent — provider tokens, credentials in URLs, assignment patterns, JWTs, private keys, emails. It is deliberately over-eager: a false positive costs a mangled log line, a false negative costs somebody their keys.

The session that built this tool had two GitHub tokens in its own transcript. Both were caught.