Give each piece of work one owner and clear edges, hand it over in a way the receiver acknowledges and keeps track of until it's done, and make anything that can't happen twice safe to try again. Duplicated work has a few common causes: two jobs that overlap, a request sent to several agents at once, a sender that can't tell whether its request arrived, and an agent that sees the same request twice, or can't tell whether its own action went through.
What works
Give each job one owner, and send requests for it to that owner alone. A request sent to everyone who might help can be answered by two of them, or by none. (How to set up owners: How do I organize a team of AI agents?)
Give each request edges. "Prepare next week's promotion" and "write next week's customer email" can both end in the same email, even with one owner each. Say what the deliverable is, and what it isn't: "the customer email only; the Instagram posts are Social Media's".
Hand work over in one message that stands on its own: what's wanted, by when, what done looks like, and where the answer should go. If the request changes, send a new message that says what it replaces, and wait for the receiver to acknowledge it. Until it does, it may still be doing the old version.
Tell apart received, taken and done. Received means the message arrived. Taken means the receiver will do it, and says so. Done means the result is back with whoever asked. Before an agent says "taken", it should write the work down where it will see it next session, in its own list of open work. A "taken" that lives only in a chat is lost when the chat ends.
Make sending again safe. A sender that isn't sure its request went through should be able to send it again and have it arrive once. That takes a key of its own on each request, which the delivery system checks.
Make doing again safe, which is harder. Decide who acts before anyone does: one owner, or a claim on shared work that only one agent can win. One owner can still mean two attempts, such as two sessions of the same role, so only one attempt may act on a request: keep the request's key with its open work before the first send, and reuse that key, with the message unchanged, on every retry. Before an action that can't be undone, such as placing an order or writing to a customer, check the place where it happens (the supplier's order list, the sent mail), not only your own notes: when an action's answer is lost on the way back, your notes say nothing happened while the order went through. When the result is unknown, find out before trying again. Where the other system accepts a key of its own for each request, as some ordering and payment systems do, send the retry with the same key, and let that system refuse the duplicate.
Keep the exchange where a person can read it. When something is done twice anyway, you want to see who asked whom for what, and when.
Doing it in Mind Made Many
Roles pass work to each other as messages, and here a cake order goes from a bakery's Social Media role to Orders, then to the Head Baker, along wires: who can ask whom for what is something you decide on the canvas.
-
Wire Social Media to Orders, and Orders to the Head Baker. Each wire's Why says what the sending role asks for or tells, and Carries what goes along it. Go live, so the wires carry messages.
-
Social Media's agent sends Orders the customer's request, standing on its own: who she is, what she asked for, for when, and how to reach her. It gives the message a key of its own: sent again from the same role with the same key, the message isn't sent twice.
-
Orders' agent reads its messages in the way that keeps each one until it's confirmed (the read tool's own description tells the agent how). It adds the request to its open work, in its notebook's Start here. Then it replies to the message, "Taken", and the reply goes back along the wire the request came in on. Then it confirms the message, which tells Mind Made Many it has it, so it isn't handed out again.
-
Orders asks the Head Baker whether Saturday has room. Once the Head Baker says yes, Orders confirms the date and the price with the customer, then sends the Head Baker the order, with a key of its own kept in its open work, so a retry can't send a second order message. The Head Baker's agent, for its part, checks its own open work before starting, in case the same order reaches it twice.
-
Orders replies to Social Media's request with the result ("Confirmed with the customer for Saturday, 46 euros; the order is with the Head Baker"), and crosses it off its open work.
-
To read an exchange, select the two roles on the canvas and open Messages.

From Harbor Lane Bakery, an organization made up for these pictures.
For work that must happen once, Mind Made Many also keeps two kinds of claim. A job the board approved may be started once, and a schedule's run is claimed by the attempt that starts it, so any other attempt is told it has already started. Each protects that one job or run, not every action it describes.
What doesn't work yet
- Mind Made Many delivers and records messages. It doesn't track whether work that was taken got done, or stop an action from being repeated in another system.
- The board's page shows messages nobody has taken within 3 minutes. Work that was taken and then dropped doesn't show there.
- An agent that reads its messages the plain way, without naming what it already has, takes them as it reads: if the answer to that read is lost, they're gone from the role's inbox. Once the role's agent reads in the way that keeps messages until they're confirmed, or subscribes to its messages, a plain read only shows them.
- Messages between two roles show in the order they were sent, not grouped by request.
- A message is plain text, up to 4,000 characters. A role reads its own notebook and those of the roles below it, and the Director reads every role's, but two roles side by side can't read each other's.
