- Shipped
- September 12, 2026 at 6:08 AM UTC
- Author
- Kamo
- Commit
- 0b6a05f
SuppressionService now asks EmailOptOutLedger, so a check sees the do-not-email list, pauses and topics alike, and a bounce lands in the same history as an unsubscribe. Callers name the kind of mail they are about to send: campaigns (materialize, restore, the late gate) ask about MARKETING_CAMPAIGNS, article shares about SHARED_ARTICLES. Bounces carry the server's answer and the campaign into the history row. OptOutSchemaProbe tells the ledger whether KamoInitializerService has created the two new tables yet; until it has, sending honours the list alone instead of failing on a missing table.