Saga Compensation Actions
Every step in a saga has a compensation action — the "undo" that runs if a later step fails.
How Compensation Works
Forward execution:
Step 1 ✓ → Step 2 ✓ → Step 3 ✗ (fails)
Compensation (reverse order):
Compensate 2 ✓ → Compensate 1 ✓
Result: System returned to original state
Defining Compensations
When adding a step, specify its compensation:
naos saga add-step order-saga charge-payment --compensate refund-payment
Example: E-Commerce Order
sagas:
order-fulfillment:
steps:
- name: reserve-inventory
agent: inventory-reserve
compensate: inventory-release # Undo: release the reserved items
- name: charge-payment
agent: payment-charge
compensate: payment-refund # Undo: refund the charge
- name: ship-order
agent: shipping-create
compensate: shipping-cancel # Undo: cancel shipment
Scenarios
All Steps Succeed
reserve ✓ → charge ✓ → ship ✓
Result: Order fulfilled, no compensation needed
Step 3 Fails
reserve ✓ → charge ✓ → ship ✗
Compensate: refund ✓ → release ✓
Result: Customer refunded, inventory released
Step 2 Fails
reserve ✓ → charge ✗
Compensate: release ✓
Result: Inventory released, no charge to refund
Compensation Best Practices
- Make compensations idempotent — They might run more than once
- Log everything — You need to trace what was undone
- Test compensations — They're as important as the forward steps
- Handle partial states — Compensations should work even if the forward step partially completed