Contract
Organizer drafts an in-event SMS.
Audience can be checked-in guests only, all registered guests, team members, or a saved segment.
Merge tokens resolve before send.
Unresolved personalization blocks the send and previews affected recipients.
Provider sends and telemetry streams back.
Queued, sent, delivered, failed, and opt-out states are visible without leaking across stations.
Failure modes
Gap probe remains visible
Until the provider adapter, audience resolver, personalization, delivery telemetry, and opt-out substrate exist, the runner expects a visible EF-071 gap panel.
Live runtime rubric
The absent feature still roots in the EFx station shell and carries all WebSocket resilience probes so the eventual messaging surface cannot bypass live-event isolation.
Stable test attributes
Visibility teeth. Active controls must be visible and interactive; hidden placeholders do not satisfy this contract.
| data-test | Where | Purpose |
|---|---|---|
efx-sms-gap-panel | EFx messaging page | Absent capability marker |
efx-sms-composer | EFx messaging page | Message composer |
efx-sms-audience-filter | Composer | Audience selector |
efx-sms-checked-in-only | Composer | Checked-in filter |
efx-sms-template-body | Composer | SMS body |
efx-sms-send-cta | Composer | Send action |
efx-sms-preview | Composer | Personalized preview |
efx-sms-optout-panel | Composer | Opt-out controls |
efx-sms-telemetry-table | Messaging report | Delivery rows |
efx-sms-delivery-status | Messaging report | Provider state |
efx-station-socket-status | Station runtime | Connection state |
efx-station-active-state | Station runtime | Pause/closed state |
Agent test plan
- sms-gap-panel-visible
- sms-composer-contract
- checked-in-audience-filter
- personalization-preview
- optout-honored
- provider-telemetry-visible
- all WebSocket rubric probes in JSON-LD