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:
| key | value |
|---|---|
hook, uses | the failing hook's id and action |
runId, runUrl, conclusion, resumes | the convergence run orun.run/watch@v1 watched |
failedLanes | a JSON array of the jobs that did not pass: name, conclusion, url, step, stepNumber, stepUrl |
failedCount | how 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