Phase 0 of the dispatcher SDK build is in; schemas, registry, SDK surface, tests, and CI gate all landed; consumer domains can scaffold integration code against the public surface today
Date: 2026-05-02 From: Platform To: Growth, Sales, Delivery, Revenue, Coaching Status: FYI. Tracking artifact, not a request for action.
What's in
Phase 0 of the dispatcher SDK build per 2026-05-01-platform-dispatcher-sdk-build-plan shipped today. Concretely:
The envelope JSON Schema at coordination/contracts/event-envelope/schema/envelope-v1.json, mirroring the v1.0.2 contract spec exactly (required and optional fields, regex on event_id and the canonical-entity prefixes, closed enum on producer including the operations deprecation alias).
The event-type registry at coordination/contracts/event-types-registry.json, with 15 event_types registered (intake.captured, intake.matched, customer.handoff, the seven credit.* events, the four lesson.* events, coach.assigned). Each entry names producer, consumers, owning contract, and per-schema-version status. Eight events have payload schemas authored against contract spec; seven are pending payload-schema authorship by their owning domain.
Eight per-event-type payload schemas under coordination/contracts/credit-reservation-lock/schema/payloads/ covering the entire credit.* family (purchased, reserved, funded, locked, consumed, released, forfeited) plus the customer.handoff sidecar. Each schema is JSON Schema draft 2020-12 and validates against the lock contract's §9 spec.
The dispatcher SDK code at platform/lib/dispatcher/ (types, registry loader, dispatcher API surface, three error classes, README). Shipped against the per-domain module pattern's lib/ rule for cross-cutting infrastructure. Compiles cleanly under the platform repo's tsc.
22 tests across dispatcher.test.ts and registry.test.ts with a synthetic 5-event fixture, covering registry queries, error paths on both dispatcher.publish and dispatcher.subscribe, and the not-implemented error contract. Tests lock in the API behavior so Phase 2's transport implementation lands against a regression safety net.
A CI workflow at .github/workflows/ci.yml running both the indexer and the new event-type validation gate (scripts/validate-event-types.mjs) on every push and pull request, plus a working-tree-clean check on the indexer's regenerated outputs. The CONVENTIONS.md doc has been claiming "CI runs the indexer on every push" for a while; this commit makes the claim true.
ADR-0009 (cross-process transport for the dispatcher SDK) is drafted at Status Proposed; full announcement landed earlier today on this thread (2026-05-02-platform-adr-0009-drafted).
What this means for consumer domains today
The dispatcher's public surface is stable. Domains scaffolding integration code (Coaching's availability-subscriber.ts, Delivery's coach-day rewrite, any future emit-side consumer wiring) compile against the surface today; when Phase 2's transport ships, the same code starts working without consumer-side changes. The DispatcherNotImplementedError thrown from publish and subscribe carries a message naming the build plan and ledger memos so callers tracing the error find the rationale and the timeline.
Concretely, a consumer can write:
import { dispatcher, type EventEnvelope } from "@/lib/dispatcher";
dispatcher.subscribe<CreditLockedPayload>("credit.locked", async (event) => {
// projection update
});
The code compiles. The runtime throws on subscribe today. The same code runs successfully on Phase 2 ship. No churn.
Producers can also scaffold:
await dispatcher.publish({
event_type: "credit.locked",
payload: { credit_reservation_id: "crr_...", lesson_id: "les_...", person_id: "per_...", locked_credits: 6, locked_at: new Date().toISOString() },
subject: personId,
actor: "system:revenue",
});
Same pattern. Compiles, throws at runtime, will work on Phase 2.
The seven event_types still pending payload-schema authorship (intake.captured, intake.matched, the four lesson.* events, coach.assigned) sit in the registry with payload_schema: null. Producers of those events can register for them, but the SDK will not validate their payload until the schema is authored. Authorship belongs to the owning domain (Growth for intake.captured, Platform for intake.matched as part of Identity Contract v1, Delivery for lesson.* and coach.assigned).
What's still owed from Platform on this thread
The follow-up commitment memo on the build plan, with Platform-internal-scoping-confirmed dates replacing the placeholder Phase 0 / Phase 2 / Phase 3 timeline, is due 2026-05-15. That memo is gated on consumer input from the build plan's two Asks (sequencing question, bus-choice constraints).
ADR-0009 decision date is 2026-05-29.
The platform-owed ledger at 2026-05-01-platform-owed-ledger has the full Platform commitment list and gets updated on the periodic supersession pattern documented there.
Asks
None. Read what was filed if you want to weigh in; consumer input on the SDK build plan still lives on the parent thread, not on this FYI.
If your domain wants to scaffold integration code against the SDK surface today, do it; the public API and registry won't shift between Phase 0 and Phase 2.
References
- Build plan thread root:
2026-05-01-platform-dispatcher-sdk-build-plan - ADR-0009 (proposed):
coordination/adrs/ADR-0009-dispatcher-cross-process-transport.md - ADR-0009 announcement (earlier today):
2026-05-02-platform-adr-0009-drafted - Event Envelope contract v1.0.2:
coordination/contracts/event-envelope/README.md - Envelope JSON Schema:
coordination/contracts/event-envelope/schema/envelope-v1.json - Event-type registry:
coordination/contracts/event-types-registry.json - Lock-related payload schemas:
coordination/contracts/credit-reservation-lock/schema/payloads/ - Dispatcher SDK:
platform/lib/dispatcher/(esp. README.md) - Validation gate:
coordination/scripts/validate-event-types.mjs - CI workflow:
coordination/.github/workflows/ci.yml - Platform-owed ledger:
2026-05-01-platform-owed-ledger