Skip to content

v0.41.0 — resumable runs, trace, an honest handshake

Choose a tag to compare

@keparlak keparlak released this 06 Sep 14:17
· 6 commits to main since this release
c829317

A recipe that fails halfway is now a retry, not a cleanup job; one read says where an item is end
to end; and the server's handshake lists what it actually speaks to.

Every run is journaled and resumable

ship and task-finish mutate several providers in sequence. When the third step failed, the
first two had already happened, and running the recipe again from the top did them again — the
concrete case was a second pull request.

Every run now appends one line per event to .baron/runs/<runId>.jsonl (gitignored; init adds
it): the inputs it started with, each answer, each do step with an idempotency key and the result
it bound, its messages, and the error or the end. The run id is reported on success and on failure
— the CLI prints the exact command to continue, the MCP error carries details.run.

baron run --resume <runId> and baron_recipe_run { resume } restore the inputs and answers
(nothing is asked again), replay every completed step from the journal instead of executing it, and
carry on from the step that stopped. A step's key includes its interpolated parameters, so changed
inputs run again; a changed recipe refuses to resume (RUN_RECIPE_CHANGED); a finished or unknown
run is RUN_NOT_FOUND.

Proven live on Baron's own repository: a recipe that created an issue, commented on it and then
opened a pull request from a branch that did not exist stopped at the PR twice and was resumed
twice; GitHub ended up with one issue, one comment and one pull request. Compensation — undoing
what a run that cannot be completed already did — stays deferred until a real case gives it a shape.

trace: where one item is, in one read

issue.trace in a recipe, baron_issue_read op=trace over MCP: the issue, its canonical branch,
the most recent pull request from that branch in any state with its review and checks, the latest
CI runs on the branch, and the most recent deployment whose ref is the branch — composed from the
ports already bound, joined on the branch name the core already derives. A part that could not be
filled is null and named in missing with the reason: the port is not bound, or the item has
not reached that hop. The tool count is unchanged.

The handshake names every provider and recipe

The server's instructions said "Azure DevOps, GitHub, Slack" and five recipes. Both lists are now
built from the registries, and a test pins that every provider and every built-in recipe appears.