Tests sample. Reviews judge. Proofs cover.
Say you change a function that rounds prices.
Use all three. Tests document intent, reviews catch design problems, and proofs cover cases nobody thought of.
Prove against what you already have
Write a spec
A written rule, like “the result is never negative”. Takes work, and most codebases don’t have one.
Reuse the previous version
“New returns the same as old for every input.” Called equivalence checking. Needs no spec. Graphify uses this.
Know where a proof stops
Verifiers limit input size, language features or time. A bounded proof holds within those limits, so there are more answers than pass and fail:
Graphify reports each one separately. It never turns “couldn’t decide” into a pass.
Turn a counterexample into a test
The distinguishing input gives you the exact arguments plus the old and new results. Use it to:1
Reproduce
Run both versions on it.
2
Decide
Was the change intended, like a bug fix?
3
Pin it
Turn it into a regression test.
In Graphify
Each pull request gets an advisory Graphify Formal Verification check on GitHub. It never blocks a merge.Formal verification
How the check works and supported languages.
Read a review and a verdict
Review findings vs verification verdicts.