Rebuildable workflow-agent projection over one run-thread journal.
Dispatch completion is not treated as workflow progress here. A runnable is
applied only after the run thread records :runnable_applied, preserving the
durable ordering between dispatch results and workflow state transitions.
Summary
Types
@type manual_state() :: %{ step: String.t(), kind: String.t(), paused_at: DateTime.t(), metadata: map() }
@type t() :: %SquidMesh.Runtime.WorkflowAgent.Projection{ anomalies: [anomaly()], applied_at: %{optional(String.t()) => DateTime.t()}, applied_execution_opts: %{optional(String.t()) => keyword()}, applied_results: %{optional(String.t()) => map() | nil}, applied_runnable_keys: string_set(), context: map(), definition_fingerprint: String.t() | nil, input: map() | nil, manual_state: manual_state() | nil, planned_runnables: %{optional(String.t()) => map()}, replayed_from_run_id: String.t() | nil, run_id: String.t() | nil, status: atom(), terminal_status: atom() | nil, trigger: String.t() | nil, workflow: String.t() | nil }