Margin removal is one line of arithmetic, which makes it easy to trust and easy to break. Four checks, run on every market you normalize, catch every broken result before it reaches a model or a screen: the sum, the bounds, the ordering and the distance from the raw price.
The sum check
After normalization, the probabilities of a complete market sum to one by construction. In floating point, expect a hair of slack: the no-vig calculator notes that its rounded percentages may not sum to exactly 100%, and the same applies to any pipeline that rounds for display, checked 2026-10-04. Check the unrounded values against a small tolerance, something like a tenth of a percent, and reject the row if the sum lands outside it.
A sum that misses the tolerance is never a rounding story. It means an outcome was dropped or double-counted before the division ran.
The bounds check
Every fair probability lives strictly between zero and one, and every fair decimal price is strictly above one. A fair price of exactly 1.00 claims certainty, which no market offers, and a negative value claims nonsense. Both are parser bugs, not market findings.
Run this check on inputs too. The calculator requires decimal prices above 1 and rejects anything else, because a raw price at or below 1.00 cannot be a real offer. Catching it at the boundary keeps a bad row from poisoning a week of history.
The ordering check
Proportional removal divides every implied probability by the same sum, so it can shrink outcomes but never reorder them. The favorite before removal must be the favorite after it. If your output flips the ranking of two outcomes, something upstream broke: a mismatched field, an outcome mapped to the wrong price, a market read from two different timestamps.
This check is the cheapest of the four and the one that catches mapping bugs, which are the bugs that matter most, because a swapped outcome looks like a plausible number.
The distance check
Fair prices should sit near the raw prices that produced them. In a market with a 5% overround, proportional removal moves a 1.91 to about 2.00, a few percent, never to 3.50. Compute the ratio of fair to raw for each outcome and flag anything beyond a band you choose; the band widens with the overround, but a fair price at double the raw price means the inputs were incomplete, not that the market was generous.
A distance failure usually traces back to a missing outcome, which is the same bug the sum check catches from the other side.
Run them per market, not per day
These checks cost four comparisons per market and belong in the ingestion path, not in a nightly audit. A bad row rejected at arrival is a line in a log; a bad row discovered in a chart is a lost afternoon. The calculator applies the same posture interactively: it flags an underround instead of normalizing it, because a failed check should stop the data, not decorate it.
Sum, bounds, ordering, distance. Four comparisons, and the fair prices you publish are the fair prices you computed.