# Sprint 2.2 — Spam rescue hardening **Status:** Done ## Backend - **Per-UID matching:** Rescuer fetches each spam UID, matches `message-id` / from+subject, moves only matched messages - **Folder auto-discovery:** `resolveSpamFolder()` tries presets then IMAP LIST; persists `spamFolderPath` on inbox - **Auto-pause:** `checkCampaignSpamThresholds()` pauses campaigns when 3 consecutive days exceed 30% spam rate (inbox < 70%) - **Mailbox metadata:** `lastSpamRescuedAt` updated on successful rescue ## Dashboard - Paused campaign alert on dashboard and campaign detail - High spam rate alert strip (inbox < 70% today) - Placement stacked bar chart on campaign overview - Activity badges: `rescued_from_spam`, `engaged_no_reply` - Mailbox detail shows spam folder path and last rescue time ## Verification 1. Simulate spam placement in test logs 2. Run rescuer job from Settings → Jobs 3. Confirm per-log rescue status (not bulk sender match) 4. After 3 high-spam days, campaign auto-pauses