Skip to main content

Display Name Rules

Display name rules let a Construction Kit type declare how instances of that type should be labeled for humans. When a rule is defined, the engine computes the read-only system fields rtDisplayName and rtDisplayDescription for every entity on save, so all consumers — GraphQL queries, Refinery Studio lists, MeshBoard entity selectors and pickers — show a consistent, meaningful label without duplicating naming logic in each application.

Display name rules replace the earlier practice of using rtWellKnownName as a human-readable label. rtWellKnownName remains a purely technical identifier (e.g. for blueprint and migration targeting).

Defining Rules​

Two optional type-level properties are available on a Construction Kit type:

PropertyDescription
displayNameRuleRule for computing the entity display name (rtDisplayName)
displayDescriptionRuleRule for computing the entity display description (rtDisplayDescription)

Example

$schema: https://schemas.meshmakers.cloud/construction-kit-elements.schema.json
types:
- typeId: NamedEntity
displayNameRule: "${Name}"
displayDescriptionRule: "${Description}"

Rule Dialect​

A rule is a string template with attribute interpolation:

  • ${attributePath} inserts the value of one of the type's own attributes. Record paths are supported (e.g. ${Contact.LastName}); association navigation is not supported.
  • ?? inside a placeholder coalesces to the first non-empty value: ${Name ?? GlobalId} uses GlobalId when Name is empty.
  • Literal text outside placeholders is kept verbatim.
  • A rule must contain at least one placeholder.

Example combining literals and coalescing

types:
- typeId: Room
displayNameRule: "${RoomNumber} - ${Name ?? GlobalId}"

Inheritance​

Rules are inherited along derivedFromCkTypeId: for an entity, the nearest non-empty rule in the inheritance chain wins. Each rule is resolved independently — a derived type can override displayNameRule while still inheriting displayDescriptionRule from its base type.

Compile-Time Validation​

Rules are validated by the Construction Kit compiler; invalid rules fail the model compile and are reported at the declaring type:

MessageMeaning
67The rule could not be parsed (syntax error, or no placeholder present)
68A placeholder references an attribute path that does not exist on the type

Versioning​

Changing a displayNameRule or displayDescriptionRule is a PATCH-level model change under the Construction Kit versioning rules — no attribute, type, or association contract changes.

Runtime Behavior​

On every save (insert, replace, and smart partial updates) the engine evaluates the effective rules and stores the results in the system fields rtDisplayName and rtDisplayDescription:

  • Both fields are read-only. They are absent from all mutation input types and cannot be set via API or import.
  • When a type has no effective rule, or all referenced attributes are empty, the stored value is null. On the GraphQL read layer, rtDisplayName (non-null in the schema) then returns the fallback <ckTypeId>@<rtId>; rtDisplayDescription stays nullable.
  • Filtering and sorting operate on the stored value, not on the synthesized fallback. Both fields are available as system attribute paths for field filters and sort orders (e.g. attributePath: "rtDisplayName") and appear as query columns.

See Retrieve for query examples.

Backfill on Model Import​

When a Construction Kit model import changes the declared display rules, existing entities of the affected type subtrees are updated by an automatic background sweep. The sweep is durable and retried; its state is tracked in the system collection display_rule_sweep. No manual action is required — labels of existing entities converge to the new rules shortly after the import completes.