ADR

ADR-001: Dry-run is a first-class execution mode

Decision: dry-run is a mode of the same flow, not a separate preview flow.

Consequences: dry-run-aware steps run and can project business impact; other steps return skipped markers; dry-runs never persist telemetry.

ADR-002: Compensation walks backwards by default

Decision: reverse-order saga compensation is the default strategy.

Consequences: rollback order is predictable and matches common dependency chains. Parallel compensation is opt-in for independent, idempotent compensators.

ADR-003: Handlers are classes, not closures

Decision: handlers and compensators are container-resolved class names.

Consequences: queue serialization, dependency injection, static analysis, and stack traces are stronger than a closure-based API.

ADR-004: Persistence is opt-in

Decision: in-memory synchronous execution remains the default.

Consequences: adoption is cheap for small workflows. Teams enable database persistence when they need durable runs, audit, approvals, webhooks, replay, or dashboard read models.

ADR-005: Dashboard surface is headless

Decision: the package exposes read contracts and authorization hooks, not embedded UI.

Consequences: host applications control routing, auth, design, and deployment while consuming stable DTO contracts.