← All stories

BRANCH · ef-052-email-association

Invitation, confirmation, and declination email association

EF-052Persona: OrganizerRoots in: event-setup

Organizers map access types to invitation, confirmation, and declination designs, preview the association with one recipient, and trust lifecycle sends to use the configured design.

Preconditions

Fixture event has at least one invite access type, three email designs, and a test recipient.

Happy path

  1. Open access-type email association.

    The mapping table shows each access type and message slot.

  2. Assign designs.

    Invitation, confirmation, and declination slots save independently.

  3. Send association preview.

    A single-recipient test proves the selected mapping before lifecycle send.

Failure modes

Send blocked on validation failure

Trigger: association points to an archived design.

Resolution: PUT/test-send returns 400 and sends nothing.

Bounced recipient tracked and suppressed

Trigger: preview recipient bounces.

Resolution: email_events records bounce and suppression blocks later sends.

Scheduled-message edit window

Trigger: associated scheduled lifecycle send is edited too late.

Resolution: 409 PAST_EDIT_WINDOW preserves queued snapshot.

Retry on transient failure

Trigger: lifecycle send gets provider 5xx.

Resolution: same Idempotency-Key is reused and sent_count remains one.

Idempotency-key on test-send

Trigger: organizer double-clicks Test association.

Resolution: one preview email is sent.

Recipient resolution empty

Trigger: association preview targets no matching guest.

Resolution: 409 NO_RECIPIENTS is shown with clear empty-audience copy.

Token rendering fallback

Trigger: associated design has missing guest token.

Resolution: preview uses fallback copy.

Cancel scheduled before send

Trigger: organizer cancels a queued associated mailing.

Resolution: queue drains, reservation is refunded, and audit logs cancellation.

Access-type mismatch

Trigger: invitation design is assigned to a purchase-only access type without required receipt copy.

Resolution: validation blocks the association and explains the missing slot contract.

Concurrent association edit

Trigger: two organizers change the same access-type mapping.

Resolution: stale save is rejected with a conflict and current mapping is reloaded.

Deployed-runtime gap

Trigger: deployed run on 2026-04-29 observed access-type email-association PUT 404; the probe locks this in until the gap is closed.

Resolution: the 404 assertion fails once the endpoint ships and the story must tighten.

Stable test attributes

Visibility teeth. Each attribute must be effectively visible when active.

email-association-pagePageAssociation manager
email-association-tablePageAccess-type mappings
association-access-type-rowTableMapping row
association-message-type-pickerRowMessage slot
association-design-pickerRowDesign picker
association-save-ctaToolbarSave
association-test-send-ctaToolbarPreview send
association-previewPanelPreview
association-warningPageValidation
association-gap-panelPageRuntime gap

Agent test plan

- association-renders
- save-association
- association-test-send
- deployed-runtime-gap