StoryProof

Proof that what's asked is what's built.

Independent verification for AI-assisted code changes.
Shows what your change proved, what it didn't, and what's likely to break if shipped.

$ curl -fsSL https://storyproof.dev/install.sh | sh

Works with Claude Code

01 — What it catches

What it catches

Real findings from a Spring PetClinic PR. Every one of these was invisible to existing evidence.

01

The behavior nobody specified

Your spec says “allow pet transfer.” StoryProof derived 16 behaviors from that one sentence. One of them — what happens when the owner doesn't exist — returns HTTP 500. Nobody specified this. Nobody verified this path. It would have shipped.

02

The proof that proves nothing

A test claims to verify “visits stay with pet after transfer.” StoryProof read the assertions. It only checks the pet moved — never checks if visits survived. The behavior is unproven. The test name is the only evidence, and it's misleading.

03

The flow nobody verified

The most important user journey — submitting the transfer form and landing on the target owner's page with a success message — has no evidence at any layer. Not unit, not integration, not E2E. The primary behavior is completely dark.

02 — How it works

Three steps. Full verdict.

storyproof check

Derives behavioral criteria from your spec. Scans existing evidence. Shows what's proved, what's unproven, and what's likely to break.

~$0.50 · 4 min

storyproof prove

Writes and runs targeted checks for unproven behaviors. Produces runtime evidence. Tests stay in your repo.

~$1.00 · 8 min

fix → prove → ship

Fix the blocker. Re-run prove. Tests catch regressions. Ship with confidence.

03 — Real output

This is the verdict.

Not a mock-up. This is terminal output from a real storyproof check run.

Terminal — storyproof
StoryProof CheckDO NOT SHIP ## Likely defects — code analysis suggests these will break [AC003] @ModelAttribute throws exception → HTTP 500, not 404 Expected: API returns 404 when source owner does not exist Prove will: Run integration test and confirm failure [AC008] parseInt without error handling → HTTP 500, not 400 Expected: API returns 400 for non-numeric input ## Needs proof — no evidence covers these behaviors [AC012] UI transfer success — the primary user journey is unverified [AC009] Visit history preservation — test name claims coverage but assertions don't prove it Already covered by existing evidence: 10 behaviors Next: storyproof prove — settle all 5 unproven behaviors

04 — Get started

Verify your next change

$ curl -fsSL https://storyproof.dev/install.sh | sh
$ cd your-repo
$ storyproof check --spec "your spec"

Requires Claude Code CLI. Runs locally. ~$0.50 per verdict.