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.2] - 2026-05-17
Fixed
Tool::Basetype validation — strict mode (#73): Removed string-coercion pass-through for:integer,:number/:float, and:booleanparameters. AStringvalue such as"42"now correctly raises a type error regardless of theon_schema_errormode. Fixes silent data corruption where the raw string was forwarded toexecuteinstead of the expected numeric/boolean type.README— correctsend_eventAPI example (#69): Fixed code sample that calledapp.send_event(:approve, config: { thread_id: ... })(positional args) which raisesArgumentErrorat runtime. Corrected toapp.send_event(state: state, event: :approve).phronomy.gemspec— excludevendor/from gem package (#70):vendor/bundle(~3 500 files, ~14 MB) was included in released gems. Added"vendor/"to the file reject list.
Added
Phronomy::Configuration#max_actors(#72): New optional attribute (defaultnil= unlimited, backward-compatible). When set,ThreadActorRegistryenforces an LRU eviction policy: the least-recently-used actor is stopped and removed before a new one is created, preventing unbounded thread growth in long-running processes.README— feature stability table (#71): Features section now uses a table with Stable / Beta / Experimental labels so users can assess maturity at a glance.TrustPipeline::Result#citations— unverified-source warning (#74): YARD documentation now explicitly states that citations are extracted from the LLM's own output and have not been verified against any external source.
CI
- Ruby 3.4 added to CI matrix (#75): Aligns test coverage with the gemspec
requirement (
>= 3.2.0) and verifies compatibility with the current stable Ruby release.
[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).