A mountable Rails engine for visibility and recovery. It is built on the step history each workflow records as it runs, and adds the controls to act on what it surfaces.
Ships as a separate gem, chrono_forge-dashboard, so the core stays lean. See the dashboard README for setup, authentication, and configuration.
Overview. A fleet summary: total processed / in-flight / blocked, then one row per workflow class with a share-of-processed bar. Every count drills into the matching filtered list; each class name opens its Analytics.Workflow list. Filter by state, job class, or workflow key, with keyset pagination and a per-row duration meter that turns rose when a run is stranded.Workflow detail. A step-replay timeline with errors inlined on the step that failed, periodic-task health, and arguments/context. Durations get a proportional meter, and a banner names where a blocked run stopped.Definition graph. A per-run static DAG of the durable steps a workflow will run, parsed from perform with Prism (never executed), with live status painted on each node: done, in progress, failed, not-yet-reached.Definition graph, branching run. A scheduled-payment recurrence with three reminder-ordering branches that reconverge on the charge. This run took the auto-charge branch (green); the others were never reached (dimmed), and the final process_payment failed.Analytics. Completion/failure rate with a window trend, throughput bars carrying a per-day completion-rate pill (amber-flagged on a failure spike), top error classes, and per-class queue health.Waiting. Leads with a banner for a stalled continue_if event wait, the silent stall that never self-resumes. Event vs poll waits read as pills, and each row's age is a meter.Stranded. Workflows stuck in running with a stale lock, the set Workflow.reap_stalled re-enqueues. Lock-age meters, the dead worker named, per-row Reap, and a Reap all background sweep.Reap. A workflow whose lock has gone stale is flagged stranded: its worker was hard-killed mid-pass, so nothing is driving the run. The banner offers Reap, which re-enqueues it to steal the lock and replay.Repetitions. A durably_repeat step's per-iteration runs as status pills, with duration and lateness meters, attempts in words, and catch-up skips shown as per-tick tombstones or a summary.Branches. Fan-out branches with exact spawned / pending / never-started counts, plus blocked count and merge state. In-flight merges show live throughput (children/s) and ETA while draining.Branch children. One branch's children with a live stats header (throughput/ETA, spawned, pending, never-started, dropped-child recovery): blocked-first triage, capped state filters, retry per child.