The Mailbox
The mailbox is where agent work meets human judgement. Agents propose enrichments — summaries, entity extractions, structured data — and you approve, edit, or reject them before they land on your content.
Why the mailbox exists
LeftFold's operating model is agents do the work, humans supervise. The mailbox is the supervision surface.
When agents enrich your content — generating summaries, extracting entities, producing structured data — those outputs are proposals, not final results. They appear in the mailbox as tasks for you to review. Nothing lands on your content until you approve it.
This gives you the productivity of automated enrichment with the quality control of human review.
What arrives in the mailbox
Tasks come from four sources:
- Internal agent enrichments — summaries, alt text, entity lists, structured data, cross-link suggestions. These are the most common.
- External agent results — task completions from agents you've connected via the relay or A2A protocol
- Human-to-agent delegation — tasks you send to an agent via
mailbox.send(e.g. "research this topic") - System notifications — dead letter alerts, circuit breaker warnings, budget exhaustion
Each task includes a title, the source agent or user, the target aggregate, a message thread, and one or more artifacts (the proposed outputs).
The six interaction modes
Every mailbox task supports six actions:
| Action | What happens | Task status |
|---|---|---|
| Approve | Accept the enrichment as-is. Artifacts marked approved. | approved |
| Reject | Decline with an optional reason. The reason is recorded for agent learning. | rejected |
| Edit | Modify the enrichment and approve the edited version. A new event is appended with your changes and causation metadata linking to the original. | approved |
| Defer | Set aside for later. Priority drops to low. Not a rejection — can be revisited. | deferred |
| Ask | Send a follow-up question to the agent. Adds a message to the thread and re-queues the task for the agent to respond. | working |
| Assign | Reassign to a different user or agent. | submitted |
How approvals flow back
When you approve a mailbox task, the enrichment becomes part of the aggregate's projection:
- Approve: the enrichment event (already in the event store) is included when the aggregate is folded. The summary, entities, structured data, or other enrichment data appears in the projection.
- Edit: a new
.enrichedevent is appended with your modifications, attributed to you as the principal. The original enrichment event is superseded. Causation metadata links the two. - Reject: the enrichment event is not included in the fold. The rejection reason is recorded on the task for future agent tuning.
The query cache is automatically invalidated when enrichment events are appended, so the next read reflects the approved enrichments.
Using the mailbox
The mailbox is accessible from every surface:
Dashboard
The mailbox is the primary view in the dashboard. Tasks are sorted by priority and date, filterable by status and project.
MCP (Claude Desktop / Cursor)
// List submitted tasks
> mailbox.list { "status": "submitted" }
// Approve a task
> mailbox.approve { "task_id": "f47ac10b-..." }
// Reject with a reason
> mailbox.reject { "task_id": "f47ac10b-...", "reason": "Summary is too long" }CLI
LeftFold mailbox list --status submitted
LeftFold mailbox approve <task_id>
LeftFold mailbox reject <task_id> --reason "Summary is too long"
LeftFold mailbox edit <task_id> --artifact '{"summary":"Shorter version"}'HTTP API
GET /mailbox # List tasks
GET /mailbox/:id # Get task with messages and artifacts
POST /mailbox/:id/approve # Approve
POST /mailbox/:id/reject # Reject
POST /mailbox/:id/edit # Edit and approve
POST /mailbox/:id/defer # Defer
POST /mailbox/:id/ask # Ask follow-up
POST /mailbox/:id/assign # ReassignAuto-approved enrichments
Two enrichment types skip the mailbox entirely:
- Embeddings (from the Embedder agent) — vector representations for semantic search. Mechanical, deterministic, no human judgment needed.
- Kind detection (from the Kind Detector agent) — file type classification. Also mechanical.
Everything else — summaries, alt text, entity extractions, structured data, cross-links — requires human review before it lands on the aggregate.