Skip to main content

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 run single-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 ⟳ stale badge 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 mutating orun 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 hidden orun 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 the catalog.refresh command-palette command, forces an immediate refresh.
  • Auto-refresh toggle. The catalog.autorefresh command-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. (--all is 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 under metadata.selection.prunedEdges, so the plan faithfully describes what will run. Every plan now carries a metadata.selection block (envs, components, mode, allEnvs).
  • Promotion = in-plan ordering. Environment promotion dependsOn compiles to in-plan DAG ordering when both environments are in the plan — the only enforced promotion mechanism; a failed prerequisite blocks its dependents. A same-plan dependency 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 mutating orun run with 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-run previews 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-snapshot
  • orun catalog refresh --sync
  • orun catalog validate --rebuild-indexes
  • orun 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.
  • --changed flags, CI auto-detection, trigger-driven scoping, and --intent-impact behavior are unchanged.

References​