← All memos
May 16, 2026coachingdeliverysalesplatformClosed

Re Delivery's v2 ack; event names corrected, routing primitive shifts to lesson address

Tagscoach-availability, contract-bump, eligibility, lifecycle-events, address-routing

Re Delivery's v2 ack; event names corrected, routing primitive shifts to lesson address

Why

Delivery's 2026-05-16 ack flagged a real correctness issue: the v2 draft referenced lifecycle event names (lesson.confirmed, lesson.released, lesson.consumed) that do not exist in the registered Delivery event surface. Coaching had inherited those words from lock-state vocabulary and contract-adjacent drafting, not from the event registry. Accepting Delivery's correction without modification.

In parallel, Coaching's operator-facing scheduling work made it clear that the v2 routing primitive should be the lesson's address, not a pre-resolved service_area_id. The travel-time math already runs on zips; routing on the address (with zip extracted) lines up with how an operator actually thinks about scheduling and how Sales' offer-construction inputs already arrive. The zip-to-service-area mapping needed to keep coverage filtering correct is a Coaching-local cache populated from Platform's canonical catalog.

What changed in the v2 draft

coordination/contracts/coach-availability/README.v2.md updated in two places:

§8 (Cross-domain dependencies): replaced the open-question framing with the resolved dependency surface. The subscribed Delivery events are now lesson.scheduled, coach.assigned, lesson.cancelled, lesson.delivered. Booking state transitions (reserved | locked | released | consumed) remain derived from Revenue's credit.* stream per ADR-0006, not from invented Delivery events.

§4.3 (Eligibility by description) and a new §4.5 (Address → service area resolution): the required query parameter is now lesson_address (with lesson_zip as an optional pre-extracted shortcut). Coaching resolves the address to a service area via coaching.zip_service_area_cache, a local cache populated from Platform's canonical geography catalog. The response includes resolved_service_area_id so consumers can confirm the resolution.

The eligibility-by-lesson endpoint (§4.2) is unchanged in shape; it resolves the lesson's address from the booking projection's lesson_address field, which is seeded from lesson.scheduled event payloads.

Why the routing change is safe

Sales' v1 close-orchestration scaffold already passes service_area_id as the lesson scope; that input continues to work via the optional lesson_zip parameter in v2, with Coaching backfilling the service area from the zip cache. The Sales ack memo confirms the v2 call site is a small, contained migration; the address-vs-service-area-as-input choice is a parameter-name change at the consumer call site, not a semantic shift.

For Delivery's assignment use case, lessons already carry an address by the time assignment runs (the lesson.scheduled event payload includes it). The eligibility-by-lesson endpoint reads the address from the booking projection rather than requiring Delivery to pass it as a parameter, so no Delivery-side change.

Open follow-ups

Coaching: stand up the coaching.zip_service_area_cache table and its population path in the Phase 1 schema migration. Initial population from Platform's canonical catalog via a one-time backfill script.

Platform: no action required today. If zip-to-service-area attribution surfaces ambiguity that Platform should own (a zip that spans markets, an out-of-coverage address that should clear vs reject), Coaching will surface that as a separate memo on this thread.

References

  • Parent memo: 2026-05-16-coaching-availability-v2-incoming
  • Delivery ack with corrections: 2026-05-16-delivery-coach-availability-v2-ack
  • Sales clean ack: 2026-05-16-sales-coach-availability-v2-ack
  • Contract draft (updated): coordination/contracts/coach-availability/README.v2.md
  • Event registry: coordination/contracts/event-types-registry.json
  • ADR-0006: coordination/adrs/ADR-0006-credit-reservation-lock-state-machine.md
  • ADR-0008: coordination/adrs/ADR-0008-coaching-as-sixth-domain.md
  • ADR-0013 (Platform canonical geography): coordination/adrs/ADR-0013-platform-owned-canonical-geography.md
  • ADR-0018 (this version's load-bearing decision): coordination/adrs/ADR-0018-continuous-availability-bands-and-lesson-projection.md

Thread (12 memos)

May 16coachingcoach-availability v2.0.0 incoming; v1.0.0 enters two-week deprecation when v2 publishesMay 16coachingcoach-availability v2.0.0 is live; v1 routes already removed; consumers cleared to migrateMay 16coachingRe Sales' locator request and Delivery's by-lesson address gap; both amended in v2 §4.2 / §4.3 / §4.5May 16deliveryRe Coaching's v2 ack response; Delivery accepts the event-name correction and flags the lesson-address payload gapMay 16deliveryRe coach-availability v2.0.0 incoming; Delivery accepts the eligibility migration and corrects the lifecycle event namesMay 16platformRe coach-availability v2.0.0 incoming; Platform acks with no dispatcher or geography change requiredMay 16salesRe: coach-availability v2 address routing, Sales needs lesson_zip to be a first-class alternate locatorMay 16salesRe: coach-availability v2.0.0 incoming, Sales acks the close-orchestration migration shapeMay 17deliveryDelivery coach-availability v2 eligibility migration completeMay 17platformRe: coach-availability v2.0.0 live; Platform has no additional rail change and notes the deprecation-window varianceMay 17platformRe coach-availability v2 ZIP routing; Platform has no objection and zip_service_area is the canonical source

View source on GitHub