← Changelog
v2.9Major23 April 2026

Reservation engine V2 · staff full-window

The biggest shift of the year. /dashboard/book is now a three-column command center with two-phase commit saga, four-layer pricing, and automatic rollback. Roiback is the first adapter that writes to real hotels.

What changes

Until v2.9 GolfStay sold golf on top of existing hotel bookings (P1a · post-checkin mini-app). With v2.9 the hotel can sell the room + tee times directly from GolfStay, in a single atomic transaction (P1b · standalone engine).


Major changes

  • /dashboard/book: new full-window three-column screen (Search + Results + Cart). Replaces the previous manual wizard in staff flows.
  • Two-phase commit saga: atomic booking with reverse-order automatic rollback if any step fails. Audit timeline visible to the operator at /dashboard/bookings/[id]/timeline.
  • Four-layer pricing: rack rate → tenant override → agency contract → staff override. Every layer visible in the final breakdown.
  • Write adapters: new IBookingEngineWriteAdapter implemented by Roiback. Enables real-time hotel inventory sales with rate verification before confirm.
  • Per-tenant feature flags: ENGINEV2ENABLED + ROIBACKWRITEENABLED. Selective activation per pilot hotel.
  • Polymorphic line items: one booking can hold HOTELSTAY + TEETIME + EXTRA + CAR_RENTAL lines.
  • Hold expiration: each draft holds inventory for 15 minutes; cleanup cron releases expired holds.

Validation

41 automated tests, 5 production smoke rounds with live feedback. C1 IDOR, C2 race condition in cancelGolf, I4 R2B prefix guard — all resolved before merge.


Next step

Enable ENGINEV2ENABLED for the two pilot hotels (Oliva Nova + Las Dunas) after the last two blockers: RESERVATION_* email triggers and rewrite of the mini-app endpoint to Reservation.