/mail — Agent Mail
Multi-session agent coordination over .lev/mail/. Wraps the levmail CLI at ~/.local/bin/levmail.
Commands
/mail # inbox (all messages, newest first)
/mail inbox # same
/mail inbox <agent-id> # messages addressed to <agent-id>
/mail send <to> <subject> # write + send a message (body from context or stdin)
/mail read <file> # read a specific message
/mail claim <path> # claim ownership of a file/workstream/folder
/mail broadcast <subject> # send to all-agents
/mail register <id> # set this session's agent ID
/mail whoami # show current agent ID
/mail roster # show all known agent IDs from message headers
/mail archive <file> # move message to archive/
How It Works
First Use in a Session
If no agent ID is registered, prompt to register:
You haven't registered an agent ID yet.
Run: /mail register <id>
Active roster:
A0 — oversight
A1 — arch IR
A2 — dashboard
A3 — constraint code
A4 — constraint content
/mail (inbox)
levmail inbox
Output format:
INBOX (5 messages)
──────────────────
20260411-from-A3-to-A0-parity-update.md from:A3 subject:parity-update
20260411-broadcast-A0-convergence.md from:A0 subject:convergence
...
/mail send
Inline body from conversation context. Uses levmail send:
echo "body text" | levmail send <to> <subject>
For longer messages, write the body from the current conversation's key points.
/mail claim
levmail claim <path>
Broadcasts to all agents: "Agent {id} claims ownership of {path}. Other agents should not modify without coordinating."
/mail broadcast
echo "body" | levmail broadcast <subject>
Sends to all-agents — every session sees it in their inbox.
Message Format
Messages are markdown files in .lev/mail/ with YAML frontmatter:
---
from: A0
to: A3
date: 2026-04-11
subject: parity-update
---
Message body here.
Identity (env-var primary, file fallback)
Identity precedence (highest to lowest):
LEVMAIL_AGENT_IDenv var — per-shell, clobber-safe (PREFERRED).lev/mail/.agent-idfile — shared across all shells, last writer wins"unregistered"— no identity at all
Recommended session-start ritual
export LEVMAIL_AGENT_ID=<your-id>
levmail register <your-id> # optional; also writes the file for shells that don't export
The export pins identity for this shell. Parallel sessions registering different ids in the file no longer clobber you. Verify with levmail roster — the current-agent row shows (source: env LEVMAIL_AGENT_ID — clobber-safe) when correctly set.
Legacy behavior
Shells that don't export LEVMAIL_AGENT_ID fall back to the .agent-id file as before. The env var is opt-in. cmd_register warns when the env var is set but differs from the id you just registered.
History
The clobber problem was load-bearing in 2026-04-22 multi-session work (thor-runtime-proof session 8 + flight-observability-blackbox session 2 had concurrent registrations stepping on each other). Fix landed 2026-04-22 in ~/.local/bin/levmail; broadcast announcement at .lev/mail/20260422-100203-broadcast-A-arch-levmail-cli-fix-env-var-clobber-immunity-landed.md.
Data Sources
.lev/mail/*.md— message files.lev/mail/.agent-id— current session's registered ID.lev/mail/archive/— archived messages~/.local/bin/levmail— the CLI
Protocols
Detangle Protocol (established 2026-04-10)
Multi-agent coordination for workstream convergence:
- Each agent dumps nuggets:
/mail broadcast nugget-dump - Each reads all dumps:
/mail inbox - Claim lanes:
/mail claim <path> - Send handoffs:
/mail send <agent> <topic> - Update handoffs with
detangle_syncblock
Full protocol: .lev/mail/20260410-detangle-protocol-all-agents.md
Nugget Ledger Format
[VERIFIED|ASSUMED|STALE] <nugget> — owner: <path> — confidence: <0-1>
Graph Footer
After every /mail command, append the shared graph footer from ~/.claude/skills/_shared/graph-footer.md.