A few days ago I wrote a post about how I only wanted two AI subscriptions, and how Claude was the one getting cancelled. Claude is now in charge of the other three.

I would like to say there was a dramatic reason for this. There wasn’t. Codex had been running the show, it was doing fine, and I moved the job across because I wanted to see what happened. That’s the entire justification. A promotion, a demotion, and a backup of the old config taken at quarter past eleven at night, because I have learned exactly one lesson in my life and it was about backups.

So the roster is four: Codex, Claude, Grok, and Google’s Antigravity. One of them plans and reviews. The other three get handed bounded jobs. And because saying “ask the Google one” out loud thirty times a day is its own special punishment, they have names now. Anvil is Codex. Keystone is Claude. Flint is Grok. Albatross, Alby for short, is agy.

The nicknames are for talking. Every log line, quota check and credit keeps the real provider name, because the one thing worse than four assistants is four assistants and no way to tell which one did the thing.

The rules are blunt. Each provider has a 90 percent ceiling on its weekly allowance, which leaves at least 10 percent for me, because these things are meant to be doing my work, not eating my quota so I can’t. Nobody quietly switches to paid billing to get around a limit. Every job I hand off needs a concrete result, the files it’s allowed to touch, acceptance criteria, and a budget check.

Then there’s the genuinely stupid part: one standing policy, 228 lines, mirrored into four separate instruction files, because each tool only reads its own. Miss one and you have a Head Developer that three of the four assistants have never heard of.

The gate, the launcher, the pane

There’s a quota gate that has to run before every delegated job and again afterwards. Delegated, in this house, means I handed the work to one of them instead of doing it myself. There’s a launcher that bounds the work, keeps the streamed partial output so a death mid-job isn’t a total blank, and classifies failures as timeout, empty success, or agent failure instead of trusting an exit code. Empty success is the fun one: it walked off claiming it was fine and produced nothing.

And in the small hours I wrote the one that runs a teammate in a pane of a terminal multiplexer, requires a stated task label and acceptance criteria, waits for a completion marker, and appends every run to an event log.

A completion marker is a word I tell them to print when the job is actually done. You can already see the hole in that plan. It assumes “done” is a thing the furniture will admit to.

Idle is not evidence

Asking the multiplexer whether an agent has finished is worth precisely fuck all.

Grok reported idle at 23 seconds into 35 seconds of work, with its command still running. agy reported idle at 7 seconds, which was impressive given its command hadn’t started yet.

agy also parks in idle between tool calls, and it echoes prompt text into its own visible thinking, so neither a status of idle nor a matching completion word is enough for it. A review got declared finished at 168 seconds while the pane still read “Running command…”. The wrapper then closed the pane and destroyed the work. The fix waits for the pane’s content to stop changing, with a longer settle time for agy.

The panes themselves had a second trick. Each kept pane leaves a split behind, and the next split is narrower. At three or more panes each one is about 6 columns wide. That is not a workspace. That is a breadstick. Every completion marker wraps across lines, and the match can never succeed. A correct 30 second task timed out at 306 seconds with its marker counted zero times.

The multiplexer also truncates a multi-line prompt echo to its first line, which made my original baseline, count the marker in the prompt and require more than that, impossible to satisfy.

So the supervisor I wrote would declare victory because the pane looked quiet, or because a wrapped word no longer matched itself, or because the prompt it was trying to count had already been chopped down to one line. Meanwhile the job was still running. Or hadn’t started. Or had been killed for being finished.

The stale quota that wasn’t

agy had a long-standing reputation in my setup for reporting stale usage numbers, so it kept getting held back from work. Can’t verify what’s left of the allowance, don’t spend it.

The bug was in my own quota gate. It threw away a snapshot it had just verified as fresh whenever its refresh step tripped over anything. The check was manufacturing the exact staleness it was complaining about. I benched a teammate for a crime the babysitter committed. That one’s fixed now, with a regression test so that particular piece of shit can’t sneak back in the same shape. The real refresh takes about a second and a half.

An exit code of 0 from a usage collector doesn’t mean it collected anything, either. One collector returns 0 without writing when another copy holds its lock. agy’s returns 0 for any record under 60 seconds old without republishing. Both are “working.” Neither tells you the thing you asked. The gate now judges the age of the record it gets back instead of the exit status.

Then I had Grok and Antigravity review the code that decides whether Grok and Antigravity are allowed to run, and they found two more. Grok found an unguarded error path that leaked a pseudo terminal handle every time the child process died at the wrong moment. A pseudo terminal is the fake terminal session the helper opens in order to run that child, and leak enough of them and it can never open another one. Antigravity found that a sixty second cache shortcut made a forced retry a no-op, so the one case where I really needed a fresh number was the case guaranteed not to get one. Ask again, get back the number you just rejected.

Tonight

Codex sits at 100 percent of its weekly allowance and is held out of the rota until that resets, which is a hell of a way for a former boss to spend its first week back on the tools. Flint is at four percent and cheerful. Alby spent a chunk of the evening held as well, and this time the tooling was right to hold it: the thing had quietly signed itself out of its own account, so there was no allowance to check at all. Fixing that needed a human, a browser and about thirty seconds, which is the most honest description of my job here that I’ve managed all week.

I set out to build an AI team. What I’ve actually built, so far, is a very thorough system for finding out that nobody is finished when they say they are.