Maintainability sensors for coding agents · Birgitta Böckeler, Distinguished Engineer, Thoughtworks · martinfowler.com, 27 May 2026
Coverage said the code was tested. Mutation testing found 13 places it was not.
This is the follow-up to Harness engineering for coding agent users, the article that supplies the guides-and-sensors vocabulary, and it reports what happened when Böckeler removed one half of that pair. She rebuilt an internal analytics dashboard in TypeScript, NextJS and React from scratch, using Cursor, Claude Code and OpenCode, and deliberately wrote almost no markdown guides, "to see how well it can do just by relying on sensor feedback." The agent wrote the entire test suite with, in her words, no oversight beyond manual testing and watching coverage.
One file, mappers.ts, reported 100
percent statement coverage and 75 percent branch coverage while having no unit tests
whatsoever; the coverage came from a single large acceptance test that happened to call
through it. Stryker, the mutation testing tool she used, reported 13 survivors, meaning 13
deliberate code mutations that the suite stayed green through. Her summary of the gap:
"coverage tells us that a line was executed, but not that its impact was verified."
Grounding an LLM modularity review in deterministic coupling data did not improve it. "The AI mostly found confirmation in the data, but not any additional findings. On the contrary, it pointed out lots of things that the CLI was missing." The raw metrics on their own fared worse still, flagging a deliberate dependency-injection factory and a shared schema as defects. Her lint messages offer a design move you can copy today: they carry the reasoning rather than the verdict, and permit the agent to raise a threshold slightly instead of suppressing a rule, "so that the rule fires again if it gets even worse in the future." She found the one rule category where the agent behaved badly was the one category where she had forgotten to configure that guidance.
She is equally plain about what did not work. Getting the agent to check the sensors at all was unreliable: "I had to ask the agents many, many times why it had not run the sensors check a single time." And she declines the larger claim outright, writing that the sensors "are not a magical solution to take the human totally out of the loop."
This is one engineer's experience on one self-built internal application, with no comparative baseline, and the sensor tooling is her own. Read the numbers as measurements from that setup, not as a benchmark.
Why it matters: If you have let an agent write your tests, your coverage number is measuring the wrong thing, and Böckeler has put a figure on how far wrong. Mutation testing is the cheap check that tells you whether the suite would actually catch a regression, and it is the one sensor in her list that becomes more important the more of the testing you hand over. The lint-message pattern is the other portable idea here: a rule that explains itself changes agent behaviour, and a rule that only forbids gets routed around.