Framing /2026-07-21 /10 min read

Proves safe, not catches bugs

A scanner is an alarm you eventually learn to ignore. A verifier is a gate you want to pass. The difference is not marketing. It changes who acts on the result, when, and whether the tool survives contact with a real developer.

Security tools die the same death. They ship, they fire, they are right often enough to be installed and wrong often enough to be resented, and then one afternoon a developer under deadline turns off the noisy check, and it is never turned back on. The tool did not fail because it caught too little. It failed because it caught in the wrong register: as an alarm, aimed at a tired human, after the work was already done.

Acutis is built to occupy the opposite register. Not an alarm that catches bugs, a gate that proves safety. Those sound like two phrasings of one idea. They are not. They imply different owners, different timing, and different failure modes, and this post is about why the difference is the whole design.

The alarmWhy "catches bugs" contains its own defeat

An alarm is a claim about something bad: this looks like a vulnerability, a human should come look. Everything about that framing sets up the failure. The claim is probabilistic, so it is sometimes wrong, and every wrong alarm is a small tax on the person who investigated it. The claim is negative, so a clean run tells you nothing you can act on, only the absence of complaint. And the claim arrives late, after the code exists, addressed to a developer who has already moved on to the next thing and now has to context-switch back to adjudicate a maybe.

Pile enough of those small taxes on one person and you get alert fatigue, which is not a personal failing but an arithmetic certainty. The rational response to a stream of mostly-wrong interruptions is to stop reading them. So the tool that "catches bugs" trains its user, one false alarm at a time, to ignore it. Its own accuracy problem is the mechanism of its abandonment.

An alarm asks a human to prove it wrong. A gate asks the code to prove itself right. Only one of those scales to the volume of machine-written code.
On registers

The gateWhat "proves safe" changes

A gate makes the opposite kind of claim. Not "this is bad, come look," but "this is proven safe under a declared contract, pass." The claim is positive: a clean result is a verdict you can build on, not merely silence. It is checkable: the verdict comes with the reasoning that produced it, so it can be audited rather than trusted. And critically, it is addressed to a different party at a different time.

Because Acutis verifies the contract an AI declares about code the AI just wrote, the natural place for the gate is inside the assistant's loop, before the code is ever shown to a person. The AI generates a change, declares what it does, and asks Acutis. If the answer is a block, the AI is the one that sees it, understands the specific property that failed, and revises, all in the same breath as writing the code, with full context still loaded. The human is never handed a maybe. They are handed code that has already passed.

This is the move that dissolves alert fatigue instead of managing it. The party best equipped to act on a security verdict, with the most context and the least switching cost, is the AI that wrote the line one second ago. The party worst equipped is a human reviewing a diff hours later. Conventional tools deliver the verdict to the second party. Acutis delivers it to the first.

The directionWhy over-blocking is the safe way to be wrong

No verifier is omniscient, so the honest question is not whether Acutis is ever wrong but which way it errs. A gate and an alarm fail in opposite directions, and the asymmetry is the point.

When Acutis is uncertain, it blocks. A missing declaration, an unresolvable call, an assumption it cannot discharge: all of these push toward the top of the lattice, toward "cannot prove safe," toward a block. So its mistakes are false blocks, not false passes. And a false block, in this architecture, is cheap: it costs the AI one more revision round inside the loop, absorbed before any human sees it. A false pass would be expensive: it ships a vulnerability. We deliberately trade the cheap error for the dear one. An alarm makes the reverse trade, tuning itself down to spare the human noise, and buys quiet at the price of misses.

What we have actually measured, and what we have not

The claim that this loop works is testable, and we have run the test. In a paired study across forty real coding prompts, each built with a tempting path to a taint-flow vulnerability, the vulnerability rate in generated code fell from 62.5% without Acutis to zero with it, with no regressions. Separately, on a suite of ordinary benign tasks, the terminal false-block rate was zero: the gate did not stand in the way of code that was actually fine. What we have not yet published is a large multi-model matrix or throughput under production load. So the honest statement is: the mechanism is demonstrated on controlled studies with a very small p-value, not yet proven at scale. We would rather you knew which of those it is.

The consequenceA verdict you want, not one you dread

Change the register and you change the relationship. Developers do not resent a passing test; they aim for it. A gate that lives inside the AI loop and comes back green is not an interruption, it is a green light, and the rare red is caught and resolved before it reaches anyone's screen. There is no stream of maybes to grow numb to, because the maybes were spent inside the loop, against the one reader who had the context to answer them instantly.

That is the reframe in one line: a gate you want to pass, not an alarm you learn to ignore. Everything else, the name-blind engine, the property lattice, the machine-readable proof, exists to make that gate trustworthy enough to sit in the path and fast enough to belong there.

Verified with Acutis. This page's script passed the gate, scan_code returned ALLOW, before the page was published.