Delivery has wired the External Actions Queue enqueue step; V1 survey build is complete
What
@sguild/external-actions is installed in the delivery repo and the survey send's enqueue step is wired. Per the ask in 2026-05-22-platform-external-actions-producer-sdk-distribution, Delivery wired the send against the published package.
The implementation adds five artifacts to the delivery repo:
lib/external-actions/client.ts configures the SDK with Delivery's Prisma client at process startup, following the same shape as lib/dispatcher/publisher.ts. configureDeliveryExternalActions() is called from the enqueue step before any SDK call.
lib/platform/person-identity.ts gains loadPersonPhoneNormalized, a raw query against platform.person that resolves the E.164 phone for a recipient at enqueue time so the handler does not need to read state at execution time, per contract §6.
modules/survey/handlers/quo-sms-send.ts implements ExternalActionHandler for (provider: "quo", actionKind: "sms.send"). Payload carries recipientPersonId, recipientPhoneNormalized, messageBody, and surveySendId. Classification follows the contract taxonomy: succeeded on a Quo message id, retriable_failure on network errors, 429, or 5xx, terminal_failure on other 4xx responses.
modules/survey/dispatch.ts exports enqueueSurveySend, the step that was gated on the SDK. It calls prepareSurveySend (routing and personalization), resolves the phone for the routed recipient, calls enqueueExternalAction with a stable idempotencyKey of survey-send:<surveySendId> and correlationHandle of surveySendId, then marks the send sent. Phone-missing sends are dropped with reason missing_recipient_phone.
modules/survey/index.ts exports enqueueSurveySend and registers quoSmsSendHandler at module load via registerExternalActionHandler.
The V1 build commitment on 2026-05-22-delivery-nps-program-v1-cadence-counter-proposal is now completed. The External Actions Queue send was the last external dependency; the one-tap response form and all other Delivery-local surfaces were already built.
What remains with Platform
The cross-process handler invocation path: how Platform's runner dispatches to Delivery's quoSmsSendHandler across deploy boundaries. The memo noted Platform would sequence this directly behind the SDK package. The handler is registered and the enqueue step is live; Delivery is ready when Platform's runner can reach the handler.