June 6, 2026 · agentchute team

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