WarmblyDocs

Send safety and diagnostic controls

Shared admission, explicit diagnostic participation, actual-message DKIM and conservative upgrade behavior.

This control system restricts sending using current authority and observed evidence. It does not manufacture engagement, promise inbox placement or establish a reputation benefit from local tests.

Explicit participation and complete stop

PATCH /emails/:id keeps its existing WRITE_EMAILS scope and organization boundary. The additive fields are:

FieldBehavior
test_modeNew actions accept diagnostic or off. Historical legacy and NULL remain readable without relabeling; newly connected mailboxes default to off
test_send_enabledEnables diagnostic sending only in diagnostic mode
test_receive_enabledSeparately enables diagnostic receiving only in diagnostic mode
shared_daily_limitPositive mailbox-wide calendar-day ceiling across outbound lanes; PATCH zero clears the override, restoring the default shared ceiling
rolling_recipient_limitPositive rolling 24-hour ceiling counting each To/CC/BCC occurrence; PATCH zero restores the default ceiling

Choose sender-only, recipient-only or both explicitly. Recipient-only does not authorize a reply. off excludes diagnostic starts, active-campaign health checks, reply-back and new recipient selection. It does not stop legitimate campaign/manual traffic by itself: pause the campaign or mailbox for that. Diagnostic mode disables synthetic read, star, importance and spam-rescue actions. Authorized filing and deletion remain housekeeping, not positive deliverability evidence. Cleanup can remove an already received diagnostic after participation stops.

The control plane checks participation before publication; capable executors recheck it immediately before native execution. A queued command is not consent. Queue callbacks, received text and model output cannot authorize sending. Revoke receiving before a queued diagnostic starts and it is denied; revoke sending and a recipient-only mailbox cannot reply. No software can retroactively cancel a provider submission that already began.

warmup_generation.generation_enabled=false is independent. It blocks new generation submissions, edits/replacements and generated source use; an already submitted provider job can drain. Preserve the configured credentials while it does. See generation controls.

Local aliases versus Cloud mailboxes

Local participation and unlinking restrict local use of an alias. They do not revoke an independently Cloud-owned native mailbox, its provider OAuth grant, or accepted Cloud-native work. Pause/delete or change participation on that Cloud mailbox separately if that is the intended outcome. Enrolled SMTP mirrors also have Cloud-side participation; a newly created Cloud mailbox is off until its owner explicitly enables it. Do not treat healthy standing as participation consent. Existing lifecycle enrollment and account IDs remain unchanged.

Shared send-time admission

Every new outbound lane goes through a mailbox/task advisory lock and one durable SQL reservation: campaigns, manual/Unibox sends, normal warmup, campaign-backed health checks/reply-back, and placement/seed probes. Campaign progress already reserved for the same task is not counted twice. Cold/manual and diagnostic allocations remain distinct constraints, with optional shared and rolling ceilings layered above them. Calendar days use the mailbox/organization timezone, including daylight-saving changes; rolling recipient totals do not reset at midnight.

Reservation requires an active organization-owned mailbox, its current configured provider and worker, current suppression and recovery state, and the exact recipient envelope. Campaign sends additionally require active campaign/lead/progress state and current calendar/pacing policy. Diagnostic partners retain their real pool, role, tier, trust, standing and inbound capacity constraints. Seed mailboxes stay measurements, not conversation partners. Future, missing or stale positive Cloud standing is unavailable evidence; restrictive holds are not erased.

Provider starts also write immutable per-nonce outbound_attempts. A definitive failure may refund successful-message capacity but never refunds attempt-rate evidence. Daily and rolling limits count those attempts plus outstanding reservations without double counting the same nonce. Campaign test sends create a real task before shared admission; rejection/publication failure records a task failure, with tracking still disabled.

The executor rechecks organization, mailbox, worker, provider, durable task/nonce and exact recipients before starting. A command cannot broaden its CC/BCC or switch tenants after reservation. Worker silence, publication uncertainty, provider timeout and executor restart are unknown outcomes, not unsent proof. Their reservations and mailbox hold remain until a correlated definite result resolves them. Terminal replay returns the saved result without resending. A definite native throttle records only the evidence and scope actually observed; legacy codes preserve conservative mailbox/provider cooldowns without invented HTTP or SMTP codes.

Result reconciliation commits task, campaign progress, variant, suppression and warmup-health changes together. Bounce webhooks and notifications enter an idempotent durable outbox in that transaction, and result consumers drain it after commit. Failed delivery retains a leased retry row; a consumer restart does not lose the effect. Stable downstream webhook delivery and notification-feed IDs prevent duplicate stored rows. External integration, Slack/push and realtime delivery remain at least once/best effort, not exactly-once delivery. Core accounting and unknown holds remain durable.

Evidence-based repair holds

Authentication, permanent and conflicting-result holds do not clear merely because time passed, a reconnect occurred or an unrelated send succeeded. An organization-authorized operator can use send_recovery_resolution in the existing mailbox PATCH after investigating the current held task and reason:

{
  "send_recovery_resolution": {
    "held_task_id": "00000000-0000-0000-0000-000000000001",
    "held_reason": "authentication",
    "evidence_type": "authentication_repaired",
    "evidence_task_id": "00000000-0000-0000-0000-000000000002"
  }
}

authentication_repaired requires evidence_task_id naming a newer definitive, applied successful outbound send on the same mailbox; fresh inbox sync alone is not repair proof. operator_provider_confirmation requires a same-mailbox definitive, applied evidence task and non-empty confirmation_reference. Include the exact held task and reason (authentication, permanent, conflict). Changed holds, inactive mailboxes, cross-organization requests and remaining unknown sends refuse resolution. Investigate unknown tasks; never label them failed just to free capacity. Repair history is inserted atomically before clearing only the repair hold. Cooldowns, suppression and other restrictions remain. References must not contain credentials, message bodies or provider payloads.

Actual-message authentication

An updated worker retrieves bounded raw MIME for one authorized application-owned diagnostic through Gmail, Graph or IMAP. Authority binds the immutable token/task, exact identities, stamped message ID, current mailbox/worker and participation. A short-lived nonce binds completion. Gmail uses raw format, Graph the exact message's MIME $value, and IMAP the exact folder/UIDVALIDITY/UID with bounded BODY.PEEK[]. IMAP uses the existing authenticated connection after sync releases its folder mutex, never widening inbox ingestion or reconnecting outside the deadline.

Receipt-before-send-result and transient DNS unknowns have metadata-only retries, at most three attempts within fifteen minutes. Each retries current authorization; absent, expired or revoked context never fetches MIME. The retry queue is bounded to 64 per worker mailbox and is in memory; restart or exhaustion can leave unknown rather than manufacture proof. Definitive stored pass/fail results do not authorize another raw fetch. Raw bytes are cleared after verification or errors and never stored or logged.

Cryptographic verification uses go-msgauth/dkim-v0.7.0, at most 1 MiB of MIME and four signatures, with context-bounded key lookup. A valid DKIM signature is pass; exact From-domain/signer equality establishes only a conservative alignment-pass subset. Body mutation fails verification. Forged or copied Authentication-Results cannot become proof. The stored result includes verifier/version and observation time, not raw MIME or DNS responses. The exact receipt receives the minimal proof; duplicate results cannot replace it with unrelated evidence.

SPF, DMARC and receiving-hop TLS remain unknown absent independent evidence. Unauthorized diagnostics, seed/placement messages outside this context, legacy workers, unavailable MIME, transient DNS failures and byte/signature bounds remain unknown. Parsed Authentication-Results stay unverified claims. DNS configuration is readiness input, not actual-message authentication. Generated prose cannot claim a provider/client check passed.

Unsubscribe and negative feedback

The existing signed unsubscribe URL provides scanner-safe GET and a context-independent POST that durably suppresses future matching traffic. HTTPS messages emit List-Unsubscribe and List-Unsubscribe-Post: List-Unsubscribe=One-Click; the visible body link and suppression checks remain. A connected transport's DKIM signer must cover both headers for full RFC 8058 signing compliance. Warmbly cannot assert that arbitrary external SMTP/API signers covered them without inspecting a genuine delivered message. The scoped diagnostic DKIM verifier does not establish that broader signing requirement.

Hard bounce/complaint/suppression and authentication failures remain negative evidence. Spam placement can slow sending but is not alone a quarantine reason. First-folder observation, native outcome, Cloud trust and content provenance are distinct measurements, not a synthetic engagement score. Coherent disclosed hypothetical diagnostic conversations preserve immutable subjects, versions, facts and exact-parent closure; they do not invent real customer relationships or actions.

Upgrade, rollback and portability

  1. Back up and preserve released migrations 1 through 265 byte-for-byte and main's workspace-link migration 266. Apply the contiguous additive 267 through 274 sequence; no new environment variable is required. Migration 274 preserves historical executor starts as attempt evidence and refuses rollback while attempts from the last 24 hours remain.
  2. Pause dispatch during a mixed control-plane rollout. Upgrade every backend/result consumer, including Cloud replicas, before relying on generation stop, exact-parent resolution, current participation or correlated managed consent.
  3. Drain/reconcile previously accepted work, then upgrade execution workers. Protocol warmup_send_protocol=2 is required for shared reservations, execution-time action authority and cryptographic diagnostics. Protocol 1 supports only its previous lineage capability. Old JSON and Avro payloads remain readable; old capability is not stronger cancellation/admission support. Use matching Kafka-tagged binaries where applicable.
  4. Recheck holds, actual configured provider, worker liveness, schedules, directional participation, shared/rolling limits and Cloud-side settings before resuming. New mailboxes default off; existing NULL participation stays legacy rather than silently relabeling historical consent. No migration rewrites legacy AI provenance as reviewed. Legacy NULL-provenance sources do not count toward new versioned selection/readiness; existing exact-parent ambiguity stays closed.

Organization export retains participation, ceilings, restrictive task/account evidence and repair history. Executor worker/nonce/start/result handles reset on import. Exact diagnostic authorization and nonces, including raw warmup receipt provenance, are instance-local and excluded; registered placement aggregates travel as history, never as execution grants. See workspace moves.

Immutable attempt timestamps and recipient counts travel with the sending group and retain restrictive rate evidence; their historical nonces do not authorize execution. Raw warmup receipt provenance remains source-instance-local and excluded, while registered placement aggregates travel.

The source-instance reconciliation outbox is excluded from organization archives so an import cannot replay customer notifications. Drain pending effects before moving; whole-instance backups retain the queue. Delivered outbox rows expire after seven days; pending rows remain until delivery or organization/task deletion. They contain event/notification metadata, not raw MIME, provider responses or credentials. Repair history lasts with the organization and must not contain sensitive message content.

Rollback refuses unresolved reservations, explicit participation state, diagnostic authorization/proof, pending outbox effects and repair history instead of discarding them. Earlier component migrations also refuse restrictive dispatch or managed consent history. Restore or complete a reviewed reconciliation; do not delete negative evidence simply to make downgrade succeed. Legacy deployments remain readable, but do not resume a mixed-old executor fleet assuming new guarantees.

Verification and limits

Research coverage and external gates

The twelve research proposals have different evidence requirements. Implemented controls and local fixtures are not substitutes for provider approval, native-language review or a real-recipient experiment.

ProposalImplemented path and regression coverageRemaining external verification
R1: consent and complete stopMailbox and Cloud participation, final action authority; review_corrections_live_test.go and lifecycle/Cloud UI-model fixturesDrain old accepted commands; verify every deployed control plane and worker before relying on cancellation
R2: shared admissionsend_admission.go, immutable attempt ledger, mixed-lane concurrency and failed-attempt fixturesOperators must reserve headroom for other mail clients and configure known applicable provider limits; their traffic is not automatically metered here
R3: errors and recoveryNative provider classification, durable holds, transactional accounting and outbox; recovery and legacy JSON/Avro fixturesReconcile ambiguous native outcomes with real provider evidence; external notifications remain at least once
R4: measurement provenanceSeparate receipt/folder/authentication observations, unknown categories and placement denominators; observation-evidence upgrade fixturesReal provider/dashboard coverage and missingness remain measured inputs, not inferred success
R5: message authentication and unsubscribeAuthorized bounded Gmail/Graph/IMAP DKIM and exact-domain alignment; cryptographic/raw-MIME fixtures and existing scanner-safe unsubscribeSPF, DMARC, receiving-hop TLS and delivered RFC 8058 signer coverage require actual evidence; provider enrollment and route remediation remain operator tasks
R6: exact-parent lifecycleDurable token/receipt ancestry, stable subject/References and one successor; warmup_lineage_live_test.go and dispatch fixturesCanary the actual deployed queue/provider path; ambiguous legacy ancestry never becomes a reply grant
R7: coherent contentVersioned vetted scenarios and final canonical rendering; content_quality_test.go and generation fixturesHuman and native-language quality benchmarks have not been run; prose never proves a real provider outcome
R8: effective generation controlsSettings round-trip, effective settings and credential-independent stop; warmup-content control/batch and upgrade fixturesConfigured model visibility is not Batch/structured-output support; actual provider submission must confirm capability
R9: trust and Cloud reconciliationCurrent role/tier/standing gates, durable consent and restrictive history; managed-consent fault/import fixturesUpgrade all Cloud replicas before correlated operations; local alias unlink is not global native-mailbox revocation
R10: queue and diagnostic paritySQL-bound callbacks, replay fencing, untouched first-folder evidence and seed isolation; lineage, worker and placement fixturesActual hosted/local queue fleets and fixed-panel coverage require rollout verification; missing reports remain unknown
R11: legitimate response-adaptive pacingConservative cold ceiling uses fresh distinct campaign replies, with negative feedback and configured caps; unknown lookups preserve known warmup and conservative execution/projection/explanation fixturesAdequate real-recipient coverage, provider-stratified holdouts and a preregistered controlled evaluation are required before any efficacy claim
R12: readiness and claimsDNS discovery is not authentication; operational health is not reputation; UI/docs explain diagnostic scope and unknownsNo guaranteed inbox or universal safe-volume claim; marketing benefits require replicated real-recipient evidence

Upgrade fixtures start at the released 265 schema and preserve legacy IDs/state. Mixed campaign/warmup/placement/manual contenders prove shared capacity and unknown reservation retention; worker fixtures exercise replay, envelope binding, current consent and old JSON/Avro readability. Provider MIME fixtures test mutation, forged headers, timeout and bounds without provider access.

These checks establish local engineering behavior, not production efficacy, provider consent, real delivery, all-provider authentication, signed RFC 8058 headers or exactly-once external notification delivery. They perform no live sends, browser proof or production reads.

On this page