Build1 publisher2 min readPublished
The Critic agent had to break a line and watch the suite fail before it would sign off. It did exactly that, twice, on fixes that never ran in production, because the fixture kept answering yes after FishNet had said no.
The Engineer · Build desk

Follow any of these and your For You feed starts watching them — no settings page required.
Compiled by The EngineerSomething wrong?How this is made
Mutation testing answers one question: change this line, does an assertion notice. That is a fact about the coupling between a test and the code it names. Whether the test drives that code the way production drives it is a separate question, and a mutation cannot reach it. When the fixture is wrong, the mutated and unmutated runs fail for the same wrong reason, the evidence looks complete, and the fix never executes on the path it was written for [13].
The receipt here is two line numbers. In FishNet's `ManagedObjects.cs`, `Deinitialize(asServer)` is called at 418 and `UnityEngine.Object.Destroy` on the GameObject at 437 [9], nineteen lines later in the same file [1]. `Deinitialize` flips the flag through `SetInitializedStatus(false, asServer)` at `NetworkObject.cs:1147` [10], and `DecidesHere()` reads that flag [8]. Unity runs `OnDestroy` after the object has stopped believing it has authority. "My fixture was more cooperative than reality, in exactly the spot the feature lived," the developer writes in the Curbside devlog [20].
Driving the real path turned out to be the cheap part. `StartServer()` then `StopConnection(true)` then `StartServer()` in a single process is 180 lines, runs in about 40 seconds, and uses a launcher another test already used [15]. It had been written off as flaky process-management engineering [16], which is the usual reason a lifecycle test does not exist. Once the real lifecycle ran, the failure was immediate [18]. Ahead of that sat a fortnight of debugging [19] and two consecutive fixes that were green, mutation-proved and inert [14].
For this to be your bug, you need a framework that mutates its own state during teardown, a guard that reads that state from a destruction callback, and a fixture that answers the guard from a constant. Unity with FishNet supplies the first [9][10]. Any hand-rolled arbiter stub supplies the third [12].
The loop is worth keeping on this evidence. The same mutation standard caught a mechanic that shipped with its entry point having no caller under a fully green suite, with every rule of the feature tested and nothing in the game able to reach it [4]. Reading the tests would never have surfaced that. What the standard cannot price is fixture fidelity, so it belongs on the assertion and something else has to own the stub. And the evidence base is one developer, one game still in grey boxes, one networking library [1]. The mechanism generalises, because the teardown order lives in the library rather than the game, but the frequency does not, since there is no denominator.
Ranked by verification strength, evidence, and original report placement.
The suite was green at 161 of 161, and the applied mutation of deleting the Unstow() call made the new test fail as predicted, which the author counted as complete evidence by the standard he had set.
A mutation proves a test is load-bearing for what it asserts but cannot prove the test models production; if the fixture is wrong, the mutated and unmutated runs both fail for the same wrong reason, the evidence looks perfect, and the fix never executes on the path it was written for.
Curbside is a co-op car theft game being built in Unity 6 with a three-agent loop, described in devlog #1 on dev.to; it is currently grey boxes on a grey plane with one district, drivable streets, and one heist tier working end to end across two machines, with no art, no NPCs and no sound.
The loop uses three strictly separated AI agents: an Architect that writes a spec and no code, a Builder that implements the spec without designing the seam or grading its own work, and a Critic that reviews the result cold without seeing the Builder's reasoning.
The Critic's standard of proof is mutation, not reading: it is not allowed to say a test looks weak, it must name the production line to break and the assertion that should then fail, break it and run the suite; describing a change to production code that leaves the suite green counts as a finding regardless of how the test reads.
In the wheel mechanic, the server decides everything and clients only ask; if the car is destroyed while the wheel is fitted, the wheel should come off and return to where it started so the next car must be repaired by hand.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Checkable detail, single witness
The account is unusually falsifiable for a devlog: named files, two line numbers in FishNet's teardown path, a suite count of 161, the exact mutation applied and the assertion that failed. All of it comes off one developer's machine, and nobody else has opened ManagedObjects.cs to confirm the ordering the argument turns on. The one success claimed for the agent loop without any such detail, the mechanic whose entry point had no caller, is also the one a reader cannot check.
One repository, one developer
Two machines, one district of grey boxes and a single licence seat is the whole footprint. Nobody else is reported to be running this agent loop, and the game has no players, so the practice described has exactly one user: its author.
Argued below what it shows
The headline concedes the failure rather than selling the workflow, and the sharpest language in the piece is aimed at the developer's own reasoning. The part with reach beyond this project gets the least volume: any Unity project that asks FishNet for authority inside OnDestroy will read false on every peer for the same reason, and that sits in the middle of the post as a code listing. Pulling the other way, a general rule about mutation testing's blind spot is drawn from two incidents in one codebase against one library.
Devlog #1, with a game to sell
This is the first entry in a series promoting an unreleased game and a bespoke agent workflow, which rewards making the workflow look rigorous. The content pushes the other way: the centrepiece is that workflow producing false confidence twice, and the developer also reports his reviewing agent raising a confident, specific and wrong blocking finding in the round where a locked licence seat left it unable to execute code. Self-promotion that leads with two of its own false clears is weakly distorting.
Coherent account, no second reader
Internally the story holds together: the teardown ordering explains the 100% early exit, the stub explains the passing test, and the latch explains why the restart test now fails on the old guard. Against that, every number and every code excerpt reaches us through the person whose mistake is under discussion, and a reader who does not use FishNet has no way to test the one claim the rest depends on.
build
Coverage at 80% was a price on human attention, and CI is the wrong place to charge it1 publisher
build
The Unity netcode you choose writes rules for gameplay code you have not written yet1 publisher
build
Unity's AI problem is not the prompt: the load-bearing context lives in the prefabs1 publisher
build
Cognition's $47bn ask prices Devin at about 94 times its own run rate1 publisher
Publishers with included, body-backed reporting in this cluster.
1 article · September 7, 2026