Inventory failure and payment failure compensation

Inventory rejected → no Payment call; Payment rejected → release then Failed

Inventory failure and payment failure compensation Inventory rejected → no Payment call; Payment rejected → release then Failed ReserveInventoryReq ReserveInventoryRes [Inventory rejected] Append InventoryReservationFailedEvent Append OrderFailedEvent Apply Failed [Inventory accepted] Append InventoryReservedEvent Apply InventoryReserved AuthorizePaymentReq AuthorizePaymentRes [Payment rejected] Append PaymentFailedEvent ReleaseInventoryReq ReleaseInventoryRes Append InventoryReleasedEvent Append OrderFailedEvent Apply Failed [Payment accepted] Append PaymentAuthorizedEvent Apply PaymentAuthorized Append OrderConfirmedEvent Apply Confirmed OrderWorkflow · / Order Spot · Sequence participant OrderWorkflow / Order Spot Inventory · Sequence participant Inventory Payment · Sequence participant Payment Order Event Store · Sequence participant Order Event Store Order Read Model · Sequence participant Order Read Model

mermaid alt/else structure (archify has no native block — flattened, bracket-tagged)

  • • alt Inventory rejected: messages 3-5 only, Payment is never called.
  • • else Inventory accepted: messages 6-9 run, then a nested alt: Payment rejected → messages 10-15 (release + InventoryReleasedEvent + OrderFailedEvent); else Payment accepted → messages 16-19 (PaymentAuthorizedEvent + OrderConfirmedEvent). The Payment-rejected and Payment-accepted branches are mutually exclusive.

Compensation contract

  • • If Payment is rejected, release is requested with the already-recorded ReservationId, and the release result and OrderFailedEvent are recorded in order.
  • • Both Inventory and Payment must return the first result when given the same deterministic ID again.