v2.15.0
Release notes for orun v2.15.0.
This release retires the last legacy persistence stack: the content-addressed
object model is now the single store for everything orun records on disk. It
also lands catalog auto-refresh in the cockpit, so the live component view
keeps its catalog current on its own, and adds an explicit environment-selection
model — --all-envs, self-contained scoped plans, and a fail-closed orun run.
Highlights
- One persistence stack. The legacy revision/catalog store
(
internal/catalogstore,internal/statestore,internal/revision,internal/executionstate,internal/catalogsync) has been deleted. Every source snapshot, catalog, revision, execution, job, step, and log now lives in the content-addressed object model under.orun/objectmodel/. A lint gate bans the retired imports repo-wide. orun runsingle-writes the object graph. The old dual-write — the runner mirroring each tick into a separate legacy revision/execution layout — is gone. There is exactly one write path and one source of truth.- Cockpit catalog auto-refresh. The cockpit refreshes the object-model catalog
when it opens, exposes a manual refresh and an auto-refresh toggle, and shows a
⟳ stalebadge when what it is showing has drifted from the working tree. - Environment selection. Explicit
--all-envs, self-contained scoped plans (dangling edges pruned + surfaced), in-plan promotion ordering, and a fail-closed mutatingorun run.
One persistence stack
orun records its history as a content-addressed object graph under
.orun/objectmodel/: immutable, hash-named objects/ (the source → catalog →
revision → execution → job → step nodes, plus log blobs) and a small mutable
refs/ layer of named pointers (catalogs/current, revisions/latest,
executions/latest, executions/by-id/<id>, sources/*). Identical content is
stored once and shared, so re-recording an unchanged workspace is a cheap ref
move rather than a rewrite.
Every read command — orun status, orun logs, orun describe, orun get, and
every orun catalog * subcommand — now resolves through this graph. The
State model page documents the layout in full.
What this means in practice:
- There is no longer a
.orun/plans/or.orun/executions/directory, no revision-first.orun/revisions/<key>/...tree, and no compatibility mirror. orun state(including the hiddenorun state migrate) has been removed — it migrated into the retired layout and no longer has a target.
Cockpit: catalog auto-refresh
The cockpit Browse view reads the object-model catalog. It now keeps that catalog
fresh itself instead of relying on an external orun plan/run/catalog refresh
having run:
- Refresh on open. Opening the cockpit resolves and persists a current catalog (even for a dirty tree), so you start on an up-to-date view.
- Manual refresh.
ctrl+r, or thecatalog.refreshcommand-palette command, forces an immediate refresh. - Auto-refresh toggle. The
catalog.autorefreshcommand-palette command enables periodic refresh on the live-view ticker; the choice is persisted in~/.orun/cockpit.json(autoRefresh, default off) so a dirty tree does not re-resolve on every edit unless you opt in. - Stale badge. When the loaded catalog no longer matches the current source,
the header shows a
⟳ stale (⌃r)pill prompting a refresh.
A single shared internal/catalogrefresh engine backs both the CLI resolve path
and the cockpit, so both produce the same content-addressed catalog id — no
churn when you switch between them. A non-blocking advisory lock keeps a
concurrent CLI orun catalog refresh and the cockpit from both running the
expensive resolve.
Resume carries step logs forward
Cross-run resume (--exec-id) skips jobs that already succeeded in a prior run.
Those skipped jobs now carry their prior step logs into the new sealed
execution, so a resumed run's logs are complete — inspecting a cached job shows
its output, not an empty record.
Environment selection and the fail-closed run
orun plan/run gain an explicit environment-selection model (the "Z" model):
--all-envs. Compile/run every environment explicitly — the self-documenting form of the default. Mutually exclusive with--env, which reads a comma-separated list. (--allis unrelated: it disables CWD-based component scoping.)- Self-contained scoped plans. When you narrow a plan (
--env/--component), dependency or promotion edges pointing at environments/components you left out are pruned with a warning and recorded undermetadata.selection.prunedEdges, so the plan faithfully describes what will run. Every plan now carries ametadata.selectionblock (envs,components,mode,allEnvs). - Promotion = in-plan ordering. Environment promotion
dependsOncompiles to in-plan DAG ordering when both environments are in the plan — the only enforced promotion mechanism; a failed prerequisite blocks its dependents. Asame-plandependency on an environment left out of a scoped plan is now pruned (earlier releases errored). Cross-plan gates are recorded but advisory (cross-pipeline gating is a separate, future change). - Fail-closed
run(deprecation). A mutatingorun runwith no environment/component selection now warns that it will soon require an explicit selection or--all-envs; for now it proceeds (running all environments).--dry-runpreviews and saved-plan/component runs are exempt. A future release turns the warning into a hard error.
See Environment promotion and the
orun plan / orun run references.
CLI changes
Removed (legacy-store plumbing with no object-model meaning):
orun plan --catalog-source/--catalog-snapshotorun catalog refresh --syncorun catalog validate --rebuild-indexesorun state/orun state migrate
Added on orun plan:
--no-catalog-refresh— skip the pre-plan catalog refresh; plan without catalog context.--catalog-strict— fail the plan on catalog resolution errors.
Added on orun plan and orun run:
--all-envs— compile/run all environments explicitly; mutually exclusive with--env(now a comma-separated list).
The orun catalog selector flags (--source / --catalog-source,
--catalog-snapshot) are unchanged; they now resolve against object-model refs.
Compatibility
- The object model is the same store the catalog and executions have used since the v2.10–v2.14 line; this release removes the parallel legacy copy, it does not change the object model's format. Catalogs and executions written by recent releases remain readable.
- Workspaces still carrying a pre-retirement
.orun/plans/or.orun/executions/tree are simply ignored — orun neither reads nor writes those paths. They can be deleted once you no longer need the historical files; orun will not migrate them. --changedflags, CI auto-detection, trigger-driven scoping, and--intent-impactbehavior are unchanged.
References
- State model — the object-model layout on disk.
orun catalog— the catalog command group.orun tui— the cockpit, including catalog refresh keys.- Cockpit overview — the live component view.