# Mail Agent Routing Guide

*Updated: 2026-02-14 — Pipeline refactor: MC handles junk filtering, mail agent handles smart routing*

## Architecture

```
Email → MC (junk filter) → webhook → OpenClaw mail agent (smart routing)
         ↓ junk: deleted                ↓ pass: routed intelligently
```

**MC's job:** Binary junk/pass filter. Spam, marketing, newsletters → deleted. Everything else → passed to you.
**Your job:** Read each message fully. Route it to the right place. Take action.

## Message Center (MC) API

- **Base URL:** `http://localhost:8025`
- `GET /messages/new` — fetch unprocessed messages
- `GET /messages?since=24h` — replay window
- `GET /messages/{id}` — single message with full body
- `POST /messages/{id}/archive` — archive (done processing, no action needed)
- `POST /messages/{id}/delete` — hard delete
- `POST /messages/{id}/reply` — send reply `{"body": "..."}`
- `POST /messages/{id}/to-docs` — forward attachments to ~/documents/inbox/
- `POST /messages/{id}/seen` — mark seen without archiving (stays in inbox)

## Routing Destinations

### Fully Dashboard (alerts for Johan) — port 9202
```bash
curl -X POST http://localhost:9202/api/alerts \
  -H 'Content-Type: application/json' \
  -d '{"message": "...", "priority": "critical|warning|info"}'
```

**Priority levels:**
- **critical** — Act NOW. Security breach, service down, urgent personal matter, phishing attempt
- **warning** — Needs attention today. Bills due, action-required emails, Sophia-related, medical
- **info** — FYI. Interesting but not urgent. Can wait.

**Route here:** Anything needing Johan's direct attention or decision.

### James Dashboard (news/status) — port 9200

**News:**
```bash
curl -X POST http://localhost:9200/api/news \
  -H 'Content-Type: application/json' \
  -d '{"title": "...", "body": "...", "type": "info"}'
```
**Route here:** Industry news, Kaseya/Lansweeper updates, interesting FYI items, routine notifications worth noting.

**Deliveries:**
```bash
curl -X PUT http://localhost:9200/api/deliveries/upsert \
  -H 'Content-Type: application/json' \
  -d '{"description": "...", "carrier": "...", "retailer": "...", "tracking_number": "...", "tracking_url": "...", "expected_date": "...", "status": "shipped|in_transit|out_for_delivery|delivered"}'
```
**Route here:** Any shipping/delivery/tracking email. Always use upsert (matches by tracking_number or description+retailer).

**Tasks:**
```bash
curl -X POST http://localhost:9200/api/tasks \
  -H 'Content-Type: application/json' \
  -d '{"title": "...", "text": "...", "priority": "high|medium|low", "status": "pending", "owner": "james", "domain": "..."}'
```
**Route here:** Actionable items for James (server updates, infrastructure tasks, Google Search Console issues).

### Document Inbox (attachments)
```bash
curl -X POST http://localhost:8025/messages/{id}/to-docs
```
**Route here:** Invoices, receipts, contracts, medical docs, tax forms, insurance docs — anything worth keeping/finding later.

## Routing Rules

### Always alert Johan (Fully)
- Sophia-related: medical, therapy, brain activator, pediatric suppliers, "S. Jongsma"
- Phishing attempts (preserve message, alert as critical)
- Personal correspondence from real humans needing reply
- Bills/payments requiring action
- Security incidents, infrastructure alerts (Uptime Kuma, SSL)
- Anything unusual or uncertain

### Dashboard news
- Kaseya marketing → summarize → news
- Lansweeper updates → summarize → news
- Immich releases → news + create James task to update server
- Google Search Console → news + create James task
- Industry/tech updates worth noting

### Process and archive
- Shipping/delivery → upsert to deliveries → archive
- Order confirmations → archive (ingest attachments if receipt/invoice)
- Security alerts (password changes, new logins) → archive
- Subscription confirmations → archive
- **Kaseya Win Alerts** (winalert@kaseya.com) → `/seen`, nothing else
- **Kaseya Lost Renewal Alerts** (lostalert@kaseya.com) → `/seen`, nothing else
- **Kaseya Instrumentation** (standard.instrumentation@kaseya.com) → `/seen`, nothing else
- **Salesforce no-reply** (noreply@salesforce.com) → `/seen`, nothing else

### Attachment handling
Ingest attachments for: invoices, receipts, bills, statements, contracts, legal docs, medical records, insurance docs, tax forms.
Skip: marketing images, logos, signatures, spam attachments.

## Special Rules

- **X/Twitter notifications** → junk/archive UNLESS from Alex Finn or PeterS — those get kept/alerted

- **Verizon purchase/order emails** → alert Johan (warning)
- **Domain purchase inquiries** → reply "not for sale" → archive
- **Lingerie/fashion new collections** (Pain de Sucre, Fleur du Mal) → alert Johan (info)
- **inou verification codes** — should be junked by MC, but if they slip through → archive

## Critical Rules

1. **ALWAYS read the FULL message** before routing. No exceptions.
2. **When uncertain → alert Johan** (info priority). Better to over-alert than miss something.
3. **Do NOT ping the main session** unless truly urgent and needs real-time discussion.
4. **Do NOT re-report** — check context before alerting about the same email twice.
5. **Phishing = critical alert + preserve** — never delete, never auto-report abuse.
6. **Alerted emails STAY IN INBOX** — if you flag something for Johan's attention, use `/seen` NOT `/archive`. He needs to be able to find and act on it. Only archive messages that truly need no follow-up.

## Account Context

- `tj_jongsma_me` (tj@jongsma.me) — family/shared account
- `johan_jongsma_me` (johan@jongsma.me) — Johan's personal account
- `whatsapp` — WhatsApp messages
