Anatomy of one scan
A full scan of a 1.2 million line Go codebase in the decentralized AI inference industry, by the numbers: what was read, how many hypotheses were formed, how they died, and what it cost. No finding details until the maintainers have shipped a fix.
The target
An open-source decentralized AI inference network. It is not named here until a fix ships. 1,209,122 lines, 81 percent Go, with Kotlin, Python and shell around it. The profiler indexed 1,299 sink sites: places where input meets a shell, a query, a file path, a network call, or a deserialiser.
Before the hunt
- Known advisories were pulled from NVD, GitHub Advisories and OSV. None matched the project directly.
- The commit history was mined for past security fixes. Three were found and their patches read.
- The recent delta since the last release was scanned separately, because new code is the least reviewed.
- 31 conclusions from four earlier scans of the same repository were re-judged with the current model before anything new was proposed. One previously refuted finding was recovered.
Hypotheses
Ten hypotheses came out of the planning phase: one from the hunter plan, nine from the zero-day generators. The hunt loop then ran four evolution rounds, proposing new angles as old ones were closed. 28 hypotheses were processed in total.
How they ended
| Outcome | Count |
|---|---|
| Rejected at pre-screen | 13 |
| Refuted with a cited defense | 9 |
| Unverifiable: code not loaded | 3 |
| Unverifiable: evidence insufficient | 1 |
| Candidate for a human | 1 |
| Confirmed exploitable | 1 |
The confirmed finding is a logic flaw in a validation routine. Its report contains a unit test a maintainer can drop into the repository to see the check fail. It is with the maintainers, together with the confirmed findings from earlier scans. Details follow a fix.
Cost
| Metric | Value |
|---|---|
| Model calls | 167 |
| Tokens | 3,437,797 |
| Spend | $0.97 |
| Wall clock | 126 minutes, clone to last call |
The scan ended early. Not because the budget ran out, but because the model provider's key limit was reached. The remaining time was never used, and the counts above are what was gathered before the calls stopped.