A construct changes underneath you

Component types and traits are versioned objects with consumers. What happens when one moves, how to see what adopting a version would change, and why your release was re-cut without you asking.

A ClusterComponentType or ClusterTrait is a construct: the platform's offer to an application. It has a version, it has consumers, and editing it changes every one of them.

Component types, traits and resource types, each with who uses it.

The construct catalog →

The construct catalog: component types, traits and resource types

A release freezes the construct, not a reference to it

This is the fact that explains most surprises here. When a ComponentRelease is cut it embeds the entire component type and trait bodies it resolved against — not a pointer to them.

Two consequences:

note

That is why a build page can list several releases carrying the same digest. They are grouped as "later releases from these same bytes", and each names the construct that moved. bakery-web has eleven on one digest — four within twenty-two seconds, a version going 11.11.1.1.

Seeing what a version would change, before adopting it

Two versions side by side, field by field: what a consumer would gain, lose or have redefined.

Pick a construct, then Compare →

A contract diff between two versions of one construct

This is the question the catalog exists to answer. "Version 2.0.0 is available" is not actionable; "2.0.0 removes the field your component sets and adds a required one" is.

Pins, and the fourth axis

A component can pin a construct version, and a pin can be a range. That matters more than it sounds:

warning

A component pinned to version: "2" is satisfied by 2.0.0. Compared with == it is not, and the catalog once reported "Used by 0" for a construct with real consumers — the page looked healthy and the number was silently wrong.

The trait screenshots in shots-traits.txt exist as the regression detector for exactly that bug.

Which is what these two show. The same trait, two versions, and the count that was once wrong:

otel-instrumentation v1: parameters, per-environment settings, what it expands into, and sixteen components using it

otel-instrumentation v2: the same trait with a  pin in the manifest, and one consumer

And the comparison between them, which is the page that makes a version bump actionable rather than merely announced:

The two versions compared: two breaking changes, graded by contract area rather than by diff

What is behind upstream

Every pinned thing on this platform against what upstream has published.

Upgrade watch →

Upgrade watch: pins against upstream, across four axes

Four axes, and the fourth is the one people forget: container images, Helm charts, language dependencies — and the platform's own constructs. A component type nobody has revisited is as much a pin as an image tag.

note

Construct versioning here is one type deep: forty-two of the forty-three live constructs declare no version at all. That is a real gap and the page reports it as one rather than rendering an empty column that looks fine.