Multi-agent queues
Multi-agent queues
What it looks like when several agents propose into one vault.
Setup
Each agent gets its own token, so each can be scoped, audited, and revoked independently. Give review-gated agents the --propose flag (writes become reviewable proposals) and scope each one to the folders it should touch with --allow:
lettuce keys add --label "Triage" --scope write --propose
lettuce keys add --label "Tag Curator" --scope write --propose --allow Areas,Projects
lettuce keys add --label "Research" --scope write --propose
--scope is read, write, or all; --propose is a separate flag that makes a write-scoped key queue proposals instead of committing. --allow is a comma-separated folder allowlist (omit it for whole-vault access). Each command prints the secret once. Now wire each into a different MCP client (or different sessions of the same client, with the right LETTUCE_TOKEN).
What you see
The proposals UI groups proposals by target note, but each proposal is labeled with its source agent:
▼ Inbox/random.md (3)
• Triage — move to Projects/ +0/-0
• Tag Curator — add #project/lettuce +1/-0
• Research — add ## Sources section +12/-0
Three different agents, three different angles on the same note. You can accept, reject, or merge them independently.
Ordering
The proposals UI groups proposals into batches and shows the newest batch on top; standalone proposals follow in their existing order. Each proposal is labeled with its source agent, so a multi-agent queue stays legible without manual sorting. (There aren’t separate sort modes — the order is fixed newest-first.)
Coordination
Agents don’t talk to each other directly. They each see their own proposals via list_my_proposals — they can’t read proposals from another agent. This is by design: agent-to-agent coordination should happen through the vault, not through a side channel.
Practical: if agent A is doing tag curation and agent B is doing triage, and they shouldn’t both move the same file:
Agent B (triage) tags the note
#triagingwhile it works.Agent A (tag curator) has a rule: never edit notes tagged
#triaging.Agent B removes
#triagingwhen done.
This is the same pattern used in distributed systems for advisory locking.
Conflicts
When two agents propose overlapping changes:
Both proposals exist in the queue.
Whichever you accept first wins.
The other becomes stale (see Suggestions mode/04 Staleness and conflicts).
Lettuce doesn’t try to auto-merge between agents. It surfaces the conflict to you with both diffs side by side.
Keeping an over-eager agent in check
There’s no pending-proposal quota, and only the paid AI tools carry a (generous, runaway-loop) rate limit — see Agent reference/08 Errors and rate limits. What you do have are the review gate and scoping: a propose-only key can’t commit anything without your accept, and --allow confines it to the folders it’s meant to touch. If an agent is noisy, throttle it on the client side, or narrow its --allow / revoke its key. The proposals UI lets you reject in bulk.
Audit
Per-agent activity shows in the Agents sidebar, filterable by agent name, and committed agent writes are recorded in .lettuce/agent-edits.json (the revert-able review timeline, see Core concepts/02 The .lettuce directory) — each edit carries its agent label. The proposals UI shows acceptance rate per agent, so if “Tag Curator” has 90% rejections, it’s probably misconfigured.
Related
Suggestions mode/06 Withdraw and ownership — proposals belong to the agent that made them
Agent reference/03 Authentication — per-key scoping
Recipes/03 Tag curator — full example of a focused agent