Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.2.1] — Unreleased
Changed
WorkflowRunner— state_machines fully drives execution (architecture overhaul). Previouslystate_machineswas used only for post-hoc transition validation; the next-node was calculated by Phronomy internally (resolve_next_node). As of 0.3.0, all state transition decisions — including guard evaluation for routing events — are delegated entirely tostate_machines.PhaseTrackernow exposesattr_accessor :contextso guard lambdas can access theWorkflowContextviam.context.- Guard bridge pattern:
if: ->(m) { guard_proc.call(m.context) }. - Three event types registered per workflow:
advance_<from>— unconditional after-transitions<routing_event>— guarded branching from action states (name is the event name used in the DSL, e.g.:route,:route_review)<external_event>— human-in-the-loop triggers from wait states- Invalid transitions now raise
ArgumentErrorinstead of logging warnings.
WorkflowRunnerinitializer signature changed —edges:,conditional_edges:, andwait_states:replaced byafter_transitions:,route_transitions:,external_events:, andwait_state_names:. This is an internal-only change; the publicPhronomy::Workflow.defineDSL is unchanged.
Removed (internal)
WorkflowRunner#resolve_next_node— logic moved to state_machinesWorkflowRunner#advance_phase— replaced byfire_event!Workflow::Builder#build_edges,#build_conditional_edges,#build_wait_states— replaced by unified event classification inbuild
[Unreleased]
Added
Phronomy::Graph::Contextmodule — canonical module for defining workflow context classes (replaces the removedPhronomy::Graph::State).Phronomy::Graph.register_context_class— registers context classes for deserialization from external stores (Redis, DB).Phronomy::Workflow.defineDSL — primary high-level API for declaring stateful workflows (state,wait_state,event,after,initial).Phronomy::Graph::WorkflowRunner— state-machine execution engine backing the Workflow DSL. Replaces the removedCompiledGraph.app.send_event(event, config:)— event-driven resume for workflows halted at await_state.state.halted?— returnstruewhen the workflow is paused at await_state.state.phase— single source of truth for execution state.
Removed
Phronomy::Graph::StateGraph/CompiledGraph— usePhronomy::Workflow.define.Phronomy::Graph::State— usePhronomy::Graph::Context.Phronomy::Graph.register_state_class— useregister_context_class.state.current_nodes/state.halted_before— usestate.phase/state.halted?.compiled.interrupt_before/compiled.interrupt_after— usewait_state+event.compiled.resume— useapp.send_event.
[0.2.0] - 2026-05-13
Added
Phronomy::Graph::WorkflowRunner— state_machines-based execution engine (introduced as the internal successor toCompiledGraph).state.phase— single source of truth for graph execution state (replacescurrent_nodes+halted_beforedual attributes).state.halted?— returnstruewhen the graph is paused.CompiledGraph#add_wait_state— declared a named wait state that halts automatically when reached (later superseded bywait_stateDSL inWorkflow.define).CompiledGraph#send_event(state:, event:, input: nil)— event-driven resume API (later superseded byapp.send_event).
Removed
ParallelNodeandadd_parallel_nodeDSL. UseThread.neworConcurrent::Futureat the application level instead.Phronomy::Graph::TimeoutError(was only used byParallelNode).