← SagaForge

The dashboard

A mountable Rails engine for visibility and recovery. It reads the durable event ledger every saga writes as it runs, and adds the controls to act on what it surfaces.

Ships as a separate gem, saga_forge-dashboard, so the core stays lean. See the dashboard README for setup, authentication, and configuration.

Overview: fleet summary with per-class rows
Overview. A fleet summary across every saga class: total, then stalled / suspended / compensating at a glance. One row per class breaks the instances down by current state, and each count drills into the matching filtered list.
Saga list with filter chips and state badges
Saga list. One class at a time, with filter chips for stalled, suspended, compensating, finalized, and active, a correlation-ID prefix search, and keyset pagination. Each row shows the current state and when it was last active.
Saga detail: event-ledger timeline and context
Saga detail. The event ledger as a timeline — every event this instance received, in order, with status and attempts — over the saga's live context. Operator actions (compensate, cancel) sit in the header, and the current state is one badge away from the definition graph.
A compensating saga stuck mid-rollback
Compensation. When a step fails, what already committed unwinds in reverse. Here release_stock ran but refund exhausted its retries mid-rollback: the banner names where it's stuck, the timeline inlines the error on the failed compensation, and the Compensation panel lists the compensated steps most-recent-first.
Parsed state-machine graph of a saga
State-machine graph. A forward-only DAG of the saga's states, parsed from the class (never executed). Solid edges are the event-handler chain; dashed edges are best-effort transition_to jumps detected in the handler source. Node status paints on when viewed for a specific run.
Stalled sagas triage view
Stalled. Instances with an event parked in stalled — it exhausted its retry budget and is waiting to be retried, the classic out-of-order arrival that parked until its state was reached. Per-class Retry all stalled re-enqueues the parked work in one background sweep.
Suspended sagas triage view
Suspended. Poison-pill isolation: an event that ran out of retries and landed in failed halts its one saga instance, not the fleet. Each row names the failed event and error; after the fix, Resume all re-fires them, or an instance can be compensated instead.