← All stories

BRANCH · ef-058-calendar-links

Calendar links

EF-058Persona: Organizer + guestRoots in: event-setup

An organizer inserts Google, Outlook, Yahoo, and signed ICS links into email, previews provider URLs, and guests round-trip from email click to calendar app.

Preconditions

Fixture event has timezone, location, signed ICS secret, calendar link block, and empty-audience segment.

Happy path

  1. Preview calendar providers.

    Google, Outlook, Yahoo, and ICS links are visible.

  2. Send calendar email.

    Provider URLs use event metadata and signed ICS link.

  3. Download ICS.

    Guest click returns a valid calendar payload.

Failure modes

Send blocked on validation failure

Trigger: missing event time or invalid timezone.

Resolution: 400 blocks send and no email leaves.

Bounced recipient tracked and suppressed

Trigger: calendar email bounces.

Resolution: bounce is recorded and suppression honored.

Scheduled-message edit window

Trigger: scheduled calendar mailing edit is too late.

Resolution: 409 PAST_EDIT_WINDOW.

Retry on transient failure

Trigger: provider 5xx.

Resolution: same Idempotency-Key retry and one delivery.

Idempotency-key on test-send

Trigger: test-send double-click.

Resolution: one calendar test email is sent.

Recipient resolution empty

Trigger: calendar audience resolves to zero.

Resolution: 409 NO_RECIPIENTS with empty-audience copy.

Token rendering fallback

Trigger: optional location token is missing.

Resolution: fallback copy renders, calendar links remain valid.

Cancel scheduled before send

Trigger: scheduled calendar email is cancelled.

Resolution: queue drains and audit logs cancellation.

Signed ICS tamper

Trigger: guest changes ICS signature.

Resolution: public ICS endpoint returns 403.

Provider URL encoding

Trigger: event title/location includes special characters.

Resolution: provider URL remains encoded and usable.

Deployed-runtime gap

Trigger: deployed run on 2026-04-29 observed calendar mailing send 409 NO_RECIPIENTS, so ICS round-trip could not be exercised; the probe locks this in until the gap is closed.

Resolution: story expects 409 until deployed calendar send reaches a real recipient.

Stable test attributes

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

calendar-email-pagePageCalendar email
calendar-provider-previewPreviewProvider links
calendar-google-linkPreviewGoogle
calendar-outlook-linkPreviewOutlook
calendar-yahoo-linkPreviewYahoo
calendar-ics-linkPreviewICS
calendar-email-send-ctaToolbarSend
calendar-email-warningPageValidation
calendar-email-gap-panelPageRuntime gap

Agent test plan

- calendar-email-renders
- calendar-provider-preview
- signed-ics-roundtrip
- deployed-runtime-gap