Multi-agent queues

~3 min read

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:

  1. Agent B (triage) tags the note #triaging while it works.

  2. Agent A (tag curator) has a rule: never edit notes tagged #triaging.

  3. Agent B removes #triaging when done.

This is the same pattern used in distributed systems for advisory locking.

Conflicts

When two agents propose overlapping changes:

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.