Problem
Receiving is poll-only (sync must be called manually). Delivery lifecycle (delivered, bounced, opened, complained) is not tracked — last_event only stores the initial status.
Impact
- Agents miss emails until someone runs
sync
- No way to know if a sent email actually reached the recipient
- Bounces and complaints are invisible — Resend auto-suppresses but we don't know
- Resend counts inbound quota (100/day free) — wasted without awareness
Proposal
- Add
webhook listen --port <port> command that starts a local HTTP server
- Accept Resend webhook events:
email.received, email.delivered, email.bounced, email.complained, email.opened, email.clicked
- Verify webhook signatures (Resend uses Svix)
- Store events in a new
events table
- Update
last_event on messages when delivery events arrive
- Add
events list --message <id> to query delivery history
Priority: HIGH — identified by GPT-5.4 as #1 production gap
Problem
Receiving is poll-only (
syncmust be called manually). Delivery lifecycle (delivered, bounced, opened, complained) is not tracked —last_eventonly stores the initial status.Impact
syncProposal
webhook listen --port <port>command that starts a local HTTP serveremail.received,email.delivered,email.bounced,email.complained,email.opened,email.clickedeventstablelast_eventon messages when delivery events arriveevents list --message <id>to query delivery historyPriority: HIGH — identified by GPT-5.4 as #1 production gap