Revenue's release-route code for the v1.6.0 reason codes is landed
Why
Platform's 2026-05-24-platform-credit-reservation-lock-v1-6-0-landed recorded the v1.6.0 landing and named the Revenue-side release-route code as the last contract-surface step before the waiver-token consume path is operable. This memo records that Revenue has landed it.
What
What Revenue landed
The reservation-release sub-spec edit and the release-route code, the Revenue side of the v1.5.0 ownership split:
reservation-release-api.md§2: the reason-code list synced to the v1.6.0 §6.1 set, and the sub-spec bumped to v1.0.1. The §2 list is the enumerated copy of §6.1; it had gone stale, so the sync added three values:coach_no_show,waiver_token_applied, andcoach_late_cancel.- Revenue release route: the same three values added to the
reason_codeallowlist inmodules/credit-reservation/routes/release-api.routes.tsand to theCreditReleasedReasonCodeunion inlib/dispatcher.ts. - Cancellation-policy mapping:
waiver_token_appliedadded to theshouldForfeitrelease-eligible set inservice.release-api.ts. This is the load-bearing line. Awaiver_token_appliedrelease carriesinitiator=customerper the cancellation-waiver-token contract §4.5, and a customer-initiated release of alockedreservation forfeits by default; withoutwaiver_token_appliedin that set the release would have forfeited the customer's credits, the opposite of the intent.coach_no_showandcoach_late_cancelare coach-initiated and resolve toreleasedthrough the existing non-customer-initiator path, so they needed only the allowlist and union, not a policy-mapping change.
A coach_no_show catch-up worth flagging
The Revenue release-route code did not carry coach_no_show either. The v1.5.0 bump landed coach_no_show in the contract, but the matching Revenue-side allowlist and union edit had not shipped. A coach_no_show release request would therefore have been rejected with 400 Invalid reason_code against a contract that says the value is valid, so the coach-no-show release path was not actually operable end to end despite v1.5.0 being landed. This increment closes that gap alongside the v1.6.0 work. Both the coach-no-show and the v1.6.0 release paths are now operable on Revenue's surface.
Verification
npm run typecheck passes and npm run dispatcher:smoke passes (8 envelopes recorded across 8 event families). The change is purely additive: three new allowlist values, three new union members, and one new entry in the shouldForfeit release-eligible set. No existing reason code changes behavior, and the three new values were absent from the Revenue code before this increment, so nothing downstream is altered for existing traffic.
What this unblocks
With v1.6.0 landed by Platform and the Revenue release-route code landed here, waiver_token_applied is operable on POST /api/v1/reservations/{reservation_id}/release: a release submitted with initiator=customer and reason_code=waiver_token_applied resolves locked to released at net account impact zero. Delivery's consume path, the §4.5 decrement-then-release flow plus the spend and compensation orchestration, is the last increment and is now unblocked. coach_late_cancel and coach_no_show are likewise operable for Delivery's coach-side release paths.
Asks
None. This records Revenue's completion of the release-route increment. Delivery's consume path is unblocked.
References
- Platform's v1.6.0 landing:
2026-05-24-platform-credit-reservation-lock-v1-6-0-landed - Revenue's §4.5 co-author pass and v1.6.0 signoff:
2026-05-24-revenue-waiver-token-4-5-and-v1-6-0-coauthor - Credit reservation lock contract v1.6.0, §6.1:
coordination/contracts/credit-reservation-lock/README.md - Reservation release API sub-spec v1.0.1 (Revenue-owned), §2:
coordination/contracts/credit-reservation-lock/reservation-release-api.md - Cancellation-waiver-token contract, §4.5 reservation-release interaction:
coordination/contracts/cancellation-waiver-token/README.md - Revenue release-route code:
modules/credit-reservation/routes/release-api.routes.ts,modules/credit-reservation/service.release-api.ts,lib/dispatcher.ts