Skip to content
ParaShape

Open surface

Every field in the Schema closure typed string, any, unknown, Record<…>, an index signature, or an array of those — the schema alone does not close what these fields can hold. "What closes it" is copied verbatim from the field's own doc comment on the Rust struct; not stated means the schema carries no written constraint at that field, whatever a caller enforces elsewhere.

32 open-ended fields (type string, any, unknown, Record<…>, an index signature, or an array of those) in the persisted-document closure. 0 carry no class word on their own field doc comment.

fieldtypeclasswhat closes it
ModelJson.titlestringintentintent — content name printed on the artifact, verbatim text (a human types it; nothing evaluates it). Fails validate when empty or over EXPR_MAX_LENGTH characters (validate::model::push_title).
ModelJson.descriptionstringintentintent — what this definition is, verbatim text beside title (a human types it; nothing evaluates it): allowlisted HTML or plain text, read by the catalogue, the configurator and the quote, never by evaluation. On the definition, so no placement overrides it (SketchUp ComponentDefinition#description, AutoCAD block Comments).
BehaviorNode.methodstringintentintent — the catalog behaviors-context method this act invokes.
ComponentNode.keystringidentityidentity — unique in the document's one key namespace, every lane; placeComponent.component names it.
ComponentNode.labelstringintentintent — editor-chrome display name, printed verbatim; absent falls back to key (RecordView.ts: "header = label (or key)").
LayerNode.keystringidentityidentity — unique in the document's one key namespace, every lane.
LayerNode.labelstringintentintent — editor-chrome display name, printed verbatim; absent falls back to key (RecordView.ts: "header = label (or key)").
MaterialNode.keystringidentityidentity — unique in the document's one key namespace, every lane.
MaterialNode.labelstringintentintent — editor-chrome display name, printed verbatim; absent falls back to key (RecordView.ts: "header = label (or key)").
ObjectNode.keystringidentityidentity — unique in the document's one key namespace, every lane, nested children included.
ObjectNode.labelstringintentintent — editor-chrome display text, printed verbatim; absent falls back to key.
ParameterNode.keystringidentityidentity — unique in the document's one key namespace, every lane.
ParameterNode.labelstringintentintent — editor-chrome display text, printed verbatim; absent falls back to key.
PatternNode.keystringidentityidentity — unique in the document's one key namespace, every lane.
PatternNode.labelstringintentintent — editor-chrome display name, printed verbatim; absent falls back to key (RecordView.ts: "header = label (or key)").
ViewNode.keystringidentityidentity — unique in the document's one key namespace, every lane.
ViewNode.labelstringintentintent — editor chrome, printed VERBATIM (not an expression); absent falls back to key (SceneMenu.ts: view.label ?? view.key).
Argument.keystringidentityidentity — the arg's name; meant unique among its owning node's args, but nothing rejects a duplicate — node_args::node_arg_input/ set_node_arg read and write only the FIRST match, silently ignoring any later one.
Argument.inputstringintentintent — an expression string, authored and underivable; may be empty (an unselected file parameter authors nothing, so this arg's min/max/options do not apply).
Argument.minstringintentintent — expression → number, inclusive lower bound.
Argument.maxstringintentintent — expression → number, inclusive upper bound.
Argument.optionsstringintentintent — expression → non-empty array, the arg's whole domain.
Argument.keyframesstringintentintent — expression → [{ time, value }], explicit key pairs on the document's one timeline (USD timeSamples, Blender keyframe_points). Legal ONLY on the value arg of a length/number/angle/integer PARAMETER — the parameter is the clip; any other arg fails loud. The host plays it (engine_animation_set); the engine never samples it.
Argument.visiblestringintentintent — expression → boolean: whether the configurator shows this parameter to the buyer (true = shown, absent = shown; a parameter hidden this way still evaluates and still feeds every expression that reads it). Legal ONLY on the value arg of a PARAMETER — any other arg fails loud. It may read any parameter of the scope, so a parameter can be conditional on another.
PropertyNode.methodstringintentintent — the registry-checked property method.
Environment.skyColorstringintentintent — the sky-fill color; absent = the resolver's default.
Environment.groundColorstringintentintent — the ground-fill color; absent = the resolver's default.
StepNode.labelstringintentintent — editor-chrome display text for this step, printed verbatim; absent falls back to the registry's friendly name for method.
StepNode.methodstringintentintent — the catalog method this step invokes.
PatternStepNode.labelstringintentintent — editor-chrome display text, printed verbatim; absent falls back to the registry's friendly name for method (StepView.ts's renderStep, shared by every step-shaped row, this one included).
EnvironmentHdri.parameterstringintentintent — the KEY of a url-method parameter (checked at validate).
EnvironmentHdri.urlstringintentintent — a direct https:/data: address.
📖 4 min read