The format follows Keep a Changelog and the project adheres to Semantic Versioning.
[Unreleased]
Added
Initial extraction as a standalone library.
Node-backed state store (
workflow_nodes) — nooban_jobs.metamutation.Worker macros:
Baton.Worker,Baton.LLMWorker.Dependency gating, completion-triggered rescheduling, retry idempotency.
Multi-model fan-out + synthesis (
Baton.MultiModel).Baton.Plugin(Oban plugin) for orphan rescue and failure telemetry.Baton.Pricingbehaviour + reference implementation.Per-step stats and context-window capture (optional features).
Versioned schema via
Baton.Migration.Terminal
{:workflow_finished, _}PubSub event (and[:baton, :workflow, :finished]telemetry) when a workflow's last step settles, with:completed/:failedoutcome and the failed step names (Baton.Completion).Baton.Pluginbackstops that notification for workflows that settle without a clean worker return (hard crash / Oban kill).Schema v2:
workflow_completionstable — an atomic claim guaranteeing the finished notification fires exactly once across the worker and plugin paths.Configurable LLM client for
Baton.Debug.call_llm/3(config :baton, llm_client: ...).Opt-in data retention:
Baton.Plugincan prune Baton's own tables (workflow_nodes,workflow_step_stats,workflow_debug_logs,workflow_completions) once their Oban job is pruned, with an optional shorter age cap forworkflow_debug_logs(prune: true,debug_log_max_age:). SeeBaton.Retention.
Changed
Baton.Migration.up/downnow default to the latest schema version when:versionis omitted.Baton.MultiModel.configure/2model injection now happens insideBaton.add/4, so the documentedconfigure |> Baton.addusage works.Baton.MultiModel.add/4is deprecated (now a passthrough).
Removed
Baton.Stats.record_cache_hit(dead code — was never called).
Fixed
Baton.LLMWorkerno longer injects the Oban Pro-only:kill_timeoutoption, which madeuse Baton.LLMWorkerfail to compile under Oban OSS. Replaced with a configurabletimeout/1callback (:timeoutoption, default:infinity).- PubSub broadcast failures no longer crash workers — broadcasting is now
best-effort over telemetry (
Baton.Events). Baton.LLMWorkerstores the step result before recording stats and no longer raises on an unexpectedllm_usagekey, preventing a wasted/repeated LLM call on retry.