
Ordinary testing is an act of faith. A programmer runs the system through a handful of chosen scenarios, watches it behave, and believes — on the strength of that small sample — that it will behave the same way in the scenarios never tried. Between the cases tested and the cases possible lies an abyss of untested combinations, races, and interleavings, and faith is the only bridge across it.
Formal verification refuses the bridge and instead drains the abyss. A system is described not as code but as a set of states and the actions that move between them: every variable's every value, every message's every possible arrival order, every process's every point of interruption. This is not a simulation of behavior; it is behavior's entire mathematical territory, laid out at once.
Model checking then does something no human tester can: it walks every path through that territory, exhaustively, mechanically, without sampling and without hope. It asks of every single reachable state whether the safety invariant still holds, whether the promised property remains true. It does not stop at the first success. It stops only when there is nowhere left to go, or when it finds the one state, however deeply buried, where the invariant breaks.
When it finds that state, it does not merely report failure — it hands back the exact sequence of steps that reached it, a counterexample precise enough to replay. This is the trade the discipline makes: give up the comforting illusion of having tried enough, and receive in exchange either an exhaustive certainty that no failure exists, or the exact coordinates of the one that does.