Claude said the tests passed.

Put the old code back. Run only the tests it just wrote. If they still pass, they never checked the change.

Free, MIT, runs on your machine. Nothing is uploaded.

Install CLAUDE CODE
/plugin marketplace add Grade-Inc/corund-plugin
/plugin install corund

Passing is not the same as checking.

80.2% of agent-authored test-file patches contain weak or no explicit oracle signals — the test code the agent added runs your code without checking that what it returns is correct.

The study covers Claude Code, Cursor, Copilot, Devin and OpenAI Codex. Even on the newly created files where oracles are strongest, the strong-oracle rate runs from 18% for OpenAI Codex to 67% for Claude Code — so a third of new test files from the strongest agent still carry no strong oracle.

86,156 test-file patches from 33,596 agent-authored pull requests across 2,807 repositories, five coding agents: arXiv:2606.18168, IEEE AITest 2026.

The check runs where the agent is, not after it has gone.

The hook reads your working tree against HEAD, takes the test files you touched, and runs only those. It does not run your suite, and it does not look at tests you did not change. It reverts the non-test half, runs those tests again, and if they pass both ways it refuses the stop.

There is no model judgment in it. Ask a language model whether a test is any good and the answer can move between runs; this is a comparison — same tree, same two runs, same verdict every time.

When it stays quiet

Silence is the normal case. Corund allows the stop, and prints nothing, when:

  1. 01

    The change is test-only

    There is no non-test diff to revert, so nothing can be red-on-revert.

  2. 02

    The change is docs-only

    A README, a config file or a lockfile touches no source, so reverting it cannot make a test fail — and a test passing without it proves nothing about it.

  3. 03

    It could not measure

    A missing runner, a timeout, a crash, a tree mid-rebase. A check that blocks on its own blindness is an accusation without proof, and this tool exists to refuse exactly that.

It also stays quiet when no test file changed against HEAD — the common case, and it costs nothing — and when the tests do fail on the reverted tree, which is the change being covered.

Limits, stated rather than footnoted

It proves a test ran and fails on revert. It does not verify the test asserts the correct value. A change whose code and test are wrong in agreement is not decided.

It catches a new test that does not exercise new code. It does not catch a weakened test on an existing function.

On JavaScript, one thing blocks: green-on-revert. A test that fails on the reverted tree by erroring — TypeError: discount is not a function, a failed import — is not a witness. Corund reports that as unproven and allows the stop. It does not treat a crash as proof that your test works.

On Jest, a failed assertion carries no frame, so Corund cannot confirm the red came from the test's own body rather than a helper or a setup file. The receipt says so when it applies.

Jest is live. Vitest is built on the same engine. Python is the Action, below.