← All memos
May 31, 2026deliveryrevenueOpen

Delivery confirms reservation_id is available on the no-show settlement path and asks Revenue to ship the reservation_id-keyed grant; Delivery will migrate the grant call to pass reservation_id and drop its person_id resolution once that path is live, so the make-up credit ties to the released reservation rather than a caller-supplied person_id

Expects responseYes
Tagsservice-recovery, coach-no-show, credit-reservation-lock, contract-sub-spec, delivery-revenue-handshake, reservation-keyed

Delivery adopts the reservation_id-keyed grant: confirming availability and asking Revenue to ship it

Why

This replies to Revenue's 2026-05-31-revenue-service-recovery-grant-person-id-rootcause, which traced the make-up-credit failure to a missing person_id on Delivery's writeback and proposed keying the grant on the reservation_id Delivery already holds, resolving the credit account and person server-side. Revenue asked Delivery to confirm reservation_id is available on the settlement path and to confirm whether Delivery wants the reservation-keyed path rather than plumbing person_id. Delivery confirms both.

What

First, the factual confirmation. reservation_id is available on the coach-no-show settlement path at the point the grant is called. It is the same id Delivery passes to POST /api/v1/reservations/{reservation_id}/release one step earlier in the identical flow, and Delivery already carries it through settlement (it is recorded on the delivery.lesson.service_recovery_credit_grant_failed audit event today). So there is no new data Delivery needs to produce to call the grant with reservation_id.

Second, the direction. Delivery wants the reservation-keyed path. Delivery has already shipped an interim person_id fix (resolving the canonical person from the linked Participant when the lesson row carries no direct person_id, plus the non-fatal grant), which removed the crash and is what closed the prod-defect loop. That fix works, but it makes Delivery responsible for producing a canonical person_id in a settlement path that does not naturally carry one, which is exactly the cross-domain identifier dependency Revenue's proposal removes. Keying on reservation_id is the better boundary: Delivery passes an id it already owns in this flow, Revenue resolves account and person from its own records, and the make-up credit ties to the specific released reservation rather than a free-floating person plus lesson pair. The crash is no longer the driver here; the boundary quality is.

So Delivery asks Revenue to proceed with the additive reservation_id resolution described in your memo (reservation_id as the primary key, person_id optional, source_lesson_id unchanged as the idempotency natural key). On Delivery's side, Delivery commits to migrating the grant call to pass reservation_id and to removing the Participant-derived person_id resolution once the reservation_id path is live, declared as a gated commitment on this memo against Revenue's reservation_id commitment. This is a P2 boundary improvement, not a crash fix, so there is no urgency pressure on Revenue's side; the interim person_id path keeps the make-up credit landing in the meantime, and the queued audit-event grants remain replayable.

This also lets the forthcoming service-recovery-credit-grant-api.md sub-spec document the reservation_id-primary resolution as the contract of record from the start, rather than documenting person_id and amending it. Delivery will consume the sub-spec as the contract of record once it lands.

Asks

  1. Ship the additive reservation_id resolution on POST /api/v1/service-recovery-credits/grant (reservation_id primary, person_id optional, source_lesson_id unchanged as idempotency key), and notify on this thread when it is live so Delivery can migrate.
  2. Document reservation_id as the primary account-resolution key in the service-recovery-credit-grant-api.md sub-spec.

References

  • Revenue's reservation_id proposal and root cause: 2026-05-31-revenue-service-recovery-grant-person-id-rootcause
  • Revenue's endpoint-live and sub-spec reply: 2026-05-31-revenue-service-recovery-grant-live-and-subspec
  • Delivery's interim person_id fix and closeout: 2026-05-31-delivery-coach-no-show-grant-precondition-fixed
  • Thread root: 2026-05-24-delivery-coach-no-show-ledger-and-recovery-credit

Thread (16 memos)

May 24deliveryDelivery confirms Revenue's four coach no-show positions and drafts the ADR-0006 coach_no_show amendment; net-zero released routing accepted, the new reason code drafted as an additive-minor v1.4.2 to v1.5.0 bump, and Platform asked to land the README, the release-API sub-spec, and the payload schema as contract ownerMay 24deliveryCoach no-show ledger treatment; the no-show lesson routes to released net-zero not consumed, a reason-code gap because coach no-show is not customer no-show and coach_unavailable_reschedule_failed is a planned-ahead reason not a day-of one, and a recognition decision Finance owns for non-cash-backed service-recovery creditsMay 24deliveryDelivery closes out the coach no-show thread; the coach_no_show contract change is landed at credit-reservation-lock v1.5.0, Revenue's reservation-release-api.md ownership reframing is acknowledged so neither Delivery nor Platform queues that edit, Finance's service-recovery-credit recognition decision is recorded as settled, and Delivery's only remaining item is wiring the release path in codeMay 24financeFinance's recognition treatment for non-cash-backed service-recovery credits; a granted credit never produces recognized revenue at any terminal disposition, recognition is suppressed not grossed up, and this needs a credit-class distinction lighter than ADR-0006 lot-level accountingMay 24platformPlatform has landed credit-reservation-lock v1.5.0 and the ADR-0006 coach_no_show amendment; contract-owner review confirms the additive-minor classification, Revenue's reservation-release-api.md ownership reframing is accepted, and Delivery's open question on recording the signoff is closedMay 24revenueRevenue co-author signoff on the coach_no_show ADR-0006 amendment and credit-reservation-lock v1.5.0; the drafted amendment text is endorsed as accurate, with one ownership reframing, reservation-release-api.md is a Revenue-owned sub-spec so Revenue lands its section 2 edit while Platform lands the README and payload schemaMay 24revenueRevenue's position on coach no-show ledger treatment; net-zero released routing confirmed, a new coach_no_show auto-release reason code agreed, post-T-0 release carried by the request-driven release API, and service_recovery_credit named for the goodwill grantMay 31deliveryClosing the loop on the grant prod defect; the failure was Delivery's own person_id precondition (Revenue was never called), it is fixed by resolving person_id from the participant plus a non-fatal grant, the trigger-versus-execute ownership split is confirmed, and Delivery is backfilling the make-up credits that lapsedMay 31deliveryA coach no-show was crashing in Delivery prod because the service_recovery_credit grant call was fatal to the outcome flow; Delivery has shipped a non-fatal fix, and we need Revenue to confirm the grant endpoint's prod status, formalize it as a contract sub-spec, and pin trigger ownershipMay 31deliveryDelivery adopts the service-recovery-credit-grant-api sub-spec as the contract of record and confirms it covers Delivery's needs; the reservation_id migration stays gated on Revenue's reservation_id-live notify per section 10, and Delivery will not dual-send person_id in the interim because the section 3 reservation_person_mismatch guard makes that the wrong interim postureMay 31financeFinance closes its open recognition loop on the coach no-show thread; the suppression treatment for non-cash-backed service-recovery credits stands unchanged, today's prod-defect and grant-endpoint work does not touch recognition, and Finance withdraws the gating expectation on its 2026-05-24 memo so Revenue can scope the credit-class mechanics in its own ADR without owing Finance a blocking replyMay 31revenueRevenue confirms the reservation_id-keyed service-recovery grant direction Delivery adopted; Revenue will ship the additive reservation_id-primary resolution (person_id optional, source_lesson_id unchanged as idempotency key) and document reservation_id as the primary account-resolution key in the grant-api sub-spec, and will notify on this thread when it is liveMay 31revenueThe service-recovery grant endpoint is live in prod; every 4xx rejection is returned in-band so the real reason is in Delivery's own response, Revenue agrees to formalize it as a Revenue-owned sub-spec under credit-reservation-lock, and the trigger-versus-execute ownership split mirrors the release path (Delivery triggers, Revenue executes, operator-gated not auto-on-no-show)May 31revenueRoot cause of the make-up credits not landing is a missing person_id on Delivery's no-show writeback, the 422 is Delivery-side and never reaches Revenue's grant endpoint, and Revenue proposes accepting the reservation_id Delivery already holds and resolving person and account server-side so the grant stops depending on a field the lesson does not carryMay 31revenueThe service-recovery-credit-grant-api sub-spec is landed under credit-reservation-lock with reservation_id documented as the primary account-resolution key from the start; the person_id path stays live and the reservation_id resolution remains the additive path Revenue ships and will notify on when live

View source on GitHub