Two copies of my AI ran the same operation. It went exactly how you'd think.
My assistant runs its operations out of a git repository. Message queues, negotiation logs, project state: all files, all committed. Any session of the assistant can read the playbook and continue the work. That’s the feature. Today it was the bug.
I keep several terminal sessions open. Each one is a full copy of the assistant: same memory, same instructions, same write access to the outbox that a bridge process drains to WhatsApp. At some point two of those copies were both awake, both watching the same message threads, and both convinced the work was theirs. Nothing in the system said otherwise.
What two competent agents do without coordination
Everything that happened next was locally reasonable.
My son is fabricating the first product of one of the projects, a reproduction part printed in the family workshop. He sent an ambiguous message: “we have tested it before already.” Copy one (the one I’d actually assigned) read it as being about the 3D scanner. Copy two read it as the part having been printed before. Both replied. Within a minute of each other, with different follow-up questions, under colliding reference numbers.
My son, more patient than most production incident channels: “you just sent me 4 messages in a row, i am getting confused, can you give me 1 message to say what you need?”
Copy two then did something worse than being confusing. Confident in its misreading, it wrote that the part had been printed before and the pilot was de-risked into the shared project state. A plausible, wrong fact, now in a file every future session boots from. If you’ve operated multi-writer systems you know this failure: not garbage data, which gets caught, but reasonable-looking data, which doesn’t.
Then it queued 33 outreach messages to local businesses into the outbox in one shot. The bridge sends whatever lands there, paced but indiscriminate. Thirty-three near-identical messages from a personal WhatsApp number in half an hour is how you get that number banned, and it’s the number my entire operation, and my actual life, runs on.
What caught it
The copy I’d assigned was watching the outbox as part of its loop. It saw reference numbers it hadn’t issued, read the queued batch, moved 31 unsent messages into quarantine on the chance that I did ask the other copy for a wider sweep, and paged me. Two messages had already gone out. It also went back and corrected the false fact in the project state, with a note explaining the misreading, and sent my son one consolidated list with an apology. Nine seconds later the other copy sent its own consolidated list with its own apology. Even the apology shipped twice.
Total damage: three stray messages, one annoyed kid, one corrected file.
The fix is boring, which is the point
Nothing here needed smarter AI. Each copy, alone, was doing its job well. The failure was architectural: two writers, one channel, no ownership. The fixes are the same ones you’d apply to a human team:
- Thread ownership. A dated claim at the top of the shared queue: this conversation belongs to session X, everyone else hands off. Sessions read it at boot.
- A sibling check. Before working a thread: are other copies running? Are there sent messages with reference numbers you didn’t issue? That second signal, refs you don’t recognize, is the tell.
- One message per turn. Now a hard rule in the operating spec, source: my son.
- Quarantine, never delete. When one copy blocks another’s work, it preserves everything and escalates. It might be wrong about which of them is the rogue.
The uncomfortable part: I created this. I opened the second session, gave it the same standing instructions, and left both running. A copy of an agent that never stops working is not a backup. It’s a second employee you forgot you hired, doing the same job from the same inbox.
The operation is fine. My son said “okay,” took the build spec for the part, and told the assistant to keep working while he’s away. Somewhere in there is the actual story: the kid and the AI have a better working protocol than the two AIs had with each other.