Skip to main content

v2.59.0

Released 2026-09-22. One minor release, two changes, both about the moment a platform build stops.

Binaries and the merged-pull-request list are on the GitHub releases page.

--redo <phase>: a resume places the phase you name again​

Phase state is derived from the tree, never recorded. That is what makes --resume safe, and it is also why a resume could not do the one thing an operator wanted after a failed convergence: the phase had landed — its pull request was merged, every file it places was on main — and then failed to deploy. To the tree that phase was done, so a retried build narrated "already in place from an earlier run" and went on to the next one.

--redo <phase> (repeatable) places the named phase again under --resume, whatever the tree says. It refines a resume rather than adding a fourth selector: on its own it is refused, a phase the blueprint does not declare is refused by name, and a phase a when: condition excludes stays excluded. The doctrine stands — nothing stored decides this; the caller that knows the phase is not done says so.

orun baseline new cirrus --local --out ./acme-cloud --run-hooks --resume --redo 04-workers

The bootstrap driver reads the same request from ORUN_BASELINE_REDO (comma-separated phase names) and appends --redo per phase beside the --resume it always forces. The platform sets it when an operator retries a stopped build from the console.

A redone phase re-places its files as a no-op and runs its hooks again. For the phase to have something to land, the baseline must give it a diff; the cirrus baseline's retouch hook does that by rewriting one marker line in each affected component, which also puts those components back into the convergence run's plan.

A failed phase reports what failed, as fields​

A hook's failure now keeps the outputs the hook had established before it failed (scaffold.HookError), instead of discarding them on the error path. The failed event on the bootstrap-event/v1 stream sets step to the failing hook and carries, in meta:

keyvalue
hook, usesthe failing hook's id and action
runId, runUrl, conclusion, resumesthe convergence run orun.run/watch@v1 watched
failedLanesa JSON array of the jobs that did not pass: name, conclusion, url, step, stepNumber, stepUrl
failedCounthow many

orun.run/watch@v1 records the failed jobs on its outputs as failedLanes and failedCount on both failure branches — the budget spent, and the resume GitHub refused — with each job's page and the first failed step in GitHub's own #step:N:1 anchor grammar. The prose line reads exactly as before, so a reader of the transcript sees nothing change; a console reading the event can now link the component, the environment, the deploy and the step.

meta already crossed the wire as a string map, so no schema changed.

Upgrading​

No intent, plan, or object-model format changed. Install the latest binary and re-run a stopped build with --redo if you want to.

curl -fsSL https://raw.githubusercontent.com/sourceplane/orun/main/install.sh | sh
orun version