Build1 distinct publisher2 min readUpdated
A payments agent reported success on an HTTP 200 whose body said declined. The output check passed. Injecting the fault on purpose scored the suite at 0 percent.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A tool call that fails at the domain layer while succeeding at the transport layer is the version of this bug that walks past everything. The operator in question hands the agent an HTTP 200 whose body reads `{"status": "declined"}`, and because nothing technically errored, structured-error handling never fires [7]. The agent takes the result at face value and writes a sentence saying the payment went through [6].
The eval meant to catch that asked whether the reply confirmed the charge, and the reply did confirm it [6][8]. Set the two surfaces next to each other: the mutation lands in the tool output, the check reads the final answer text, and they never touch, so no amount of judge tuning would have killed this mutant [15]. The author's other examples have the same shape. A `contains("refund")` check keeps passing after someone deletes the refund rule, and a faithfulness judge waves through a confidently wrong answer as long as it is grounded in the retrieved context [14].
What closed the gap was not a smarter output judge, per the author, because the output looked fine [10]. It was a declared failure contract on the tool: `failure_when` with a JSON pointer at `/status` and `declined` among the bad values, checked against the trace by tracelint, with no judge and no key in the loop [11]. Added to the suite, the semantic check still passes while tracelint fails, which kills the mutant and leaves the baseline run green [12].
The 0 to 100 figure deserves less weight than it will get. It is killed-over-injected on the declined-charge mutant, so what reached 100 percent is coverage of one operator rather than coverage of the suite [16]. The author is blunter about that than most tool authors bother to be. A survivor is a candidate and not a verdict, and whether an injected change could really happen is a human call [13]. He also concedes that a suite can be highly sensitive to mutations and still be wrong [13].
The usable part is smaller than the demo and more portable. Mutation testing on evals is a way of making a suite demonstrate that it is capable of failing, by degrading the prompt, the retrieved context, the tool output or the model and counting what the existing checks notice [3]. Code has had that discipline for years in tools like mutmut and Stryker [4]. A suite nobody has watched fail has an unknown floor, and a green run tells you that today's tests passed and nothing about whether they would notice quiet decay [17].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The author previously published tracelint, a linter that catches structural bugs in agent traces; the classic case is an agent that calls charge_card, gets a failure back, keeps going, and tells the customer their order shipped.
Readers repeatedly asked whether their eval suite would have caught that case; the author checked, and on the case he shows it did not: the suite was green, the charge was declined, the agent said 'payment successful', and every eval passed.
muteval applies mutation testing to eval suites: instead of mutating application code it degrades the system under test (the prompt, the retrieved context, the tool outputs, the model), reruns the existing evals, and reports the percentage of injected regressions the evals caught.
Mutation testing in normal software is done by tools such as mutmut and Stryker, which inject bugs into code and measure how many the test suite catches.
Injected regressions the evals miss are called survivors, and the author describes them as concrete coverage gaps.
The demonstration is a deliberately naive payments agent that calls charge_card and reports success; its eval suite has one realistic semantic check, whether the reply confirms the charge went through.
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.
Single self-authored demonstration, reproducible but unverified
Every factual element comes from one first-person post by the tools' author. The mechanism is described concretely, the outputs are quoted, and the demo is runnable keyless from a public repo, which raises the floor above assertion-only. But there is no independent reproduction, no second publisher, and the demonstration is a deliberately naive agent with one semantic check and one mutation operator, so the headline result generalises no further than the author's own caveats allow.
Public release only, no external users disclosed
The material establishes that muteval exists publicly under Apache-2.0 with a working keyless demo, and that tracelint exists under MIT. Beyond that there is no deployment, download, dependent-project, or user disclosure of any kind, and the author is soliciting feedback rather than reporting usage — so adoption evidence stops at availability.
Dramatic framing, modest and self-scoped demonstration
The framing — a green suite while the agent lied about a declined charge, scored at 0%, then 100% after one added check — reads as a general indictment of eval suites, while the underlying demonstration is one deliberately naive agent, one substring-style semantic check and one mutation operator. The gap is real but small, because the author himself scopes the 0% figure, calls survivors candidates rather than verdicts, and states that mutation sensitivity is not validity and that synthetic mutants may not model real regressions.
Author is promoting his own two tools in the only source
The sole source is written by the creator of both muteval and tracelint, on a self-publishing developer platform, and ends with install commands, repository links and an explicit engagement ask. The result presented is that the author's second tool closes the gap found by the author's first tool, which is a strongly self-serving configuration even though the code is permissively licensed and the demo is independently runnable.
Mechanism clear, generality untested
Confidence is moderate: what the tools do and what the author observed are stated precisely enough to be checked, and the keyless demo makes verification cheap. It is held down by single-source, self-interested provenance, absence of any external adoption or replication, and the author's acknowledgement that whether synthetic mutants predict real failures is still an open question.
build
Coverage at 80% was a price on human attention, and CI is the wrong place to charge it1 distinct publisher
build
Coverage Is A Line Counter, So A Coverage Gate Buys You Line-Counting Tests1 distinct publisher
build
The check that never fires: why every agent-built detector needs a negative control1 distinct publisher
build
An AI test suite hit 94% coverage and missed the one branch that mattered1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 24, 2026