Live demo
Two release candidates. One of them is ready.
A defect population was generated and hidden. Three detection methods sample it independently, and the estimator sees only what they found. Every number below is computed in your browser from the overlap between the finding lists, and the true count is revealed afterwards so you can grade it.
The audit most teams actually run
One scanner, one reviewer, and no answer
Two methods found 34 and 28 defects, and agreed on 5 of them. That is not enough shared findings to estimate from, so the honest output is a warning and not a number. Most tools would print the number.
The shape of most security reviews. Two methods, and they barely found the same things.
| Pair | Found | Overlap | Estimate | 95% interval |
|---|---|---|---|---|
| Static analysis x Manual review | 34 / 28 | 5 | 168 | 67 to 270 |
Ground truth, which the estimator never saw: 160 defects were injected. The estimate came back at 168, off by 5%, and the true value sits inside the interval.
Add a third method
Now the overlap says something
Same product, a longer review and a fuzzing campaign added. Three methods means three independent pairs, and the spread across those pairs is itself the check on whether the independence assumption is holding.
Three methods, three weeks. The report lists what was found and says nothing about what was not.
| Pair | Found | Overlap | Estimate | 95% interval |
|---|---|---|---|---|
| Static analysis x Manual review | 46 / 44 | 11 | 175 | 104 to 246 |
| Static analysis x Fuzzing | 46 / 50 | 19 | 119 | 89 to 149 |
| Manual review x Fuzzing | 44 / 50 | 9 | 229 | 121 to 336 |
Ground truth, which the estimator never saw: 160 defects were injected. The estimate came back at 175, off by 10%, and the true value sits inside the interval.
Three weeks later
What being done looks like
After remediation, against a much smaller residual population. The methods now keep finding the same defects as each other, which is the signal that there is not much left to find. Heavy overlap is the good outcome, and it is the opposite of what it feels like at the time.
Same team, same product, three more weeks of testing against a much smaller residual population.
| Pair | Found | Overlap | Estimate | 95% interval |
|---|---|---|---|---|
| Static analysis x Manual review | 26 / 26 | 16 | 42 | 36 to 49 |
| Static analysis x Fuzzing | 26 / 21 | 14 | 39 | 33 to 46 |
| Manual review x Fuzzing | 26 / 21 | 13 | 41 | 34 to 50 |
Ground truth, which the estimator never saw: 42 defects were injected. The estimate came back at 41, off by 1%, and the true value sits inside the interval.
Where this breaks, and it will break on your data
Unequal findability makes the answer look better than it is
The estimator assumes every defect is roughly as easy to find as every other. Real code does not work like that: some bugs live in the file nobody reads and no method is good at them. Below is the identical 160-defect population from the second panel, with a third of the defects made hard for all three methods. Nothing else changed.
Hard-to-find defects are missed by every method at once, so they never enter the overlap and never enter the estimate. The population looks smaller than it is and coverage looks higher than it is. On the well-behaved RC1 data the estimate landed within 10% of truth. Here it comes back 35% low with no warning attached, because the overlaps are healthy and nothing in the arithmetic can see the difference. Read every number this product produces as a floor on what remains, not as an answer. The true remaining count is usually worse.
Try it on your own numbers
Two methods, two counts, and how many they shared
That is the entire input. Push the overlap up and watch the remaining count collapse. Push it down and watch the interval blow out and the product refuse to give you a number.
Two assumptions hold this up and neither is free. The methods have to be independent, so two reviewers working from the same checklist will overstate your coverage. And defects have to be roughly equally findable, which they are not, and that one biases the answer low.