lesson-lifecycle contract v1.0.0 filed with lesson.delivered and lesson.cancelled payload schemas; Platform can wire the registry entries
Why
2026-05-14-platform-dispatcher-producer-sdk-consumption confirmed that the producing domain authors the per-event-type payload schemas for its own events, and asked Delivery to flag this thread when the lesson.delivered and lesson.cancelled schema files land so Platform can wire the registry. They have landed; this memo is that flag.
What
Delivery filed the lesson-lifecycle contract at v1.0.0 under coordination/contracts/lesson-lifecycle/:
README.md. The contract proper. Documents the four-event lesson lifecycle family (lesson.scheduled,lesson.attended,lesson.delivered,lesson.cancelled), pins the payload schemas for the two events the Delivery lesson outcome write path emits, and listslesson.scheduledandlesson.attendedschemas as future work pending binding consumers.schema/payloads/lesson.delivered-v1.json. Fields:lesson_id(required),credit_reservation_id(optional, present for reserved lessons),delivered_at(required). Kept lean to matchcredit.consumed, its sibling on the other side of Revenue's Lesson Completion Job. Revenue's Job keys oncredit_reservation_idwhen present per credit-reservation-lock §10, and falls back to alesson_idlookup otherwise.schema/payloads/lesson.cancelled-v1.json. Fields:lesson_id(required),cancellation_reason(required, flexible string),cancelled_at(required). Deliberately carries nocredit_reservation_id: the event-type registry note is explicit that the credit cancellation is a separate path producingcredit.releasedorcredit.forfeited, so a crr_ field here would invite consumers to wrongly couple the lifecycle signal to the credit truth. It is a v2-additive candidate if a real consumer need surfaces.validation/README.md. Placeholder; no validation notes yet.
The coordination indexer was re-run and exits clean with the new contract parsed (16 contracts).
Asks
Platform: wire the event-type registry entries for lesson.delivered and lesson.cancelled, filling in payload_schema (pointing at the two files above) and owning_contract (lesson-lifecycle), both at schema_version 1. This is the reactive aggregation step described in 2026-05-14-platform-dispatcher-producer-sdk-consumption.
No rush on the timing. The actual producer publish wiring in Delivery still waits for the published @sguild/dispatcher package (Platform's dateless P2 on this thread); the registry wiring just needs to be in place before the first real lesson.delivered or lesson.cancelled emit, which cannot happen before the package lands anyway. Delivery does not need a written reply; closing this loop is the registry edit itself.
References
- Platform's answer that prompted this:
2026-05-14-platform-dispatcher-producer-sdk-consumption - Delivery's original question:
2026-05-14-delivery-dispatcher-producer-sdk-shape - The contract:
coordination/contracts/lesson-lifecycle/README.md - Credit Reservation Lock Contract (§10, Revenue's Lesson Completion Job):
coordination/contracts/credit-reservation-lock/README.md - Event-type registry:
coordination/contracts/event-types-registry.json - Delivery outcome write-side design:
delivery/docs/outcome-write-side-postgres-design.md