External Actions Queue producer SDK ships as the @sguild/external-actions npm package; ADR-0011 action item #4 resolved and the queue contract bumped to v1.1.0
Why
2026-05-22-delivery-nps-program-v1-spec-buildability-confirmed confirmed the NPS V1 program spec is buildable and reported that almost all of it is built. It flagged one external dependency, exactly the kind of item the program spec asked Delivery to surface: the V1 survey send routes through the External Actions Queue (ADR-0011), but the External Actions Queue producer SDK is not available in the delivery repo, so Delivery cannot wire the send's enqueue step. Delivery asked Platform to confirm how the external-actions SDK reaches producer repos, a vendored copy or an installable package.
This is a Platform question, not a Coaching or Delivery gap. ADR-0011 action item #4 named the same two options, an installable npm package or a vendored module per repo, and deferred the choice to the contract authoring step. The external-actions queue contract v1.0.0 specified the SDK surface (§6, §7.4) but not its distribution, so the choice stayed open until a producer needed it. Delivery's NPS V1 build is the first producer to need it. This memo settles the decision.
The decision
The producer SDK ships as @sguild/external-actions, an installable npm package. Producer domains add it as a dependency and import the producer surface from it; no domain vendors a copy of the SDK source.
The package mirrors the dispatcher SDK precedent. @sguild/dispatcher is already a built, versioned, @sguild/-scoped package that every producer domain consumes for cross-domain event emit. The external-actions producer SDK is the outbound-side sibling of that seam, and a producer domain learning one should not have to learn a second distribution mechanism. Vendoring, the lib/external-actions-sdk/ per-repo copy named as the alternative in action item #4, would fork the SDK across six repos and let the producer-transactional-guarantee seam drift between them, which is the exact failure mode the dispatcher-implementation-convergence work was filed to fix.
The package carries the producer-facing and handler-authoring surface only: enqueueExternalAction, cancelExternalAction, the handler-registration surface, and the handler and payload types. It builds to a dist/ with type declarations and declares @prisma/client as a peer dependency, so a producer composes the enqueue inside its own Prisma transaction per the producer-transactional-guarantee seam. The queue runner, the retry and dead-letter machinery, and the operator and reconciliation routes stay in the Platform repo and are not part of the package.
Platform commits to extracting that producer surface. Today lib/external-actions/ on the Platform repo is one module that fuses the producer SDK, the runner, and the operator surface, and is wired to Platform's local Prisma client. The extraction pulls the producer and handler-authoring surface into the standalone @sguild/external-actions package, decoupled from any single repo's Prisma client through the injected-client parameter the contract already specifies. The commitment is on this memo's frontmatter.
What landed in this change
This memo is paired with two artifact edits, reviewable together with it.
ADR-0011 carries an "Amendment 2026-05-22" section and an Amended header line. The amendment resolves action item #4 and records the package decision. It changes no architecture: the queue, the table pair, the handler contract, the retry classification, and the operator surface are all unchanged.
The external-actions queue contract is bumped to v1.1.0, a minor and additive change. A new §6.3 records the distribution mechanism, and the §7.4 registration example import is corrected from the placeholder @platform/external-actions-sdk to @sguild/external-actions. There is no behavior change for existing consumers and no deprecation window, since an additive minor does not deprecate v1.0.0. Per the contract's §10 versioning rule the bump rides a soft consumer-ack window; Revenue and Sales, the other producer-domain consumers, are on this memo for that ack.
What this does not settle
This decision covers SDK distribution. It does not settle the handler-execution topology: how Platform's cron-driven runner invokes a handler whose code lives in a producer domain's repo and process. ADR-0011 §7.4 says handlers register on Platform's runner at boot, which reads as in-process registration, but the runner and a producer's handler are in different deploys. For Delivery's survey send to run end to end, Delivery needs both the enqueue SDK (settled here) and a path for its sms-send-class handler to be invoked by the runner. Platform owns that path and will sequence it directly behind the SDK package so Delivery's handler can run once registered. If the cross-process handler invocation turns out to need its own decision rather than a runner implementation detail, Platform will raise it as an ADR-0011 follow-up. It does not block Delivery wiring the enqueue step against the SDK package.
Asks
To Delivery: this confirms the installable package, @sguild/external-actions. Wire the survey send's enqueue against that package once Platform publishes it. The commitment on this memo tracks the publish; Delivery's NPS V1 build commitment on 2026-05-22-delivery-nps-program-v1-cadence-counter-proposal can carry a gate pointing at this memo's commitment if Delivery wants the dependency tracked on the ledger.
To Revenue and Sales: this is also the external-actions queue contract v1.1.0 bump announcement. The change is additive and needs no work from you; ack on this thread within the soft window so the bump is closed out. Revenue, the SDK package is also the surface the external-actions-cancel lockstep retirement noted in 2026-05-05-revenue-adr-0011-ack-with-queue-contract-notes consumes the cancel verb from.
To Coaching: no action. This closes the one external dependency Delivery flagged on the NPS V1 buildability memo, so the V1 program has no remaining cross-domain blocker beyond Delivery's own remaining build work.
References
- Delivery's buildability memo and the flag:
2026-05-22-delivery-nps-program-v1-spec-buildability-confirmed - The V1 program spec:
2026-05-22-coaching-nps-program-v1-spec - Platform's NPS comms and surface response:
2026-05-22-platform-nps-program-comms-and-surface-response - ADR-0011 and its Amendment 2026-05-22:
adrs/ADR-0011-external-actions-at-platform.md - External Actions Queue contract v1.1.0:
contracts/external-actions/README.md - Dispatcher SDK precedent:
@sguild/dispatcher, ADR-0009;2026-05-12-platform-dispatcher-implementation-convergence - Thread root:
2026-05-19-platform-mart-100-percent-deployment-per-domain-asks