2.4 KiB
2.4 KiB
Sho'Nuff Inbox Monitoring — Collection + LLM Summary Pattern
Architecture
Two-tier hybrid: no_agent collection script + agentic cron for summarization.
Layer 1: Data collection (no_agent script)
Script at /root/.hermes/scripts/shonuff-inbox-collect.py — runs every 15m:
- Connects to IMAP (shonuff@germainebrown.com)
- Fetches UNSEEN messages
- For each message NOT from trusted senders (g@germainebrown.com):
- Extracts: sender, subject, date, body preview (first 500 chars)
- Generates hash from Message-ID for dedup
- Outputs JSON with messages array
- Marks processed messages as
\\Seen(prevents re-processing) - Silent (no output) when nothing new
Trusted senders filter: Trusted senders (user's own address) are skipped silently — no alert, no output.
Dedup: Uses hashed Message-ID in ~/.hermes/scripts/.shonuff-processed.json. This file persists across reboots. Each message reports exactly once.
Layer 2: Agentic cron job
Connected to the collection script via cronjob():
cronjob(action='create', name='shonuff-inbox-agent',
schedule='every 15m',
script='shonuff-inbox-collect.py',
prompt='Check the collected inbox data above. If there are new messages in ShoNuff's inbox (shonuff@germainebrown.com), summarize each one for Germaine... respond with SILENT.',
deliver='origin')
When collection script is empty
When the collection script exits with no output (no new messages), the agent receives an empty context. The prompt must include an explicit instruction: "If no new messages or only messages from trusted senders, respond with SILENT."
Key design choices
- Trusted sender list: Only the user's own email
- Body truncation: First 500 chars only
- Hash dedup: Prevents re-alerting on the same message
- Message-ID fallback: Falls back to IMAP sequence number when missing
Comparison to bounce-check
| Aspect | shonuff-inbox-agent | bounce-check |
|---|---|---|
| Scope | All non-trusted senders | Only delivery-failure emails |
| Accounts | shonuff only | Both g@ and shonuff@ |
| Output | JSON → LLM summarizes | Plain text count |
| Cadence | Every 15m | Every 60m |
| Cron type | Agentic (LLM) | no_agent |
Pitfalls
- Message-ID is optional in the SMTP spec — duplicate alert risk
- IMAP UNSEEN state is sticky — if LLM call fails between collection and delivery, the message is silently lost. Consider pending-file for reliability.