Verification
for AI agents

Runs your real tests on a copy of your project. If anything breaks, nothing gets written.

) works with every agent
Claude Code
Codex
Cursor
GitHub Copilot
Windsurf
Cline
Gemini CLI
OpenCode
Zed
) See it verify[01/07]

Verified before it lands

A real Claude Code session. The agent writes a migration, checks its own diff, and merges only on SAFE.

claude code~/services · main
Claude Code v2.1.206
Fable 5 with xhigh effort · Claude Max
~/services
>migrate BalanceService.reconcile to the SQLAlchemy 2.0 session API, land it only if it is provably safe
I'll migrate reconcile to the 2.0 API, then verify the diff in a shadow tree before anything lands.
Update(services/balance.py)
Updated services/balance.py with 5 additions and 4 removals
118-session = Session()
118+with self.session_factory() as session:
124-rows = session.query(Ledger).filter(...)
124+rows = session.execute(select(Ledger)...)
… +4 lines (ctrl+o to expand)
refactron - verify_change (MCP)(diff: working tree)
shadow tree · 6 files · your tree untouched
syntax · pass
imports · pass
your test suite · 142 passed · 0 failed · 2m 38s
attribution · 6/6 changed lines executed by a test
VERDICT:SAFE
SAFE. Refactron never writes to your repo, so the change is still only in my working tree. Landing it now.
Bash(git commit -am 'migrate reconcile to SQLAlchemy 2.0')
1 file changed, 5 insertions(+), 4 deletions(-)
Done. reconcile now runs on the 2.0 session API, proven against your real suite before it touched main.
>
⏵⏵ accept edits on (shift+tab to cycle)refactron-mcp · connected

The agent calls verify_change over MCP before it lands. The same gate runs in CI or on a migration.

) How verification works[02/07]

How it checks a change

Point it at any change, from an agent, a codemod, or you. Every one gets the same gate.

  1. 01
    PARSE DIFF

    Map the changed symbols: agent, codemod, or human.

  2. 02
    SHADOW TREE

    Apply the diff to a throwaway copy. Your tree is never touched.

  3. 03
    THREE GATES

    Syntax, then imports, then your real test suite.

  4. 04
    ATTRIBUTION

    Did a test that ran actually execute the changed lines?

  5. 05
    VERDICT + REPORT

    SAFE · UNSAFE · UNPROVEN, with the evidence behind it.

verification flowiso · scoped
) The verdict[03/07]

Three answers, not two

“Tests pass” can hide the truth. When the changed code was never run, we say UNPROVEN instead of pretending.

Worked example. Three composed runs, cycling. Not live data.

refactron verify-diffbalance.py · +5 −4
syntaxpass···
importspass···
your test suite142 passed · 0 failed···
attribution6/6 changed lines executed by a test···
SAFEgates, coverage and engine version in the report · nothing written to your repo

The gate

Every diff runs against your real tests on a copy of your project, before it can land.

Learn more
UNPROVEN2m ago
rates.py · +7 −2tests passed, and that proves nothing here
bycodemodonCI
UNSAFE9m ago
retry.ts · +18 −6nothing was written to your repo
byCursoronlinux
SAFE31m ago
balance.py · +5 −4safe to land, and still only in your working tree
byClaude CodeonmacOS

The verdict feed

SAFE, UNSAFE, or UNPROVEN, one per run. The CLI and MCP return it today; posting it on a PR is in early access.

Learn more
) Where it plugs in[04/07]

Where it runs

A verdict only matters at the merge. So it runs where merges happen: your agent, your CI, your migrations.

01·MCP SERVERearly access

The tool your agent calls before it lands

Your agent proposes a diff, calls verify_change, and gets a verdict + report back, so it can decide whether to land.

$ verify_change(diff)
) Wire it in[05/07]

Drop it into your stack

One gate, every surface: the CLI, your CI, or your agent over MCP. Python and TypeScript today.

1
$ npm install -g refactron
2
$ refactron login
3
$ refactron verify-diff . --diff agent.patch
4
 
5
SAFE · 142 passed · 0 failed
6
6/6 changed lines executed by a test
) How we're different[06/07]

What CI doesn't catch

feature
Changed-line coverage proof
Runs the suite itself, not your CI's report
Answers mid-task, before a PR exists
Says UNPROVEN when it cannot tell
Catches a narrowed test command
Useful on a repo with no tests
the gateRefactron
Python today
patch-coverage gates“80% of changed lines.”
AI code review“Here is what looks wrong.”
some
capabilities as shipped today
01/a patch-coverage gate

80% of the changed lines are covered.

It reads the report your CI already produced. We run the suite ourselves, in a copy, and refuse to call it SAFE when the command was narrowed.

02/AI code review

Here is what looks wrong.

An opinion about the diff, however good, is not an execution of it. We do not read your code. We run your tests and report what they touched.

03/running your tests in CI

The suite went green.

Green on lines no test touched is UNPROVEN, and we say so.

) How the guarantee holds[07/07]

Why the verdict holds

Writing a diff takes seconds. Proving it did not break anything is the slow part, and the part we will not skip.

how a change clearsproven · on green
A change proven in an isolated shadow copy before it is fitted into a machined socket
0

changes written to your repo. Refactron never writes to your tree, on any verdict

3 gates

every diff clears: syntax · imports · your real test suite

1 lang

proves changed-line coverage today: Python. A TypeScript diff runs every gate and caps at UNPROVEN

See how your agent calls the gate over MCP
) get early access

Try it before anyone else

The MCP server and CI gate are being built in the open. Come shape them.

No spam, just the verification layer, early. By joining you agree to our Privacy Policy.

) questions[FAQ]

Frequently asked questions

What the verdict means, what leaves your machine, and what ships today versus next.

That's the point. Refactron verifies a diff whoever authored it: Cursor, Claude Code, Copilot, Codex, a codemod, or you. The MCP server ships today, so your agent can call verify_change on its own work before it lands.

Your tests pass, but the changed lines aren't actually exercised by any test, so “green” proves nothing. We say so explicitly and list the tests to add, instead of hand-waving.

No. Refactron runs locally against your real test suite in an isolated shadow tree. Nothing is sent to an external service to make the verdict.

CI tells you the suite went green. It does not tell you whether a single test executed the lines you changed. Refactron checks that after the suite runs, and returns UNPROVEN when the answer is no, so a green run on untested code stops reading as proof.

Shipping today: the CLI (npm install -g refactron) and the MCP server, which exposes one tool, verify_change. Changed-line coverage is proved on Python today; a TypeScript diff runs every gate and caps at UNPROVEN. In early access: the hosted CI gate. Verification needs a token, so join early access to get one.

Still curious? Read the docs