# Talos main for AI

Generated from the same sources as the agent knowledge pack (pack 6123005c3102). Read it once. For anything not here use the `argus-agent` tools (`explain.search`, `explain.rule`, `explain.component`, `explain.api`) or the full docs.

## What Talos is

A game engine you drive yourself or through your AI assistant. A project is a folder with `argus.project.json` and scene files (`*.scene.json`): entities with components, validated by a contract of named rules. Game logic is TypeScript behaviours written against `@argus/api` (`ctx`), helpers in `@argus/gameplay`. The running engine serves a query API over HTTP, and `argus-agent` exposes tools over MCP (stdio). Units: metres, Y up, right-handed, forward is -Z; angles in radians unless a field says degrees.

## Agent tools (134, 40 in the default list)

The default list, then the toolsets.

- activity: Who else works on this project: the roster (agents and the…
- behaviour.list: This project's behaviour modules, with what each says it…
- behaviour.read: One project behaviour's source, by name or module name.
- behaviour.write: [editor or disk] Write a TypeScript behaviour to…
- build.apply: Turn files changed outside the workspace API (a save is…
- build.status: [editor or service] What the workspace service made of the…
- critic.check: Deterministic checks of the scene FILE (save editor edits…
- critic.check_ui: UI critic over every screen on the stack across themes, UI…
- critic.play: The playtester walks each goal entity in order with the…
- editor.click: Press a control by drawn name: cursor move, press, release…
- editor.controls: Every control the editor drew last frame, by name, with…
- editor.start: [disk (starts an editor)] Start an editor on this project…
- entity.add: [editor or disk] A new entity in the scene, as one undo…
- entity.add_behaviour: [editor or disk] Attach a behaviour: a script component…
- entity.reparent: [editor or disk] Reparent (null: root), keeping world…
- entity.set_component: [editor or disk] Put this component on this entity…
- example.behaviour: The smallest compiling behaviour module doing what you…
- explain.api: One @argus/api symbol or @argus/gameplay helper: its…
- explain.component: A component kind's fields (type, default, values), nested…
- explain.rule: What a refusal's or finding's code means: severity…
- explain.search: Find what the explain tools and argus:// resources hold…
- export.compose: [disk (with a Ready build)] Compose the player's native…
- notes.append: Record one thing about THIS project for the next session…
- notes.read: What earlier sessions recorded about this project.
- play.capture: Render a frame of the running game, overlays optional…
- play.input: Press input-map actions through their bound keys, as the…
- play.query: One request to Play's query API: /entities, /entity/{id}…
- play.start: Play the open scene in the editor; waits until it runs.
- play.step: Pause Play and advance exactly this many fixed ticks, to…
- play.stop: End Play; back to authoring, scene and camera as they were.
- project.create: Make a project from a template and take it as this…
- project.open: Take this project as the session's, which every other tool…
- revert: Undo one of your changes as a new revert change.
- scene.list: Every scene in the project, the open one, and the one a…
- scene.open: [editor or disk] Make this the open scene: the editor's…
- scene.patch: [editor or disk] An RFC 6902 JSON Patch on the scene, ONE…
- scene.read: [editor or disk] The scene as canonical JSON…
- tools.enable: Add toolsets to this session's list.
- ui.screens: [editor or disk] The stack bottom-first with each screen's…
- ui.tree: The live UI tree across the screen stack: per node its…

Toolsets (`tools.enable` adds one; its tools then list their own arguments):

- assets: asset.derived, asset.import, asset.place, asset.reprocess, asset.ruler, entity.align, entity.fit_proxies, project.files
- audio: audio.synth
- buildings: bridge.generate, building.generate, building.kit, dress, network.grow, parcels.subdivide, settlement.generate, wall.generate
- editor: editor.capture, editor.hover, editor.key, editor.set, editor.state, editor.type, entity.copy, entity.paste
- foliage: foliage.generate, foliage.preset, foliage.preview, foliage.species, foliage.stats
- kit: kit.check, kit.piece, kit.sheet
- library: library.gate, library.generate, library.import, library.process, library.search, library.share
- materials: material.compare, material.measure, material.preview, material.write
- measure: play.measure, play.roads, play.save, road.edit, road.sample
- music: music.add
- prefabs: prefab, prefab.place
- profile: play.desync, profile.blame, profile.capture, profile.diff, profile.explain, profile.view, replay.verify
- release: export.info, export.run, plugin, project.settings.get, project.settings.set
- selftest: critic.selftest
- shaders: shader.library, shader.measure, shader.preview, shader.write
- terrain: terrain.apply, terrain.create, terrain.edit, terrain.ops, terrain.preview, terrain.sample, terrain.stack, terrain.stats
- ui: ui.activate, ui.focus, ui.input, ui.locale, ui.pop, ui.push, ui.scale, ui.schema, ui.theme, ui.viewport
- vfx: vfx.describe, vfx.explain, vfx.patch, vfx.read, vfx.report, vfx.sheet
- view: look.apply, view.render

## Scene components

Fields marked * are required. The contract refuses unknown keys.

- `animator`: asset*:string, states*:AnimState[], initial*:string, parameters:AnimParam[], events:AnimEvent[], ik:AnimIk[], pelvis:AnimPelvis, footLock:AnimFootLock, lookAt:AnimLookAt, retarget:AnimRetarget, layers:AnimLayer[], rootMotionFrom:string, feet:string[]
- `attach`: to*:string, bone:string, socket:GripSocket, position:Vec3, rotation:Quat, activeWhile:string
- `audio`: asset*:string, spatial*:boolean, loop*:boolean, volume*:number, autoplay:boolean, range:number
- `buoyancy`: probes:BuoyancyProbe[], resolution:number, volumeScale:number, linearDrag:number, quadraticDrag:number, waterVelocity:boolean, angularDrag:number
- `camera`: kind*:CameraKind, fov*:number, primary:boolean, target:string, distance:number, far:number, projection:CameraProjection, orthoSize:number, pixelsPerUnit:number, pixelSnap:boolean, referenceResolution:unknown[], pixelPerfect:boolean, priority:number, layers:string[], hideLayers:string[], output:CameraOutput, sensor:CameraSensor, viewport:unknown[], texture:CameraTexture, order:number, blendIn:CameraBlend, rig:CameraRigSettings
- `collider`: shape*:ColliderShape, size:Vec3, radius:number, height:number, center:Vec3, isTrigger:boolean, material:PhysicsMaterial, detail:PhysicsColliderDetail
- `controller`: kind*:ControllerKind, speed*:number, jump*:number, crouch:boolean, input:ControllerInputMode, inputBasis:ControllerInputBasis, gravity:number, maxFallSpeed:number, accel:number, decel:number, turnRate:number, step:number
- `face`: blink:number, gaze:number, expression:number, headMotion:number, head:string, eyes:string[], seed:number
- `foliage`: prototypes*:FoliagePrototype[], density:number, seed:integer, collisionLayout:InstanceCollisionLayout
- `giVolume`: size*:Vec3, indirectIntensity*:number, blend:number, mode:GiVolumeMode, probeSpacing:number
- `goal`: id*:string, labelKey*:string, order:number
- `gradeVolume`: size:Vec3, unbound:boolean, look*:RenderLook, blend:number, priority:number, weight:number
- `hud`: element*:HudElement, textKey:string
- `hullMask`: center:Vec3, halfLength*:number, halfWidth*:number, bowLength:number, bowWidth:number, edgeSoftness:number, capHeight:number, skirtWidth:number, skirtCap:number
- `instancedMesh`: asset*:string, material:string, materials:object, color:string, castShadow:boolean, receiveShadow:boolean, source*:string, colliderMode:ColliderMode, collisionLayout:InstanceCollisionLayout, customData:string[], cullDistance:number, cellSize:number
- `joint`: kind*:JointKind, connectedTo:string, anchor:Vec3, connectedAnchor:Vec3, axis:Vec3, limits:Vec2, motor:JointMotor, collideConnected:boolean
- `junction`: arms*:JunctionArm[], cornerRadiusM:number, stopLines:boolean, keepLeft:boolean, material:PhysicsMaterial
- `label`: textKey*:string, size*:number, billboard*:boolean
- `light`: kind*:LightKind, color*:string, intensity*:number, castShadow:boolean, range:number, angle:number, shadowTint:LightShadowTint, indirectIntensity:number
- `lipsync`: track:string, gain:number
- `mesh`: asset*:string, material:string, materials:object, color:string, castShadow:boolean, receiveShadow:boolean, colliderMode:ColliderMode, collide:boolean
- `multirotor`: preset:MultirotorPreset, rotors:MultirotorRotor[], thrustToWeight:number, motorTime:number, dragArea:number, maxTilt:number, maxRate:number, maxYawRate:number, maxSpeed:number, maxClimb:number, maxDescent:number, endurance:number, mode:MultirotorMode, input:ControllerInputMode, propellers:string[]
- `navagent`: radius*:number, speed*:number
- `navarea`: walkable*:boolean
- `navlink`: to*:Vec3, kind*:NavLinkKind, bidirectional:boolean, action:string, radius:number, hold:number
- `particles`: preset:ParticlePreset, rate:number, color:string, material:string, class:string, effect:string, params:object
- `rigidbody`: kind*:BodyKind, mass:number, friction:number, restitution:number, ccd:boolean, lockAxes:LockAxes, planar:boolean
- `road`: source*:string, material:PhysicsMaterial, barrierMaterial:PhysicsMaterial
- `script`: module*:string, props:object
- `spawn`: for*:string, player:integer
- `splat`: asset*:string, radianceNits:number, visible:boolean, axes:SplatAxes
- `springBones`: chains*:SpringChain[], colliders:SpringCollider[]
- `sprite`: frames*:SpriteFrame[], animations:SpriteAnimation[], animation:string, pixelsPerMetre:number, billboard:SpriteBillboard, anchor:Vec2, sortLayer:number, order:number, flipX:boolean, flipY:boolean, color:string, opacity:number, alphaCutoff:number, filter:SpriteFilter, lit:boolean, emissive:string, visible:boolean
- `terrain`: source*:string, render:TerrainRenderMode, collision:TerrainCollisionMode, nav:boolean, groundCover:TerrainGroundCover, horizon:boolean
- `terrainmod`: terrain:string, priority:integer, op*:TerrainOp
- `tilemap`: tileset*:TilemapTileset, legend*:object, layers*:TilemapLayer[], cellSize:Vec2, alphaCutoff:number, filter:SpriteFilter, lit:boolean
- `trigger`: event*:string, once:boolean
- `uiPanel`: screen*:string, props:object, size*:Vec2, pixels:Vec2, lit:boolean, input:boolean
- `vehicle`: preset:string, model:VehicleModel, chassis:VehicleChassis, wheels:string[], drivetrain:VehicleDrivetrain, brakes:VehicleBrakes, tyres:VehicleTyres, aero:VehicleAero, assists:VehicleAssists, steering:VehicleSteering, drift:VehicleDrift, handling:VehicleHandling, recovery:VehicleRecovery, contact:VehicleContact, offRoad:VehicleOffRoad, water:VehicleWater, input:ControllerInputMode
- `water`: size*:Vec2, shape:WaterShape, windMps:number, windDirectionRad:number, seed:number, priority:number, look:LakeLook
- `waterWake`: strength:number, halfLength:number, halfWidth:number, draft:number, armFoam:number, trailFoam:number, fillFoam:number, trailWidth:number, trailGrowth:number, trailMaxWidth:number, armLife:number, trailLife:number, fillLife:number, solve:WaterWakeSolve
- `waterways`: terrain:string, rivers:boolean, waterfalls:boolean, lakes:boolean, look:WaterwaysLook, roughness:number, flowScale:number, foam:number, mist:number, overrides:WaterwaysOverride[]
- `wheel`: radius:number, width:number, suspension:VehicleSuspension, tyre:VehicleTyres, inertia:number, steerable:number, driven:number, braked:number, handbrake:boolean, visuals:string[]
- `xrOrigin`: mode:XrTrackingMode, eyeHeight:number

## Script API

### ctx (Ctx)

- entity: EntityHandle
- world: WorldQuery
- nav: NavAgent | null
- input: InputState | null
- controller: Controller | null
- animator: Animator | null
- body: RigidBody | null
- joint: Joint | null
- vehicle: Vehicle | null
- wheel: Wheel | null
- sprite: Sprite | null
- tilemap: Tilemap | null
- data: DataHandle
- events: EventBus
- hud: HudHandle
- ui: UiHandle
- time: TimeInfo
- xr: XrHandle
- environment: EnvironmentInfo
- water: WaterHandle
- wind: WindHandle
- camera: CameraHandle
- players: PlayersHandle
- views: ViewsHandle
- audio: AudioHandle
- particles: ParticlesHandle
- labels: LabelsHandle
- render: RenderHandle
- screenEffects: ScreenEffectsHandle
- strings: StringsHandle
- save: SaveHandle
- files: FilesHandle
- session: SessionHandle
- debug: DebugHandle
- state: S
- props: P
- log(msg: string, data?: unknown): void

### ctx.entity (EntityHandle)

- readonly id: string
- readonly name: string
- readonly tags: readonly string[]
- readonly alive: boolean
- position: Vec3
- readonly worldPosition: Vec3
- rotation: Quat
- scale: Vec3
- translate(delta: Vec3): void
- moveToward(target: Target, maxStep: number): boolean
- distanceTo(target: Target): number
- teleport(position: Vec3, yaw?: number): boolean
- lookAt(target: Target, opts?: { flat?: boolean }): void
- yaw: number
- readonly forward: Vec3
- readonly right: Vec3
- readonly up: Vec3
- visible: boolean
- readonly parent: EntityHandle | null
- setParent(parent: EntityHandle | string | null, opts?: { keepWorld?: boolean }): void
- setWaterWake(feed: WaterWakeFeed | null): boolean
- fly(command: FlightCommand): boolean
- flight(): FlightState | null
- readonly children: EntityHandle[]
- readonly body: RigidBodyView | null
- readonly vehicle: VehicleView | null
- hasTag(tag: string): boolean
- hasComponent(type: string): boolean
- component(type: string): Record<string, any> | null
- overrides<T extends keyof WritableComponents>(component: T): Partial<WritableComponents[T]> | null
- set<T extends keyof WritableComponents>(component: T, patch: WritableComponents[T]): void
- despawn(): boolean

### ctx.world (WorldQuery)

- query(filter?: QueryFilter): EntityHandle[]
- find(id: string): EntityHandle | null
- junction(id: string): Junction | null
- readonly weather: { rain: number; wetness: number } | null
- setWeather(weather: { rain?: number; wetness?: number }): void
- road(id: string): RoadLine | null
- instances(entity: string | EntityHandle): Instances | null
- readonly count: number
- raycast(from: Vec3, dir: Vec3, max?: number, opts?: CastOptions): Hit | null
- raycastMany(from: Float32Array | number[], dir: Float32Array | number[], max?: number, opts?: CastOptions &…
- positions(entities: readonly (string | EntityHandle)[]): Float32Array
- nearestMany(from: Float32Array | number[], to: Float32Array | number[], radius: number): Int32Array
- shapeCast(shape: CastShape, from: Vec3, dir: Vec3, max?: number, opts?: CastOptions): Hit | null
- overlap(shape: CastShape, position: Vec3, rotation?: Quat, opts?: CastOptions): EntityHandle[]
- overlaps(entity: EntityHandle | string): EntityHandle[] | null
- setSensor(entity: EntityHandle | string, on: boolean): boolean
- pick(from: Vec3, dir: Vec3, max?: number, opts?: PickOptions): Hit | null
- hold(holder: EntityHandle | string, target: EntityHandle | string, opts?: HoldOptions): boolean
- release(target: EntityHandle | string, opts?: ReleaseOptions): boolean
- heldBy(target: EntityHandle | string): EntityHandle | null
- holding(holder: EntityHandle | string): EntityHandle[]
- path(from: Vec3, to: Vec3): Vec3[] | null
- spawn(options: SpawnOptions): EntityHandle

### ctx.nav (NavAgent)

- goTo(target: Target, speed?: number): void
- stop(): void
- readonly arrived: boolean
- readonly stuck: boolean
- readonly target: Vec3 | null

### ctx.input (InputState)

- axis(name: string): Vec2
- axisParts(name: string): AxisParts
- readonly pointer: InputPointer | null
- action(name: string): ActionState
- pressed(name: string): boolean
- held(name: string): boolean
- released(name: string): boolean
- readonly context: string
- setContext(name: string): boolean
- actions(): string[]
- bindings(action: string, context?: string): ActionBinding | null
- rebind(action: string, binding: Binding, context?: string): void
- resetBindings(): void
- rumble(strength: number, seconds: number): void

### ctx.controller (Controller)

- move(dir: Vec3, speed: number): void
- jump(height?: number): void
- crouch(on: boolean): void
- setVelocity(v: Vec3): void
- addVelocity(v: Vec3): void
- readonly grounded: boolean
- readonly velocity: Vec3
- readonly groundNormal: Vec3 | null
- readonly groundEntity: EntityHandle | null
- readonly groundVelocity: Vec3
- readonly squeezedBy: EntityHandle | null
- readonly wallNormal: Vec3 | null
- readonly blocked: boolean
- gravityScale: number
- moveWithGround: boolean

### ctx.animator (Animator)

- set(state: string): void
- readonly state: string | null
- param(name: string, value: number): void
- rootDelta(): Vec3
- groundSpeed(clip: string): number | null
- window(name: string): boolean
- bone(name: string, pose?: BonePoseKind | { pose?: BonePoseKind }): BonePose | null
- ik(chain: string, target: Vec3 | EntityHandle | null, weight?: number): void
- lookAt(target: Vec3 | EntityHandle | null): void
- play(name: string, opts?: AnimatorPlayOptions): boolean
- warp(opts: AnimatorWarpOptions | null): boolean
- layerWeight(layer: string, weight?: number): number
- setMorph(name: string, weight: number | null): number
- morph(name: string): number
- stopLayer(layer: string): void
- speed: number

### ctx.events (EventBus)

- emit(name: string, data?: unknown): void
- emitTo(target: string | EntityHandle, name: string, data?: unknown): void
- on<N extends string>(name: N, handler: (ev: GameEvent<BusPayload<N>>) => void, opts?: ListenOptions): void
- once<N extends string>(name: N, handler: (ev: GameEvent<BusPayload<N>>) => void, opts?: ListenOptions): void
- off<N extends string>(name: N, handler?: (ev: GameEvent<BusPayload<N>>) => void): void

### ctx.hud (HudHandle)

- set(field: HudField, value: string | number | null, options?: HudFieldOptions): void
- objective(textKey: string): void
- prompt(textKey: string | null): void
- timer(seconds: number | null): void
- score(value: number): void
- hittable(field: HudField | string, on?: boolean): void

### ctx.time (TimeInfo)

- readonly now: number
- readonly frame: number
- readonly dt: number
- readonly scale: number
- after(seconds: number, event: string, data?: unknown, opts?: AfterOptions): void

### ctx.camera (CameraHandle)

- set(kind: CameraKind, params?: CameraParams): void
- follow(target: EntityHandle | string | null): void
- shake(amplitude: number, seconds?: number, frequency?: number): void
- readonly yaw: number
- readonly pitch: number
- readonly viewYaw: number
- readonly fov: number
- readonly viewSize: ViewSize | null
- screenToRay(x: number, y: number, view?: number): Ray | null
- pick(x: number, y: number, opts?: CameraPickOptions): PickHit | null
- worldToScreen(point: Vec3, view?: number): { x: number; y: number } | null
- readonly arm: CameraArm

### ctx.audio (AudioHandle)

- play(asset: string, opts?: AudioOptions): number
- stop(handle: number): void
- setPitch(handle: number, rate: number, opts?: AudioRampOptions): void
- setVolume(handle: number, volume: number, opts?: AudioRampOptions): void
- bus(name: AudioBus): AudioBusHandle
- snapshot(name: string): boolean
- listenFrom(mode: AudioListenFrom): void
- setListenerPolicy(policy: AudioListenerPolicy): void
- readonly music: AudioMusicHandle

### ctx.particles (ParticlesHandle)

- emit(preset: ParticlePreset, at: Vec3, params?: Record<string, unknown>): void
- play(effect: string, at: Vec3, params?: Record<string, ParticleParamValue>): void
- setParam(name: string, value: ParticleParamValue, target?: string | EntityHandle): boolean
- burst(count: number, target?: string | EntityHandle, emitter?: string): boolean

### ctx.labels (LabelsHandle)

- set(id: string, textKey: string, at: Target): void
- clear(id: string): void

### ctx.render (RenderHandle)

- setShaderParam(entity: EntityHandle, name: string, value: number | boolean): void
- setMaterialParam(material: string, name: string, value: ShaderParamValue): void

### ctx.strings (StringsHandle)

- get(key: string): string
- has(key: string): boolean

### ctx.session (SessionHandle)

- restart(): void
- quit(): void
- loadScene(path: string): void
- pause(): void
- resume(): void
- paused(): boolean
- scene(): string

## Rule codes

Scene and critic findings, by severity. A message opens with its code.

### Error (232)

- animator-blend-coverage: A blend tree's points do not cover its parameter space: two at one…
- animator-blend-degenerate: A blend tree has too few points for its kind: fewer than two on a…
- animator-blend-parameters: A blend tree reads the wrong number of parameters, one the animator…
- animator-damp-invalid: An animator parameter's `damp` is negative (a smoothing time cannot…
- animator-event-data-invalid: An animation event's `data` has too many keys or is too large.
- animator-event-invalid: An animation event sits outside its clip (`at` not in 0..1), or names…
- animator-event-window-invalid: An animation event's `until` / `untilFrame` is not a window: not above…
- animator-feet-invalid: An `animator.feet` names fewer than two or more than four joints, an…
- animator-ik-invalid: An IK chain has a duplicate name, a bone listed twice, both kinds of…
- animator-initial-undefined: `animator.initial` is not one of the animator's state names.
- animator-invalid: Animator states, transitions, blend trees, events and clips resolve
- animator-layer-invalid: An animator layer that cannot be built: an empty or repeated name, a…
- animator-look-at-invalid: A look-at has no bones, a bone listed twice, an empty bone name, a…
- animator-loop-range-invalid: An animator state's or blend point's `loopStart`/`loopEnd` is outside…
- animator-not-finite: A blend point, a parameter value, an animation event position or a…
- animator-once-invalid: A one-shot state (`once`) loops, hands over to a state that does not…
- animator-rest-pose-straight: A rig with foot IK rests with its legs bent enough to plant a foot…
- animator-retarget-duplicate: Two of a retarget map's keys name the same bone of the target rig, so…
- animator-retarget-unmapped: A retarget map leaves a bone the built-in clips animate unmapped…
- animator-speed-invalid: An animator state's or blend point's `speed`, or a `speedParam.scale`…
- animator-state-duplicate: Two of an animator's states share a name, so `initial` and every…
- animator-state-source: An animator state has both a `clip` and a `blend`, or neither.
- animator-transition-undefined: An animator transition targets a state that does not exist.
- asset-builtin-unknown: An `assets[*].path` of `builtin:<name>` names nothing built in: a…
- asset-forward-invalid: An `assets[*].forward` sits on an asset that is not a model, so there…
- asset-import-invalid: An `assets[*].import` declares a scale or an axis pair that cannot be…
- asset-path-not-relative: An `assets[*].path` is absolute, names a drive, or climbs out with `..`.
- attach-bone-or-socket: An `attach` that names both a `bone` and a grip `socket`, or neither…
- attach-owner-missing: An `attach.to` that names no entity of the scene, or the attached…
- attach-owner-no-animator: An `attach.to` that names an entity with no `animator` component, so…
- buoyancy-without-body: A `buoyancy` component on an entity that has no `rigidbody` of kind…
- buoyancy-without-ocean: A `buoyancy` component in a scene with no `meta.environment.ocean` and…
- camera-layers-invalid: A camera sets both `layers` and `hideLayers`, or one of them is an…
- camera-point-invalid: `GET /camera/project` or `GET /camera/ray` was given a missing or…
- camera-projection-invalid: A `camera`'s `orthoSize` or `pixelsPerUnit`, or a side of its…
- camera-rig-invalid: A camera's `rig`, `output`, `texture` or `blendIn` cannot work: a…
- camera-view-unknown: `GET /camera/project` or `GET /camera/ray` named a `view` the running…
- collider-material-invalid: A `collider.material` has a negative friction, a restitution outside…
- controller-invalid: A `controller.gravity` is negative, a `controller.maxFallSpeed` is 0…
- dangling-asset: An asset reference names a key that is not in `scene.assets`.
- dangling-parent: `entity.parent` names an entity that is not in the scene.
- dangling-ref: Asset, script, parent and target references resolve
- dangling-target: `camera.target` names an entity that is not in the scene.
- duplicate-entity-id: Two entities share an id.
- face-invalid: A `face` that is wrong whatever the model is: no `animator` on the…
- feel/action-window-unreachable: an action's cancel window (cancel, combo, chain) opens after the…
- feel/anim-backwards: the character walks backwards: its planted foot is carried the body's…
- feel/anim-bind-pose: a skinned character stood in its bind (T-)pose: no clip reached the…
- feel/anim-foot-slide: the planted foot slid over the ground: the locomotion clip's pace does…
- feel/anim-frozen: an animator's clip did not advance: the playhead and pose stayed still…
- feel/anim-no-handle: a behavior read ctx.animator and got null (the engine's null-handle…
- feel/anim-pop: a joint turned far more in one tick than on the ticks either side…
- feel/anim-stuck: the body moved but the animator stayed in the state and clip it had…
- feel/anim-unknown-name: ctx.animator.set or play named a state or clip this animator does not…
- feel/buried: a body a script or kinematic body moves went more than 0.15 m into the…
- feel/camera-clip: the camera's near plane was inside a collider: the frame showed the…
- feel/camera-wall-collapse: walked into a wall, the camera's arm pulled in under 1 m though the…
- feel/controls-dead: no stick direction moved the player (after the probe held input for…
- feel/controls-rotated: a stick direction moved the player the wrong way on screen: over 30°…
- feel/look-capped: mouse look has a top speed: a fast synthetic mouse sweep turned the…
- feel/player-died-in-probe: the player died or respawned during a probe, so later rows are…
- feel/teleport-facing-ignored: a tool's teleport with a heading faced the player at something, and a…
- feel/viewmodel-static: the first-person view-model (an image in the lower middle of the…
- floor-gap: No holes in the floor under the walkable areas or around a spawn
- fog-density-and-visibility: `meta.environment.fog` writes both `density` and `visibilityM`, two…
- fog-value-range: A `meta.environment.fog` value is outside its range (density 0..1…
- gi-intensity-range: An `indirectIntensity` (`meta.environment.gi`, a light, or a…
- gi-volume-shape: A `giVolume` that cannot be built: a `size` axis of 0 or less or not…
- globe-provider-format: A globe provider file's `format` that does not fit its `kind`…
- globe-provider-grid: A globe provider file's `grid` that is missing (heights and imagery…
- globe-provider-host: A globe provider file's `url` whose host is not one of its `hosts`…
- globe-provider-keyed-default: A globe provider file with `auth` (a key) whose…
- globe-provider-template: A globe provider file's `url` that is not an `https://` address, or…
- goal-order: Goals carrying `order` do not form the strict sequence 1..n.
- grade-volume-shape: A `gradeVolume` that cannot be built: no `size` and not `unbound`, a…
- ground-cover-layer-invalid: A ground cover layer or document with a value out of range: an empty…
- ground-cover-no-terrain: A scene with ground cover and no terrain to grow it on.
- ground-cover-source-unknown: A ground cover layer whose `source.channel` is not a channel of the…
- ground-cover-too-dense: A ground cover layer whose `densityPerM2` is above 200.
- hud-layout-invalid: A `meta.hud` element declares a size, colour, offset or number format…
- joint-invalid: A `joint` that cannot be built: `connectedTo` names no entity, the…
- junction-invalid: A `junction` with fewer than two arms (a through road counts twice)…
- layer-unknown: An entity's `layer`, or a camera's `layers`, `hideLayers` or…
- layers-in-project-scene: A scene inside a project declares `meta.layers`: the project's…
- layers-invalid: A standalone scene's `meta.layers` is not a layer table: more than 32…
- light-shadow-tint-range: A light's `shadowTint` with a `strength` that is not a finite number…
- lipsync-invalid: A `lipsync` component that cannot move a mouth: its entity has no…
- lipsync-track-unknown: `lipsync.track` names a scene asset whose kind is not `visemes`.
- material-graph-cycle: The nodes of a `maskGraph` feed each other in a loop; the graph must…
- material-graph-too-many-nodes: A `*.material.json` `maskGraph` has more than 32 nodes.
- material-graph-unknown-node: A node of a `maskGraph` names (in `in`) or an output (in `layers`)…
- material-height-from-mixed: The layers of one `*.material.json` that have `maskFrom.heightM`…
- material-layer-needs-graph: A material with a `maskGraph` can have up to 6 layers (HD), but a…
- material-mask-from-wear-both: A layer of a `*.material.json` has more than one of `maskFrom.edge`…
- material-shader-missing: A `*.material.json` `shader` names no file the project holds, or its…
- material-shader-param-range: A `*.material.json` `params` value is outside the `[min, max]` its…
- material-shader-param-unknown: A `*.material.json` `params` key is not a `param` or `texture` the…
- material-texture-invalid: A `*.material.json` texture reference is empty, absolute, names a…
- material-value-range: A `*.material.json` number is outside its range or not finite: a…
- missing-collider: Dynamic bodies have a collider; triggers have a trigger collider
- multirotor-invalid: A `multirotor` needs 4 to 8 `rotors`, each `spin` 1 or -1.
- multirotor-without-body: A `multirotor` without a dynamic `rigidbody`.
- navlink-invalid: A `navlink.hold` is negative or not finite.
- navmesh-failed: The navmesh builds and has polygons
- navmesh-trap: No walkable region the player can get into and not out of
- ocean-bathymetry-asset-missing: `meta.environment.ocean.bathymetry.asset` names an asset that is not…
- ocean-bathymetry-not-16bit: The bathymetry asset is not a 16-bit greyscale PNG: not a `texture`…
- ocean-bathymetry-range-invalid: A bathymetry value that cannot describe a raster: `sizeM` not above 0…
- ocean-layer-field-mismatch: An ocean wave layer with fields of the other kind: `windSpeedMps` or…
- ocean-swell-without-period: An ocean `swell` layer with no `periodS`: a swell is defined by its…
- ocean-wave-mask-asset-missing: `meta.environment.ocean.waveMask.asset` names an asset that is not in…
- ocean-wave-mask-not-greyscale: The wave mask asset is not a greyscale PNG: not a `texture` asset, or…
- ocean-wave-mask-range-invalid: A wave mask value that cannot describe a raster: `sizeM` not above 0…
- ocean-weather-not-ascending: A `meta.environment.ocean.weather` whose `timeS` values are not…
- out-of-bounds: An entity's world position is outside `meta.bounds` (critic.check also…
- over-budget: Triangles, draw calls, texture MB and dynamic bodies within meta.budgets
- parent-cycle: Parent chain loops back on itself.
- particles-source: Exactly one of `particles.preset` and `particles.effect` is required…
- physics-quality-invalid: A `meta.physics.overrides` number is outside its range…
- plant-material-missing: A foliage recipe whose `materials` names a project file that does not…
- plant-param-invalid: A foliage recipe value the generator cannot take: a parameter that is…
- plant-species-unknown: A foliage recipe whose `species` is not one of the closed species list.
- plant-template-locked: A foliage recipe that sets a parameter its template locks, because…
- plant-template-unknown: A foliage recipe whose `template` names no library or project template.
- plant-too-heavy: A plant whose level-0 mesh has more than 150,000 triangles.
- plant-variants-invalid: A foliage recipe with `variants` outside 1..64, or more than 8 `ages`.
- play/bad-start: critic.play's from named no goal or entity of the scene, or the player…
- play/fell-out: the player fell below the scene's bounds on the way to a goal
- play/no-player: no entity carries a controller or a vehicle component, so the…
- play/no-response: the playtester pressed every action the game declares, each one many…
- play/nothing-to-drive: no entity carries a controller or a vehicle, and the input context in…
- play/player-script-error: the player's own behaviour threw or overran its budget during the run…
- play/stuck: the bot stopped moving on the way to a goal (blocked by an entity, or…
- play/timeout: the run spent its simulated time budget before reaching every goal
- play/trigger-noop: the player walked through a trigger volume and its event never fired
- play/unknown-goal: critic.play was asked for a goal id the scene does not have
- player-spawn: No entity carries a `spawn` component with `for: "player"`.
- prefab-cycle: A prefab that contains itself, through `source` instances…
- prefab-depth: Prefabs nested more than 8 levels deep (the scene instance's own…
- prefab-id-collision: An instance expands to an entity id the scene already has, or its…
- prefab-invalid: A prefab file that cannot be used: its shape, not exactly one root, an…
- prefab-missing: A prefab instance's `source` does not resolve to a readable…
- prefab-too-large: One instance that expands to more than 10,000 entities, counted as it…
- primary-camera: The scene does not have exactly one camera with `primary: true`.
- project-default-invalid: A scene rule's error on a value the scene takes from its project's…
- render-value-range: `meta.render.exposure` is not more than 0 and at most 64, or…
- scale-zero: A scale axis is exactly zero.
- schema-shape: The document does not match the schema: wrong type, missing field…
- shader-compile-error: The shader's WGSL does not compile (a name that does not exist, a type…
- shader-cost-over-cap: The shader's static cost estimate (cost units per pixel, or texture…
- shader-forbidden: The shader uses something the sandbox refuses: a module-scope `var`…
- shader-header-invalid: A `*.shader.wgsl` header or file shape that cannot be read: an unknown…
- shader-loop-unbounded: The shader has a `while` or `loop`, a `for` whose trip count is not a…
- shader-model-mismatch: The functions and the `model` disagree: `model: stylized` without both…
- shader-param-invalid: A `param` or `instance` header line that cannot be built: a name that…
- shader-raw-disabled: A `*.shader.wgsl` says `kind: raw` or `kind: pass` (the escape hatch)…
- shader-texture-invalid: A `texture` header line that cannot be built: a name that is not…
- shader-variants-over-cap: The project's shaders compile to more pipeline families than the cap…
- shot-keys-unordered: A path shot's key times are not strictly ascending, or a key is past…
- shot-target-missing: A shot names an entity (`follow.entity`, a `look` or orbit `center`…
- shots-invalid: A `meta.shots` timeline that cannot play as written: no shots or an…
- sky-asset-wrong-kind: `sky.asset`, or the deprecated `envMap`, names an asset whose `kind`…
- sky-hdr-needs-asset: `sky.kind` is `"hdr"` and no `sky.asset` names the panorama to use.
- sky-value-range: A `sky` number is outside its stated range, or is NaN or infinite, or…
- spring-collider-invalid: A `springBones` collider with a `radius` that is not above 0 and at…
- spring-invalid: A `springBones` chain that is wrong whatever the rig is: it gives both…
- sprite-frame-missing: A `sprite` name that resolves to nothing: an animation lists a frame…
- sprite-invalid: A `sprite` that cannot draw as written: no frames; pixelsPerMetre, fps…
- sprite-rotation-count-invalid: A `sprite` frame with a number of views other than 1 (the same from…
- steering-gameplay: No behaviour reads ctx.controller.steering, which the engine removed
- terrain-dem-missing: An `import.dem` op's DEM file cannot be read, or its SHA-256 is not…
- terrain-extent-invalid: A terrain file whose `extentM` is not above zero on both axes, or is…
- terrain-in-2d-scene: A `terrain` component in a 2D-kind project: terrain is a 3D feature.
- terrain-layer-unknown: A `shoreline`, `material.rules`, `volume.shape` or `volume.cliff` op…
- terrain-layers-too-many: A terrain file declares more than 8 `layers`.
- terrain-multiple: A scene with more than one `terrain` component.
- terrain-op-id-duplicate: Two ops of a terrain file's `stack` share an `id`.
- terrain-sample-invalid: A terrain file's `sampleM`, or a `detail` entry's, that is not 0.25…
- terrain-transform: An entity with a `terrain` component whose own transform is rotated or…
- terrain-volume-invalid: A `volume.shape` or `volume.cliff` op cannot be built.
- terrain-volume-order: A height or material op of a terrain file's `stack` comes after a…
- terrainmod-no-terrain: A `terrainmod` whose `terrain` names no entity with a `terrain`…
- tick-rate-invalid: `meta.tickRate` that is not a whole number from 1 to 240.
- tilemap-invalid: A `tilemap` that cannot draw as written: a tileset image that is not a…
- tilemap-tile-unknown: A `tilemap` tile that resolves to nothing: a legend index that is not…
- tilemap-too-large: A `tilemap` too big to load in one piece: more than 16 layers, a layer…
- transform-not-finite: A transform component is not finite (NaN or infinity).
- ui-clipped: an interactive node a clipping ancestor cuts into
- ui-expectation: the live tree is not what the component library meant to build
- ui-field-no-label: an editable field with nothing saying what it is for
- ui-font-face-missing: Every @font-face rule names a font file, and a bitmap font an atlas…
- ui-matrix-refused: an engine refused a cell of the matrix
- ui-no-way-back: a screen that takes input, cannot be dismissed, and has no way off it
- ui-offscreen: an interactive node outside the viewport
- ui-overlap: two interactive rectangles on top of each other
- ui-panel-invalid: A `uiPanel` whose `size` entry is not finite, not above 0 or above 100…
- ui-start-screen: `meta.ui.startScreen` is a name no `defineScreen` could have given a…
- ui-undefined-token: a stylesheet reads a token a theme leaves undefined
- ui-unknown-prop: a node that is not a text carries words, which nothing draws
- ui-unreachable: a focusable node Tab and directional navigation never reach
- unreachable-goal: Every goal is reachable from the player spawn
- vehicle-invalid: A `vehicle` that cannot be built: an unknown `preset`; a part or field…
- vfx-collide-invalid: A `*.vfx.json` `collide` module names no surface, a surface that is…
- vfx-distort-invalid: A `*.vfx.json` sprite's `render.bend` is not a share of the screen in…
- vfx-effect-missing: `particles.effect` names no effect: not a scene asset of kind…
- vfx-event-invalid: A `*.vfx.json` emitter's `role` or `events` break the event rules: an…
- vfx-expr-invalid: A `*.vfx.json` emitter's expressions are wrong: a string that does not…
- vfx-extends-invalid: A `*.vfx.json` that `extends` a parent is wrong: an unknown preset, a…
- vfx-gas-invalid: A `*.vfx.json` with `gas` cannot have one: it is also `shared`, or an…
- vfx-inherit-invalid: A `*.vfx.json` emitter's `init.inherit` (the share of the emitter's…
- vfx-max-screen-invalid: A `*.vfx.json` sprite's `render.maxScreen` is not a share of the…
- vfx-min-screen-invalid: A `*.vfx.json` sprite's or ribbon's `render.minScreenPx` is not a…
- vfx-param-invalid: A `*.vfx.json` binding names a param the effect does not declare, a…
- vfx-preset-invalid: A `*.vfx.json` that names an effect preset (`"preset"…
- vfx-render-invalid: A `*.vfx.json` emitter's `render` is wrong: more than 3 renderers or…
- vfx-shape-invalid: A `*.vfx.json` sprite names an unknown `render.shape` (allowed: disc…
- vfx-shared-invalid: A `*.vfx.json` with `shared: true` has an emitter that spawns by…
- vfx-source-invalid: A `*.vfx.json` `mesh` or `image` shape names its file in a way that…
- vfx-source-missing: A `*.vfx.json` `mesh` or `image` shape names a file that is not there…
- vfx-stateless-invalid: A `*.vfx.json` emitter with `stateless: true` does something that…
- vfx-texture-invalid: A `*.vfx.json` sprite texture is empty, absolute, names a drive or…
- vfx-texture-missing: An export packs an effect (`*.vfx.json`) whose sprite, ribbon or decal…
- vfx-value-range: A `*.vfx.json` number is outside its range, a curve or gradient has…
- water-shape-invalid: A `water` component whose `size` has an axis that is not a finite…
- water-waves-invalid: A `water` component with a wave value out of range: `windMps` outside…
- watercraft-invalid: A `vehicle` `water` number out of its documented range (a negative…
- watercraft-without-buoyancy: A `vehicle` with a `water` block on an entity with no `buoyancy`…
- waterways-look-invalid: A `waterways` value out of range: `roughness` outside 0.02..0.15…
- waterways-override-invalid: A `waterways` override that names none or more than one of river…
- waterways-without-terrain: A `waterways` component with no terrain: `terrain` names no entity…
- weather-invalid: An `environment.weather` with a `rain` or `wetness` outside 0..1, or a…
- wheel-invalid: A `wheel` that cannot work: no dynamic rigidbody above it; a number…

### Warning (117)

- air-out-of-range: `meta.environment.air` with a value outside its range: `density`…
- animator-root-motion-source: A state with `rootMotion` reads a parameter bound to a…
- audio-bus-unknown: Every bus meta.audio names is a bus meta.audio declares
- audio-missing-file: Every sound the scene names is an audio asset that exists
- audio-orphan: Spatial audio sits on something with a position you can see
- behavior-position-ignores-teleport: A behaviour that writes a position every tick from its own state…
- behavior-wrap-drops-event: A behaviour that runs another's init or update forwards its onEvent too
- camera-clip: The camera's default position is not inside or behind geometry
- camera-hides-everything: A camera's `layers` / `hideLayers` leaves out every layer the scene's…
- camera-priority-tie: Two or more screen cameras share the top priority and none of them is…
- character-unanimated: A skinned character with a controller has an animator whose states…
- collider-detail-ignored: A `collider.detail` sits where nothing reads it: on a box, sphere or…
- dynamic-needs-collider: A `rigidbody` of kind `dynamic` has no non-trigger collider.
- feel/action-out-of-reach: an action's hit volume (an attached trigger collider) never came…
- feel/anim-loop-seam: a looping state plays a clip whose last frame does not meet its first…
- feel/anim-no-air-state: the character left the ground and the animator kept its grounded…
- feel/anim-run-in-place: a walk or run clip played while the body stood still (not reported for…
- feel/anim-slow-response: the player's animator answered a press (move or jump) more than 6…
- feel/audio-loops-stacked: three or more copies of one loop played at once with none placed in…
- feel/audio-none: the scene has gameplay events (a jump, goals, triggers, emitted…
- feel/audio-silent: not one voice started: the player jumped or reached goals, or 30 s…
- feel/audio-unplayable: the game called ctx.audio.play for assets with no sound behind them…
- feel/camera-close: the camera sat within 0.3 m of solid geometry in more than 15% of…
- feel/camera-collapsed: the camera's arm (or its distance to the player) was under 1 m in more…
- feel/camera-occluded: something solid hid the player from the camera for longer than a second
- feel/camera-target-hidden: the focus target (the lock target, else the nearest opponent, else the…
- feel/facing-actions-silent: the aimed buttons (fire, use, interact) raised no event once a…
- feel/impact-no-reaction: the victim of an impact did not react within 300 ms: it moved under 5…
- feel/impact-silent: an impact (the player's sensor on something, another character's…
- feel/movement-facing-off: at steady speed the character faced over 60 degrees off the way it…
- feel/movement-slippery: the walker took over 1.5 s to stop after the stick was let go: it slides
- feel/movement-sluggish: the walker took over 1.5 s to reach 90% of its top speed with the…
- feel/movement-steer-dead: a full steer at 90% of top speed turned the vehicle under 3 deg/s: the…
- feel/movement-turn-slow: the character turned under 60 deg/s to a 90 degree stick flick at…
- feel/player-fell-off: the player walked off the level and fell (nothing under it), so the…
- feel/response-dead: pressing a gameplay action changed nothing in half a second: no bus…
- feel/response-slow: a gameplay action's press was answered (animator state, pose, velocity…
- feel/roll-mismatch: a ball moving along the ground spun against its travel (backwards…
- feel/telegraph-unreactable: another character's strike opened less than 250 ms (a person's…
- gi-volume-limit: More than 8 `giVolume` components of one mode; only the first 8 in…
- grade-volume-limit: More than 16 `gradeVolume` components; only the first 16 in scene…
- hd-only-ignored: A field or component only the HD renderer draws (a `splat` component)…
- hull-mask-out-of-range: A `hullMask` with a value outside its range: `halfLength` outside…
- input-conflict: No two actions in one context share a device source
- input-key-unknown: A `meta.input` key name the runtime binds nothing to ("Back"…
- input-reader-not-player: A behaviour that reads `ctx.input` runs on an entity player input is…
- input-unbound: Every action a script reads is bound by the scene's action map
- light-directional-horizontal: Every directional light in the scene lies within 5 degrees of the…
- light-shadow-tint-ignored: A `shadowTint` on a point or spot light: only a directional light's…
- lighting-map-unlit: A `sprite` with a `normalImage`, an `emissiveImage` or `emissive`, or…
- material-field-ignored: A `*.material.json` field that nothing reads: `alphaCutoff` without…
- material-graph-over-budget: A material with a `maskGraph` costs more than an HD budget tier allows…
- mesh-collide-conflict: A mesh's `colliderMode` and its deprecated `collide` disagree.
- missing-string: Every text key resolves in meta.strings
- multirotor-out-of-range: A `multirotor` number out of range; the engine clamps it.
- nav-undeclared: A `navlink` in a scene that declares no navigation (no `meta.nav`, no…
- ocean-shore-without-bathymetry: `meta.environment.ocean.shore` sets `shoaling` or `breakerIndex`…
- ocean-wind-out-of-range: An ocean wind or fetch outside its range (wind above 60 m/s or below…
- outliner-folder-stale: Every Outliner folder entry names a root entity
- outliner-folder-unknown-entity: A `meta.outliner.folders` entry names no root entity: no entity has…
- play/dead-button: a menu button that, pressed, changed nothing: no screen opened or…
- play/dialog-never-closes: a blocking dialog kept turning pages (each press changed what it…
- play/drive-hits: a driven player hit obstacles (entities tagged cone, pylon, barrier…
- play/ended-early: the game put up a screen that owns the input and could not be answered…
- play/interaction-noop: the bot walked to an interactable, pressed interact, and nothing…
- play/interaction-unreached: the interaction sweep could not walk to an interactable or a trigger…
- play/menu-dead-end: a screen reached from the menus that neither Back nor any of its…
- play/no-goals: the scene has no goal component, so the playtester had nowhere to…
- play/over-budget: at the pace the run was making, the goals left would not fit in the…
- play/script-error: a behaviour other than the player's threw or overran its budget during…
- play/softlock: no progress toward a goal and no change anywhere in the world for a…
- play/untested-flows: the scene has no goal component and its project has no self-test…
- prefab-override-stale: Every prefab override still points at something in its prefab
- prefab-override-unknown: An override on an instance does not apply to its prefab: no such…
- render-clouds-without-atmosphere: `sky.clouds` is set on a sky whose `kind` is not `"atmosphere"` (no…
- render-field-ignored: A `meta.environment.fog` field its mode does not read: density or…
- render-ocean-without-hd: `meta.environment.ocean` in a project whose `render.profile` is not…
- render-waterways-without-hd: A `waterways` component in a project whose `render.profile` is a known…
- ripples-out-of-range: `meta.environment.ripples` with a value outside its range: `cells`…
- scene-over-triangle-budget: The scene's meshes add up to more full-detail triangles (each mesh at…
- shader-cost-high: The shader's static cost estimate is over the soft cap for the…
- shot-blend-long: A shot's `blendIn.time` is longer than the shot, so the blend never…
- sky-color-ignored: `meta.environment.skyColor` is set and the sky is not `"kind"…
- sky-envmap-conflict: `sky.asset` and the deprecated `envMap` name different assets.
- spring-needs-animator: A `springBones` on an entity with no `animator`: there is no skeleton…
- static-overlap: Static trimeshes do not intersect
- terrain/entity-buried: a collider's base is more than 0.25 m under the terrain's ground at…
- terrain/entity-floating: a static collider's base is more than 0.5 m above the terrain's ground…
- terrain/look-far-ground-off: the terrain is over a kilometre across and surface.groundDetail is…
- terrain/look-far-rock-off: more than 1% of the terrain is steeper than 35 degrees and…
- terrain/look-rock-detail-off: more than 1% of the terrain is steeper than 35 degrees and…
- terrain/look-tint-clamped: a terrain layer's tint is over 4 on a channel: the renderer clamps…
- terrain/road-buried: a stretch of road (its centre, its edges and the footprint of each…
- terrain/spawn-slope: a spawn stands on ground steeper than a character can stand on (the…
- tick-rate-low: `meta.tickRate` below 15 ticks a second: motion, physics contacts and…
- trigger-needs-trigger-collider: A `trigger` component sits on an entity with no `isTrigger` collider.
- trigger-volume-unheard: A trigger volume that behaviours listen for has a trigger component
- ui-colour-only: a state that differs from its siblings only in colour
- ui-contrast: text below the minimum contrast against its resolved background
- ui-default-font: The game's screens draw in a face of its own, not only the engine's…
- ui-ellipsis: text cut off by an ellipsis, a line limit or a clip, where the rest of…
- ui-locale-gap: a key the base table has and this locale does not translate
- ui-missing-string: a text key with no string in this locale
- ui-reduced-motion: a transition still running when reduced motion is on
- ui-relayout: a node relaid out between two frames with nothing touched
- ui-scroll-hidden: a container that clips content it cannot scroll to
- ui-target-size: an interactive target below the minimum size
- ui-text-overflow: text that does not fit the box it was laid out into
- ui-untranslated: a visible string with no key, in a locale that cannot translate it
- unlit: Something lights the scene
- vehicle-cannot-steer-or-brake: No wheel has `steerable` above 0, or none has `braked` above 0.
- vehicle-capability-absent: The scene carries a `vehicle` component and this build of the engine…
- vehicle-geometry: A wheel sits outside the chassis collider's bounds, a wheel's…
- vehicle-needs-dynamic-body: The entity has no dynamic rigidbody, or no non-trigger collider, so…
- vehicle-value-implausible: A wheel radius outside 0.15..0.6 m or a chassis mass outside 400..8000…
- vfx-capacity-short: A `*.vfx.json` emitter's `capacity` is under the slots it can ask for…
- water-wake-out-of-range: A `waterWake` with a value outside its range: `strength` outside 0..1…

### Info (11)

- feel/audio-jump-silent: the jump made no sound, though the game plays sounds elsewhere
- feel/skipped: a feel probe could not run on this scene and says why
- instanced-mesh-candidate: No <…> or more copies of one static mesh written out as separate…
- play/quit: the game called ctx.session.quit() during the run; a headless engine…
- play/respawned: the game moved the player somewhere at once on the way to a goal (a…
- prefab-candidate: No <…> or more identical entities written out one by one
- prefab-depth-high: No instance nests prefabs more than <…> levels deep
- prefab-override-redundant: No prefab override repeats the prefab's own value
- prefab-override-shadowed: No override stored in a nested prefab is hidden by the instance's own
- prefab-unused: Every prefab file is placed in a scene or named by a script
- scene-unorganized: A big scene is filed into Outliner folders

## Runtime codes

What a script is thrown, a query refuses with, or the log prints. A code that is also a rule code is listed there.

- input-unknown-action: the context (the live one, or the one `rebind` named) binds no…
- input-unknown-context: `ctx.input.rebind` or `bindings` named a context the scene's…
- input-unknown-key: a `keys` entry, or a `key:`-prefixed token, is not a key name
- input-unknown-binding: a bare token matched no device, or a `pad:`/`mouse:` name is…
- input-binding-arity: the wrong number of keys for the action's kind: a 2D axis…
- input-no-map: this world has no action map, so there is nothing to rebind
- save-bad-key: the key is not 1 to 64 characters of `A-Z a-z 0-9 .
- save-full: writing the value would take the save file past its size limit
- files-path-refused: the path is not a file under the project's `data/` folder: it…
- files-missing: the project has no file at that path, the path names a folder…
- files-too-large: the file is over 1 MiB, the most `ctx.files` reads
- files-not-text: the file is not UTF-8 text
- files-bad-json: `readJson` was given a file that is not JSON; the message has…
- entity-despawned: a handle kept across frames names an entity that has since…
- entity.not-finite: `entity.yaw` was set to NaN or an infinite number…
- entity.parent-cycle: `entity.setParent` was given this entity or one of its…
- entity.parent-despawned: `entity.setParent` was given a handle whose entity has been…
- entity.parent-unknown: `entity.setParent` was given a scene id no live entity has…
- component-absent: the entity has no component of that kind to read or write…
- component-not-writable: that component cannot be written at run time; `entity.set`…
- component-field-unknown: the component has no writable field by that name
- component-field-type: a field was given a value of the wrong type (a colour that is…
- spawn-no-source: `ctx.world.spawn` was called with neither `like` nor `prefab`…
- spawn-two-sources: `ctx.world.spawn` was given both `like` and `prefab`; it…
- spawn-unknown-source: no live entity has the id `like` names; spawn copies an entity…
- spawn-unknown-prefab: `prefab` names no prefab file of the scene's project, or one…
- spawn-prefab-cycle: `prefab` names a prefab that nests itself, directly or through…
- spawn-bad-override: an `overrides` key does not apply to the prefab (no such…
- spawn-duplicate-id: the `id` asked for is empty or already taken by a live entity
- spawn-unsupported: this world cannot spawn entities (a headless or mock world)
- animator-play-unknown: `play` named a state, or a `then`, the animator does not have…
- animator-play-invalid: a `blend` or `blendOut` time is negative or not a number…
- animator-param-unknown: the animator declares no parameter by that name, or the entity…
- animator-ik-unknown: the animator declares no IK chain by that name, or the entity…
- animator-look-at-missing: the animator component declares no `lookAt`, or the entity has…
- animator-layer-unknown: `play(name, { layer })`, `layerWeight` or `stopLayer` named a…
- animator-morph-unknown: `ctx.animator.setMorph` or `morph` named a morph channel the…
- animator-layer-bone-unknown: a layer's `mask` (`include`, `exclude` or `weights`) names a…
- animator-loop-seam: a looping state plays a clip whose last frame is far from its…
- animator-stride-rate: a point of a stride-matched blend tree plays at more than 3x…
- animator-clip-missing: an animator state's `clip` is not a clip of the asset nor of…
- animator-window-unreachable: a one-shot state (`once`, or `ctx.animator.play` with…
- animator-retarget-clips-invalid: an asset in `retarget.clips` has no skeleton and clips, or its…
- animator-retarget-suspect: the retarget map is legal but probably wrong: its left and…
- animator-root-motion-hips: a `rootMotion` state plays a clip whose root does not travel…
- animator-root-motion-joint-missing: the animator's `rootMotionFrom` names a joint the rig does not…
- animator-transition-unheard: an animator has transitions whose `on` nothing hands to it…
- animator-unknown: `set` named a state the animator does not have, so nothing…
- sprite-play-unknown: `play` named an animation the sprite's component does not…
- sprite-frame-unknown: `ctx.sprite.frame` was set to a name no frame of the sprite has
- sprite-image-missing: a sprite picture's asset did not load: it is not in…
- sprite-map-size: a sprite's `normalImage` or `emissiveImage`, or a tileset's…
- sprite-rect-outside: a view's `rect` reaches outside its image, so it was clamped…
- tilemap-layer-unknown: `ctx.tilemap.get`, `set` or `size` named a layer the component…
- tilemap-sheet-short: the tileset image is smaller than `grid` × `tileSize` (with…
- scene-load-failed: a scene switch was refused and the current scene is still…
- scene-no-root: this world was opened from a document, not a file, so it has…
- scene-path-refused: the scene path breaks a project-path rule (absolute, `..`…
- scene-missing: there is no scene file at that path in this project
- scene-invalid: the scene file is not a valid scene; the message lists the…
- script-import: a behaviour imports something the engine does not bundle: an…
- author-failed: an authoring script (`authoring/<name>.ts`, run by…
- data.record: `ctx.data.record(name, value)` was given a name that is not 1…
- script-error: a behaviour threw, ran away (work budget or hard cap) or was…
- web-unsupported: a behaviour running in the web runtime called a `ctx` member…
- script-warning: a behaviour did something the engine accepted but that is…
- camera-fov-overrides-scene: a script's `ctx.camera.set(kind, { fov })` differs from the…
- camera-probe-wider-than-body: `ctx.camera.set`'s `probeRadius` is wider than the body the…
- views-layout-unknown: `ctx.views.setLayout` was given a name that is not a layout…
- views-out-of-range: a `ctx.views` member was given a view number that is not a…
- camera-overlay-not-drawn: the scene has a camera with `output: "overlay"`, which the…
- audio-loops-stacked: three or more loops of one sound play at once with none placed…
- audio-reach-invalid: `ctx.audio.play` was given a `range` or `lowPassAtRange` that…
- particles-override-ignored: a `ctx.particles.emit` override key is not a particle…
- particles-param-unknown: an effect param was not applied: the `particles` component's…
- particles-effect-unknown: `ctx.particles.play` named an effect the scene did not load…
- particles-texture-missing: a `*.vfx.json` emitter's sprite texture did not load, so that…
- particles-shape-missing: a `*.vfx.json` `mesh` or `image` shape could not be baked from…
- particles-collide-unavailable: a `*.vfx.json` effect has a `collide` module, but the engine…
- teleport-heading-ignored: a tool's `POST /entity/{id}/teleport` gave the character the…
- behaviour-prop-unknown: a `class X extends Behaviour` was given a script prop with no…
- behaviour-hook-unknown: a `class X extends Behaviour` has a method `Behaviour` never…
- behaviour-detached: a `Behaviour` instance's engine members were used on an…
- input-read-without-routing: A behaviour read `ctx.input` on an entity that has the handle…
- script-unknown-hook: a behaviour's default export has a member named like another…
- script-module-state: a behaviour's `update`, `updateAll`, `pausedUpdate` or an…
- script-state-handle: a behaviour keeps an engine object, such as an entity handle…
- resim-mismatch: the re-simulate-twice check (`POST /desync { "resim": true…
- xr.hand-unknown: `ctx.xr.hand` or `ctx.xr.vibrate` was given a hand other than…
- xr.vibrate-invalid: `ctx.xr.vibrate` was given `seconds` or `frequency` that are…
- time.after-invalid: `ctx.time.after` was given seconds that are negative or not…
- null-handle: a behaviour read `ctx.animator`, `ctx.controller`, `ctx.nav`…
- script-call-inapplicable: a behaviour called `entity.visible = …` on an entity with no…
- teleport-position-ignored: a tool's teleport (`POST /entity/{id}/teleport`, an editor…
- body.not-finite: a `ctx.body` force, torque, impulse or point has a NaN or…
- body.velocity-not-dynamic: `ctx.body.velocity` was assigned on a kinematic or static…
- body.space-invalid: a `ctx.body` push was given a `space` other than `"world"` or…
- joint.motor-invalid: `ctx.joint.setMotor` was given a target that is not finite, a…
- joint.limits-invalid: `ctx.joint.setLimits` was given something other than `[min…
- physics.layer-unknown: an entity's `layer` (or a camera's `layers`, `hideLayers` or…
- physics.controller-enclosed: a character's `controller` capsule as the scene placed it…
- physics.mesh-collider-moved: an entity with a mesh collider moved after the collider was…
- vehicle.not-finite: `ctx.vehicle.drive` was given a `throttle`, `brake`, `steer`…
- vehicle.boost-invalid: `vehicle.boost(speed, seconds)` was given a `speed` or…
- vehicle.not-own: `drive`, `reset` or `wheels` through another entity's vehicle…
- vehicle.flight-invalid: `entity.fly` got an unknown field or a wrong value…
- body.not-own: `wheels` through another entity's body (`other.body` in a…
- wheel.not-finite: `ctx.wheel.setMotorTorque`, `setBrakeTorque`, `setSteer` or…
- wheel.tyre-invalid: `ctx.wheel.setTyre` was given a negative `grip` or `rolling`
- world.weather-invalid: `ctx.world.setWeather` was given a `rain` or `wetness` outside…
- fluid.sample-invalid: `ctx.water.sample`, `ctx.wind.sample`, `ctx.water.poke` or…
- water.sea-invalid: `ctx.water.setSea` was given something it cannot use: no…
- wind.set-invalid: `ctx.wind.set` was given something that is not an object of…
- physics.buoyancy.probe-cap: a `buoyancy` hull asked for more than 256 probes (an `auto`…
- physics.water.lake-cap: the scene has more than 4 `water` components; only the 4 with…
- physics.water.river-cap: the terrain's hydrology has more than 32 rivers or 256 k…
- render.hd.water.river-id-unknown: a `waterways` override names a river, waterfall or lake id the…
- render.hd.water.river-junction-gap: a tributary ends more than 5 cm above or below the river it…
- render.hd.water.river-flow-inconsistent: for one river the discharge its drawn geometry carries (width…
- physics.buoyancy.force-refused: the solver refused a buoyancy force on a body that should be…
- render.camera-texture-missing: a material names `"camera:<id>"` as a texture, but the scene…
- render.hd.unavailable: the HD renderer could not start on this device, so the…
- project-kind-2d-hd: a project with `kind` `"2d"` asks for `render.profile` `"hd"`…
- render-backend-forced-unavailable: the project forces a graphics backend (`render.backend`…
- render.hd.black_frame: an HD frame read back for `--record`, `--out` or a capture…
- render.hd.rt_unavailable: the device or build has no ray tracing, so HD3 ray-traced…
- render.hd.rt_mesh_too_large: a mesh's geometry does not fit HD's ray-tracing vertex and…
- render.hd.rt_mesh_proxied: a static mesh's geometry does not fit HD's ray-tracing vertex…
- render.hd.cloud_shadow_unavailable: the device allows fewer than 17 sampled textures per shader…
- render.hd.horizon_map_unavailable: the device allows fewer than 18 sampled textures per shader…
- render.hd.vg_streaming_auto: the virtual-geometry meshes' pages no longer fit one resident…
- render.hd.vg_resident_full: a headless run, capture or `--record` keeps frames exact, so…
- render-lut-missing: `meta.render.look.lut` names a `.cube` file that is not in the…
- render-lut-invalid: `meta.render.look.lut`'s file is not a 3D `.cube` LUT (a 1D…
- render-tonemap-substituted: `meta.render.tonemap` names a curve the renderer does not…
- render.hd.rt-proxy-invalid: a virtual-geometry mesh was given its own ray-tracing proxy…
- render.hd.rt-deform-over-budget: swaying virtual-geometry instances within the ray-tracing…
- render.hd.screen-fx-views: a frame of several views (a headset's stereo pair) on HD…
- render.hd.pass-point-skipped: a `kind: pass` escape-hatch shader at `afterOpaque` or…
- render.standard.layer-mask-from-ignored: a material file's layer has `maskFrom` reading the mesh's…
- render.uv-scroll-ignored: a material file sets `uvScroll` but is drawn by a renderer…
- material-graph-variants: more than 16 distinct material `maskGraph`s are in the scene…
- material-layer-rows: a material asks for more than 3 layers (through a `maskGraph`)…
- render.hd.shading_substituted: a material draws with vertex (Gouraud) shading…
- render.hd.splat_format: a Gaussian splat file is not one the loader reads (not a 3DGS…
- render.hd.splat_truncated: a Gaussian splat file ends before the data its header…
- render.hd.splat_too_large: a splat capture has more splats than one HD renderer holds…
- render.sky.background_hd: a scene's `sky.background` is drawn by the standard renderer…
- splat-view-outside: the camera stood more than 1 m outside where a `splat` capture…
- quality-value-out-of-range: a quality knob was outside its range and was clamped
- quality-value-not-finite: a quality knob was NaN or infinite and the preset's value was…
- quality-value-not-a-step: a quality knob was in range but not one of its steps (a shadow…
- quality-unsupported-on-device: the GPU cannot do what the knob asks, so it fell back to what…
- quality-custom-defaults: a custom quality profile without `basedOn` left out optional…
- quality-custom-missing: the preset is Custom and no Custom knobs were given, so High…
- quality-not-available-in-renderer: this renderer has no path for that value yet, so the knob fell…
- quality-value-unknown: a quality knob named a value this engine does not know (a…
- look-value-out-of-range: a camera look (post-processing) value was outside its range…
- look-value-not-finite: a camera look value was NaN or infinite and its default was used
- look-range-inverted: a look range's minimum was above its maximum; the maximum was…
- look-lut-path-empty: a colour LUT was given with no path, so it was dropped
- render-decal-value-out-of-range: a decal value was outside its range and was clamped
- render-decal-value-not-finite: a decal value was NaN or infinite and its default was used
- render-decal-range-inverted: a decal fade ended before it started; the end was moved to the…
- render-decal-rotation-not-unit: a decal rotation was not a unit quaternion and was normalised…
- render-decal-texture-unknown: a decal named a texture that was never registered, so that…
- render-decals-over-budget: more decals than the budget; the lowest-priority ones were…
- render-decals-unsupported: the device cannot run the decal pass, so no decal is drawn
- render.shader.fallback: a user shader's pipeline failed to compile, once per shader…
- render.shader.reload-failed: an edited shader's new version could not replace the running…
- render.shader.param-dropped: a hot reload changed a param's type (a colour became a number…
- render.shader.compiled-after-load: a user shader's pipeline was first compiled after the scene…
- render.shader.downgraded: a shader effect this device or renderer cannot draw was…
- render.shader.vg-skipped: a mesh whose shader has `vertex()` is drawn by HD's raster…
- render.shader.families-many: more shader families are visible than the advised count for…
- render.hd.user-shader-partial: HD draws a user shader family in some paths and not in others…
- render.hd.user-rt-static: HD's ray-traced paths (reflections, global illumination…
- render.screen-effect: a screen effect listed in the scene's render settings was…
- screen-effects.param-invalid: `ctx.screenEffects.setParam` was given an `effect` that is…
- screen-effects.param-refused: a `ctx.screenEffects.setParam` write is not drawn: the scene…
- environment.override-invalid: `ctx.environment.override` was given something that is not a…
- environment.override-refused: the environment a `ctx.environment.override` makes breaks a…
- bad_request: 400: the body or query parameters are wrong; the message…
- not_found: 404: the named entity, frame or navmesh does not exist
- unsupported: 501: this engine or source does not implement that endpoint
- timeout: 503: the simulation did not answer in time (paused in a…
- unavailable: 503: the command queue is full or the simulation is shutting…
- at_capacity: 503: a bounded resource is full, so the request was refused…
- internal: 500: the engine failed while answering
- stale_stamp: 409: an exact read named a committed state the server no…
- session_mismatch: 409: the session id or nonce is another server's (a restarted…
- capability_denied: 403: the session does not grant what the endpoint needs
- session_required: 428: this endpoint needs a session identity and the request…
- host_rejected: 403: the `Host` header does not name this server by a loopback…
- origin_rejected: 403: the request came from a web page on another site (`Origin`)
- unsupported_media_type: 415: a POST body that is not `Content-Type: application/json`
- nav-bounds-required: 400 on `GET /navmesh`: the navmesh has more polygons than one…
- nav-bounds-too-large: 400 on `GET /navmesh`: more polygons fall inside the bounds…
- ui.unavailable: this world has no UI runtime, so every `ctx.ui` call is refused
- ui.screen.unknown: no screen answers to that name; the message lists the ones…
- ui.screen.bad-json: the screen's description has an error, or its `render` threw…
- ui.player.input: `ctx.ui.push(name, props, { player })` named a screen that…
- ui.player.invalid: `ctx.ui.push`'s `{ player }` is not a whole number from 1 to…
- ui.screen.duplicate: a push or replace named a screen already on the stack, or two…
- ui.stack.empty: `pop` with nothing on the stack
- ui.panel.unknown: a `ctx.ui.panel*` call named an entity that has no `uiPanel`…
- ui.set.unknown-node: no screen on the stack holds that id, or a bare id is ambiguous
- ui.fx.unknown-node: `ctx.ui.fx` named a node no screen on the stack holds, or a…
- ui.fx.unknown-preset: `ctx.ui.fx` named a preset that is not in the library
- ui.fx.bad-options: `ctx.ui.fx`'s options were not `{ duration?, delay?
- ui.set.unknown-prop: the property is not bindable; the message carries the hint
- ui.set.bad-value: the property is bindable and the value is the wrong kind for it
- ui.get.unknown-node: no screen on the stack holds that id, or a bare id two screens…
- ui.get.unknown-prop: that property cannot be read
- ui.get.not-a-field: the node is not a text field, so it has no value to read
- ui.activate.no-such-node, ui.focus.no-such-node: no screen on the stack holds that id
- ui.activate.hidden: the node is under `display: none`, so it is not laid out or…
- ui.activate.disabled: the node is disabled, and a disabled node refuses activation
- ui.activate.clipped: a clipping ancestor removes every pixel of the node, and no…
- ui.activate.not-hittable: the node answers no hit test; on a click-through screen a node…
- ui.activate.not-interactive: neither the node nor any ancestor of it takes activation
- ui.activate.blocks: the node is a blocker: it takes a click only to stop one…
- ui.activate.occluded: another node is painted over the point a click would land on
- ui.activate.not-on-top: the node's screen is not the topmost screen taking input
- ui.focus.not-focusable: the node does not take focus, or is disabled
- ui.focus.unreachable: the node takes focus and Tab never arrives at it
- ui.input.no-field: text arrived and no text field holds focus, so there is…
- ui.input.bad-key: no key by that name
- ui.theme.unknown: the project's stylesheets declare no theme by that name
- ui.scale.out-of-range: the UI-scale multiplier is outside the supported range
- ui.locale.unknown: the project ships no locale by that name; the message lists…
- ui.viewport.no-surface: this source has no surface of its own, so there is nothing to…
- ui.screen.tools: the screen describer could not start, so no screen was…
- ui.screen.compile: a screen file failed to compile; it is not registered
- ui.screen.prepared: an exported build's prepared screens are missing or unreadable
- ui.screen.props-unbound: `render` reads props and the screen declares no scenario, so…
- ui.screen.scenarios: a screen declares fewer than two scenarios, so the critic and…
- ui.locale.missing-glyphs: a locale has characters no font in the project's font chain…
- ui.font.unusable: a font file under the project's `ui/fonts/` (or named by an…
- ui.tree.duplicate-id: two nodes in one screen claim one id
- ui.tree.invalid-id: a node id holds `/` or `:`, the id grammar's own separators…
- ui.style.unknown-token: a `var(--…)` or token names no declared token
- ui.style.token-cycle: tokens refer to one another in a loop
- ui.style.token-kind: a token's value is the wrong kind for the property using it (a…
- ui.style.gradient-stops: a gradient's stops are malformed or out of order
- ui.style.unsupported-value: a value the engine cannot draw for that property
- ui.style.root-size-ignored: a width or height on a screen's root is ignored; the root…
- ui.layout.grid-unsupported: that part of grid is not in the supported subset
- ui.layout.failed: layout could not place the tree
- ui.layout.grid-placement-ignored: `grid-column` or `grid-row` on an item whose parent is not…
- ui.layout.grid-tracks-truncated: a track list longer than the engine's limit; only the first…
- ui.focus.nav-target-missing: a `nav-up`/`nav-down`/`nav-left`/`nav-right` names a node that…
- ui.focus.target-missing: the initial-focus target names a node that is not there
- ui.focus.no-focusable: a screen that takes input has nothing a pad or keyboard can…
- ui.screen.missing: a screen names another screen that does not exist
- ui.screen.stack-empty: the screen stack was left empty where a screen was expected
- ui.screen.no-exit: a screen that takes input has no way back out of it
- ui.transition.not-animatable: a `transition` names a property that cannot be animated; it…
- ui.draw.rotate-unsupported: a rotation in `transform`; the node is drawn unrotated
- ui.draw.gradient-truncated: a gradient has more stops than the renderer draws; the rest…
- ui.draw.group-opacity: opacity on a group is applied to each child rather than the…
- ui.diagnostics.overflow: more diagnostics than the sink holds; the count of the dropped…
- ui.css.syntax: the stylesheet does not parse at that point
- ui.css.unknown-property: a property the engine does not support
- ui.css.unknown-value: a value the property does not take
- ui.css.unknown-unit: a unit the engine does not support
- ui.css.unknown-function: a CSS function the engine does not support
- ui.css.unknown-selector: a selector form outside the supported subset
- ui.css.combinator-depth: a selector chains more than two child or descendant…
- ui.css.unknown-at-rule: an at-rule the engine does not support
- ui.css.important: `!important` is not supported
- ui.css.media-query: media queries are not supported
- ui.css.calc: `calc()` is not supported
- ui.css.value-range: a value outside the range the property takes
- ui.css.unknown-semantic: a semantic colour or token name the theme does not define
- ui.css.unknown-size-class: a size class the engine does not define
- ui.css.reserved-token: an attempt to define a token the engine reserves
- ui.css.deferred-property: a property this engine has not implemented yet
- ui.css.physical-side: a physical side (`left`, `margin-right`) where a logical one…
- ui.css.duplicate-declaration: the same property twice in one rule; the last wins
- ui.describe.format: the screen description is not the format the engine reads
- ui.describe.unknown-role: a node's role is not one the engine knows
- ui.describe.unknown-prop: a prop the element does not take
- ui.describe.value: a prop's value is the wrong kind, a key repeats among…
- ui.describe.too-large: the description is past the size the engine reads
- ui.describe.root-id: the screen's root carries an id; it is kept as an alias of…
- ui.describe.model-view-subject.tentative: TENTATIVE (code to be numbered): a `model-view` names neither…
- ui.describe.model-view-value.tentative: TENTATIVE: a `model-view` attribute is not a documented…
- ui.model-view.count-cap.tentative: TENTATIVE: more than 4 `model-view` nodes are visible; the…
- ui.model-view.unresolved.tentative: TENTATIVE: a `model-view`'s asset path or entity name did not…
- ui.bind.unknown-node: a binding names a node the screen does not have
- ui.bind.unknown-prop: a binding names a property that is not bindable
- ui.bind.value-kind: the bound value is the wrong kind for the property
- ui.asset.image-missing: an `Image` or `Icon` names a file that is not in the project…
- ui.asset.atlas-budget: the project's UI images are over the 32 MB atlas budget
- ui.scroll.not-scrollable: `scroll-top` or `scroll-left` written to a node that is not a…
- ui.locale.file: a `ui/locales/<tag>.json` the engine cannot use; that one…
- ui.locale.missing-param: a `{name}` slot in a string has no parameter; it draws…
- ui.draw.view-box-outside: an `object-view-box` reaches past its image; the part inside…
- ui.font.face: an `@font-face` file is missing or not a font the engine…
- ui.font.glyph-missing: a bitmap font has no cell for a character in the text; it is…
- ui.layout.image-zero-size: an `image` whose file loaded laid out with no width or no…
- ui.font.unavailable: the project has screens and no font was found, so the text on…
- build.typecheck: a behaviour has a TypeScript type error at the line and column…
- build.transpile: a behaviour does not compile (esbuild's error)
- build.import: a behaviour imports something the engine does not bundle (an…
- build.sandbox: a behaviour touches something the engine's sandbox does not…
- build.module-load: a behaviour threw while its module was evaluated
- build.module-not-found: a scene names a script module with no `.ts` or `.js` file
- build.module-outside-project: a script module path leads outside the project
- build.module-unreadable: a built-in module could not be read
- build.plugin: a plugin the project lists does not resolve (not installed…
- build.scene-invalid: a scene breaks a contract rule; the message opens with the…
- build.scene-warning: a scene triggers a contract warning; the message opens with…
- build.startup-scene-missing: the project's `startupScene` is not in this revision
- build.asset-missing: a file the scene names (an asset, a texture its material file…
- build.material-layer-missing: a file a material file's `layers` need (a layer material named…
- build.material-height-on-mesh: a mesh or instancedMesh names (as `material`, or in…
- build.font-unusable: a `.ttf`/`.otf` under the revision's `ui/fonts/` does not…
- build.shader-scene-prewarm-heavy: a scene's predicted shader pre-warm (pipeline count times the…
- build.shader-hd-partial: an HD project's export packs a user shader that HD's G-buffer…
- build.shader-pass-not-exported: the project contains a `*.shader.wgsl` with `//!
- build.asset-outside-project: an asset path leads outside the project, so no revision holds it
- build.toolchain-unavailable: the TypeScript toolchain could not be found, so behaviours…
- build.transpile-failed: esbuild itself did not run to its end, or a `.js` behaviour…
- build.typecheck-failed: the TypeScript checker itself did not run to its end
- build.infrastructure: the build could not read its own inputs
- build.not-published: every check passed, but publishing the build failed
- build-not-ready: the revision asked for has no Ready build
- build-pipeline-running: a build pipeline already runs for this workspace
- build-pipeline-stopping: the build pipeline is stopping
- not-newest-revision: a newer revision has been submitted, so this one is not built
- snapshot-modified: the revision's files changed on disk after it was recorded
- plugin-native: a plugin the project lists has a compiled-in part this engine…
- plugin-failed: a plugin's compiled-in part could not start (its UDP port…
- plugin-stopped: a plugin's WebAssembly part was stopped mid-run: it ran past…
- replay-bad-file: the replay file cannot be read, is not a Talos replay, is a…
- replay-desync: a replay's playback parted from its recording: at a per-system…
- replay-load-mismatch: the replay was recorded with other simulation-affecting load…
- replay-engine-mismatch: the replay was recorded by another engine version, which does…
- replay-scene-mismatch: the scene that loaded is not the one the replay was recorded…
- replay-seed-mismatch: `--seed` names a different seed than the replay was recorded…
- replay-start-mismatch: the world is not at the tick the replay starts from
- replay-web-unsupported: a replay was asked to play in the web build, which leaves out…
- replay-camera-unknown: `--replay-camera entity:ID` names an entity the scene does not…
- journal-defs-invalid: a journal definitions file does not parse, or one of its kinds…
- environment-refused: an `environment` command (`POST /session/command`) could not…
- environment-sea-refused: an `environment` command's `seaState` was refused by the sea…
- environment-weather-refused: an `environment` command's `rain` or `wetness` was refused by…
- external-input-dropped: a plugin submitted external input (`World::submit_external`)…
- timeline-restore-inexact: a review (`POST /timeline {load}`) restored a keyframe, ran to…
- journal-kind-undeclared: an entry of a kind no definitions file declares was journaled…
- peer-protocol-mismatch: the other peer's hello is in another peer protocol (`proto`)…
- peer-engine-mismatch: the other peer runs another engine or engine version, which…
- peer-determinism-mismatch: the peers' script configs differ (`HostConfig::determinism_dige…
- peer-scene-mismatch: the peers loaded different scenes (the SHA-256 of the scene…
- peer-tick-rate-mismatch: the peers step a different number of ticks a second
- peer-seed-mismatch: the peers' world seeds differ, so every seeded draw…
- plant-bake-missing: a recipe has no cooked meshes in the project's state folder…
- plant-bake-stale: the cooked meshes are from an older recipe, an older template…
- render.hd.ground-cover-over-budget: reserved: the HD renderer will report this when a frame's…
- render.hd.ground-cover-no-height: reserved: the HD renderer will report this when a layer's…
- road-source-missing: the `road` component's `source` file is missing or unreadable…
- road-source-invalid: the road file is there but is not a valid road (bad JSON, too…
- road-material-unknown: the road file's `surface.material` is not a key of the scene's…
- road.at: `ctx.world.road(name).at(s)` was given an `s` that is NaN or…
- instances-source-missing: the `instancedMesh` component's `source` file is missing or…
- instances-source-invalid: the file is there but is not a valid instances file (wrong…
- instances-format-unsupported: the `.instances` file is a later format version or encoding…
- mesh-material-name-unknown: a `materials` key is not the name of any material of the model…
- mesh-uv-missing: a model has textured meshes and some meshes with no…
- attach-bone-unknown: the `attach` component's `bone` is not a bone of the owner's…
- attach-socket-unavailable: the `attach` component's `socket` cannot be placed on the…
- attach-skeleton-missing: the `attach` owner has no animator that built (its asset has…
- sensor-shape-unsupported: the attached entity's trigger collider is not a box, sphere or…
- lipsync-degraded: the face cannot make every viseme as written: its model lacks…
- face-degraded: `<entity>: <what is missing>; that part is off`: the model has…
- spring-bone-unknown: a chain or collider names a bone the skeleton does not have…
- spring-chain-bad: a chain is not a path down the skeleton: its `tip` is not…
- synth-bad-name: `name` is missing or is not 1 to 64 of `a-z 0-9 - _` starting…
- synth-bad-spec: the description names both `preset` and `voices` or neither…
- synth-unknown-preset: `preset` is not one of the recipe's: `blip`, `whoosh`…
- synth-bad-param: a parameter is the wrong kind or out of its range: a frequency…
- synth-bad-sample-rate: `sampleRate` is not a whole number from 8,000 to 48,000, or…
- synth-too-long: the sound would be longer than 12 s, an echo's tail included
- synth-too-large: the WAV would be over 1 MiB (about 11.9 s at 44.1 kHz)
- synth-not-found: Node, or the recipe's `synth.mjs` (under the SDK folder or a…
- synth-failed: the synthesiser ran and did not write the sound (it threw…
- unchecked-content: a headless worker started with `--require-checked` was given…
- web-exporter-missing: no Node, or no engine CLI, to run the web exporter: not named…
- web-exporter-failed: the engine CLI ended with neither a report nor an error line…
- web-export-cancelled: the web export was cancelled and the CLI stopped; the output…
- selftest-not-found: the named scenario is not `selftest/<name>.json` (or the…
- selftest-bad-scenario: the scenario is not JSON, lacks `"selfTest": 1`, has a key the…
- selftest-too-long: `maxFrames` is over 36,000 (ten simulated minutes), or…
- selftest-load-failed: the scene did not load (it does not validate, or a file it…
- selftest-crashed: the engine stopped with an internal error while playing the…

## Migrating

No migration notes are recorded for this version.
