Skip to content

Phase 5b — Email Module

Phase 5b delivered the backend ShopAccess/Email module in the operations repository: per-tenant Postmark provisioning, transactional send with a fixed From, webhook ingestion, suppression, drift detection, and the operator lifecycle. This page is the project record; the durable design has been promoted to current-system (see below).

  • Implementation: complete. Landed on operations PR #191 (consolidated S01–S11), full build green, merged. Pre-go-live design reconciliation (the design corrections) applied on the same PR.
  • Infrastructure: ready. Phase 4 per-partition exports verified live in all four partitions (dev, stage, demo, prod) — the …-API-PartitionMailZoneName / …ZoneId / …Email* exports the module consumes are present, and the zone-name values are {partition}.ardamails.com as expected.
  • Open follow-ups: api-test Bruno examples to drop the removed fromLocalPart field; PDEV-903 (multi-From via Postmark Domains).

Durable design (promoted to current-system)

Section titled “Durable design (promoted to current-system)”

The module’s design now lives in the permanent docs, not in this roadmap record:

The full design exploration (formal models, per-story plans, the verbatim working design) remains in the workbooks notebook (notebooks/email-integration/5b/) as the source-of-process; only the curated product design was promoted.

OAM telemetry families (project reference)

Section titled “OAM telemetry families (project reference)”

For completeness, the module’s structured-log / Sentry telemetry families (operator-facing summary in the module runbook):

FamilyCovers
email.configuration.lifecycle.*provisioning, verification, lock/unlock transitions; a gauge for configurations per operational state
email.send.*send attempts, outcomes, transient vs permanent failures, configuration-failure entries
email.webhook.*inbound events by type, rejections (auth_mismatch), status projections, INCONSISTENT
email.drift.*the five drift-assertion tags (partition carried by the Sentry environment dimension, not a context field)
email.material_registry.refresh.*encryption-key registry reloads (added / parse-failed)