September 3, 2026

Two Releases Before Midnight

Cut a feature the product didn't need, fixed what broke because of it, then rebuilt the one piece of database infrastructure I was least comfortable trusting blind — two releases, one day.

Shipped v1.3.0-beta this morning. Shipped v1.3.1-beta the same night. Two releases in one day isn’t a pace I’d plan for, but the second one wasn’t going to sit half-finished on my desk overnight, so it went out.

The morning release cut a feature I’d already decided didn’t belong: tool calls used to be able to run in the background, off in their own lane while the model kept talking. It sounded useful. It wasn’t — every prompt hint that told the model to punt work “into the background” was just teaching it to hide latency from the user instead of just answering. Ripped it out completely: the listing and cancel endpoints, the runner and its crash guard, the interface rows and the elapsed timer, gone. Every delegate call answers in the same turn now, full stop. A stray async flag from an old prompt just rides through as junk nobody reads instead of switching modes.

Killing it broke things I didn’t expect. The shipped playbooks — the scripts that tell the model how to use each skill — still had the old hints baked in: async instructions, a “place” hint nothing used anymore, memory steps pointing at tools that had been renamed out from under them. None of it crashed; it just quietly told the model to do things that no longer existed, which is worse. Rebuilt every playbook against what actually exists and regenerated the skill index so a running instance matches what’s written down.

Also spent an hour rewriting how Chalie decides whether a provider can actually see images. The old check sent one request and asked the model to score itself in JSON — which mostly tested whether a model can format JSON, not whether it can see. New version asks five plain questions about a test image at once instead of one after another — what colour’s missing, what colour’s there, how many shapes, the caption verbatim, the caption applied to the shapes — and calls it vision-capable at three right answers. Thinking’s off for every question, because turning it on meant a one-word answer showed up behind a hundred tokens of reasoning nobody asked for. The old sequential version took over two minutes on a busy server and the save just timed out before it ever produced a verdict.

The real work was the database. Chalie used to run one file and rewrite it in place on every upgrade — which means a bad upgrade could corrupt the only copy of your data with nothing to fall back to. Not anymore. Every release now gets its own file, and the first boot on a new version copies every table forward from whatever came before it. A table that fails to copy gets logged and skipped instead of stopping the boot — you lose that one table’s data, not the whole install. A boot that dies mid-copy is caught on the next start and the wreckage gets moved aside, never deleted. The last three versions stay on disk as restore points. Downgrading just re-points at the older file, no conversion needed, because it was never touched.

That’s the shape of the day: cut something that shouldn’t exist, fix what broke because of it, and rebuild the one piece of infrastructure I was least comfortable trusting blind. Next up is watching v1.3.1-beta actually run through a real upgrade path and see if the restore points hold up under something messier than a clean test.

  • Shipped v1.3.0-beta and v1.3.1-beta, same day

  • Removed background tool execution entirely — every delegate call now answers inline, in the same turn

  • Rewrote the shipped playbooks to drop stale references to the removed feature and renamed tools

  • Replaced the single JSON-scored vision check with five concurrent bare-answer questions, thinking off, three-of-five to pass

  • Database is now versioned per release; boot copies data forward instead of rewriting in place, and a failed copy no longer takes down the whole install