From wshobson-saga-orchestration
Implements saga patterns for distributed transactions across microservices with compensating actions, orchestrator/choreography logic, and step timeout handling.
How this skill is triggered — by the user, by Claude, or both
Slash command
/wshobson-saga-orchestration:saga-orchestrationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Patterns for managing distributed transactions and long-running business processes without two-phase commit.
Patterns for managing distributed transactions and long-running business processes without two-phase commit.
What you provide:
What this skill produces:
Moved to references/details.md.
Moved to references/details.md.
saga_id must flow through every event and logsaga_id, step_name, old_state → new_state on every changeA saga enters compensation but never reaches FAILED. This means a compensation handler is throwing an unhandled exception and never publishing SagaCompensationCompleted. Add dead-letter queue (DLQ) handling to compensation consumers and ensure every compensation action publishes a result event even when the underlying operation was already rolled back.
async def handle_release_reservation(self, command: Dict):
try:
await self.release_reservation(command["original_result"]["reservation_id"])
except ReservationNotFoundError:
pass # Already released — treat as success
# Always publish completion, regardless of outcome
await self.event_publisher.publish("SagaCompensationCompleted", {
"saga_id": command["saga_id"],
"step_name": "reserve_inventory"
})
If your orchestrator service restarts mid-saga, it may replay events and re-execute already-completed steps. Guard every step action with an idempotency key — see Template 3 above.
In a choreography-based saga, a downstream service may miss an event if it was offline when published. Use a durable message broker (Kafka with replication, RabbitMQ with persistence) and store the current saga state in a dedicated saga_log table so you can replay from the last known good step.
A step like create_shipment might take up to 15 minutes during peak load but your global timeout is 5 minutes, causing spurious compensation. Make step timeouts configurable per step type — see references/advanced-patterns.md for the TimeoutSagaOrchestrator implementation and the STEP_TIMEOUTS dict pattern.
When two steps both complete before a failure is detected, compensation must run in strict reverse order or you leave data in an inconsistent state. Verify that _compensate() iterates from current_step - 1 down to 0, and add an integration test that deliberately fails at each step index to confirm correct rollback order.
The references/ directory contains production-grade implementations not needed for most sagas:
references/advanced-patterns.md — Full SagaOrchestrator abstract base class, TimeoutSagaOrchestrator with per-step deadlines, detailed bank transfer compensating transaction chain, Prometheus instrumentation, stuck saga PromQL alerts, and DLQ recovery worker.cqrs-implementation — Pair sagas with CQRS for read-model updates after each step completesevent-store-design — Store saga events in an event store for full audit trail and replay capabilityworkflow-orchestration-patterns — Higher-level workflow engines (Temporal, Conductor) that build on saga concepts4plugins reuse this skill
First indexed Jul 7, 2026
npx claudepluginhub p/wshobson-wshobson-saga-orchestration-plugins-backend-development-skills-saga-orchestrationImplements saga patterns for distributed transactions across microservices with compensating actions, orchestrator/choreography logic, and step timeout handling.
<!-- AUTO-GENERATED by export-plugins.py — DO NOT EDIT -->
Implements saga patterns for distributed transactions and cross-aggregate workflows. Covers choreography vs orchestration, execution states, and compensating transactions for multi-step business processes.