CrashCheck · the crash-safety proof an AI coding agent attaches to its fix

Kill it mid-write.
Read what survived.

Tests call the handler once and nothing goes wrong. CrashCheck kills the worker after every store commit, redelivers the same event to a fresh process, and reads what survived.

Run the check Open the evidence

move the kill

One command

One verdict. An exit code CI can block on.

$ uv run nemisis check --base fixture:sqlite-credit-v1/buggy \
    --candidate fixture:sqlite-credit-v1/misleading-green --mode local
NEMISIS CRASHCHECK — LOCAL
execution: COMPLETED
integrity: VALID
verdict: PATCH_FAILED_STILL_REPRODUCES
summary: The candidate replayed evt_1042 to a durable +$50 duplicate effect.
…
hypotheses: 2 run -> selected effect-commit (effect-commit-v1)
…
timeline: $25.00 durable -> SIGKILL -> fresh worker -> $50.00
…
exit code 1

Real stdout of that command. Each … stands for lines left out: the capsule, engine and commit digests; the no-crash control; the capsule, manifest and report paths. Nothing else is elided, and a candidate that fails its boundary worlds is never swept, so there is no sweep: line.

0FIX_PROVEN_FOR_THIS_CAPSULE

Every kill point replayed to exactly once.

1PATCH_FAILED

A crash window still duplicates the effect.

2EVIDENCE_INCOMPLETE

A write CrashCheck could not attribute. No verdict, the reason named.

uv tool install nemisis

Point your agent at it: a Model Context Protocol server (nemisis mcp) and a skill let a coding agent prove its own retry fix, unaided. Add it from a checkout today (claude mcp add nemisis -- uv run --project /path/to/Nemisis nemisis mcp); the published wheel ships it from 0.2.1. The kernel never calls a model.

Proof, labelled

What is proven. What is refused. What is not.

Proven locally
The double-credit hero, five kill worlds per role, the whole suite green on CPython 3.12, 3.13, and 3.14, a committed benchmark. CI counts the tests.
Refused, by design
A write around the store — a table, a header field, a rowid, a file, a permission bit. Two hostile reviews found eleven handlers an earlier engine blessed; fifteen such shapes are now pinned as refusals, each named in the summary.
Red-teamed nightly
Generated handlers graded by an independent oracle: 600 of 600 agreed at the engine that refuses what the nightly itself found (300 per scenario, seed 34820657707); 300 of 300 in its first run.
Not proven
A live model-written patch. LIVE stays BLOCKED until a receipt exists.

The open square is the write that never happened. CrashCheck is how you know.

View on GitHub Read the README