4 min read Measurements Tools
We measured our scan. It found 4 of 105.
The first two measurements found nothing, 0 of 31 and then 0 of 40. This one was written down before it ran, on contests nobody here had touched. It missed its own bar, and we are publishing it anyway.
Correction, 26 October: this note first said that the first measurement found 0 of 40, and that the scan found none of 40 the first time. The first measurement found 0 of 31. The 0 of 40 is version 2, which added 9 findings from three new contests to those 31. The numbers in the result files were right, the note mixed them. See the errata.
Update, 25 October: a newer version of the scan is live and found 8 of 105 on the same contests. See [the note](/notes/scan-version-3-1).
Bug Bounty Intelligence reads the Solidity of a public repository and returns a list of hypotheses to check by hand. We sell it for 5 USDC through x402. It is not an audit.
The first two times we measured it, it found none of the known findings, 0 of 31 and then 0 of 40. We changed it, wrote down a test before running it, and ran that test once on 8 contests that nobody here had run anything on. The version in production found 1 of 105 known findings. The new version found 4. Our own bar was 5 more than production, and it found 3 more. We missed it, so production stays as it is.
The numbers
Each with the place where you can check it.
4 of 105
Known High and Medium findings found by the new version on the sealed set, counted only where two judges of different model families agree.
The results1 of 105
The same count for the scan as it runs in production, on the same contests.
The results3 of 5
Findings the new version found that production did not, against the 5 our rule required. The rule was written before the run.
The pre-registrationabout a minute
46 to 105 seconds and at most 0.064 dollar per scan, against 2.7 to 8.6 minutes for production.
Time and cost per scande1a23a4
The first characters of the SHA-256 of the sealed set, committed before the run. The set is published now, so anyone can recompute it.
The set
What the number means
Four of 105 is a small number. The new version missed 101 known findings, including 57 of the 59 easy ones, the ones five or more auditors found, and all 14 in the middle group. It found two of the 32 that only one or two auditors found. Nobody should read this as a scan that finds what a human audit finds.
It is still the first number we can defend. The old scan found 1 of 105 on the same contests, the new one found 4, and the new one needs about a minute instead of several.
The bar we missed
Before the run we wrote that the new version would replace the running one only if it found at least 5 known findings that the running one does not, at least twice as many as it loses, with precision not more than 2 points lower and at most 1 dollar and 20 minutes per scan. It met every part except the first: 3 instead of 5.
After the run we read the two cases where the judges disagreed. Both look like the known findings to us, with attack paths that are partly off. Counted, the new version would have reached 5. We do not count them, because the number we registered is the one both judges agree on. Our reading is ours and not independent, and it is in the results next to the strict number.
What happens now
Production stays as it is, as the rule says. We keep working on the next version. It will be measured the same way, on contests that appear after today, and we will publish that number too, whatever it is.
How the scan finds things stays private, because that is the product. How it is measured is all open: the contests, the split, the judges, the rules written first and every output. The files the new version ran were committed by hash before the run, so they could not change afterwards.
How the test was built so that we could not bend it
The known findings come from the final reports of Sherlock contests, one entry per unique valid finding, with the number of wardens who found it as the measure of difficulty. A rule picked the eligible contests, and the hash of a Base block that nobody here could choose split them into a development set and a sealed set. We committed to the sealed set with a hash and did not tune on it.
Two judges of different model families decide whether a hypothesis matches a known finding. A hit counts only when both name the same finding. A person reads every disagreement and the hits. The decision rule was fixed in advance.
What we do not claim
- That the scan finds vulnerabilities in general. Four of 105 does not show that.
- That these contests are outside the models' training data. They may not be, so absolute numbers can be too high. The comparison between the two versions on the same contests is less affected, and contests that appear after today will give a clean test.
- The judges are language models, and we have a stake in the result. That is why the disagreements are read by a person and every table is published.
- None of this is an audit, an approval or a certification.
Check it yourself
The split can be recomputed with the script in the repository, the set hash from the published set, and the scores with the open judges and an OpenRouter key. If you find a mistake in how we measure, open an issue. We correct it in public.
Read the results and the rule
Everything the test needs is in the repository, including the prediction we wrote before the baseline ran.