Platform
36.0.0 Latest
- chore(payment): :wrench: declare fee-model per environment so each can be cut over separately (#1062)
- chore(payment): :wrench: flip fee-model to Stripe pass-through in local + staging
- feat(#1004): :sparkles: add BookingFeeModel flag, stamp it on bookings, gate the TripPay waterfall step (#1026)
- feat(#1005): :sparkles: acquiring-fee state, multi-room apportioning and capture event (#1034)
- feat(#1007): :sparkles: debit Stripe acquiring and refund fees to the hotel ledger (#1039)
- feat(#1008): :sparkles: expose feeModel/acquiringFee/refundFee on BookingLightweight, LedgerBalanceResponse.withdrawable, property email Stripe fee rows
- feat(pricing-view): :sparkles: add validated SHADOW gate reader (#1000)
- feat(WINK-CLI): :sparkles: add OAuth2 device authorization grant (RFC 8628) to SSO (#1013)
- fix: :bug: align isempty semantics across StateMongoQueryHelper overloads (#1063)
- fix(#1030): :bug: route the wink-cli client seeding through a published service (#1055)
- fix(#876): :bug: charge.updated webhook + acquiring-fee reconciliation sweep (#1036)
- fix(channel-manager-d-edge): :bug: lazily initialize RoomElement collections + jacoco gate on 6 modules (#1044)
- fix(channel-manager-exely): :bug: restub ExelyServiceIntegrationTest for #1021’s findRatePlansForRoomType (#1050)
- fix(channel-manager-rate-tiger): :bug: correct booking-sync NPE and validation bugs found while adding jacoco coverage on 6 modules
- fix(channel-manager,places,shortened-url,property): :bug: correct 4 production bugs found while adding jacoco coverage (#1037)
- fix(channel-manager,special-rate,computed): :bug: correct booking-sync success-flag, card-payment lookup, and warning-NPE bugs found while adding jacoco coverage
- fix(channel-manager): :bug: correct swapped rate modifiers and travelclick NPE guard (#1033)
- fix(checkout,channel-manager,computed,web-shared): :bug: correct pricing-multiplier, booking-sync success-flag, duplicate-key, and equals bugs found while adding jacoco coverage (#1046)
- fix(inventory-app): change pending stripe fee copy to “pending” (#1067)
- fix(lookup): :bug: build the local-name lookup entry from localName, not name (#1035)
- fix(mcp): :bug: aggregate tool specifications for grouped endpoints (#1054)
- fix(mcp): :bug: include workflow prerequisites in grouped toolsets (#1066)
- fix(mcp): :bug: preserve authentication in grouped tool calls (#1070)
- fix(media,winklinks): :bug: correct secure-flag and inverted oEmbed-valid bugs found while adding jacoco coverage (#1045)
- fix(payment,managed-social,computed): :bug: correct wrong-field display, date-dependent validation, and page/size default bugs found while adding jacoco coverage (#1041)
- fix(pricing-view): make ON-mode fallback coverage-aware, not just empty-aware (#1072)
- fix(report): add refundState and lifecycleStatus columns to the booking CSV export (#1069)
- fix(stripe-api,computed-api): :bug: correct status-transitions, shipping-address NPE, and cheapest-item fallback bugs found while adding jacoco coverage on 3 modules
- fix(web-shared): :bug: drop printAllRequestHeaders from WARN to DEBUG (#1002)
- perf(channel-manager): batch per-row master-rate lookups across all four ARI handlers (#1017)
- refactor(channel-manager): :recycle: address code review on the ARI batching (#1021)
- refactor(sso): :recycle: route DCR client registration through RegisteredClientService (#1057)
- test(jacoco): :white_check_mark: wave0 enable coverage gate on 31 modules already at 80%+ (#998)
- test(jacoco): :white_check_mark: wave0-step3 enable coverage gate on 6 zero-instruction modules (#999)
- test(jacoco): enable coverage gate on ai-property (#1060)
- test(jacoco): wave1 quick-wins — enable coverage gate on 6 modules (#1001)
- test(jacoco): wave1 step2 — enable coverage gate on 6 more modules (#1003)
- test(jacoco): wave1 step3 — enable coverage gate on 6 more modules (#1012)
- test(jacoco): wave1 step4 — enable coverage gate on 6 more modules + fix jacoco-check agents bug (#1014)
- test(jacoco): wave1 step5 — enable coverage gate on 6 more modules (#1015)
- test(jacoco): wave1 step6 — enable coverage gate on 6 more modules (#1020)
- test(jacoco): wave1 step7 — enable coverage gate on final 4 named quick-wins modules (#1022)
- test(jacoco): wave2 step1 — enable coverage gate on 6 more modules (#1025)
- test(jacoco): wave2 step2 — enable coverage gate on 6 more modules (#1027)
- test(jacoco): wave2 step3 — enable coverage gate on 6 more modules (#1029)
- test(jacoco): wave2 step4 — enable coverage gate on 6 more modules (#1031)
- test(jacoco): wave3 final step — enable coverage gate on datasource-mongodb-utils (#1061)
- test(jacoco): wave3 step1 — enable coverage gate on 6 more modules (#1051)
- test(jacoco): wave3 step2 — enable coverage gate on 6 more modules (#1052)
- test(jacoco): wave3 step3 — enable coverage gate on 3 more modules (#1053)
- test(jacoco): wave3 step4 — enable coverage gate on 2 more modules (#1056)
35.7.1
- fix(927): :bug: re-record payment OpenAPI golden for postingGroupId
- fix(996): :bug: fix ClassNotFoundException in open-api-grpc exec:java on cache restore (#997)
- refactor: :recycle: remove TRAVELIKO and RESAVENUE from HotelCodeContext (#994)
35.7.0
- feat(927): :sparkles: expose posting-group and booking money-trail lookups (#972)
- fix(build-cache): :bug: force buf-breaking-check to run on cache hits (#976)
- fix(build-cache): :bug: force write-partner-openapi to run on cache hits (#974)
- fix(green-index): :bug: preserve lastUpdate in prepareAnswerForDisplay (#971)
- fix(property-aggregate): :bug: add backfill script for drifted images/videos
- fix(property-aggregate): :bug: narrow media backfill script to images only
35.6.0
- feat(#938): :sparkles: backfill the default policy onto properties that declared none (#960)
- feat(#957): :sparkles: enforce urlName uniqueness with a partial unique index (#961)
- feat(#957): :sparkles: rename the duplicate side of each urlName collision (#969)
- feat(accounting): admin ledger query API and account endpoints (#925, #926)
- feat(cache): :sparkles: flip cache.l2.batched-broadcast to true now the two-step gate is satisfied (#965)
- feat(media-migration): :sparkles: add 34_ to delete FAILED orphan placeholders 33_ structurally cannot reach (#966)
- feat(pricing-view): :sparkles: serve the single-pair surfaces from the read model (#772)
- feat(property): migrate property.socials to managingEntity.onlinePresence
- feat(sentry): :sparkles: capture WARN as Sentry events, after removing the two sources that made it unaffordable (#964)
- feat(sentry): :sparkles: file new Sentry groups as GitHub issues daily (#968)
- fix(#938): :bug: guard PropertyPolicy dereference on the public inventory path (#954)
- fix(#948): :bug: marshal SOAP response types that lack @XmlRootElement (#963)
- fix(#955): wire up propertyAggregate reconciliation + drift repair scripts
- fix(geo-name): :bug: make the City and GeoName urlName indexes actually unique (#970)
- fix(inventory-app): restore inventory-app test compilation (broken on develop)
- fix(media-migration): :bug: a root-id 404 in 34_ must not imply the asset is gone (#967)
35.5.0
- feat: implement Machine Payments Protocol (MPP) — Stripe SPT + Stripe-processed tempo USDC (#290)
- feat(accounting): :sparkles: count ledger-time FX quotes so a silent gap is visible (#924)
- feat(accounting): :sparkles: record the FX quote at ledger time on hotel entries (#914)
- feat(bamboo): :sparkles: add Bamboo Specs export for WS-SP and WP-MJ (Platform)
- feat(external-event): :sparkles: typed audit recorder with deferred serialization (#849) (#903)
- fix(accounting): :bug: reverse refunds TO a target so a second settlement cannot double-reverse (#919)
- fix(api): :bug: correct the day-of-week on the taxonomy and booking
Sunsetheaders (#918) - fix(booking): :bug: add the #819 refund mislabelling repair script (#906)
- fix(booking): :bug: pay the net on partially refunded bookings instead of dropping them (#913)
- fix(booking): :bug: reverse the beneficiary ledger for Stripe-side refunds (#910)
- fix(itinerary): :bug: accept a multi-entry
itemsusing the first entry, and tell the caller it is retiring (#897) - fix(itinerary): :bug: answer an unreadable request body with an actionable 400, not a 500 (#897)
- fix(logging): :bug: log the channel-manager sync path in the app that actually runs it
- fix(partner): write proto release notes for integrators, not the commit log (#908)
- fix(scheduler): :bug: register the booking funds-available job and the guards that make it safe (#911)
- perf(channel-manager): :zap: cache JAXBContext, gate CXF logging, batch cache eviction (#849) (#902)
- test(channel-manager): :white_check_mark: cover JAXBException branch in TravelclickParserServiceImpl (#907)
- test(google-hotel-web): :white_check_mark: cover recorder-failure and no-properties branches (#909)
35.4.0
- chore(logging): :wrench: log the booking fan-out at INFO in prod (#845)
- chore(mongo): :wrench: finish the HOTEL_GURU -> rate-provider-identifier rename (#841)
- docs(inventory): :memo: track production $indexStats snapshots as drop-decision evidence (#836)
- docs(partner): :memo: correct the gRPC startup-probe command
- feat(sales-channel): :sparkles: drop the embedded rate-modifier copies (PRD Option D, step D1) (#750)
- feat(security): :lock: expose /actuator/threaddump behind SCOPE_ADMIN on inventory-app (#850)
- fix: restore CI after PR #829 entity inversion (context wiring + JaCoCo coverage) (#854)
- fix(846): :bug: correct inverted occupancy check in RatePlanLightweight.isValidOccupancy(Integer) (#848)
- fix(activity-stream): :bug: write the audit row inline instead of on the shared @Async pool (#844)
- fix(architecture-tests,inventory-app): :bug: restore CI after plan-688131-JOB1-1377 test failures (#869)
- fix(architecture-tests): exempt PaymentTransitionResult/RefundHandlingResult’s nested Status enums (#885)
- fix(architecture-tests): exempt single-sign-on’s deliberate lead/managing-entity access (#886)
- fix(campaigns-domain): :bug: restore CI after plan-688131-JOB1-1374 JaCoCo gap (#864)
- fix(cancellation-policy): :bug: migrate NINENTY_PERCENT on every RatePlanRef embed site (#889)
- fix(checkout,analytics,managing-entity): restore CI after PR #829 test gaps (#859)
- fix(computed-property,booking): :bug: restore CI after plan-688131-JOB1-1371 test gaps (#862)
- fix(inventory-app): :bug: restore CI after plan-688131-JOB1-1393 OpenAPI golden drift (#887)
- fix(invite-domain): restore CI after plan-688131-JOB1-1381 JaCoCo gap (#874)
- fix(managed-social,scheduler-domain): restore CI after plan-688131-JOB1-1379 test failures (#871)
- fix(media-migration): :bug: repair dangling media refs, restore wrongly-quarantined assets, finish the root reorganisation (#800)
- fix(notification-endpoint,message-template,winklinks): :bug: restore CI after PR #829/#834 test gaps (#861)
- fix(notification,inventory): :bug: restore CI after plan-688131-JOB1-1373 test gaps (#863)
- fix(partner-app): :bug: poll gRPC health every 60s instead of 5s (#898)
- fix(partner-grpc): :bug: restore CI after plan-688131-JOB1-1376 test failures
- fix(point-of-interest,notification-endpoint): :bug: restore CI after plan-688131-JOB1-1375 JaCoCo gap (#866)
- fix(pricing-view): :bug: stop filtering pricing data on the pair enabled flag (#894)
- fix(sales-channel,sellable-item): :bug: restore CI after PR #829/#750 gaps (#856)
- fix(sentry): :bug: drop the traces sampler bean and halve sampling to 0.05 (#900)
- fix(task-executor): :bug: isolate AI work and MVC dispatch from the shared @Async pool (#847)
- fix(user): :bug: exclude UserReportDataSource from UserServiceIntegrationTest’s component scan (#853)
- refactor(booking,channel-manager): retype ChannelManagerCommunicator to BookingLightweight (#880)
- refactor(booking): extract BookingMapper ahead of the entity move (#883)
- refactor(booking): move Booking.java out of booking-api (final entity, ArchUnit migration) (#884)
- refactor(booking): narrow booking-api service interfaces off raw Booking (#882)
- refactor(booking): narrow BookingConsumerService#findById to BookingLightweight (#881)
- refactor(event-listener): :recycle: return void from every @EventListener (#843)
- refactor(geo-name): move geo-name entities out of geo-name-api (#879)
- refactor(inventory,computed): collapse InventoryAggregate/InventorySupplierAggregate onto their Lightweight siblings (#877)
- refactor(inventory,property-aggregate): two-step-fetch InventoryAggregate hotel data (#873)
- refactor(lead): move the GooglePlaceLead entity out of lead-api (94 of 108) (#870)
- refactor(managing-entity): move the ManagingEntity entity out of managing-entity-api (93 of 108) (#867)
- refactor(property-aggregate): move PropertyAggregate entity out of property-aggregate-api (#878)
- refactor(sales-channel): :recycle: move the SalesChannel entity out of sales-channel-api (92 of 108) (#860)
- test(api): restore JaCoCo coverage in 12 -api modules after the entity inversion (#829) (#842)
35.3.3
- fix(booking): :bug: only adjust local availability for direct inventory (#840)
- fix(metrics): :bug: read the allow-list from the main properties, not the shadowed test copy
35.3.2
Housekeeping release — no user-facing changes.
35.3.1
- docs: :memo: buf and gh are provisioned on both Bamboo agents (#838)
- fix(booking-sync): :bug: write the outbox row inline instead of on the shared @Async pool (#839)
- fix(grpc-proto): :bug: make buf lint pass on the Partner proto release path (#837)
35.3.0
- docs(analytics): :memo: raw-retention TTL script and rollup deploy runbook
- feat(booking-sync): :sparkles: detect paid bookings whose sync entry was never written (#834)
- fix(metrics): :bug: export the executor meters #733 added but never shipped (#833)
- fix(pricing-view): :bug: stop concurrent rebuilds silently truncating a hotel’s view
