Why a ‘mechanical’ step failed the risk gate
Mullet’s risk gate fails a step labelled mechanical when its diff changes a literal or a call. A small prompt edit that has to change both failed it twice, so the label has to follow what the edit does, not how small it looks.
On 1 November a Mullet step labelled mechanical failed its risk gate twice on a small prompt edit. The gate scans the diff for changed literals and calls, and a step that has to change them is not mechanical, however small it looks.
In Mullet, every step in a job has a kind: mechanical, design or analysis, and a step with child steps counts as an integration step. Mechanical steps can go to cheaper workers, which is why the label is tempting, and the kind changes how some gates treat the step. The gates are described in Gates, not a model’s word.
What the gate does
Gate G3 fails a step of kind mechanical when its diff to an existing file does any of these:
- changes a literal
- changes the arguments of a call
- changes a comment
- adds control flow
- changes the value in an assertion
- flattens curly quotes to straight ones
It is a deterministic scan of the diff. No model reads it. The scan exists because cheaper models sometimes silently corrupt a literal or add a call argument. New files are skipped, because there is no existing code for the diff to change.
The message I saw was “4 risky edits in a mechanical node”.
What the job asked for
The job had three small prompt changes, each labelled mechanical:
- A brief pointer: add a sentence telling the worker where its brief is on disk, which means two new functions, an inline string replaced by a function call, and a changed function signature.
- A reviewer change: lower
MAX_FINDINGSfrom 20 to 5 and add a paragraph to the reviewer’s instructions. - A planner change: add guidance text.
Only the first step ran. It was blocked after four attempts: two aborted because the prompt did not fit the context window, and two failed gate G3. Both G3 failures were flagged for the same four edits, one call whose arguments changed and three string literals. The later gates never ran on either, so I do not know whether the code was otherwise right.
I think a correct version of that step would trip the scan as well, because the brief itself asks for a replaced string and a changed call. I have not tried a hand-written version. The other two steps never started, so I have no result for them.
For contrast, the same model passed a step that only created new files, with nine tests added. Nothing in that diff touched existing code, so there was nothing for G3 to flag. That is a sample of one.
Label by what the edit does
A mechanical step is one a cheap worker can do without judgement, and a changed literal or call is where silent mistakes hide. Size says nothing about that. A change like MAX_FINDINGS from 20 to 5 is one character and changes behaviour, and I would expect the scan to flag it, though that step never ran.
So the kind of a step has to follow what the edit does, not how small it looks. If a step changes values, strings or calls in existing code, it should not be labelled mechanical.
The code is at https://github.com/tomgould/mullet-public.
More on Mullet
-
Where Mullet goes next
Mullet 2.5.0 is out. What I plan next: a guard that checks a step fits a model’s window, a price ceiling instead of a free switch, more settings and…
-
Eight rules from a game framework’s agent prompts, for web and print design
On 1 November I read the agent prompts of VibeGame, a framework that builds 2D web games, and kept the eight techniques that carry over to web and…
-
What I tried and binned, and what each one cost
Three local-model options I stopped using, with what each cost and the verdict: a 25 GB model that timed out in a job, a Blackwell-only fork ruled…
-
When your plan has no five-hour limit
Mullet 2.5.0 copes with a Claude plan whose usage data has no five-hour window: the HUD drops the five-hour figures and the budget guard paces on…
-
Very cheap is basically free: pricing a coding model per step
A free model id in my config silently had no hosts, and the real price of a cheap coding model depends on which hosts you will accept. The per-step…
-
Thirty-four lines of shell to keep a local model alive
Strata’s server belongs to its launcher, so a plain systemd unit does not work. A one-shot unit plus a small watchdog on a timer had the model…
-
Half a 125-billion-parameter coding model, running on a 12 GB laptop GPU
On 1 November a pruned, quantised coding model ran on my laptop’s 12 GB GPU, split across VRAM, RAM and the CPU. What it is, the speeds I can and…
-
Two local-model failures that point at the context window
On 1 November a local model failed one Mullet step and had two attempts aborted on another, and both point at the context window. What the harness…
Featured projects
-
Solar Calendar
A calendar of 13 identical 28-day months, with each year starting on the first Monday on or after the spring equinox.
-
Where Should I Live
Rank cities around the world by what you’d keep after tax, what a month costs, which visas you can get and how each place fits the way you live.
-
Apple News API
A PHP client for publishing articles to Apple News, with a document builder for the whole Apple News Format.
More writing
-
A Markdown version of every page, for AI agents
Why every page on this site now has a Markdown version for coding agents, the three ways an agent finds it, what goes into it, and how each version…
-
A TV remote from the command line
Pairing a Linux computer with a Google TV over the protocol phone remotes use, what the six-character code on the screen really checks, and why a…
-
The packages I kept on a Google TV
The other half of decluttering a TCL Google TV: a keep-list of 35 packages that debloat lists remove or that only look disposable, how each one got…
-
Letting an agent drive the TV
The rules a coding agent worked under while it changed a TV we were still watching: only changes that can be undone, small batches with a person…