<!-- GENERATED FILE: do not edit by hand. --> <!-- Regenerate with npm run gen-docs. -->
Sources: packages/ecs/src/index.ts:COMPONENT_TYPE_DEFINITIONS, packages/ecs/src/index.ts:ComponentSchema, server/src/modules/runtime/capabilities/packs.ts:runtimeCapabilityPacks, web_client/spa/src/views/build/component-palette/taxonomy.ts:PALETTE_TAXONOMY.
Component Type Definitions
This is the canonical generated inventory for the v1 built-in ECS component set. Current engine capability sections may name these component types as shipped ECS components. Other component names must be explicitly marked roadmap-only, stripped-pattern history, or project-defined data.
Current built-in component count: 26. Current canonical component field count: 513.
Component catalog contract hash: sha256:aef9bd36d45d01f2845f09d64173f2ad1e690d79b1fb81194e0e3c22e178ae57. Component field contract version: ecs.component-field-contract.v1. Component field contract hash: sha256:a47f935d314b7b69edb176fa305be51b048f3ff076a5ba1765017e2f7e20e897.
All current built-in components are atomic engine components under ADR 0020. Gameplay patterns such as health, damage, spawn pools, collectors, and motion helpers are script patterns, not ECS atomics.
Inventory
| Component | Category | Class | Palette visibility | Palette notes | Default key | Contract version | Packs | Runtime systems | Runtime consumer | Renderer consumer | Replication |
|---|---|---|---|---|---|---|---|---|---|---|---|
AnimationStateComponent | Rendering | atomic | default | Atomic renderer state. | component.animation_state | component.animation_state.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
AudioEmitterComponent | Audio | atomic | default | Atomic audio primitive. | component.audio_emitter | component.audio_emitter.contract.v1 | audio.v1 | None | projected | consumed | public/low |
CameraComponent | Rendering | atomic | default | Atomic camera primitive. | component.camera | component.camera.contract.v1 | camera.v1 | None | projected | consumed | public/medium |
CharacterMovementComponent | Physics | atomic | default | Runtime movement behavior; structural hierarchy is projected from entity fields, not a component. | component.character_movement | component.character_movement.contract.v1 | None | None | consumed | not_applicable | None |
ColliderComponent | Physics | atomic | default | Atomic physics primitive. | component.collider | component.collider.contract.v1 | physics.v1 | runtime.physicsSystem, runtime.collisionSystem | consumed | not_applicable | public/medium |
DecalComponent | Rendering | atomic | default | Renderer presentation component; this contract covers existing metadata/projection without adding decal feature depth. | component.decal | component.decal.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
ForceComponent | Physics | atomic | hidden | Internal Runtime queue; use ctx.physics.command(entityId, bodyCommand). | component.force | component.force.contract.v1 | physics.v1 | runtime.physicsSystem, runtime.collisionSystem | internal | not_applicable | server/medium |
HairComponent | Rendering | atomic | default | Single creator-facing hair surface; groom data and binding artifacts live on versioned hair assets. | component.hair | component.hair.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
InputProfileComponent | Input | atomic | default | One canonical InputProfileComponent; transient UI contexts remain client-local. | component.input_profile | component.input_profile.contract.v1 | input.v1 | runtime.movementLivenessSystem, runtime.movementSystem, runtime.actionSystem | consumed | not_applicable | owner/high/reliable |
LightComponent | Rendering | atomic | default | Atomic rendering primitive. | component.light | component.light.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
LocalEnvironmentVolumeComponent | Rendering | atomic | default | Renderer environment-override primitive (ADR 0178); equal-priority overlaps are warned and resolve deterministically by entity id. | component.local_environment_volume | component.local_environment_volume.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
MaterialInstanceOverrideComponent | Rendering | atomic | default | Atomic renderer state. | component.material_override | component.material_override.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
NavAgentComponent | Physics | atomic | default | Runtime navigation behavior; the nav system steers the agent via the existing mover (no second mover) over the recast navmesh resource (no navmesh-as-component). | component.nav_agent | component.nav_agent.contract.v1 | world.v1 | None | consumed | not_applicable | public/medium |
NetworkProfileComponent | Physics | atomic | default | Netcode presentation intent for replicated motion; the runtime interpolation buffer reads this profile (no second mover). | component.network_profile | component.network_profile.contract.v1 | None | None | consumed | not_applicable | None |
ParticleEmitterComponent | Rendering | atomic | default | Default by creator expectation; particles are built-in in comparable creator engines. | component.particle_emitter | component.particle_emitter.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
ReflectionProbeComponent | Rendering | atomic | default | Renderer presentation primitive with explicit runtime/renderer projection status. | component.reflection_probe | component.reflection_probe.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
RenderableComponent | Rendering | atomic | default | Atomic rendering primitive. | component.renderable | component.renderable.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
RigidBodyComponent | Physics | atomic | default | Atomic physics primitive. | component.rigid_body | component.rigid_body.contract.v1 | physics.v1 | runtime.physicsSystem, runtime.collisionSystem | consumed | not_applicable | public/medium |
ScriptComponent | Scripting | atomic | default | Atomic behavior attachment. | component.script | component.script.contract.v1 | script.v1 | runtime.scriptSystem, runtime.componentPatchSystem, runtime.observerCommandSystem | consumed | not_applicable | server/low |
SpatialCaptureComponent | Rendering | atomic | default | Semantic placement primitive for imported captures; renderability is separate from playability proof. | component.spatial_capture | component.spatial_capture.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
TerrainComponent | Rendering | atomic | default | Renderer presentation component; this contract covers existing metadata/projection without adding terrain feature depth. | component.terrain | component.terrain.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
TextRenderableComponent | Rendering | atomic | default | Renderer presentation component: canonical MSDF text (shared per-family atlas, resolution-independent at any distance) with render-budget proof. | component.text_renderable | component.text_renderable.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
TimerComponent | Runtime | atomic | default | Atomic runtime event source. | component.timer | component.timer.contract.v1 | timer.v1 | runtime.timerSystem | consumed | not_applicable | public/low |
TransformComponent | Spatial | atomic | default | Atomic spatial primitive. | component.transform | component.transform.contract.v1 | hierarchy.v1 | runtime.hierarchyTransformSystem | projected | not_applicable | public/high/reliable |
VelocityComponent | Physics | atomic | default | Atomic physics state. | component.velocity | component.velocity.contract.v1 | physics.v1 | runtime.physicsSystem, runtime.collisionSystem | consumed | not_applicable | public/medium |
WaterComponent | Rendering | atomic | default | Renderer presentation component; this contract covers existing metadata/projection without adding water feature depth. | component.water | component.water.contract.v1 | rendering.v1 | None | projected | consumed | public/low |
Removed Component Contracts
| Component | Contract version | Removed in | Replacement | Migration class | Contract hash |
|---|---|---|---|---|---|
StateMachineComponent | component.state_machine.removed.v1 | v1.0.1 | ScriptComponent | manual | sha256:81345b3703cb0f142082b2d4856aa94a716e63c79ddd89cb31f48c2405781b3d |
HierarchyComponent | component.hierarchy.removed.v1 | v1.0.1 | None | safe_auto | sha256:ff64b237d916282efd0a1ed734fb7b253db699469bde253199051ab8e64cd74c |
InputActionDeclarationComponent | component.InputActionDeclarationComponent.removed.v1 | v1.0.1 | InputProfileComponent | safe_auto | sha256:b1b0e7f08edd7bf2401b705673307e5282e68c443d0dfcc3ca29d7cdad16396e |
InputBindingSetComponent | component.InputBindingSetComponent.removed.v1 | v1.0.1 | InputProfileComponent | safe_auto | sha256:881661044da03c69100dbbdfbf253d3c208ebf16c6483bce6b27042f49848fe5 |
InputContextStackComponent | component.InputContextStackComponent.removed.v1 | v1.0.1 | InputProfileComponent | safe_auto | sha256:080e867e1cbdbfcb763797f871049a0373f59e07088faac2c0ee9b216093f768 |
Recently Stripped Pattern Components
ActionSourceComponent, BoundsComponent, CameraTargetComponent, CollectibleComponent, CollectorComponent, CollisionConsumeComponent, DamageEventComponent, DamageModifierComponent, DamageOnContactComponent, GravityComponent, GridAlignmentComponent, HealthComponent, HitscanWeaponComponent, InputAccessibilityProfileComponent, InputFeedbackComponent, InteractableComponent, JointComponent, MotionComponent, PlayerControllerComponent, ProjectileComponent, RespawnTimerComponent, SpawnPoolComponent, SplitActionComponent, StatsComponent, WeaponSlotComponent
Roadmap Components
These names are not current ECS components and may appear only in explicit roadmap sections.
AudioListenerComponent, BillboardComponent, NetworkVisibilityComponent, UIPanelLifecycleComponent
AnimationStateComponent
Declarative animation clip state scripts can mutate; renderers may map it onto clip playback and blending.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Atomic renderer state. |
| Default component key | component.animation_state |
| Contract version | component.animation_state.contract.v1 |
| Contract hash | sha256:3229c5b7e62c38aeebb27810c7f18a686a557cf5bd8d15586d777f7bbf7e6ef8 |
| Field contract hash | sha256:a151b17ae0445b593703cfb7168b86c8e1fbf17e78e85fe51dfa7b21f07c5fee |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | clipKey, playMode, speed, startTime |
| Canonical field count | 5 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
clipKey | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | maxLength: 160<br>semantic: intra_asset_key |
playMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: loop, once, ping-pong |
speed | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | |
startTime | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "AnimationStateComponent",
"clipKey": "idle",
"playMode": "loop",
"startTime": 0,
"speed": 1
}
AudioEmitterComponent
Presentation primitive for positional and non-positional audio playback from an audio asset key.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Audio |
| Component palette visibility | default |
| Component palette notes | Atomic audio primitive. |
| Default component key | component.audio_emitter |
| Contract version | component.audio_emitter.contract.v1 |
| Contract hash | sha256:c1decf7e0d84db5eda4c74e27305e34de2290ee1b9a59f6283d04c414b9f764d |
| Field contract hash | sha256:85d34b8a6f459401a65a3d98a3d8f9ff00edbefa6f506b4860d729b88c5e1c15 |
| Migration class | none |
| Capability packs | audio.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | enabled, loop, maxDistance, pitch, playOnStart, soundAssetId, spatial, targetEntityId, volume |
| Canonical field count | 10 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
loop | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
maxDistance | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
pitch | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
playOnStart | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
soundAssetId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id audio |
spatial | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
targetEntityId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | minLength: 1<br>semantic: entity_id<br>ref: entity id |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. | |
volume | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
Defaults:
{
"type": "AudioEmitterComponent",
"volume": 1,
"pitch": 1,
"loop": false,
"spatial": true,
"maxDistance": 32,
"playOnStart": false,
"enabled": false
}
CameraComponent
Attach to an entity with Transform to make it a viewpoint players see through. The highest-priority active camera is used in Play mode. Follow target drives position; Look at target drives rotation while set.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Atomic camera primitive. |
| Default component key | component.camera |
| Contract version | component.camera.contract.v1 |
| Contract hash | sha256:d3994699126ed0c4e4e44b6c847cbaa1a8abde442900ce8f98309c9147d398d8 |
| Field contract hash | sha256:1d64637992e33e370714724bdc320d01a3ed39f0b58596a2b70bcad3cb4a63b8 |
| Migration class | none |
| Capability packs | camera.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/medium |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | active, clearColor, clearMode, exposure, far, followEntityId, followOffset, followSmoothing, fov, lookAtEntityId, lookAtOffset, near, orthoSize, postProcessing, preserveEnvironmentLighting, priority, projection, toneMapping |
| Canonical field count | 35 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
active | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
clearColor | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
clearMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: color, skybox, none |
exposure | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 10 |
far | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
followEntityId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | minLength: 1<br>semantic: entity_id<br>ref: entity id |
followOffset | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
followOffset.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
followOffset.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
followOffset.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
followSmoothing | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
fov | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 1<br>max: 170 |
lookAtEntityId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | minLength: 1<br>semantic: entity_id<br>ref: entity id |
lookAtOffset | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
lookAtOffset.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
lookAtOffset.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
lookAtOffset.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
near | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
orthoSize | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
postProcessing | object | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
postProcessing.depthOfField | object | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
postProcessing.depthOfField.bokehScale | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 4 |
postProcessing.depthOfField.focalLength | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.001<br>max: 128 |
postProcessing.depthOfField.focusDistance | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.001<br>max: 1000 |
postProcessing.depthOfField.mode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: off, auto, on |
postProcessing.depthOfField.quality | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: low, medium, high |
postProcessing.motionBlur | object | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
postProcessing.motionBlur.mode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: off, auto, on |
postProcessing.motionBlur.quality | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: low, medium, high |
postProcessing.motionBlur.samples | integer | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 2<br>max: 32 |
preserveEnvironmentLighting | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
priority | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: -9007199254740991<br>max: 9007199254740991 |
projection | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: perspective, orthographic |
toneMapping | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: aces, agx, reinhard, neutral, linear |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "CameraComponent",
"fov": 60,
"near": 0.1,
"far": 2000,
"projection": "perspective",
"orthoSize": 10,
"active": true,
"priority": 10,
"followOffset": {
"x": 0,
"y": 6,
"z": 10
},
"followSmoothing": 0.15,
"lookAtOffset": {
"x": 0,
"y": 0,
"z": 0
},
"clearMode": "skybox",
"clearColor": "#0b1020",
"preserveEnvironmentLighting": false
}
CharacterMovementComponent
Authored config for the shared kinematic character controller: horizontal speed cap plus the deterministic vertical motor (gravity/jump/ground). The explicit KCC-governance flag opts an entity into predicted kinematic movement.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Physics |
| Component palette visibility | default |
| Component palette notes | Runtime movement behavior; structural hierarchy is projected from entity fields, not a component. |
| Default component key | component.character_movement |
| Contract version | component.character_movement.contract.v1 |
| Contract hash | sha256:56a467ca0ae57fed9db6628d932953495a54b7ddea047f5ebe00c7712dec542d |
| Field contract hash | sha256:c620479fcc21e2006fa5ca4aad71128aef7d2036a160e39d6c008de0da8a0eb1 |
| Migration class | none |
| Capability packs | None |
| Runtime systems | None |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | None |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | enableKcc, gravity, groundY, jumpSpeed, maxSpeed |
| Canonical field count | 6 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
enableKcc | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
gravity | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0 |
groundY | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | |
jumpSpeed | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0 |
maxSpeed | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0 |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "CharacterMovementComponent",
"enableKcc": false
}
ColliderComponent
Passive server-owned shape for blocking active movers, physics contacts, triggers, placement diagnostics, and physics queries.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Physics |
| Component palette visibility | default |
| Component palette notes | Atomic physics primitive. |
| Default component key | component.collider |
| Contract version | component.collider.contract.v1 |
| Contract hash | sha256:21cb742598cb36f3f213f5e89df6e12047db121cdfaa5e4a41195a6646c1f325 |
| Field contract hash | sha256:28a7fe494ae7e2994751c50f56946bcf74c68e2496fca52da16186f1c498192a |
| Migration class | none |
| Capability packs | physics.v1 |
| Runtime systems | runtime.physicsSystem, runtime.collisionSystem |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | public/medium |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | collision, friction, layers, restitution, shape, size |
| Canonical field count | 11 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
collision | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: solid, trigger, none |
friction | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0<br>max: 1 |
layers | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
layers[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | minLength: 1<br>maxLength: 80 |
restitution | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0<br>max: 1 |
shape | string|object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/union | enum: box, sphere, capsule, disc, mesh |
size | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/vec3 | |
size.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
size.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
size.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "ColliderComponent",
"shape": "sphere",
"size": {
"x": 1,
"y": 1,
"z": 1
},
"collision": "solid",
"layers": [
"default"
],
"friction": 0.5,
"restitution": 0
}
DecalComponent
Surface-layer projection primitive for markings, scuffs, and signs.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Renderer presentation component; this contract covers existing metadata/projection without adding decal feature depth. |
| Default component key | component.decal |
| Contract version | component.decal.contract.v1 |
| Contract hash | sha256:9cbc8174759ea9573a3f16f68c88c4f923f63545b10cb17add4dad2dd8d8cac2 |
| Field contract hash | sha256:7635e372bbaf7fe52f97f20a7c7b1f088c1ee7e9d6a0a9be68c4203dcb94ddff |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | atlasSlot, blendMode, color, enabled, opacity, projectionBox, projectionDepth, textureAssetId |
| Canonical field count | 16 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
atlasSlot | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
atlasSlot.height | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.001<br>max: 1 |
atlasSlot.u | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
atlasSlot.v | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
atlasSlot.width | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.001<br>max: 1 |
blendMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: blend, multiply, add |
color | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
opacity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
projectionBox | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
projectionBox.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
projectionBox.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
projectionBox.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
projectionDepth | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
textureAssetId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id texture |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "DecalComponent",
"enabled": true,
"projectionBox": {
"x": 1,
"y": 1,
"z": 0.1
},
"color": "#ffffff",
"opacity": 1,
"projectionDepth": 0.1,
"blendMode": "blend",
"atlasSlot": {
"u": 0,
"v": 0,
"width": 1,
"height": 1
}
}
ForceComponent
Private per-tick physics mutation queue consumed and cleared by the physics system.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Physics |
| Component palette visibility | hidden |
| Component palette notes | Internal Runtime queue; use ctx.physics.command(entityId, bodyCommand). |
| Default component key | component.force |
| Contract version | component.force.contract.v1 |
| Contract hash | sha256:f2a0a2ada8a1c30af9b3e20451fb2834febef0252bd8ee35381c7715f331498d |
| Field contract hash | sha256:b31a9f3f4023638b18cf840dbf3681e4097f12ed65c3a5b6cbf1b2ce7daa0a2f |
| Migration class | none |
| Capability packs | physics.v1 |
| Runtime systems | runtime.physicsSystem, runtime.collisionSystem |
| Runtime consumer status | internal |
| Renderer consumer status | not_applicable |
| Consumer status reason | Internal engine queue consumed by runtime systems. |
| Replication policy | server/medium |
| Authorization | Internal Runtime physics command queue; scripts request body mutations through ctx.physics.command. |
| Inspector fields | pending |
| Canonical field count | 59 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
pending | array | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[] | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].applyAtPoint | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].applyAtPoint.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].applyAtPoint.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].applyAtPoint.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].force | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].force.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].force.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].force.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].impulse | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].impulse.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].impulse.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].impulse.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.angularVelocity | object | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.angularVelocity.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.angularVelocity.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.angularVelocity.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.position | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.position.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.position.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.position.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.rotation | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.rotation.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.rotation.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.rotation.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.velocity | object | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.velocity.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.velocity.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.velocity.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].reset.wake | boolean | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.angularVelocity | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.angularVelocity.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.angularVelocity.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.angularVelocity.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.position | object | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.position.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.position.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.position.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.rotation | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.rotation.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.rotation.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.rotation.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.velocity | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.velocity.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.velocity.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.velocity.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].teleport.wake | boolean | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].torque | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].torque.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].torque.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].torque.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].torqueImpulse | object | no | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].torqueImpulse.x | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].torqueImpulse.y | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
pending[].torqueImpulse.z | number | yes | hidden | hidden | hidden | hidden | hidden | exposed | internal | not_applicable | hidden: Internal engine component not shown in normal inspector authoring. | |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | internal | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "ForceComponent",
"pending": []
}
HairComponent
Places a canonical hair groom asset on an entity with bounded render, simulation, LOD, binding, and budget overrides.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Single creator-facing hair surface; groom data and binding artifacts live on versioned hair assets. |
| Default component key | component.hair |
| Contract version | component.hair.contract.v1 |
| Contract hash | sha256:8c4ed7a5eb82741a94b0a967afb6379f2ca03b091e62f6df546530f3976db9c5 |
| Field contract hash | sha256:7f345707f3c92ef764d0ed844d1c8330932e81817c58d80c9f8eb1582e4ccd40 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | bindingKey, budget, enabled, groomAssetId, materialOverrides, render, simulation, targetEntityId |
| Canonical field count | 31 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
bindingKey | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | minLength: 1<br>maxLength: 240<br>semantic: resource_option_key<br>options: groomAssetId → rendering.hairGroom.bindings.bindingKey |
budget | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
budget.maxDistance | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01<br>max: 100000 |
budget.maxGpuBytes | integer | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 1<br>max: 536870912 |
budget.maxSimGuides | integer | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1000000 |
budget.maxVisibleStrands | integer | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 10000000 |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
groomAssetId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id hair |
materialOverrides | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
materialOverrides.anisotropy | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
materialOverrides.baseColor | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
materialOverrides.melanin | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
materialOverrides.roughness | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.2<br>max: 1 |
render | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
render.density | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
render.hairlineGapDeg | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 288 |
render.length | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.2<br>max: 2 |
render.lodBias | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: -4<br>max: 4 |
render.representation | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: auto, cards, strands, ribbons |
render.shadowMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: off, auto |
render.taper | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.05<br>max: 1 |
render.widthScale | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01<br>max: 10 |
simulation | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
simulation.collision | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: none, floor |
simulation.damping | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
simulation.gravity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: -100<br>max: 100 |
simulation.mode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: none, procedural |
simulation.stiffness | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
simulation.windInfluence | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
targetEntityId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | minLength: 1<br>semantic: entity_id<br>ref: entity id |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "HairComponent",
"enabled": false,
"materialOverrides": {},
"render": {
"representation": "auto",
"shadowMode": "auto",
"density": 1,
"widthScale": 1,
"lodBias": 0,
"length": 0.95,
"taper": 0.28,
"hairlineGapDeg": 0
},
"simulation": {
"mode": "none",
"stiffness": 0.65,
"damping": 0.35,
"gravity": -9.8,
"windInfluence": 0.15,
"collision": "none"
},
"budget": {}
}
InputProfileComponent
One canonical input contract: action declarations, policy, prediction, and physical bindings nested under each action.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Input |
| Component palette visibility | default |
| Component palette notes | One canonical InputProfileComponent; transient UI contexts remain client-local. |
| Default component key | component.input_profile |
| Contract version | component.input_profile.contract.v1 |
| Contract hash | sha256:4d405894dc8ed8c1c593a14434a1f8c5cf38360a7decf7c13110a6fc4deae67b |
| Field contract hash | sha256:30b43a7d620288de6cc735e28a68a7b252c8da799635fd85988d50739f03c72d |
| Migration class | none |
| Capability packs | input.v1 |
| Runtime systems | runtime.movementLivenessSystem, runtime.movementSystem, runtime.actionSystem |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | owner/high/reliable |
| Authorization | Owner-private input state; server validates the canonical profile version before command routing. |
| Inspector fields | actions, version |
| Canonical field count | 99 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
actions | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[] | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[] | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[].id | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | minLength: 1<br>maxLength: 160 |
actions[].bindings[].priority | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: -9007199254740991<br>max: 9007199254740991 |
actions[].bindings[].processors | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[].processors[] | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[].processors[].kind | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: deadzone, curve, invert, sensitivity, clamp, normalize, axisComposition, stickComposition, threshold, quantize |
actions[].bindings[].processors[].parameters | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/map | |
actions[].bindings[].processors[].parameters.axes | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
actions[].bindings[].processors[].parameters.axes[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | enum: x, y, z |
actions[].bindings[].processors[].parameters.exponent | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | max: 16 |
actions[].bindings[].processors[].parameters.max | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
actions[].bindings[].processors[].parameters.min | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
actions[].bindings[].processors[].parameters.scale | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | max: 1000 |
actions[].bindings[].processors[].parameters.step | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | max: 1000000000 |
actions[].bindings[].processors[].parameters.threshold | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 0<br>max: 1 |
actions[].bindings[].processors[].parameters.value | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 0 |
actions[].bindings[].sources | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[].sources[] | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[].sources[].control | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | minLength: 1<br>maxLength: 160 |
actions[].bindings[].sources[].device | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: keyboard, mouse, gamepad, touch |
actions[].bindings[].sources[].event | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: down, up, press, move, axis, sample |
actions[].bindings[].sources[].index | integer | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0<br>max: 9007199254740991 |
actions[].bindings[].sources[].modifiers | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[].sources[].modifiers[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | enum: ctrl, shift, alt, meta, negative, positive, x, y |
actions[].bindings[].triggerOverrides | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[].triggerOverrides[] | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].bindings[].triggerOverrides[].kind | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: pressed, released, held, tap, doubleTap, hold, chord, continuous, continuous_delta, cancel |
actions[].bindings[].triggerOverrides[].parameters | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/map | |
actions[].bindings[].triggerOverrides[].parameters.durationMs | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 1<br>max: 60000 |
actions[].bindings[].triggerOverrides[].parameters.intervalMs | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 1<br>max: 60000 |
actions[].bindings[].triggerOverrides[].parameters.windowMs | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 1<br>max: 60000 |
actions[].contexts | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].contexts[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | minLength: 1<br>maxLength: 120 |
actions[].key | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | minLength: 1<br>maxLength: 160 |
actions[].label | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | minLength: 1<br>maxLength: 160 |
actions[].policy | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
actions[].policy.allowedActorKinds | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].policy.allowedActorKinds[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | minLength: 1<br>maxLength: 80 |
actions[].policy.cameraRelative | boolean | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
actions[].policy.cooldown | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
actions[].policy.cooldown.ms | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 1<br>max: 9007199254740991 |
actions[].policy.effectSystem | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: movement, action, script, look |
actions[].policy.lagCompensationMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: live, rewind_to_client_sample |
actions[].policy.look | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
actions[].policy.look.invertY | boolean | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
actions[].policy.look.pitchMaxDeg | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: -89<br>max: 89 |
actions[].policy.look.pitchMinDeg | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: -89<br>max: 89 |
actions[].policy.look.sensitivityDeg | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0.001<br>max: 45 |
actions[].policy.possessionRequired | boolean | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
actions[].policy.rateLimit | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
actions[].policy.rateLimit.perSecond | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0.001 |
actions[].policy.requiresBinding | boolean | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
actions[].policy.targetPolicy | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
actions[].policy.targetPolicy.allowedComponentTypes | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].policy.targetPolicy.allowedComponentTypes[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | minLength: 1<br>maxLength: 160 |
actions[].policy.targetPolicy.allowedTags | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].policy.targetPolicy.allowedTags[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | minLength: 1<br>maxLength: 160 |
actions[].policy.targetPolicy.entityRequired | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
actions[].policy.targetPolicy.maxDistance | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0.001 |
actions[].policy.targetPolicy.required | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
actions[].policy.targetPolicy.requireLineOfSight | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
actions[].policy.valueBounds | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
actions[].policy.valueBounds.enumValues | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].policy.valueBounds.enumValues[] | string|number|boolean | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].policy.valueBounds.integer | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
actions[].policy.valueBounds.max | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | |
actions[].policy.valueBounds.maxMagnitude | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0 |
actions[].policy.valueBounds.min | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | |
actions[].policy.valueBounds.minMagnitude | number | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0 |
actions[].policy.valueBounds.requiredFields | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].policy.valueBounds.requiredFields[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | minLength: 1<br>maxLength: 80 |
actions[].prediction | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
actions[].prediction.mode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: client_predicted, client_only, server_authoritative |
actions[].processors | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].processors[] | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].processors[].kind | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: deadzone, curve, invert, sensitivity, clamp, normalize, axisComposition, stickComposition, threshold, quantize |
actions[].processors[].parameters | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/map | |
actions[].processors[].parameters.axes | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
actions[].processors[].parameters.axes[] | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | enum: x, y, z |
actions[].processors[].parameters.exponent | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | max: 16 |
actions[].processors[].parameters.max | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
actions[].processors[].parameters.min | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
actions[].processors[].parameters.scale | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | max: 1000 |
actions[].processors[].parameters.step | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | max: 1000000000 |
actions[].processors[].parameters.threshold | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 0<br>max: 1 |
actions[].processors[].parameters.value | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 0 |
actions[].triggers | array | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].triggers[] | object | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/array | |
actions[].triggers[].kind | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: pressed, released, held, tap, doubleTap, hold, chord, continuous, continuous_delta, cancel |
actions[].triggers[].parameters | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/map | |
actions[].triggers[].parameters.durationMs | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 1<br>max: 60000 |
actions[].triggers[].parameters.intervalMs | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 1<br>max: 60000 |
actions[].triggers[].parameters.windowMs | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | min: 1<br>max: 60000 |
actions[].valueType | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: boolean, float, vector1d, vector2d, vector3d, world_target, screen2d, trigger, composite |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. | |
version | integer | yes | readonly | hidden | hidden | hidden | hidden | exposed | consumed | not_applicable | readonly/number | min: 1<br>max: 9007199254740991 |
Defaults:
{
"type": "InputProfileComponent",
"version": 1,
"actions": [
{
"key": "player.move",
"label": "Move",
"valueType": "vector2d",
"contexts": [
"gameplay"
],
"triggers": [],
"processors": [],
"policy": {
"possessionRequired": true,
"requiresBinding": true,
"allowedActorKinds": [],
"valueBounds": {
"maxMagnitude": 1,
"integer": false,
"enumValues": [],
"requiredFields": []
},
"lagCompensationMode": "live",
"effectSystem": "movement"
},
"prediction": {
"mode": "client_predicted"
},
"bindings": [
{
"id": "binding.move.wasd",
"sources": [
{
"device": "keyboard",
"control": "KeyW",
"event": "down",
"modifiers": []
},
{
"device": "keyboard",
"control": "KeyA",
"event": "down",
"modifiers": []
},
{
"device": "keyboard",
"control": "KeyS",
"event": "down",
"modifiers": []
},
{
"device": "keyboard",
"control": "KeyD",
"event": "down",
"modifiers": []
}
],
"triggerOverrides": [],
"processors": [],
"priority": 0
}
]
}
]
}
LightComponent
Real-time light source. Directional for sun-style, point for omni, spot for cones, area for windows or panels, ambient for global fill.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Atomic rendering primitive. |
| Default component key | component.light |
| Contract version | component.light.contract.v1 |
| Contract hash | sha256:4be783b856713686d9a22979240386c26340db863cc75eaa16aebe3fc2d8e4e7 |
| Field contract hash | sha256:a3ec3d2ef0e8f7bb4412d2944c4664e36b0a8fb2c27448773d68ef0365d7d886 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | angleDeg, castShadow, color, decay, distance, enabled, height, intensity, mode, penumbra, radius, width |
| Canonical field count | 13 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
angleDeg | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 1<br>max: 180 |
castShadow | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
color | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
decay | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
distance | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
height | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
intensity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
mode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: directional, point, spot, area_rect, area_disc, ambient |
penumbra | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
radius | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. | |
width | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
Defaults:
{
"type": "LightComponent",
"mode": "directional",
"color": "#ffffff",
"intensity": 1,
"distance": 0,
"decay": 2,
"angleDeg": 30,
"penumbra": 0.2,
"width": 2,
"height": 2,
"radius": 1,
"enabled": true,
"castShadow": false
}
LocalEnvironmentVolumeComponent
Bounded region that sparse-overrides the global environment (fog, ambient, aerial haze, exposure-compensation bias) with strict-priority blending toward the world default at its boundary.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Renderer environment-override primitive (ADR 0178); equal-priority overlaps are warned and resolve deterministically by entity id. |
| Default component key | component.local_environment_volume |
| Contract version | component.local_environment_volume.contract.v1 |
| Contract hash | sha256:d6dd9fe24fc5e1f89e725ba11a7debf7efbdd318b353ca50692e0e7f81d0651b |
| Field contract hash | sha256:0126e545a5d0b688d7a3c7957656dde242d338f6d1406de185626ab140803f69 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | ambientIntensity, blendDistance, enabled, exposureCompensationBias, fogDensity, overrideAmbient, overrideExposureCompensation, overrideFog, priority, radius, shape, size |
| Canonical field count | 16 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
ambientIntensity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 10 |
blendDistance | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
exposureCompensationBias | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: -4<br>max: 4 |
fogDensity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
overrideAmbient | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
overrideExposureCompensation | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
overrideFog | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
priority | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: -9007199254740991<br>max: 9007199254740991 |
radius | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
shape | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: sphere, box |
size | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
size.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
size.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
size.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "LocalEnvironmentVolumeComponent",
"enabled": true,
"shape": "sphere",
"radius": 8,
"size": {
"x": 8,
"y": 8,
"z": 8
},
"priority": 0,
"blendDistance": 4,
"overrideFog": false,
"fogDensity": 0.02,
"overrideAmbient": false,
"ambientIntensity": 1,
"overrideExposureCompensation": false,
"exposureCompensationBias": 0
}
MaterialInstanceOverrideComponent
Optional per-entity material parameters layered over the referenced material asset at runtime.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Atomic renderer state. |
| Default component key | component.material_override |
| Contract version | component.material_override.contract.v1 |
| Contract hash | sha256:2f7cf0103e714fe0578e820bb33a1096d3b75f72a009035ca66407fa3cc5d349 |
| Field contract hash | sha256:9c767d7832a0f6af816d31a900aa08bfbe2350bb4785ea614c8f48b8fa21420d |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | baseColorTint, emissiveIntensityMultiplier, opacityMultiplier |
| Canonical field count | 4 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
baseColorTint | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
emissiveIntensityMultiplier | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 20 |
opacityMultiplier | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 4 |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "MaterialInstanceOverrideComponent",
"opacityMultiplier": 1,
"emissiveIntensityMultiplier": 1
}
NavAgentComponent
Path-following navigation agent: steers an entity to a destination (or a followed target) across the world navmesh via the existing mover.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Physics |
| Component palette visibility | default |
| Component palette notes | Runtime navigation behavior; the nav system steers the agent via the existing mover (no second mover) over the recast navmesh resource (no navmesh-as-component). |
| Default component key | component.nav_agent |
| Contract version | component.nav_agent.contract.v1 |
| Contract hash | sha256:64f388c59f9e470370e118f20aee28c87c38152a60be1cbd237206e9325acbfa |
| Field contract hash | sha256:7486b7d3a08eaa2c3315f5406df110fd81136e06feac439bc9738ec19e1744f0 |
| Migration class | none |
| Capability packs | world.v1 |
| Runtime systems | None |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | public/medium |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | arrivalRadius, destination, enabled, speed, targetEntityKey |
| Canonical field count | 9 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
arrivalRadius | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0<br>max: 1000 |
destination | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/vec3 | |
destination.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
destination.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
destination.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
speed | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0<br>max: 1000 |
targetEntityKey | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | minLength: 1<br>maxLength: 160<br>semantic: project_graph_key<br>ref: entity key |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "NavAgentComponent",
"enabled": true,
"destination": {
"x": 0,
"y": 0,
"z": 0
},
"speed": 4,
"arrivalRadius": 0.5
}
NetworkProfileComponent
How remote clients present this entity's replicated motion. Responsive hugs the newest server sample and never bridges gaps (teleporting projectiles, snappy pickups); Smooth doubles the interpolation buffer for perfectly fluid slow movers (platforms, doors); Default is the tick-derived baseline.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Physics |
| Component palette visibility | default |
| Component palette notes | Netcode presentation intent for replicated motion; the runtime interpolation buffer reads this profile (no second mover). |
| Default component key | component.network_profile |
| Contract version | component.network_profile.contract.v1 |
| Contract hash | sha256:5f623b55c44626fcf2307a42dd1bceb89c2c4d4c18683df564600812126ac49e |
| Field contract hash | sha256:d6abd62e5c32251e84e664dec36248528177c85c65542a67f1c7c5312c0aaff6 |
| Migration class | none |
| Capability packs | None |
| Runtime systems | None |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | None |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | interpolation |
| Canonical field count | 2 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
interpolation | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: default, responsive, smooth |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "NetworkProfileComponent"
}
ParticleEmitterComponent
Budgeted billboard VFX emitter: emission rate, particle size and color ramps, lifetime, velocity, gravity, drag, spawn shape, blend/sort policy, texture, and plane collision.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Default by creator expectation; particles are built-in in comparable creator engines. |
| Default component key | component.particle_emitter |
| Contract version | component.particle_emitter.contract.v1 |
| Contract hash | sha256:edc1044554006096133ffe596718aa9baf27b4002f09b586069d41f8a5597947 |
| Field contract hash | sha256:3c5b526647ce2277efdb2ac0f78cc6ef60a6c57239bb71bc29c410d2f6a11ea0 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | blendMode, bounds, budgetCap, collision, color, depthWrite, drag, emissionRate, enabled, endColor, endSize, gravity, lifetimeSeconds, maxParticles, opacity, particleSize, schemaVersion, seed, shape, simulationPath, sortMode, startColor, startSize, textureAssetId, velocity |
| Canonical field count | 63 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
blendMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: alpha, additive, multiply, premultiplied |
bounds | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
bounds.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
bounds.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
bounds.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
budgetCap | integer | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 1<br>max: 9007199254740991 |
collision | object | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
collision.enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
collision.planeNormal | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
collision.planeNormal.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
collision.planeNormal.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
collision.planeNormal.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
collision.planeOffset | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | |
color | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
depthWrite | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
drag | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 16 |
emissionRate | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
endColor | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
endSize | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
gravity | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
gravity.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
gravity.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
gravity.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
lifetimeSeconds | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
maxParticles | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 9007199254740991 |
opacity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
particleSize | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
schemaVersion | number | yes | readonly | hidden | hidden | hidden | hidden | exposed | projected | consumed | readonly/number | min: 1<br>max: 1 |
seed | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: -9007199254740991<br>max: 9007199254740991 |
shape | object | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
shape.angleDeg | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 180 |
shape.arcDeg | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 360 |
shape.edgeEnd | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
shape.edgeEnd.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.edgeEnd.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.edgeEnd.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.edgeStart | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
shape.edgeStart.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.edgeStart.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.edgeStart.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.radius | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
shape.size | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
shape.size.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.size.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.size.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
shape.spawnMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: center, surface, volume |
shape.type | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: point, sphere, box, cone, disc, edge |
simulationPath | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: auto, cpu, gpu |
sortMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: none, cameraDistance |
startColor | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
startSize | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
textureAssetId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id texture |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. | |
velocity | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
velocity.max | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
velocity.max.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
velocity.max.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
velocity.max.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
velocity.min | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
velocity.min.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
velocity.min.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
velocity.min.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested |
Defaults:
{
"type": "ParticleEmitterComponent",
"schemaVersion": 1,
"enabled": true,
"maxParticles": 64,
"particleSize": 0.08,
"color": "#ffffff",
"opacity": 1,
"lifetimeSeconds": 1,
"emissionRate": 16,
"seed": 1,
"bounds": {
"x": 1,
"y": 1,
"z": 1
},
"velocity": {
"min": {
"x": -0.1,
"y": 0.3,
"z": -0.1
},
"max": {
"x": 0.1,
"y": 1.2,
"z": 0.1
}
},
"gravity": {
"x": 0,
"y": -0.4,
"z": 0
},
"drag": 0,
"sortMode": "none",
"blendMode": "alpha",
"simulationPath": "auto",
"depthWrite": false,
"shape": {
"type": "box",
"spawnMode": "volume",
"size": {
"x": 1,
"y": 1,
"z": 1
},
"radius": 0.5,
"angleDeg": 30,
"arcDeg": 360,
"edgeStart": {
"x": -0.5,
"y": 0,
"z": 0
},
"edgeEnd": {
"x": 0.5,
"y": 0,
"z": 0
}
},
"collision": {
"enabled": false,
"planeNormal": {
"x": 0,
"y": 1,
"z": 0
},
"planeOffset": 0
}
}
ReflectionProbeComponent
Local reflection probe used by the renderer to select nearby environment lighting for PBR objects.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Renderer presentation primitive with explicit runtime/renderer projection status. |
| Default component key | component.reflection_probe |
| Contract version | component.reflection_probe.contract.v1 |
| Contract hash | sha256:77c53f5cd9d5a201d2a1bb7ddc020e5e804e7139d24317a4080f2bcc1e456f56 |
| Field contract hash | sha256:9d363f2441e72e6ffd5501b115ce6b578e9ed5b11290aff8f794ae22185cb0c1 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | cubemapAssetId, enabled, intensity, radius, shape, size |
| Canonical field count | 10 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
cubemapAssetId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id texture |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
intensity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 10 |
radius | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
shape | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: sphere, box |
size | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
size.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
size.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
size.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "ReflectionProbeComponent",
"enabled": true,
"shape": "sphere",
"radius": 8,
"size": {
"x": 8,
"y": 8,
"z": 8
},
"intensity": 1
}
RenderableComponent
Presentation primitive used by the shared client renderer.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Atomic rendering primitive. |
| Default component key | component.renderable |
| Contract version | component.renderable.contract.v1 |
| Contract hash | sha256:2f9dd23364a87823c6cd128e3b03dac64a4f3ff55aafed361cd9f94b28e15cf7 |
| Field contract hash | sha256:7f398b835404bb84d03481ce97aa1bf3b4d6c701d06824a9c28adf9c5c42b84a |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | assetId, bounds, fadeOutDistance, materialRef, materialSlots, maxDrawDistance, shape, visible |
| Canonical field count | 20 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
assetId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id model |
bounds | object | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
bounds.center | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
bounds.center.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
bounds.center.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
bounds.center.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
bounds.size | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
bounds.size.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
bounds.size.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
bounds.size.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
fadeOutDistance | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
materialRef | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: material_id<br>ref: asset id material |
materialSlots | array | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/array | |
materialSlots[] | object | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/array | |
materialSlots[].materialRef | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: material_id<br>ref: asset id material |
materialSlots[].slot | string|integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | |
maxDrawDistance | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.01 |
shape | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: box, sphere, disc, capsule, billboard, mesh, plane |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. | |
visible | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean |
Defaults:
{
"type": "RenderableComponent",
"visible": true,
"shape": "sphere"
}
RigidBodyComponent
Opts an entity into authoritative Rapier simulation; runtime physics owns dynamic Transform and Velocity readback.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Physics |
| Component palette visibility | default |
| Component palette notes | Atomic physics primitive. |
| Default component key | component.rigid_body |
| Contract version | component.rigid_body.contract.v1 |
| Contract hash | sha256:0bc4b0983a476b42977aaa6ac58b9f142066e993ecb4907aaec77996fed4d744 |
| Field contract hash | sha256:f21ba6b73c5054a336adab86a2151586d18a66aff37d9635e2eaaf2ad7f230c5 |
| Migration class | none |
| Capability packs | physics.v1 |
| Runtime systems | runtime.physicsSystem, runtime.collisionSystem |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | public/medium |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | angularDamping, bodyType, ccdEnabled, gravityScale, linearDamping, lockRotations, lockTranslations, mass |
| Canonical field count | 15 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
angularDamping | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0 |
bodyType | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | enum: dynamic, kinematic, static |
ccdEnabled | boolean | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
gravityScale | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | |
linearDamping | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0 |
lockRotations | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
lockRotations.x | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
lockRotations.y | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
lockRotations.z | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
lockTranslations | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/object | |
lockTranslations.x | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
lockTranslations.y | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
lockTranslations.z | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
mass | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0.001 |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "RigidBodyComponent",
"bodyType": "dynamic",
"mass": 1,
"linearDamping": 0,
"angularDamping": 0,
"gravityScale": 1,
"lockTranslations": {
"x": false,
"y": false,
"z": false
},
"lockRotations": {
"x": false,
"y": false,
"z": false
}
}
ScriptComponent
Attaches a sandboxed project script asset to an entity.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Scripting |
| Component palette visibility | default |
| Component palette notes | Atomic behavior attachment. |
| Default component key | component.script |
| Contract version | component.script.contract.v1 |
| Contract hash | sha256:491fc529c81767d2fe676fc46f925075cbf792ed472da13aa37db46ca91f4f22 |
| Field contract hash | sha256:3fe33eb00ed04200c8f61673cab3414747e015221dd5945e2122ec8f5457278a |
| Migration class | none |
| Capability packs | script.v1 |
| Runtime systems | runtime.scriptSystem, runtime.componentPatchSystem, runtime.observerCommandSystem |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | server/low |
| Authorization | Server-owned script attachment; runtime reads it and does not replicate it publicly. |
| Inspector fields | config, enabled, scriptId |
| Canonical field count | 4 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
config | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/map | |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
scriptId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: script_id<br>ref: script id |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "ScriptComponent",
"enabled": true,
"config": {}
}
SpatialCaptureComponent
Placed imported spatial capture or splat asset, projected to the renderer without becoming mesh geometry.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Semantic placement primitive for imported captures; renderability is separate from playability proof. |
| Default component key | component.spatial_capture |
| Contract version | component.spatial_capture.contract.v1 |
| Contract hash | sha256:5e6e44cc9ee6250c2888a5af01d7b80156354eac8182570adb9b322fb6540cca |
| Field contract hash | sha256:afa355f350b96cb7dab7d5517134f8f010997072c86fea784882c647d49cdbb3 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | assetId, colorTint, fadeOutDistance, maxDrawDistance, opacity, pointSize, sourceVariantKey, visible |
| Canonical field count | 9 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
assetId | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id model|raw |
colorTint | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
fadeOutDistance | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
maxDrawDistance | number | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | |
opacity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
pointSize | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.001<br>max: 1 |
sourceVariantKey | string | yes | readonly | hidden | hidden | hidden | hidden | exposed | projected | consumed | readonly/string | minLength: 1<br>maxLength: 120<br>semantic: spatial_capture_facet_key |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. | |
visible | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean |
Defaults:
{
"type": "SpatialCaptureComponent",
"sourceVariantKey": "source",
"visible": true,
"pointSize": 0.06,
"opacity": 0.92
}
TerrainComponent
Thin placement/binding component for a canonical terrain resource.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Renderer presentation component; this contract covers existing metadata/projection without adding terrain feature depth. |
| Default component key | component.terrain |
| Contract version | component.terrain.contract.v1 |
| Contract hash | sha256:d201463d659e0c1cbebbafabdb564bb63f75662834e06f4399af41f93f5e5b3b |
| Field contract hash | sha256:1944f700e45c31eb1f4d67fe9af8cb8d8e315dddcf77d157bc3eee77684057f9 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | enabled, terrainAssetId |
| Canonical field count | 3 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
terrainAssetId | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id terrain |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "TerrainComponent",
"enabled": true
}
TextRenderableComponent
Budgeted world-space text primitive for nameplates, floating values, item labels, and quest markers anchored to entities.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Renderer presentation component: canonical MSDF text (shared per-family atlas, resolution-independent at any distance) with render-budget proof. |
| Default component key | component.text_renderable |
| Contract version | component.text_renderable.contract.v1 |
| Contract hash | sha256:31898ee74eefadc1bdd2786fd6ca6071b5ce15af9f697bea2a6cf548d6e5752c |
| Field contract hash | sha256:14912a63e99055d15bbcba4d893bad58140ce8cdce3ccc026637ba67c8679581 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | align, anchor, backgroundColor, billboardMode, color, depthTest, depthWrite, enabled, fadeDistance, fontFamily, fontSize, fontWeight, letterSpacing, lineHeight, maxDistance, maxWidth, offset, opacity, outlineColor, outlineWidth, projectionKey, statKey, text, textSource |
| Canonical field count | 28 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
align | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: left, center, right |
anchor | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: center, top, bottom |
backgroundColor | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
billboardMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: camera, yAxis, fixed |
color | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
depthTest | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
depthWrite | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
fadeDistance | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
fontFamily | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: sans, mono, serif |
fontSize | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 6<br>max: 96 |
fontWeight | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: regular, medium, semibold, bold |
letterSpacing | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | |
lineHeight | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
maxDistance | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.1 |
maxWidth | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
offset | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/vec3 | |
offset.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
offset.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
offset.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/nested | |
opacity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
outlineColor | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
outlineWidth | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 8 |
projectionKey | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | minLength: 1<br>maxLength: 160<br>semantic: runtime_projection_key |
statKey | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | minLength: 1<br>maxLength: 160<br>semantic: runtime_stat_key |
text | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | maxLength: 256 |
textSource | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: static, entityName, projection, stat |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "TextRenderableComponent",
"enabled": true,
"text": "Label",
"textSource": "static",
"color": "#ffffff",
"opacity": 1,
"fontSize": 18,
"fontFamily": "sans",
"fontWeight": "regular",
"align": "center",
"anchor": "bottom",
"maxWidth": 0,
"lineHeight": 0,
"letterSpacing": 0,
"offset": {
"x": 0,
"y": 1.6,
"z": 0
},
"billboardMode": "camera",
"depthTest": true,
"depthWrite": false,
"maxDistance": 80,
"fadeDistance": 60,
"outlineWidth": 0
}
TimerComponent
Fires timer events on a server-owned interval. Scripts subscribe with onTimerFired (event.timerKey, event.iteration) to drive cooldowns, regen tickers, and day/night cycles.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Runtime |
| Component palette visibility | default |
| Component palette notes | Atomic runtime event source. |
| Default component key | component.timer |
| Contract version | component.timer.contract.v1 |
| Contract hash | sha256:0d3d3746a0a78224e00af52fc8cd24784faa432deaaabb1bc967736e5a5b8037 |
| Field contract hash | sha256:673afa912b2a0d6e60d367a8a94848c13dc31cb07b72dc13993b6b66c3f78675 |
| Migration class | none |
| Capability packs | timer.v1 |
| Runtime systems | runtime.timerSystem |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | enabled, intervalSeconds, maxFirings, repeating, timerKey |
| Canonical field count | 6 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
intervalSeconds | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0.01 |
maxFirings | integer | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/number | min: 0<br>max: 9007199254740991 |
repeating | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/boolean | |
timerKey | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/string | minLength: 1<br>maxLength: 80<br>semantic: component_local_key |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "TimerComponent",
"enabled": true,
"timerKey": "default",
"intervalSeconds": 1,
"repeating": true,
"maxFirings": 0
}
TransformComponent
Local position, rotation, and scale. Root entities treat this as world transform.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Spatial |
| Component palette visibility | default |
| Component palette notes | Atomic spatial primitive. |
| Default component key | component.transform |
| Contract version | component.transform.contract.v1 |
| Contract hash | sha256:788109f9132e2db7f9ad9562c8158d60e4d943e4a6dbad612de5077322e15fca |
| Field contract hash | sha256:3ce983928925f037b0b3b74aaf2b7f9e4dca20fcd5b4b8608cd3f25317486154 |
| Migration class | none |
| Capability packs | hierarchy.v1 |
| Runtime systems | runtime.hierarchyTransformSystem |
| Runtime consumer status | projected |
| Renderer consumer status | not_applicable |
| Consumer status reason | Design-time component field projected through project graph. |
| Replication policy | public/high/reliable |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | position, rotation, scale |
| Canonical field count | 13 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
position | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/vec3 | |
position.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
position.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
position.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
rotation | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/vec3 | |
rotation.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
rotation.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
rotation.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
scale | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/vec3 | |
scale.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
scale.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
scale.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | not_applicable | editable/nested | |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | not_applicable | hidden: Component discriminator is selected by component type. |
Defaults:
{
"type": "TransformComponent",
"position": {
"x": 0,
"y": 0,
"z": 0
},
"rotation": {
"x": 0,
"y": 0,
"z": 0
},
"scale": {
"x": 1,
"y": 1,
"z": 1
}
}
VelocityComponent
The live movement vector. Runtime-owned - authored only as a reset default; the movement/physics step patches it each tick. Does not opt an entity into collision response or events by itself.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Physics |
| Component palette visibility | default |
| Component palette notes | Atomic physics state. |
| Default component key | component.velocity |
| Contract version | component.velocity.contract.v1 |
| Contract hash | sha256:88e2978b8abceb4d149b15e0e1fca43c5cfcfca2db588ee22c9e2be06cc072c0 |
| Field contract hash | sha256:dadecedf5574f7ab4fb52d340047310a15579e784b815b1a9a71f256b80ce572 |
| Migration class | none |
| Capability packs | physics.v1 |
| Runtime systems | runtime.physicsSystem, runtime.collisionSystem |
| Runtime consumer status | consumed |
| Renderer consumer status | not_applicable |
| Consumer status reason | Runtime system consumes this component contract. |
| Replication policy | public/medium |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | velocity |
| Canonical field count | 5 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | consumed | not_applicable | hidden: Component discriminator is selected by component type. | |
velocity | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/vec3 | |
velocity.x | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
velocity.y | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested | |
velocity.z | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | consumed | not_applicable | editable/nested |
Defaults:
{
"type": "VelocityComponent",
"velocity": {
"x": 0,
"y": 0,
"z": 0
}
}
WaterComponent
Planar water surface with quality-gated reflection intent.
| Field | Value |
|---|---|
| Classification | atomic |
| Category | Rendering |
| Component palette visibility | default |
| Component palette notes | Renderer presentation component; this contract covers existing metadata/projection without adding water feature depth. |
| Default component key | component.water |
| Contract version | component.water.contract.v1 |
| Contract hash | sha256:ac883dba8a95c0d3bccff752e01c94c7247b9e21d82c122ebb50616d366994e6 |
| Field contract hash | sha256:839fa698318ce1ee9ae8b17692a81230436389c24a2f01e787a40c50303f5067 |
| Migration class | none |
| Capability packs | rendering.v1 |
| Runtime systems | None |
| Runtime consumer status | projected |
| Renderer consumer status | consumed |
| Consumer status reason | Presentation component projected to runtime/renderer. |
| Replication policy | public/low |
| Authorization | Script-mutable only through authorized Entity host operations; Runtime validates payloads with ComponentSchema. |
| Inspector fields | color, depth, depthBlendDistance, enabled, materialRef, normalMapAssetId, opacity, reflectionMode, refractionMode, shallowColor, shoreFoamStrength, surfaceLevel, waveProfile, waveStrength, width |
| Canonical field count | 21 |
Canonical Field Contract:
| Field | JSON | Required | Frontend | AI | MCP | SDK | Script | Runtime | Runtime consumer | Renderer consumer | Inspector | Validation |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
color | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
depth | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 1 |
depthBlendDistance | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
enabled | boolean | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/boolean | |
materialRef | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/asset | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: material_id<br>ref: asset id material |
normalMapAssetId | string | no | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$<br>semantic: asset_id<br>ref: asset id texture |
opacity | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
reflectionMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: none, cheap, screen, planar, cube |
refractionMode | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/string | enum: none, screen |
shallowColor | string | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/color | pattern: ^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$ |
shoreFoamStrength | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
surfaceLevel | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | |
type | string | yes | hidden | hidden | hidden | hidden | hidden | hidden | projected | consumed | hidden: Component discriminator is selected by component type. | |
waveProfile | object | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/object | |
waveProfile.amplitude | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
waveProfile.choppiness | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
waveProfile.frequency | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0.001 |
waveProfile.normalScale | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
waveProfile.speed | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0 |
waveStrength | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 0<br>max: 1 |
width | number | yes | exposed | exposed | exposed | exposed | exposed | exposed | projected | consumed | editable/number | min: 1 |
Defaults:
{
"type": "WaterComponent",
"enabled": true,
"width": 32,
"depth": 32,
"surfaceLevel": 0,
"color": "#3aa7ff",
"shallowColor": "#72d6ff",
"opacity": 0.72,
"waveStrength": 0.15,
"waveProfile": {
"amplitude": 0.15,
"frequency": 1,
"speed": 1,
"choppiness": 0.25,
"normalScale": 0.65
},
"reflectionMode": "cheap",
"refractionMode": "none",
"shoreFoamStrength": 0.35,
"depthBlendDistance": 3
}