Ornaments And Domain Surfaces
An ornament enriches a base description with domain-specific structure.
For metaBuilder the base description is the shared builder shape. A domain builder adds fields for its own vocabulary while keeping the ability to become an ordinary builder program. A service ornament can add a runtime, a port, and a health path. A code-generator ornament can add a compiler identity, a set of defines, and a generated artifact kind.
Refining Data, Not Operations
An ornament refines the data of a description. It does not change the operation alphabet. The shared signature of build-time and runtime operations stays fixed for every builder, ornamented or not. A domain builder still produces a program over the same operations, so every view that understands the base program understands the ornamented one without modification.
This is the discipline that keeps domains from fragmenting the model. New vocabulary enters as new fields, and those fields are lowered into the shared operations by the builder's constructor. The operation alphabet is never extended per domain.
Preserving The Base Shape
The enriched builder still carries the shared pieces. Those pieces are inputs, tools, operations, outputs, and evidence. The common views know how to read exactly those pieces, which is why they keep working across domains.
Adding Domain Meaning
The added fields should be meaningful in the domain. Service protocol, health path, compiler identity, generated artifact kind, and language target are good examples. They let a builder author speak in domain terms without giving up the shared program model.
Surface And Forgetting
The domain surface is what users write. The shared builder shape is what the views understand.
Moving between them is a real, typed map called forgetting. It projects an ornamented builder onto the shared shape by dropping the domain-only fields and keeping the shared pieces. Those shared pieces are inputs, tools, operations, outputs, and evidence. Because the operations live in the shared shape, forgetting preserves them. The program you get from a forgotten spec is the same program the ornamented spec describes. Nothing the build needs is lost by speaking in domain terms.
This forget map is checked, not informal. The projection is certified to land in the base builder type, so an ornamented builder always forgets to a genuine shared builder.
Forgetting recurs later in the pipeline. Materialization carries a working plan state with derived bookkeeping, and the final build plan forgets that bookkeeping while keeping only the outputs and runtime declarations the builder promised. Each stage forgets exactly what the next stage does not need.