ModelSpecification contains schemaVersion, id, metadata, grammar, turtle,
geometry, organs, animation, LOD, and extension data. Static successors remain
plain data. Dynamic production logic is referenced by operationId and resolved
from caller-owned registries.
const spec: ModelSpecification = {
schemaVersion: 1,
id: "my-stem",
grammar: {
alphabet: [{ id: "A" }, { id: "F" }],
axiom: [symbol("A")],
productions: [{ id: "grow", predecessor: "A", successor: [symbol("F"), symbol("A")] }],
},
};
Use extendModelSpecification for immutable group-level deep overrides and
migrateModelSpecification for schema 0 inputs. Never execute registry IDs from
untrusted data without an allow-list.
hashModelSpecification covers every declarative generation group, including
turtle, geometry, organ, animation, LOD, version, and extension data. Inline
callback bodies cannot be portably hashed across JavaScript and Luau, so compiled
callback-backed models receive a process-local cache identity that prevents
unsafe shared-cache aliasing. For network-reconstructible models, prefer static
successors or versioned operationId/predicateId registry entries.