v2.16.0
Release notes for orun v2.16.0.
This release grows the component catalog into a service catalog: a typed,
multi-kind entity model (orun.io/v1) with ownership provenance, a unified
relation graph, first-class Compositions, and a live deployment plane — all
derived from the same declarative sources orun already compiles. Everything is
additive and non-destructive: existing catalogs up-convert transparently on
read, and a new advisory orun catalog migrate command shows each component's
path to the richer model.
Highlights
- A multi-kind entity model. The catalog no longer tracks only components.
It resolves a graph of typed entities — Component, API, Resource, System,
Domain, Group, Environment, Composition — each carried in a shared
orun.io/v1envelope (metadata,ownership,lifecycle,spec,relations,contracts,integrations,docs,links,provenance,extensions).orun catalog list --kind System(or any other kind) enumerates them. - Ownership with provenance. When a component authors no owner, the resolver
derives one from
CODEOWNERS(last matching rule wins) and records where the answer came from (ownership.source: authored | CODEOWNERS | inherited). Owners are typed refs (group:<name>,user:<name>), andcatalog listgrows OWNER and SYSTEM columns. - One typed relation graph. The resolver emits a single
relations.jsoncontaining every typed edge in the catalog —dependsOn,partOf,ownedBy,providesApi,consumesApi,runsOn,deployedTo,composedBy— with inverses materialized on read. The change-detection engine consumes the same graph, so "what depends on this?" and "what should this PR run?" are answers to the same question. - Compositions are catalog entities. A composition now carries a semver
versionand alifecycle.stage(stable | beta | deprecated), appears in the catalog withcomposes/usedByrelations to the components on its golden path, and can declareeffects— the integrations, deployments, resources, and APIs that running it contributes to the graph. - A derived live plane.
orun catalog describeappends live deployments and latest executions, projected on read from execution history — never persisted into catalog blobs, never stale relative to the runs that produced them. - A Catalog surface in the cockpit. The TUI gains a third top-level surface
(key
3): a multi-kind entity explorer with kind tabs and per-kind counts, envelope-aware columns (owner, lifecycle stage, version, member counts), and a walkable typed-relation graph with breadcrumbs. - Adopt at your own pace.
orun catalog migrateis a read-only lint that reports, per component, what keeps it from being a first-class v1 entity. Oldv1alpha1snapshots stay byte-identical on disk and up-convert on read.
The v1 entity model
Every catalog entity — authored or derived — now resolves into the same
envelope. For a component, orun catalog describe <name> renders it in full:
identity and lifecycle, ownership (with its source), environments, dependencies,
provided/consumed APIs, resources, integrations, vendor extensions, inferred
runtime, live deployments, and resolution provenance. --json emits the
machine-readable envelope.
Derived kinds are first-class reads, not separate stores:
orun catalog list # components (unchanged default)
orun catalog list --kind System # systems, with member counts
orun catalog list --kind Environment # environments as entities
orun catalog list --kind Composition # golden paths in the catalog
Derived entities (System, Domain, Group) carry their member set
(spec.members) and a MEMBERS count in list output, so "what belongs to this
system?" is a single read rather than a reverse graph walk.
Entity keys are unified across kinds — <namespace>/<repo>/<name> for
component-like kinds, group:<name> / user:<name> for owners. The legacy
Owner kind is read as Group.
Ownership from CODEOWNERS
Authored spec.owner always wins. When it is absent, the resolver reads the
workspace CODEOWNERS file and assigns the last matching rule's owner, recorded
as ownership.source: CODEOWNERS. Ownership flows through every catalog build
path (refresh, plan, pre-run), so the computed catalog — and its
content-addressed identity — is the same no matter which command produced it.
Composition effects: the golden path feeds the graph
Authored compositions may declare what running them contributes:
spec:
version: 2.3.0
lifecycle: stable
effects:
integrations:
cloudflare:
product: workers
provides:
- default/orun/cloudflare-edge # Resource entities
exposes:
- default/orun/edge-http-api # API entities
scorecards:
satisfies:
- has-deploy-pipeline
The resolver folds these declarations into the relation graph and the derived entities: a component on the golden path gets its platform integrations, its provided Resources, and its exposed APIs linked into the catalog without authoring them by hand. Effects are authored intent; the live plane records what actually happened.
Pinned-but-deprecated composition versions surface a deprecation warning at resolve time, so golden-path upgrades are visible where they matter — in the plan, not in a wiki.
Cockpit: the Catalog surface
The cockpit grows a Catalog mode alongside Browse and Activity — press 3,
tab-cycle, or run the goto.catalog palette command. Where Browse is the
work surface (components you compose and run), Catalog is the knowledge
surface:
- Kind tabs with counts —
[/]cycle the kinds present in the catalog; theAlltab mixes kinds with a glyph per row. - Envelope columns per kind — Components lead with OWNER and lifecycle STAGE; Compositions show VERSION and stage; derived kinds show member counts.
- A walkable graph —
⏎opens an entity's envelope and its Connections: members and typed relation edges (◂marks incoming edges), each navigable, with the breadcrumb tracking your path. - Same freshness model as Browse — the surface reads
catalogs/currentand shows the⟳ stale (⌃r)badge when a refresh would change it.
Browse itself is enriched with envelope ownership and lifecycle on the
catalog-served path. See the cockpit overview and
orun tui.
Migration: transparent, advisory, never destructive
- Reads are version-blind. Every read command (
catalog list,describe,tree,history,diff, the cockpit) operates on oldv1alpha1and newv1catalogs alike. Immutable snapshots keep their original bytes on disk forever; up-conversion happens in memory, on read. orun catalog migratelints authoredcomponent.yamlfiles for v1 readiness — a legacyapiVersion, a missing owner (none authored and no CODEOWNERS match), a missinglifecyclestage, a missingsystem— and prints per-file findings plus a ready count. It never rewrites files.--jsonemits the structured result for CI.- Catalog ids move once. The resolver version advanced (now 14) to cover the new model; the first resolve after upgrading is a cache miss that re-stabilizes immediately, exactly as with prior resolve-shape changes.
CLI changes
Added:
orun catalog migrate— read-only v1-readiness lint (--json).orun catalog list --kind <API|Resource|System|Domain|Group|Environment|Composition>— enumerate derived entities; OWNER, SYSTEM, and MEMBERS columns.orun catalog describe— renders the full v1 envelope including integrations, extensions, inferred runtime, live deployments, and provenance; accepts bare names or fully-qualifiednamespace/repo/namekeys (ambiguous bare names exit4with candidates).
Unchanged: the default orun catalog list output shape, all source
selectors (--source, --catalog-snapshot), and the affected engine's CLI
surface.
Compatibility
- No breaking changes. Existing
component.yamlfiles resolve as before; the richer authoring surface (system,lifecycle,integrations,links,docs,extensions) is opt-in. - Vendor extension blocks must be namespaced (
x-<vendor>); namespaced blocks are preserved verbatim through the resolver, and registered extension schemas are validated on round-trip. - The examples workspace dogfoods the model end to end: a
CODEOWNERSfile, an enrichedapps/api-edgecomponent, and compositions carryingversion,lifecycle, andeffects.
Also in this release
- The orun-work design epic (
specs/orun-work/) — a work plane whose task states derive from delivery truth (PR → in review, merge + gates → done, production deployment → released) — is published as a design document. It builds on the typed relation graph introduced here and is gated to a future release.
References
- Service catalog — the entity model, the relation graph, and the live plane.
orun catalog— the catalog command group, includingmigrateand--kind.- Compositions — golden paths, versioning, and effects.
- State model — where entities live in the content-addressed object model.