Our release notes were wrong, and how I found out
Mullet 2.3.0’s notes made two claims the code did not support. Checking each claim against the repo while I wrote about the release caught both, and 2.3.1 corrected them.
A release note is a claim about code, and a claim can be wrong. Two of the claims in Mullet 2.3.0’s notes were.
What the notes said
- The decision records, the short context, decision and consequences files beside the code, ran from 0001 to 0010.
- Containers started by 2.3.0 lack the owner labels that the cleanup of orphaned containers relies on, so they are never cleaned up and have to be removed by hand.
What the code said
There were eleven decision records, not ten. The eleventh is the one for the container sandbox, which was the main new feature of the release, and the notes had left it out.
The second claim was written before the last fixes went in. The v2.3.0 tag already had the labels, so the warning described a build that never shipped. I only found that by looking at what the tag contained, rather than at what I remembered writing.
How it was found
I was writing about the release, and for each claim in a post I looked for the line of code or the file that backed it. That is slow, and it turned up more than I expected. These notes were the largest finding. A smaller one was that the Python plan() call returned the planner’s notes but dropped the questions it could not answer from the code, so a script that approved straight away never saw them.
None of it was hidden by a test. A test checks what the code does. Nothing checks that the words describing the code are true.
What changed
Mullet 2.3.1 corrected both notes, and plan() now returns the open questions. The sandbox image tag follows the version, so after an upgrade mullet sandbox build-image has to be run again. That is the part of the old warning that still holds. One older line about rebuilding an image from 2.3.0 is still in the 2.3.0 notes, and it is the second thing I would fix.
I don’t know whether anyone acted on the wrong notes in the short time they were up. If you did rebuild an image you did not need to, that cost a few minutes and nothing else.
The habit I am keeping
When a post or a changelog says what the code does, I find the file that proves it before it goes out. For anything with a number in it, I find the number. The posts I wrote this week have a few lines I could not back that way, and they say so, as we checked the bill did about the ledger.
The notes for every release are in the changelog.
More on Mullet
-
Mullet’s delegation tools are now opt-in
Mullet 2.4.0 turns the older delegation tools off by default. They send work to another model provider, so they now run only when you set…
-
Cheap models only for the work that is safe to be wrong about
Mullet tries free and cheap models first only on steps its gates can judge, and starts one-way steps on Claude, with an independent review on the…
-
Decision records for a solo project
Mullet now keeps eleven short decision records beside its code, each a context, a decision and its consequences. Why a one-person project bothers…
-
Mullet from Python
Mullet 2.3.0 adds mullet.api, so a script or CI can plan, approve, run and merge coding jobs without the CLI. It was built by splitting the CLI’s…
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 it stays out…
-
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…