mail-negotiator
main
IMAP classify (rules + optional LLM), conservative needs_review, reply drafts gated on human approval, SMTP sends approved-only. 29 tests green.
- IMAP poll (UNSEEN, stdlib imaplib) -> parse (bare address via email.utils) - threading: In-Reply-To -> outbound sent-draft message-id -> proposal - classify: deterministic rules; optional LLM behind provider interface; below-threshold confidence -> needs_review (never guessed) - unthreadable approvals flagged needs_review (suspicious by definition) - merchant_status recorded on proposal detail; proposal lifecycle untouched - reply drafts generated from templates (drafted), NEVER auto-sent - SMTP sends only draft_status=approved (human approve_draft, audited); sent drafts store their Message-ID for future threading - idempotent on Message-ID; DaemonRun wrapper for monitor tests: 9 new (classification rules, threshold->review, threading, idempotence, blocked send without approval, approve->send->audit chain, double approve) — 29 total passing
No dependencies set.
The note is not visible to the blocked user.
IMAP classify (rules + optional LLM), conservative needs_review, reply drafts gated on human approval, SMTP sends approved-only. 29 tests green.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.