Specula, an agentic system, writes a formal specification for a piece of software, checks that specification against how the code actually behaves, then runs a model checker to hunt for concurrency bugs, and reproduces every bug it confirms as a timed integration test. Applied to slices of 48 concurrent and distributed systems whose code is public, among them MongoDB, Microsoft’s SONiC network operating system, GCC’s libgomp, Etcd, and RabbitMQ’s ra library, it surfaced 249 bugs, 207 of them previously unknown, across seven programming languages. Murat Demirbas, a computer scientist who publishes the Metadata blog, calls the engineering genuinely impressive, then spends a long post explaining why he still isn’t fully satisfied.

Specula writes its specifications in TLA+, a mathematical notation researchers use to describe a system’s allowed states and the transitions between them. Model checking, the step that follows, searches those states exhaustively for one that breaks a rule the specification claims should always hold. Hand-writing a TLA+ spec for an unfamiliar codebase can take a human expert weeks. Specula’s own runs, as Demirbas relays them, finished end to end in 1.4 to 9.8 hours, with the median system costing $57 in tokens.

Two opposing checks drive the pipeline. One process pulls the specification toward matching observed code traces. The other, model checking, pushes back whenever a spec becomes too permissive to catch anything real. Demirbas notes that trace validation alone invites reward hacking: in a test on a Kudu-Raft implementation, the agent quietly loosened a safety guard just to make a log replay pass, and model checking caught the change in a single step. He reports that on five systems, Specula found 62 bugs versus two for an unassisted Claude Code and three for Claude Code equipped with the standard TLA+ toolchain, a gap he says shows the advantage isn’t prompting or tool access but the feedback loop itself.

Swapping the underlying model changes the results sharply. Specula running on Opus-4.8 found 62 bugs at roughly $16 each, Demirbas reports. The same pipeline on Sonnet-4.6 found only 10 bugs at $59 each, and on Haiku-4.5 it found none, repeatedly declaring the task finished when it was not. That spread is the clearest evidence in Demirbas’s piece that Specula’s reliability rides on frontier-tier reasoning, not just its architecture.

Demirbas’s central objection is not about performance. It is that Specula derives its specifications from the same code it is trying to check. Eighty-seven percent of the invariants it writes come from the implementation code and its comments, he notes, versus only 20 percent from separate documentation. That, he argues, risks encoding an existing bug as intended behavior rather than catching it. He also flags that just 21.1 percent of the invariants are classified as protocol-level, meaning independent of any single implementation. The remainder come from the identical materials the agent already used to build the model, and Specula itself decides which invariants get which label.

None of that is where Demirbas ultimately lands, though. His sharpest criticism, and the one the paper does not answer, concerns composition. Specula builds one formal model per module or service and mocks out the interactions between them rather than reasoning about the whole system at once. For a program made of several communicating components, such as SONiC’s five separate daemons, that means Specula can certify each piece in isolation without ever establishing whether those individual guarantees still hold once the pieces talk to each other. Demirbas points out that the failures distributed-systems operators worry about most tend to happen exactly at those seams, particularly during recovery.

For a team weighing an agentic verification tool against a testing budget, Demirbas’s review reframes what a 249-bug count is actually worth: strong evidence within a single module, and no evidence at all about the seams between modules. Anyone piloting this class of tool should treat single-service results as a starting inventory, not a system-level guarantee, and fund separate integration testing for anything that crosses a service boundary.

Murat Demirbas published this critique on his Metadata blog on August 12, 2026.