The agents debugged their own message bus
A fleet of fourteen agents broke agentchute. Four of them — Claude Code, codex, Gemini, and grok — found the bug, fixed it, and verified each other's work, all over the inboxes they were repairing.
An earlier post ended on the thesis that agents can build the protocol they coordinate through. This one is about the less flattering corollary: when that protocol has a bug, the same agents are the ones standing in it.
The bug surfaced in a real run. Alex was driving a fourteen-agent build
fleet on one host — four vendors, one shared bus — with several lanes per
vendor: claude-code, claude-l1,
claude-l2, claude-l3, and a merger,
all running the same Claude wrapper. codex and Gemini had their own lane
sets. grok rode solo as the xai lane.
Ten of the fourteen never saw their own mail.
One id to rule them all
agentchute resolves an agent's identity from the --as flag its
enrollment hooks pass on every turn. The hook templates baked that flag in
as a literal — the wrapper's default id. So every lane running the Claude
wrapper called check, pending, and
gate as claude-code. They read the coordinator's
inbox, not their own. They archived mail meant for someone else. And the
finish-gate — the guardrail that refuses to let an agent stop while it owes
a reply — checked the wrong inbox, found it empty, and waved them through.
The transport was fine. The agents just couldn't agree on who they were.
A round-trip test made it concrete: ping all thirteen non-coordinator agents with a unique nonce, ask each to reply from its own shell. Only the four whose roster id happened to equal their wrapper default answered. The other ten sat silent — their pings waiting in an inbox they were never reading.
The team that fixed it was on the bus
The build coordinator wrote the problem up and put it to the team — four agents, four vendors, one inbox each. The discussion ran the way these discussions now run at agentchute: a round of independent takes, a synthesis, then consensus, every message a direct send.
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ CLAUDE-CODE │ │ CODEX │ │ GEMINI-CLI │ │ GROK │
└──────┬───────┘ └──────▲───────┘ └──────▲───────┘ └──────▲───────┘
│ 1. problem + proposed fix │ │ │
├───────────────────────────▶──────────────▶──────────────▶
│ 2. round-1 takes │ │ │
│◀───────────────────────────┤◀─────────────┤◀─────────────┤
│ 3. synthesis + lane split │ │ │
└───────────────────────────▶──────────────▶──────────────▶
The fix was small and the agents converged on it fast. The hard-coded
--as in the hooks always beat the runtime identity, so the
cure was to stop baking the id in. Hook commands now name only the vendor
and let the CLI resolve the active process:
agentchute check --vendor anthropic
Explicit --as still wins when an operator provides it. Otherwise
the CLI uses AGENTCHUTE_AGENT_ID, then the current tmux pane's
registration, then a contextual default such as
claude-code-agentchute, adding a suffix when another live agent
has already claimed the same name. The literal that caused the whole mess
was the thing to remove.
"Didn't we move on from that name?"
With the identity fix on a branch, Alex noticed something in passing:
rehumanlabs was still scattered through the tree. agentchute
had renamed its state directory from .rehumanlabs/ to
.agentchute/ back in v0.2.2. The current code was clean — the
two remaining mentions were the company credit, which is brand, not
namespace. But the rename had left a gap nobody had closed: anyone who
installed during the old era still had a .rehumanlabs/loop on
disk.
That matters because discovery scans every dotted directory for a
loop. A stranded legacy loop either collides with the new one — the dreaded
"multiple vendor loop directories" refusal — or silently runs the agent
under the wrong namespace, orphaned from its own registrations. So the
second fix taught setup and init to migrate it:
rename when the new namespace is absent, move a leftover empty scaffold
aside, promote real legacy state over an empty new loop — and, when
both hold live coordination state, refuse and hand it to the
operator rather than guess at a merge that could lose mail.
That last restraint was a team decision. An automatic merge of two live
inboxes can fabricate obligations or drop messages; the agents agreed the
safe move was to stop and ask. --yes applies the safe cases
and never the dangerous one.
A four-way verification loop
Neither fix shipped on a single agent's say-so. Each went through a verification round where every lane checked the work from its own angle and replied with an explicit verdict — the same inbox mechanics, pointed at the diff instead of the design.
That loop earned its keep. Reviewing the migration, codex caught a trap the
author had walked right past: backing up a stale .rehumanlabs
by renaming the whole directory would leave a
.rehumanlabs.backup/loop behind — which discovery would happily
pick up again, re-creating the exact ambiguity the migration was meant to
end. Back up the loop path, not the directory, and the backup
stops being a loop. A test now asserts that exactly one discoverable loop
remains afterward.
Gemini verified the operator-facing strings and the docs. grok confirmed the migrated path stayed clean for a manual, no-hooks, single-lane xai install — the one configuration the hook fix doesn't even touch. Four lanes, four green verdicts, two pull requests, merged.
The protocol carried the diagnosis, the fix, and the review — for a bug in the protocol.
Why this matters
A coordination substrate earns trust by surviving its own failures. The reassuring thing here wasn't that agentchute had a bug — every system does — it was the shape of the recovery. The agents didn't escalate to a human to carry messages while the bus was broken. They used the working parts of the bus to route around the broken part, reached consensus on a fix, and held each other to a verification standard before anything merged.
Alex steered where steering was his: he spotted the lingering name, he chose the simple fix over the larger refactor, and he authorized both merges. He didn't carry a message between agents, and he didn't debug the identity resolver. The agents standing in the bug were the ones best placed to describe it, and they did.
We gave agents inboxes so they could coordinate. It turns out that's also how they fix the inboxes.
Try it
curl -fsSL https://raw.githubusercontent.com/agentchute/agentchute/main/install.sh | sh
Then wire up the repo where your agents coordinate:
agentchute setup
Running several agents of one vendor? Give each its own id — pass
--as <roster-id>, or export
AGENTCHUTE_AGENT_ID in the pane and let the hooks resolve it.
Upgrading from an older release? setup migrates a legacy
.rehumanlabs/loop in that repo to .agentchute/loop —
the safe cases automatically, and it stops and asks if both namespaces hold
live state.
Repository: github.com/agentchute/agentchute · MIT license · home