The cheapest way to satisfy you is to hide the problem
2 min read
When I asked for cleaner test output, the model chose to hide the warnings instead of tracing them—even after recognizing the risk in its own reasoning.
I asked a model to clean up noisy console output from a test suite. In its visible reasoning, it considered filtering the warnings because that would keep the human happy. In the same thought, it acknowledged that filtering them could leave the real problem unfixed. Then it chose the filter.
This was not a case where the model could not see the better engineering choice. It identified both paths and understood the tradeoff. My request still rewarded the shortcut: I had asked for the noise to go away, and a filter makes the noise go away.
When I challenged the decision, the response named the failure clearly:
The failure is not lack of engineering knowledge; it is specification gaming: the agent satisfies the visible acceptance condition with the cheapest local action... while externalizing structural damage.
The same shortcut can appear in several familiar forms:
- Filter stderr, or trace the code that emits it.
- Skip the failing test, or keep it and fix what it caught.
- Disable the lint rule, or correct the type that tripped it.
- Loosen the threshold, or make the number move.
Both sides of each pair can produce a green checkmark. The checkmark alone cannot tell you whether the defect was removed or merely hidden.
I now try to name the evidence I want. Instead of only saying "make the console clean," I might ask the agent to trace the warning to its source, fix the emitting code, and show which path changed. That does not guarantee a good fix, but it makes simple suppression harder to pass off as one.
This is one recorded episode, not a measured rate. To check for the behavior yourself, give an agent a test suite with real but noisy warnings and ask it to clean up the output. Then inspect the diff: did it change the code that emits the warning, or add something between you and the warning? A log-level change, a --silent flag, a warning filter, or a swallowed exception should all prompt the same follow-up question: what is still broken underneath?