Agent lanes: give more than one named AI agent its own queue
Agent lanes give each named AI agent on your Done account its own task queue. How to pin a task to one agent and pass work between agents with handoff_task.

By Alejandro Rioja6 min read
An agent lane is a named queue on your Done account — Claude, Instinct, Muse, whatever you call the agents you run — and a task pinned to one only shows up in that agent's list_my_tasks, next_task, and list_triggers, never another agent's. Set it up from Settings → Agent access → Agent roster: name each agent, then match a credential to each name (an Extra MCP token, or a connected app you rename), and Done routes every claim by which credential is actually asking, not by anything the client says about itself.
How does Done know which credential is which agent?
By the credential's own name, never a tool argument. A caller's lane comes from its MCP token's name (set when you generate an Extra MCP token from the Account panel) or its OAuth connection's label (rename a claude.ai or Claude Desktop connector from Settings → Agent access → Connected apps), matched case-insensitively against the roster. A client can put anything in a tool's agent argument, but it can't put anything in a credential it was issued — which is exactly why the match is on the credential and not the argument: a task pinned to Instinct's lane can't be claimed by something that merely claims to be Instinct.
What happens to a credential that isn't on the roster?
It works the default agent's lane — the roster's first entry, unless you've moved the default elsewhere. That's also what an unnamed full-access token gets, and every run made before you had a roster at all: nothing breaks, the credential just isn't distinguished from the default agent. An account with no roster at all behaves exactly as it always has — every agent shares one queue, list_agents reports an empty roster, and none of this is in the way until you opt in.
Pinning a task to a specific agent
In the app, the task modal's Doer picker lists Me plus each roster agent once you've added at least one — pick a name and the task's delegate field is set alongside its assignee. Over MCP, create_task takes an agent argument, but only to your own lane: a task you create always lands in your own queue, never someone else's, so there's no way for an agent to quietly route brand-new work to a colleague at creation time. Passing existing work sideways is a separate, deliberate action.
Handing work to another agent: handoff_task
handoff_task moves a task you currently own to another named agent, mid-flow — you built the lead list, now it's Instinct's turn to do outreach. The task's claim is released, it goes back to not_started so the receiving agent's own next_task picks it up, and everything about it travels along: notes, acceptance criteria, deliverables, the whole comment thread. Your note argument is posted to that thread too, so say what's done, what's left, and where your output lives before you hand it off — the receiving agent has no other way to know. One deliberate side effect: agent_ok resets to false on every handoff, because trust a human granted for your half of the work doesn't carry to the next agent's half — the task ends at propose_completion until a human turns it back on for whoever's holding it now.
How this differs from Done's shared fleet queue
It's a different axis from what fleet_status and next_task's atomic dequeue already solve. Without lanes, every agent competes for the same queue, and the guarantee is only that two of them can't grab the same task at once. Lanes add a second, orthogonal guarantee: which queue a task is even in. You can run lanes and a multi-agent fleet together — each lane's own next_task is still atomic against other credentials sharing that lane — but most accounts reaching for lanes want work sorted by which agent should do it, not just guaranteed not to collide.
Who can change the roster?
Only a human, from inside the app. The roster routes are cookie-session only — there is no MCP tool that creates, renames, or deletes an agent — on purpose: an agent that could edit its own roster could route work to itself. list_agents is read-only for the same reason; an agent can see the roster and its own lane, never change either.
Do I need a paid plan for this?
No — there's no plan check anywhere in the agent-roster routes or the scoped-token path a named credential comes from, so naming agents and using lanes works on any plan today.
Frequently asked questions
What is an agent lane in Done?
A named queue a task can be pinned to. Set up an agent roster (Claude, Instinct, Muse, whatever you call them) from Settings → Agent access, and each named credential — an Extra MCP token or a connected app — only ever sees and claims tasks pinned to its own name's lane.
How does Done tell two AI agents apart?
By the credential's own name, not by anything a tool call claims. A caller's lane comes from its MCP token's name or its OAuth connection's label, matched against the roster — a client can't fake being a different agent by passing a different argument.
Can I move a task from one AI agent to another?
Yes, with handoff_task. It releases the current agent's claim, moves the task to the named agent's queue, carries every note and comment along, and resets agent_ok — the receiving agent has to earn approval again rather than inherit trust granted for someone else's part of the work.
Do I need a roster at all?
No. An account with no agent roster behaves exactly as before — every connected agent shares one queue. Lanes are opt-in: add your first named agent from Settings → Agent access whenever you actually want tasks sorted by which agent should do them.