# Talos 0.7.0 for AI

Generated from the same sources as the agent knowledge pack (pack 0b31aba780a3). 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 (6, 3 in the default list)

- `editor.hover` [editor] ~123t: Put the pointer on a control and leave it there for several frames, which is what opens a submenu.
- `explain.rule` ~102t: What a code a refusal or a finding gave you means: its severity, what triggers it, where it points, and whether a check…
- `play.measure` [measure] ~308t: Step Play tick by tick with actions held over chosen ticks, reading entity fields after each: per field first, final, m…
- `project.create` ~212t: Make a project from a template and take it as this session's: argus.project.json and scenes/main.scene.json only, no ed…
- `scene.read` ~228t: [editor or disk] The scene as canonical JSON (argus://contract/scene): the editor's document (unsaved edits too), else…
- `ui.schema` [ui] ~203t: [editor or disk] Every style property, unit, selector, pseudo-class, role, design token, binding and refusal code this…

## 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, lookAt:AnimLookAt, retarget:AnimRetarget, layers:AnimLayer[], rootMotionFrom:string, feet:string[]
- `attach`: to*:string, bone*:string, 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, priority:number, layers:string[], hideLayers:string[], output:CameraOutput, viewport:unknown[], 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
- `goal`: id*:string, labelKey*:string, order:number
- `hud`: element*:HudElement, textKey:string
- `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
- `label`: textKey*:string, size*:number, billboard*:boolean
- `light`: kind*:LightKind, color*:string, intensity*:number, castShadow:boolean, range:number, angle:number, indirectIntensity:number
- `lipsync`: track:string, gain:number
- `mesh`: asset*:string, material:string, materials:object, color:string, castShadow:boolean, receiveShadow:boolean, colliderMode:ColliderMode, collide:boolean
- `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, 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, 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
- `trigger`: event*:string, once: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:OceanLook
- `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[]

## 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
- environment: EnvironmentInfo
- water: WaterHandle
- wind: WindHandle
- camera: CameraHandle
- players: PlayersHandle
- views: ViewsHandle
- audio: AudioHandle
- particles: ParticlesHandle
- labels: LabelsHandle
- render: RenderHandle
- 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
- 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
- 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: (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
- window(name: string): boolean
- bone(name: string, pose?: "final" | "animated"): 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. A message opens with its code.

- `air-out-of-range` (warning): `meta.environment.air` with a value outside its range: `density` outside 0..10 kg/m3, `wind.speedMp…
- `animator-blend-coverage` (error): A blend tree's points do not cover its parameter space: two at one coordinate, or a plane's worth a…
- `animator-blend-degenerate` (error): A blend tree has too few points for its kind: fewer than two on a line, fewer than three on a plane.
- `animator-blend-parameters` (error): A blend tree reads the wrong number of parameters, one the animator does not declare, the same one…
- `animator-damp-invalid` (error): An animator parameter's `damp` is negative (a smoothing time cannot be); a non-finite one is `anima…
- `animator-event-data-invalid` (error): An animation event's `data` has too many keys or is too large.
- `animator-event-invalid` (error): An animation event sits outside its clip (`at` not in 0..1), or names no clip or no event.
- `animator-event-window-invalid` (error): An animation event's `until` / `untilFrame` is not a window: not above its start, past the end of t…
- `animator-feet-invalid` (error): An `animator.feet` names fewer than two or more than four joints, an empty name, or one name twice.
- `animator-ik-invalid` (error): An IK chain has a duplicate name, a bone listed twice, both kinds of pole, a pole bone from its own…
- `animator-initial-undefined` (error): `animator.initial` is not one of the animator's state names.
- `animator-invalid` (error): Animator states, transitions, blend trees, events and clips resolve
- `animator-layer-invalid` (error): An animator layer that cannot be built: an empty or repeated name, a weight outside 0..1, a negativ…
- `animator-look-at-invalid` (error): A look-at has no bones, a bone listed twice, an empty bone name, a limit outside 0..180 degrees, a…
- `animator-loop-range-invalid` (error): An animator state's or blend point's `loopStart`/`loopEnd` is outside 0..1, or `loopStart` is not b…
- `animator-not-finite` (error): A blend point, a parameter value, an animation event position or a transition blend time is NaN or…
- `animator-once-invalid` (error): A one-shot state (`once`) loops, hands over to a state that does not exist or to itself, lets an un…
- `animator-rest-pose-straight` (error): A rig with foot IK rests with its legs bent enough to plant a foot downhill
- `animator-retarget-duplicate` (error): Two of a retarget map's keys name the same bone of the target rig, so one of the two limbs loses it…
- `animator-retarget-unmapped` (error): A retarget map leaves a bone the built-in clips animate unmapped, names a bone the profile does not…
- `animator-root-motion-source` (warning): A state with `rootMotion` reads a parameter bound to a measured-velocity source, which is a closed…
- `animator-speed-invalid` (error): An animator state's or blend point's `speed`, or a `speedParam.scale`, is negative, NaN or infinite…
- `animator-state-duplicate` (error): Two of an animator's states share a name, so `initial` and every transition are ambiguous.
- `animator-state-source` (error): An animator state has both a `clip` and a `blend`, or neither.
- `animator-transition-undefined` (error): An animator transition targets a state that does not exist.
- `asset-builtin-unknown` (error): An `assets[*].path` of `builtin:<name>` names nothing built in: a `glb` asset whose name is not one…
- `asset-forward-invalid` (error): An `assets[*].forward` sits on an asset that is not a model, so there is no nose to turn.
- `asset-import-invalid` (error): An `assets[*].import` declares a scale or an axis pair that cannot be applied.
- `asset-path-not-relative` (error): An `assets[*].path` is absolute, names a drive, or climbs out with `..`.
- `attach-owner-missing` (error): An `attach.to` that names no entity of the scene, or the attached entity itself.
- `attach-owner-no-animator` (error): An `attach.to` that names an entity with no `animator` component, so there is no skeleton to follow.
- `audio-bus-unknown` (warning): Every bus meta.audio names is a bus meta.audio declares
- `audio-missing-file` (warning): Every sound the scene names is an audio asset that exists
- `audio-orphan` (warning): Spatial audio sits on something with a position you can see
- `behavior-position-ignores-teleport` (warning): A behaviour that writes a position every tick from its own state adopts a teleport
- `behavior-wrap-drops-event` (warning): A behaviour that runs another's init or update forwards its onEvent too
- `buoyancy-without-body` (error): A `buoyancy` component on an entity that has no `rigidbody` of kind `dynamic`: forces only move a d…
- `buoyancy-without-ocean` (error): A `buoyancy` component in a scene with no `meta.environment.ocean` and no `water` component: there…
- `camera-clip` (warning): The camera's default position is not inside or behind geometry
- `camera-hides-everything` (warning): A camera's `layers` / `hideLayers` leaves out every layer the scene's meshes and sprites are on, so…
- `camera-layers-invalid` (error): A camera sets both `layers` and `hideLayers`, or one of them is an empty list.
- `camera-point-invalid` (error): `GET /camera/project` or `GET /camera/ray` was given a missing or non-finite `x`, `y` or `z`, an un…
- `camera-priority-tie` (warning): Two or more screen cameras share the top priority and none of them is `primary`, so scene order pic…
- `camera-projection-invalid` (error): A `camera`'s `orthoSize` or `pixelsPerUnit` that is not a finite number above zero: an orthographic…
- `camera-rig-invalid` (error): A camera's `rig`, `output` or `blendIn` cannot work: a following rig with no `target`, `viewport` w…
- `camera-view-unknown` (error): `GET /camera/project` or `GET /camera/ray` named a `view` the running world does not have: not a nu…
- `character-unanimated` (warning): A skinned character with a controller has an animator whose states follow movement
- `collider-detail-ignored` (warning): A `collider.detail` sits where nothing reads it: on a box, sphere or capsule, or on a trimesh whose…
- `collider-material-invalid` (error): A `collider.material` has a negative friction, a restitution outside 0..1, or a slope limit outside…
- `controller-invalid` (error): A `controller.gravity` is negative, a `controller.maxFallSpeed` is 0 or less, or a `controller.step…
- `dangling-asset` (error): An asset reference names a key that is not in `scene.assets`.
- `dangling-parent` (error): `entity.parent` names an entity that is not in the scene.
- `dangling-ref` (error): Asset, script, parent and target references resolve
- `dangling-target` (error): `camera.target` names an entity that is not in the scene.
- `duplicate-entity-id` (error): Two entities share an id.
- `dynamic-needs-collider` (warning): A `rigidbody` of kind `dynamic` has no non-trigger collider.
- `face-invalid` (error): A `face` that is wrong whatever the model is: no `animator` on the same entity; `blink` (0..60), `g…
- `feel/action-out-of-reach` (warning): an action's hit volume (an attached trigger collider) never came within 0.25 m of the nearest thing…
- `feel/action-window-unreachable` (error): an action's cancel window (cancel, combo, chain) opens after the animator's state has already hande…
- `feel/anim-backwards` (error): the character walks backwards: its planted foot is carried the body's way at about twice its speed,…
- `feel/anim-bind-pose` (error): a skinned character stood in its bind (T-)pose: no clip reached the skeleton while the probe drove…
- `feel/anim-foot-slide` (error): the planted foot slid over the ground: the locomotion clip's pace does not match the ground speed (…
- `feel/anim-frozen` (error): an animator's clip did not advance: the playhead and pose stayed still while the state said it was…
- `feel/anim-loop-seam` (warning): a looping state plays a clip whose last frame does not meet its first (or one clip of a clips state…
- `feel/anim-no-air-state` (warning): the character left the ground and the animator kept its grounded state: no jump or fall pose
- `feel/anim-no-handle` (error): a behavior read ctx.animator and got null (the engine's null-handle warning): the entity has no run…
- `feel/anim-pop` (error): a joint turned far more in one tick than on the ticks either side while the probes drove the charac…
- `feel/anim-run-in-place` (warning): a walk or run clip played while the body stood still (not reported for an animator the stick does n…
- `feel/anim-slow-response` (warning): the player's animator answered a press (move or jump) more than 6 ticks late: the state or its blen…
- `feel/anim-stuck` (error): the body moved but the animator stayed in the state and clip it had while standing, so the characte…
- `feel/anim-unknown-name` (error): ctx.animator.set or play named a state or clip this animator does not have; set changes nothing, so…
- `feel/audio-jump-silent` (info): the jump made no sound, though the game plays sounds elsewhere
- `feel/audio-loops-stacked` (warning): three or more copies of one loop played at once with none placed in the world: they add up to one l…
- `feel/audio-none` (warning): the scene has gameplay events (a jump, goals, triggers, emitted events) and no audio anywhere: no a…
- `feel/audio-silent` (warning): not one voice started: the player jumped or reached goals, or 30 s went by, in silence
- `feel/audio-unplayable` (warning): the game called ctx.audio.play for assets with no sound behind them, so nothing played
- `feel/buried` (error): a body a script or kinematic body moves went more than 0.15 m into the ground under it for 3 reads…
- `feel/camera-clip` (error): the camera's near plane was inside a collider: the frame showed the inside of a wall
- `feel/camera-close` (warning): the camera sat within 0.3 m of solid geometry in more than 15% of samples: most of the frame is a s…
- `feel/camera-collapsed` (warning): the camera's arm (or its distance to the player) was under 1 m in more than 5% of samples, so the v…
- `feel/camera-occluded` (warning): something solid hid the player from the camera for longer than a second
- `feel/camera-target-hidden` (warning): the focus target (the lock target, else the nearest opponent, else the next goal) was behind the pl…
- `feel/camera-wall-collapse` (error): walked into a wall, the camera's arm pulled in under 1 m though the space behind the character alon…
- `feel/controls-dead` (error): no stick direction moved the player (after the probe held input for the wait cap, 12 s of simulated…
- `feel/controls-rotated` (error): a stick direction moved the player the wrong way on screen: over 30° off by half a second, or over…
- `feel/facing-actions-silent` (warning): the aimed buttons (fire, use, interact) raised no event once a teleport faced the player at somethi…
- `feel/impact-no-reaction` (warning): the victim of an impact did not react within 300 ms: it moved under 5 cm, kept its animation state,…
- `feel/impact-silent` (warning): an impact (the player's sensor on something, another character's sensor on the player, or a hit, da…
- `feel/look-capped` (error): mouse look has a top speed: a fast synthetic mouse sweep turned the view fewer degrees per pixel th…
- `feel/movement-facing-off` (warning): at steady speed the character faced over 60 degrees off the way it travelled: it moves sideways or…
- `feel/movement-slippery` (warning): the walker took over 1.5 s to stop after the stick was let go: it slides
- `feel/movement-sluggish` (warning): the walker took over 1.5 s to reach 90% of its top speed with the stick held: it feels heavy
- `feel/movement-steer-dead` (warning): a full steer at 90% of top speed turned the vehicle under 3 deg/s: the steering does nothing
- `feel/movement-turn-slow` (warning): the character turned under 60 deg/s to a 90 degree stick flick at speed: it does not follow the sti…
- `feel/player-died-in-probe` (error): the player died or respawned during a probe, so later rows are unmeasured
- `feel/player-fell-off` (warning): the player walked off the level and fell (nothing under it), so the camera lost it
- `feel/response-dead` (warning): pressing a gameplay action changed nothing in half a second: no bus event, animator state, pose, ve…
- `feel/response-slow` (warning): a gameplay action's press was answered (animator state, pose, velocity or camera) later than the bu…
- `feel/roll-mismatch` (warning): a ball moving along the ground spun against its travel (backwards, about the wrong axis, or under 3…
- `feel/skipped` (info): a feel probe could not run on this scene and says why
- `feel/telegraph-unreactable` (warning): another character's strike opened less than 250 ms (a person's reaction time) after its wind-up beg…
- `feel/teleport-facing-ignored` (error): a tool's teleport with a heading faced the player at something, and a few ticks later the view stil…
- `feel/viewmodel-static` (error): the first-person view-model (an image in the lower middle of the screen) stood still while the play…
- `floor-gap` (error): No holes in the floor under the walkable areas or around a spawn
- `fog-density-and-visibility` (error): `meta.environment.fog` writes both `density` and `visibilityM`, two spellings of the same extinctio…
- `fog-value-range` (error): A `meta.environment.fog` value is outside its range (density 0..1, heightFalloff 0.001..10, start 0…
- `gi-intensity-range` (error): An `indirectIntensity` (`meta.environment.gi`, a light, or a `giVolume`) that is not a finite numbe…
- `gi-volume-limit` (warning): More than 8 `giVolume` components of one mode; only the first 8 in scene order count.
- `gi-volume-shape` (error): A `giVolume` that cannot be built: a `size` axis of 0 or less or not finite, a `blend` below 0 or n…
- `goal-order` (error): Goals carrying `order` do not form the strict sequence 1..n.
- `ground-cover-layer-invalid` (error): A ground cover layer or document with a value out of range: an empty id, a duplicate id, a range wi…
- `ground-cover-no-terrain` (error): A scene with ground cover and no terrain to grow it on.
- `ground-cover-source-unknown` (error): A ground cover layer whose `source.channel` is not a channel of the terrain.
- `ground-cover-too-dense` (error): A ground cover layer whose `densityPerM2` is above 200.
- `hd-only-ignored` (warning): A field or component only the HD renderer draws (a `splat` component) on a project whose `render.pr…
- `hud-layout-invalid` (error): A `meta.hud` element declares a size, colour, offset or number format that cannot be drawn.
- `input-conflict` (warning): No two actions in one context share a device source
- `input-key-unknown` (warning): A `meta.input` key name the runtime binds nothing to ("Back", "Rigth"): `input-keys.ts` is the list…
- `input-reader-not-player` (warning): A behaviour that reads `ctx.input` runs on an entity player input is not routed to (the scene's `sp…
- `input-unbound` (warning): Every action a script reads is bound by the scene's action map
- `instanced-mesh-candidate` (info): No <…> or more copies of one static mesh written out as separate entities
- `joint-invalid` (error): A `joint` that cannot be built: `connectedTo` names no entity, the owner itself, or an entity with…
- `layer-unknown` (error): An entity's `layer`, or a camera's `layers`, `hideLayers` or `rig.collisionLayers`, names a layer t…
- `layers-in-project-scene` (error): A scene inside a project declares `meta.layers`: the project's `layers` is the one table.
- `layers-invalid` (error): A standalone scene's `meta.layers` is not a layer table: more than 32, a repeated or badly formed n…
- `light-directional-horizontal` (warning): Every directional light in the scene lies within 5 degrees of the horizon (none points further down…
- `lipsync-invalid` (error): A `lipsync` component that cannot move a mouth: its entity has no `animator` (the model whose morph…
- `lipsync-track-unknown` (error): `lipsync.track` names a scene asset whose kind is not `visemes`.
- `material-field-ignored` (warning): A `*.material.json` field that nothing reads: `alphaCutoff` without `alphaMode` mask, a `normalScal…
- `material-height-from-mixed` (error): The layers of one `*.material.json` that have `maskFrom.heightM` disagree on `maskFrom.heightFrom`…
- `material-mask-from-wear-both` (error): A layer of a `*.material.json` has more than one of `maskFrom.edge`, `cavity`, `ao`, `convexity` an…
- `material-shader-missing` (error): A `*.material.json` `shader` names no file the project holds, or its reference is empty, absolute,…
- `material-shader-param-range` (error): A `*.material.json` `params` value is outside the `[min, max]` its shader's header declares.
- `material-shader-param-unknown` (error): A `*.material.json` `params` key is not a `param` or `texture` the shader declares (an `instance` v…
- `material-texture-invalid` (error): A `*.material.json` texture reference is empty, absolute, names a drive or climbs out with `..`, or…
- `material-value-range` (error): A `*.material.json` number is outside its range or not finite: a colour or factor outside 0..1, a n…
- `mesh-collide-conflict` (warning): A mesh's `colliderMode` and its deprecated `collide` disagree.
- `missing-collider` (error): Dynamic bodies have a collider; triggers have a trigger collider
- `missing-string` (warning): Every text key resolves in meta.strings
- `nav-undeclared` (warning): A `navlink` in a scene that declares no navigation (no `meta.nav`, no `navagent`): no navmesh is bu…
- `navlink-invalid` (error): A `navlink.hold` is negative or not finite.
- `navmesh-failed` (error): The navmesh builds and has polygons
- `navmesh-trap` (error): No walkable region the player can get into and not out of
- `ocean-bathymetry-asset-missing` (error): `meta.environment.ocean.bathymetry.asset` names an asset that is not in `assets`.
- `ocean-bathymetry-not-16bit` (error): The bathymetry asset is not a 16-bit greyscale PNG: not a `texture` asset, or a path that does not…
- `ocean-bathymetry-range-invalid` (error): A bathymetry value that cannot describe a raster: `sizeM` not above 0 or not finite, `stepM` not ab…
- `ocean-layer-field-mismatch` (error): An ocean wave layer with fields of the other kind: `windSpeedMps` or `fetchKm` on a swell, `heightM…
- `ocean-shore-without-bathymetry` (warning): `meta.environment.ocean.shore` without a `bathymetry`: nothing for the shoreline controls to act on…
- `ocean-swell-without-period` (error): An ocean `swell` layer with no `periodS`: a swell is defined by its period.
- `ocean-wave-mask-asset-missing` (error): `meta.environment.ocean.waveMask.asset` names an asset that is not in `assets`.
- `ocean-wave-mask-not-greyscale` (error): The wave mask asset is not a greyscale PNG: not a `texture` asset, or a path that does not end in .…
- `ocean-wave-mask-range-invalid` (error): A wave mask value that cannot describe a raster: `sizeM` not above 0 or not finite, a non-finite `o…
- `ocean-weather-not-ascending` (error): A `meta.environment.ocean.weather` whose `timeS` values are not strictly ascending (a repeat counts…
- `ocean-wind-out-of-range` (warning): An ocean wind or fetch outside its range (wind above 60 m/s or below 0, fetch outside 1..2000 km):…
- `out-of-bounds` (error): An entity's world position is outside `meta.bounds` (critic.check also reads a scale axis under a m…
- `outliner-folder-stale` (warning): Every Outliner folder entry names a root entity
- `outliner-folder-unknown-entity` (warning): A `meta.outliner.folders` entry names no root entity: no entity has that id, or it has a parent (a…
- `over-budget` (error): Triangles, draw calls, texture MB and dynamic bodies within meta.budgets
- `parent-cycle` (error): Parent chain loops back on itself.
- `particles-source` (error): Exactly one of `particles.preset` and `particles.effect` is required, and `particles.material` is n…
- `physics-quality-invalid` (error): A `meta.physics.overrides` number is outside its range: solverIterations 1..64 and substeps 1..16 (…
- `plant-material-missing` (error): A foliage recipe whose `materials` names a project file that does not exist.
- `plant-param-invalid` (error): A foliage recipe value the generator cannot take: a parameter that is not a number or a `[min, max]…
- `plant-species-unknown` (error): A foliage recipe whose `species` is not one of the closed species list.
- `plant-template-locked` (error): A foliage recipe that sets a parameter its template locks, because changing it breaks the template'…
- `plant-template-unknown` (error): A foliage recipe whose `template` names no library or project template.
- `plant-too-heavy` (error): A plant whose level-0 mesh has more than 150,000 triangles.
- `plant-variants-invalid` (error): A foliage recipe with `variants` outside 1..64, or more than 8 `ages`.
- `play/bad-start` (error): critic.play's from named no goal or entity of the scene, or the player could not be put there
- `play/dead-button` (warning): a menu button that, pressed, changed nothing: no screen opened or closed, nothing it shows, no stat…
- `play/dialog-never-closes` (warning): a blocking dialog kept turning pages (each press changed what it shows) and was still up after 24 o…
- `play/drive-hits` (warning): a driven player hit obstacles (entities tagged cone, pylon, barrier, …) or drew the game's penalty…
- `play/ended-early` (warning): the game put up a screen that owns the input and could not be answered (its own results or game-ove…
- `play/fell-out` (error): the player fell below the scene's bounds on the way to a goal
- `play/interaction-noop` (warning): the bot walked to an interactable, pressed interact, and nothing happened: no event, no change in t…
- `play/interaction-unreached` (warning): the interaction sweep could not walk to an interactable or a trigger to try it
- `play/menu-dead-end` (warning): a screen reached from the menus that neither Back nor any of its buttons leaves
- `play/no-goals` (warning): the scene has no goal component, so the playtester had nowhere to walk; nothing was driven, no rout…
- `play/no-player` (error): no entity carries a controller or a vehicle component, so the playtester has nothing to drive
- `play/no-response` (error): the playtester pressed every action the game declares, each one many times, and none of them change…
- `play/nothing-to-drive` (error): no entity carries a controller or a vehicle, and the input context in force declares no actions, so…
- `play/over-budget` (warning): at the pace the run was making, the goals left would not fit in the simulated time budget, so it st…
- `play/player-script-error` (error): the player's own behaviour threw or overran its budget during the run; when the engine disabled it…
- `play/quit` (info): the game called ctx.session.quit() during the run; a headless engine keeps running
- `play/respawned` (info): the game moved the player somewhere at once on the way to a goal (a respawn at a checkpoint, a send…
- `play/script-error` (warning): a behaviour other than the player's threw or overran its budget during the run, and the engine disa…
- `play/softlock` (warning): no progress toward a goal and no change anywhere in the world for a while
- `play/stuck` (error): the bot stopped moving on the way to a goal (blocked by an entity, or no path there), or kept movin…
- `play/timeout` (error): the run spent its simulated time budget before reaching every goal
- `play/trigger-noop` (error): the player walked through a trigger volume and its event never fired
- `play/unknown-goal` (error): critic.play was asked for a goal id the scene does not have
- `play/untested-flows` (warning): the scene has no goal component and its project has no self-test scenario (selftest/*.json), so no…
- `player-spawn` (error): No entity carries a `spawn` component with `for: "player"`.
- `prefab-candidate` (info): No <…> or more identical entities written out one by one
- `prefab-cycle` (error): A prefab that contains itself, through `source` instances: a.prefab.json holds an instance of b.pre…
- `prefab-depth` (error): Prefabs nested more than 8 levels deep (the scene instance's own prefab is level 1).
- `prefab-depth-high` (info): No instance nests prefabs more than <…> levels deep
- `prefab-id-collision` (error): An instance expands to an entity id the scene already has, or its prefab declares an asset key the…
- `prefab-invalid` (error): A prefab file that cannot be used: its shape, not exactly one root, an entity outside the root's tr…
- `prefab-missing` (error): A prefab instance's `source` does not resolve to a readable `.prefab.json` in the project.
- `prefab-override-redundant` (info): No prefab override repeats the prefab's own value
- `prefab-override-shadowed` (info): No override stored in a nested prefab is hidden by the instance's own
- `prefab-override-stale` (warning): Every prefab override still points at something in its prefab
- `prefab-override-unknown` (warning): An override on an instance does not apply to its prefab: no such entity, component or path, or the…
- `prefab-too-large` (error): One instance that expands to more than 10,000 entities, counted as it expands.
- `prefab-unused` (info): Every prefab file is placed in a scene or named by a script
- `primary-camera` (error): The scene does not have exactly one camera with `primary: true`.
- `project-default-invalid` (error): A scene rule's error on a value the scene takes from its project's defaults (argus.project.json `ph…
- `render-clouds-without-atmosphere` (warning): `sky.clouds` is set on a sky whose `kind` is not `"atmosphere"` (no `sky` means the default procedu…
- `render-field-ignored` (warning): A `meta.environment.fog` field its mode does not read: density or height on linear fog, height or e…
- `render-ocean-without-hd` (warning): `meta.environment.ocean` in a project whose `render.profile` is not `hd`: the standard renderer dra…
- `render-value-range` (error): `meta.render.exposure` is not more than 0 and at most 64, or `meta.render.scale` is outside 0.1..1.
- `render-waterways-without-hd` (warning): A `waterways` component in a project whose `render.profile` is a known profile other than `hd`: riv…
- `scale-zero` (error): A scale axis is exactly zero.
- `scene-over-triangle-budget` (warning): The scene's meshes add up to more full-detail triangles (each mesh at its asset's `triangles`) than…
- `scene-unorganized` (info): A big scene is filed into Outliner folders
- `schema-shape` (error): The document does not match the schema: wrong type, missing field, unknown key, bad enum member.
- `shader-compile-error` (error): The shader's WGSL does not compile (a name that does not exist, a type mismatch, a uniformity error…
- `shader-cost-high` (warning): The shader's static cost estimate is over the soft cap for the project's targets but under the hard…
- `shader-cost-over-cap` (error): The shader's static cost estimate (cost units per pixel, or texture fetches) is over the hard cap f…
- `shader-forbidden` (error): The shader uses something the sandbox refuses: a module-scope `var`, `@group`/`@binding`, an entry…
- `shader-header-invalid` (error): A `*.shader.wgsl` header or file shape that cannot be read: an unknown `//!` key, a malformed or re…
- `shader-loop-unbounded` (error): The shader has a `while` or `loop`, a `for` whose trip count is not a constant of at most 32, more…
- `shader-model-mismatch` (error): The functions and the `model` disagree: `model: stylized` without both `fn light(` and `fn ambient(…
- `shader-param-invalid` (error): A `param` or `instance` header line that cannot be built: a name that is not camelCase or is declar…
- `shader-raw-disabled` (error): A `*.shader.wgsl` says `kind: raw` or `kind: pass` (the escape hatch) in a project that has not set…
- `shader-texture-invalid` (error): A `texture` header line that cannot be built: a name that is not camelCase or is declared twice, an…
- `shader-variants-over-cap` (error): The project's shaders compile to more pipeline families than the cap allows.
- `shot-blend-long` (warning): A shot's `blendIn.time` is longer than the shot, so the blend never finishes, or the first shot has…
- `shot-keys-unordered` (error): A path shot's key times are not strictly ascending, or a key is past the shot's `duration`.
- `shot-target-missing` (error): A shot names an entity (`follow.entity`, a `look` or orbit `center` entity) the scene does not have.
- `shots-invalid` (error): A `meta.shots` timeline that cannot play as written: no shots or an empty path, a duration not abov…
- `sky-asset-wrong-kind` (error): `sky.asset`, or the deprecated `envMap`, names an asset whose `kind` is not `envmap`.
- `sky-color-ignored` (warning): `meta.environment.skyColor` is set and the sky is not `"kind": "color"` (no `sky` means the default…
- `sky-envmap-conflict` (warning): `sky.asset` and the deprecated `envMap` name different assets.
- `sky-hdr-needs-asset` (error): `sky.kind` is `"hdr"` and no `sky.asset` names the panorama to use.
- `sky-value-range` (error): A `sky` number is outside its stated range, or is NaN or infinite, or a `sky.background` colour is…
- `spring-collider-invalid` (error): A `springBones` collider with a `radius` that is not above 0 and at most 10, or an `offset` or `tip…
- `spring-invalid` (error): A `springBones` chain that is wrong whatever the rig is: it gives both `joints` and `root`/`tip`, g…
- `spring-needs-animator` (warning): A `springBones` on an entity with no `animator`: there is no skeleton to swing, so it does nothing.
- `sprite-frame-missing` (error): A `sprite` name that resolves to nothing: an animation lists a frame the sprite does not have, or h…
- `sprite-invalid` (error): A `sprite` that cannot draw as written: no frames; pixelsPerMetre, fps or a duration not above zero…
- `sprite-rotation-count-invalid` (error): A `sprite` frame with a number of views other than 1 (the same from every side) or 2, 4, 8 or 16 (o…
- `static-overlap` (warning): Static trimeshes do not intersect
- `steering-gameplay` (error): No behaviour reads ctx.controller.steering, which the engine removed
- `terrain-extent-invalid` (error): A terrain file whose `extentM` is not above zero on both axes, or is not a whole multiple of its `c…
- `terrain-in-2d-scene` (error): A `terrain` component in a 2D-kind project: terrain is a 3D feature.
- `terrain-layer-unknown` (error): A `shoreline`, `material.rules`, `volume.shape` or `volume.cliff` op of a terrain file names a laye…
- `terrain-layers-too-many` (error): A terrain file declares more than 8 `layers`.
- `terrain-multiple` (error): A scene with more than one `terrain` component.
- `terrain-op-id-duplicate` (error): Two ops of a terrain file's `stack` share an `id`.
- `terrain-sample-invalid` (error): A terrain file's `sampleM`, or a `detail` entry's, that is not 0.25, 0.5, 1, 2 or 4; or a `detail`…
- `terrain-transform` (error): An entity with a `terrain` component whose own transform is rotated or scaled: the entity's transla…
- `terrain-volume-invalid` (error): A `volume.shape` or `volume.cliff` op cannot be built.
- `terrain-volume-order` (error): A height or material op of a terrain file's `stack` comes after a `volume.shape` or `volume.cliff`…
- `terrain/entity-buried` (warning): a collider's base is more than 0.25 m under the terrain's ground at its x and z: the entity is sunk…
- `terrain/entity-floating` (warning): a static collider's base is more than 0.5 m above the terrain's ground at its x and z (a dynamic bo…
- `terrain/road-buried` (warning): a stretch of road (its centre, its edges and the footprint of each wall outside gapsAt, probed ever…
- `terrain/spawn-slope` (warning): a spawn stands on ground steeper than a character can stand on (the terrain layer's physics slopeLi…
- `terrainmod-no-terrain` (error): A `terrainmod` whose `terrain` names no entity with a `terrain` component, or, with no `terrain` na…
- `tilemap-invalid` (error): A `tilemap` that cannot draw as written: a tileset image that is not a `texture` asset; tileSize or…
- `tilemap-tile-unknown` (error): A `tilemap` tile that resolves to nothing: a legend index that is not a whole number below the tile…
- `tilemap-too-large` (error): A `tilemap` too big to load in one piece: more than 16 layers, a layer of more than 1024 rows or a…
- `transform-not-finite` (error): A transform component is not finite (NaN or infinity).
- `trigger-needs-trigger-collider` (warning): A `trigger` component sits on an entity with no `isTrigger` collider.
- `trigger-volume-unheard` (warning): A trigger volume that behaviours listen for has a trigger component
- `ui-clipped` (error): an interactive node a clipping ancestor cuts into
- `ui-colour-only` (warning): a state that differs from its siblings only in colour
- `ui-contrast` (warning): text below the minimum contrast against its resolved background
- `ui-default-font` (warning): The game's screens draw in a face of its own, not only the engine's fallback mono font
- `ui-ellipsis` (warning): text cut off by an ellipsis, a line limit or a clip, where the rest of the string is not on screen
- `ui-expectation` (error): the live tree is not what the component library meant to build
- `ui-field-no-label` (error): an editable field with nothing saying what it is for
- `ui-font-face-missing` (error): Every @font-face rule names a font file, and a bitmap font an atlas image, that the project has
- `ui-locale-gap` (warning): a key the base table has and this locale does not translate
- `ui-matrix-refused` (error): an engine refused a cell of the matrix
- `ui-missing-string` (warning): a text key with no string in this locale
- `ui-no-way-back` (error): a screen that takes input, cannot be dismissed, and has no way off it
- `ui-offscreen` (error): an interactive node outside the viewport
- `ui-overlap` (error): two interactive rectangles on top of each other
- `ui-reduced-motion` (warning): a transition still running when reduced motion is on
- `ui-relayout` (warning): a node relaid out between two frames with nothing touched
- `ui-scroll-hidden` (warning): a container that clips content it cannot scroll to
- `ui-start-screen` (error): `meta.ui.startScreen` is a name no `defineScreen` could have given a screen.
- `ui-target-size` (warning): an interactive target below the minimum size
- `ui-text-overflow` (warning): text that does not fit the box it was laid out into
- `ui-undefined-token` (error): a stylesheet reads a token a theme leaves undefined
- `ui-unknown-prop` (error): a node that is not a text carries words, which nothing draws
- `ui-unreachable` (error): a focusable node Tab and directional navigation never reach
- `ui-untranslated` (warning): a visible string with no key, in a locale that cannot translate it
- `unlit` (warning): Something lights the scene
- `unreachable-goal` (error): Every goal is reachable from the player spawn
- `vehicle-cannot-steer-or-brake` (warning): No wheel has `steerable` above 0, or none has `braked` above 0.
- `vehicle-capability-absent` (warning): The scene carries a `vehicle` component and this build of the engine has no vehicle capability, so…
- `vehicle-geometry` (warning): A wheel sits outside the chassis collider's bounds, a wheel's suspension travel exceeds the ground…
- `vehicle-invalid` (error): A `vehicle` that cannot be built: an unknown `preset`; a part or field missing with no preset to fi…
- `vehicle-needs-dynamic-body` (warning): The entity has no dynamic rigidbody, or no non-trigger collider, so there is nothing for the wheels…
- `vehicle-value-implausible` (warning): A wheel radius outside 0.15..0.6 m or a chassis mass outside 400..8000 kg: most likely a unit mista…
- `vfx-collide-invalid` (error): A `*.vfx.json` `collide` module names no surface, a surface that is not `ground`, `water` or `depth…
- `vfx-effect-missing` (error): `particles.effect` names no effect: not a scene asset of kind `effect`, not a `*.vfx.json` path, an…
- `vfx-event-invalid` (error): A `*.vfx.json` emitter's `role` or `events` break the event rules: an unknown role or event, a chil…
- `vfx-inherit-invalid` (error): A `*.vfx.json` emitter's `init.inherit` (the share of the emitter's own velocity a particle starts…
- `vfx-max-screen-invalid` (error): A `*.vfx.json` sprite's `render.maxScreen` is not a share of the viewport height in (0, 4], or a ri…
- `vfx-param-invalid` (error): A `*.vfx.json` binding names a param the effect does not declare, a number field binds a vec3 or co…
- `vfx-preset-invalid` (error): A `*.vfx.json` that names an effect preset (`"preset": "builtin:fx/<name>"`) names an unknown prese…
- `vfx-shape-invalid` (error): A `*.vfx.json` sprite names an unknown `render.shape` (allowed: disc, ring, star, blade, puff, flak…
- `vfx-texture-invalid` (error): A `*.vfx.json` sprite texture is empty, absolute, names a drive or climbs out with `..`.
- `vfx-texture-missing` (error): An export packs an effect (`*.vfx.json`) whose sprite, ribbon or decal texture is a path from the e…
- `vfx-value-range` (error): A `*.vfx.json` number is outside its range, a curve or gradient has more than 8 keys or keys that d…
- `water-shape-invalid` (error): A `water` component whose `size` has an axis that is not a finite number above 0: a lake needs an o…
- `water-waves-invalid` (error): A `water` component with a wave value out of range: `windMps` outside 0..30 or not finite, a non-fi…
- `watercraft-invalid` (error): A `vehicle` `water` number out of its documented range (a negative thrust, a `reverse` outside 0..1…
- `watercraft-without-buoyancy` (error): A `vehicle` with a `water` block on an entity with no `buoyancy` component: nothing floats it.
- `waterways-look-invalid` (error): A `waterways` value out of range: `roughness` outside 0.02..0.15, `flowScale` outside 0..4, `foam`…
- `waterways-override-invalid` (error): A `waterways` override that names none or more than one of river, waterfall and lake, a non-whole o…
- `waterways-without-terrain` (error): A `waterways` component with no terrain: `terrain` names no entity with a `terrain` component, or i…
- `wheel-invalid` (error): A `wheel` that cannot work: no dynamic rigidbody above it; a number non-finite, non-positive where…

## Runtime codes

What a script is thrown, a query refuses with, or the log prints.

- `input-unknown-action`: the context (the live one, or the one `rebind` named) binds no action by that name
- `input-unknown-context`: `ctx.input.rebind` or `bindings` named a context the scene's input map does not have
- `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 not one
- `input-binding-arity`: the wrong number of keys for the action's kind: a 2D axis takes four (up, left, down, rig…
- `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 is outside `data/`, climbs…
- `files-missing`: the project has no file at that path, the path names a folder, or a segment's case differ…
- `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 the line and column
- `entity-despawned`: a handle kept across frames names an entity that has since been despawned (`DespawnedEnti…
- `entity.not-finite`: `entity.yaw` was set to NaN or an infinite number (`RangeError`); the rotation is unchang…
- `entity.parent-cycle`: `entity.setParent` was given this entity or one of its descendants as the parent, which w…
- `entity.parent-despawned`: `entity.setParent` was given a handle whose entity has been despawned (`ReparentError`);…
- `entity.parent-unknown`: `entity.setParent` was given a scene id no live entity has (`ReparentError`); nothing cha…
- `component-absent`: the entity has no component of that kind to read or write (`ComponentWriteError`)
- `component-not-writable`: that component cannot be written at run time; `entity.set` takes `material`, `light` or `…
- `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 not `#rrggbb` or `[r, g, b]…
- `spawn-no-source`: `ctx.world.spawn` was called with neither `like` nor `prefab`, so it names nothing to spa…
- `spawn-two-sources`: `ctx.world.spawn` was given both `like` and `prefab`; it spawns one or the other
- `spawn-unknown-source`: no live entity has the id `like` names; spawn copies an entity the scene already has
- `spawn-unknown-prefab`: `prefab` names no prefab file of the scene's project, or one the contract refused at load…
- `spawn-prefab-cycle`: `prefab` names a prefab that nests itself, directly or through other prefabs (`prefab-cyc…
- `spawn-bad-override`: an `overrides` key does not apply to the prefab (no such entity, component or path), over…
- `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 (`AnimatorPlayError`)
- `animator-play-invalid`: a `blend` or `blendOut` time is negative or not a number (`AnimatorPlayError`)
- `animator-param-unknown`: the animator declares no parameter by that name, or the entity has no animator (`Animator…
- `animator-ik-unknown`: the animator declares no IK chain by that name, or the entity has no animator (`AnimatorI…
- `animator-look-at-missing`: the animator component declares no `lookAt`, or the entity has no animator (`AnimatorLook…
- `animator-layer-unknown`: `play(name, { layer })`, `layerWeight` or `stopLayer` named a layer the animator componen…
- `animator-morph-unknown`: `ctx.animator.setMorph` or `morph` named a morph channel the model does not have, gave a…
- `animator-layer-bone-unknown`: a layer's `mask` (`include`, `exclude` or `weights`) names a bone the rig does not have;…
- `animator-loop-seam`: a looping state plays a clip whose last frame is far from its first (or, in a `clips` sta…
- `animator-stride-rate`: a point of a stride-matched blend tree plays at more than 3x its clip's rate on its own `…
- `animator-clip-missing`: an animator state's `clip` is not a clip of the asset nor of its retargeted clips (the bu…
- `animator-window-unreachable`: a one-shot state (`once`, or `ctx.animator.play` with `blendOut`) plays a clip with a win…
- `animator-retarget-clips-invalid`: an asset in `retarget.clips` has no skeleton and clips, or its skeleton lacks the canonic…
- `animator-retarget-suspect`: the retarget map is legal but probably wrong: its left and right look swapped (by the tar…
- `animator-root-motion-hips`: a `rootMotion` state plays a clip whose root does not travel but whose hips (the canonica…
- `animator-root-motion-joint-missing`: the animator's `rootMotionFrom` names a joint the rig does not have (after `retarget.map`…
- `animator-transition-unheard`: an animator has transitions whose `on` nothing hands to it: the entity runs no built-in `…
- `animator-unknown`: `set` named a state the animator does not have, so nothing changed; printed once per enti…
- `sprite-play-unknown`: `play` named an animation the sprite's component does not declare, or a `then` that is no…
- `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 `scene.assets`, not a `texture` asset…
- `sprite-rect-outside`: a view's `rect` reaches outside its image, so it was clamped to the image's edges
- `tilemap-layer-unknown`: `ctx.tilemap.get`, `set` or `size` named a layer the component does not have; the message…
- `tilemap-sheet-short`: the tileset image is smaller than `grid` × `tileSize` (with `margin` and `spacing`) says;…
- `nav-undeclared`: the scene declares no navigation, so it has no navmesh to route on
- `scene-load-failed`: a scene switch was refused and the current scene is still running; the event's `code` say…
- `scene-no-root`: this world was opened from a document, not a file, so it has no folder to resolve a scene…
- `scene-path-refused`: the scene path breaks a project-path rule (absolute, `..`, outside the project)
- `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 contract violations
- `script-import`: a behaviour imports something the engine does not bundle: an npm package, a Node built-in…
- `author-failed`: an authoring script (`authoring/<name>.ts`, run by `behaviour.write` with `run`) did not…
- `data.record`: `ctx.data.record(name, value)` was given a name that is not 1 to 64 of A-Z, a-z, 0-9, `_`…
- `script-error`: a behaviour threw, ran away (work budget or hard cap) or was interrupted, and is disabled…
- `web-unsupported`: a behaviour running in the web runtime called a `ctx` member the web backend does not imp…
- `script-warning`: a behaviour did something the engine accepted but that is almost certainly a mistake; the…
- `camera-fov-overrides-scene`: a script's `ctx.camera.set(kind, { fov })` differs from the scene camera's `fov`, so the…
- `camera-probe-wider-than-body`: `ctx.camera.set`'s `probeRadius` is wider than the body the camera follows, so the arm sw…
- `views-layout-unknown`: `ctx.views.setLayout` was given a name that is not a layout, or `ctx.views.shared` a `spl…
- `views-out-of-range`: a `ctx.views` member was given a view number that is not a whole number from 1 to 4; it t…
- `camera-view-unknown`: `GET /camera/project` or `GET /camera/ray` was given a `view` that is not a whole number…
- `camera-point-invalid`: `GET /camera/project` or `GET /camera/ray` was given a missing or non-finite `x`, `y` or…
- `camera-overlay-not-drawn`: the scene has a camera with `output: "overlay"`, which the engine does not draw yet; the…
- `audio-loops-stacked`: three or more loops of one sound play at once with none placed in the world (`ctx.audio.p…
- `particles-override-ignored`: a `ctx.particles.emit` override key is not a particle parameter, or its value is not one…
- `particles-param-unknown`: an effect param was not applied: the `particles` component's `params`, a `ctx.particles.p…
- `particles-effect-unknown`: `ctx.particles.play` named an effect the scene did not load, so nothing played (it also c…
- `particles-texture-missing`: a `*.vfx.json` emitter's sprite texture did not load, so that emitter draws the built-in…
- `particles-collide-unavailable`: a `*.vfx.json` effect has a `collide` module, but the engine was built without the `vfx-c…
- `teleport-heading-ignored`: a tool's `POST /entity/{id}/teleport` gave the character the camera films a `yaw`, and tw…
- `behaviour-prop-unknown`: a `class X extends Behaviour` was given a script prop with no field of that name, so it w…
- `behaviour-hook-unknown`: a `class X extends Behaviour` has a method `Behaviour` never calls — `Awake`, `FixedUpdat…
- `behaviour-detached`: a `Behaviour` instance's engine members were used on an instance the engine did not const…
- `input-read-without-routing`: A behaviour read `ctx.input` on an entity that has the handle (a controller or vehicle) b…
- `script-unknown-hook`: a behaviour's default export has a member named like another engine's hook (`Update`, `St…
- `time.after-invalid`: `ctx.time.after` was given seconds that are negative or not finite, or was called outside…
- `null-handle`: a behaviour read `ctx.animator`, `ctx.controller`, `ctx.nav` or `ctx.input` on an entity…
- `script-call-inapplicable`: a behaviour called `entity.visible = …` on an entity with no mesh, sprite or children, or…
- `teleport-position-ignored`: a tool's teleport (`POST /entity/{id}/teleport`, an editor drag during Play, a test harne…
- `body.not-finite`: a `ctx.body` force, torque, impulse or point has a NaN or infinite component
- `body.velocity-not-dynamic`: `ctx.body.velocity` was assigned on a kinematic or static body, or through a handle kept…
- `body.space-invalid`: a `ctx.body` push was given a `space` other than `"world"` or `"local"`
- `joint.motor-invalid`: `ctx.joint.setMotor` was given a target that is not finite, a `maxForce`, `stiffness` or…
- `joint.limits-invalid`: `ctx.joint.setLimits` was given something other than `[min, max]` with both finite and `m…
- `physics.layer-unknown`: an entity's `layer` (or a camera's `layers`, `hideLayers` or `rig.collisionLayers`) names…
- `vehicle.not-finite`: `ctx.vehicle.drive` was given a `throttle`, `brake`, `steer` or `handbrake` that is NaN o…
- `vehicle.boost-invalid`: `vehicle.boost(speed, seconds)` was given a `speed` or `seconds` that is NaN, infinite, z…
- `vehicle.not-own`: `drive`, `reset` or `wheels` through another entity's vehicle (`other.vehicle` in a trigg…
- `body.not-own`: `wheels` through another entity's body (`other.body` in a trigger): it can be pushed and…
- `wheel.not-finite`: `ctx.wheel.setMotorTorque`, `setBrakeTorque` or `setSteer` was given a NaN or infinite nu…
- `fluid.sample-invalid`: `ctx.water.sample` or `ctx.wind.sample` was given a coordinate that is NaN or infinite (`…
- `physics.buoyancy.probe-cap`: a `buoyancy` hull asked for more than 256 probes (an `auto` grid of `resolution` 7 or 8,…
- `physics.water.lake-cap`: the scene has more than 4 `water` components; only the 4 with the highest levels count (t…
- `physics.water.river-cap`: the terrain's hydrology has more than 32 rivers or 256 k centreline points under `waterwa…
- `render.hd.water.river-id-unknown`: a `waterways` override names a river, waterfall or lake id the terrain's hydrology does n…
- `render.hd.water.river-junction-gap`: a tributary ends more than 5 cm above or below the river it joins, once per river; the wa…
- `render.hd.water.river-flow-inconsistent`: for one river the discharge its drawn geometry carries (width, depth, speed) and the terr…
- `physics.buoyancy.force-refused`: the solver refused a buoyancy force on a body that should be dynamic (a non-finite force,…
- `terrain-multiple`: a scene has a second entity with a `terrain` component; only the first one gets collision…
- `terrain-volume-invalid`: the terrain file has an enabled `volume.shape` or `volume.cliff` op and this engine build…
- `render.hd.unavailable`: the HD renderer could not start on this device, so the standard renderer draws instead
- `project-kind-2d-hd`: a project with `kind` `"2d"` asks for `render.profile` `"hd"`; a 2D project draws with th…
- `render-backend-forced-unavailable`: the project forces a graphics backend (`render.backend` `"vulkan"` or `"dx12"`) that cann…
- `render.hd.black_frame`: an HD frame read back for `--record`, `--out` or a capture came out black (the mean of it…
- `render.hd.rt_unavailable`: the device or build has no ray tracing, so HD3 ray-traced effects are off
- `render.hd.rt_mesh_too_large`: a mesh's geometry does not fit HD's ray-tracing vertex and index pools within the device'…
- `render.hd.rt_mesh_proxied`: a static mesh's geometry does not fit HD's ray-tracing vertex and index pools within the…
- `render.hd.cloud_shadow_unavailable`: the device allows fewer than 17 sampled textures per shader stage, so the HD cloud layer…
- `render.hd.horizon_map_unavailable`: the device allows fewer than 18 sampled textures per shader stage, so HD leaves out the t…
- `render.hd.vg_streaming_auto`: the virtual-geometry meshes' pages no longer fit one resident pool, so they stream within…
- `render.hd.vg_resident_full`: a headless run, capture or `--record` keeps frames exact, so virtual-geometry pages never…
- `render-tonemap-substituted`: `meta.render.tonemap` names a curve the renderer does not have: on the standard renderer…
- `render.hd.rt-proxy-invalid`: a virtual-geometry mesh was given its own ray-tracing proxy (`add_vg_mesh_with_rt_proxy`,…
- `render.hd.rt-deform-over-budget`: swaying virtual-geometry instances within the ray-tracing deformation range (`RtCoreDesc:…
- `render.hd.screen-fx-views`: a frame of several views (a headset's stereo pair) on HD cannot draw screen effects or us…
- `render.hd.pass-point-skipped`: a `kind: pass` escape-hatch shader at `afterOpaque` or `beforeTonemap` is not run on HD (…
- `render.standard.layer-mask-from-ignored`: a material file's layer has `maskFrom` (procedural coverage from the mesh's height and fa…
- `render.hd.shading_substituted`: a material draws with vertex (Gouraud) shading (`meta.render.shading` or a material file'…
- `render.hd.splat_format`: a Gaussian splat file is not one the loader reads (not a 3DGS `.ply` with `x y z f_dc_* o…
- `render.hd.splat_truncated`: a Gaussian splat file ends before the data its header promises; nothing was loaded
- `render.hd.splat_too_large`: a splat capture has more splats than one HD renderer holds (16,777,216) or bigger lists t…
- `render.sky.background_hd`: a scene's `sky.background` is drawn by the standard renderer; the HD renderer draws its o…
- `splat-view-outside`: the camera stood more than 1 m outside where a `splat` capture was taken (its camera traj…
- `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 used
- `quality-value-not-a-step`: a quality knob was in range but not one of its steps (a shadow size that is not a power o…
- `quality-unsupported-on-device`: the GPU cannot do what the knob asks, so it fell back to what it can
- `quality-custom-defaults`: a custom quality profile without `basedOn` left out optional knobs (it predates them), so…
- `quality-custom-missing`: the preset is Custom and no Custom knobs were given, so High was used
- `quality-not-available-in-renderer`: this renderer has no path for that value yet, so the knob fell back
- `quality-value-unknown`: a quality knob named a value this engine does not know (a newer engine's, or a typo), so…
- `look-value-out-of-range`: a camera look (post-processing) value was outside its range and was clamped
- `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 raised to it
- `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 start
- `render-decal-rotation-not-unit`: a decal rotation was not a unit quaternion and was normalised (identity when zero)
- `render-decal-texture-unknown`: a decal named a texture that was never registered, so that channel has none
- `render-decals-over-budget`: more decals than the budget; the lowest-priority ones were dropped
- `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 family; its materials draw wi…
- `render.shader.reload-failed`: an edited shader's new version could not replace the running one, so the last good versio…
- `render.shader.param-dropped`: a hot reload changed a param's type (a colour became a number, say), and a material's val…
- `render.shader.compiled-after-load`: a user shader's pipeline was first compiled after the scene loaded, so one frame hitched;…
- `render.shader.downgraded`: a shader effect this device or renderer cannot draw was replaced by the nearest one it ca…
- `render.shader.vg-skipped`: a mesh whose shader has `vertex()` is drawn by HD's raster path, not virtual geometry, so…
- `render.shader.families-many`: more shader families are visible than the advised count for the target (64 on web, Androi…
- `render.hd.user-shader-partial`: HD draws a user shader family in some paths and not in others yet, once per family; the l…
- `render.hd.user-rt-static`: HD's ray-traced paths (reflections, global illumination, ray-traced shadows through a cut…
- `render.screen-effect`: a screen effect listed in the scene's render settings was skipped (its shader did not bui…
- `bad_request`: 400: the body or query parameters are wrong; the message quotes what was expected
- `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 debugger, blocked on a load, shut…
- `unavailable`: 503: the command queue is full or the simulation is shutting down
- `at_capacity`: 503: a bounded resource is full, so the request was refused rather than queued
- `internal`: 500: the engine failed while answering
- `stale_stamp`: 409: an exact read named a committed state the server no longer has
- `session_mismatch`: 409: the session id or nonce is another server's (a restarted game on the same port)
- `capability_denied`: 403: the session does not grant what the endpoint needs
- `session_required`: 428: this endpoint needs a session identity and the request had none
- `host_rejected`: 403: the `Host` header does not name this server by a loopback name (DNS rebinding, or a…
- `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 answer carries
- `nav-bounds-too-large`: 400 on `GET /navmesh`: more polygons fall inside the bounds than one answer carries
- `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 that do
- `ui.screen.bad-json`: the screen's description has an error, or its `render` threw at the props it was given
- `ui.screen.duplicate`: a push or replace named a screen already on the stack, or two screens share a name
- `ui.stack.empty`: `pop` with nothing on the stack
- `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 bare id that is ambiguous
- `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 answer to
- `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`: no screen on the stack holds that id
- `ui.activate.hidden`: the node is under `display: none`, so it is not laid out or drawn
- `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 scroll container above it bri…
- `ui.activate.not-hittable`: the node answers no hit test; on a click-through screen a node must say `hit="always"`
- `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 reaching the game, and activates…
- `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.no-such-node`: no screen on the stack holds that id
- `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 nothing to type into
- `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 the ones it does
- `ui.viewport.no-surface`: this source has no surface of its own, so there is nothing to resize
- `ui.screen.tools`: the screen describer could not start, so no screen was registered and every push is refus…
- `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 they were undefined when des…
- `ui.screen.scenarios`: a screen declares fewer than two scenarios, so the critic and the preview have little to…
- `ui.locale.missing-glyphs`: a locale has characters no font in the project's font chain draws; they show as squares
- `ui.font.unusable`: a font file under the project's `ui/fonts/` (or named by an `@font-face` rule) cannot be…
- `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; the derived id was used inst…
- `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 length where a colour goes)
- `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 fills the viewport
- `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 `display: grid`
- `ui.layout.grid-tracks-truncated`: a track list longer than the engine's limit; only the first sixteen are used
- `ui.focus.nav-target-missing`: a `nav-up`/`nav-down`/`nav-left`/`nav-right` names a node that is not there
- `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 focus
- `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 changes at once
- `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 are dropped
- `ui.draw.group-opacity`: opacity on a group is applied to each child rather than the group as one
- `ui.diagnostics.overflow`: more diagnostics than the sink holds; the count of the dropped ones is given
- `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 combinators (one inside `@size`)
- `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 mirrors for right-to-left lo…
- `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 siblings, or the root has an id
- `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 `<screen>:root`, which is the…
- `ui.describe.model-view-subject.tentative`: TENTATIVE (code to be numbered): a `model-view` names neither `asset` nor `entity`, so it…
- `ui.describe.model-view-value.tentative`: TENTATIVE: a `model-view` attribute is not a documented spelling (`camera`, `yaw`, `spin`…
- `ui.model-view.count-cap.tentative`: TENTATIVE: more than 4 `model-view` nodes are visible; the extras draw only their backgro…
- `ui.model-view.unresolved.tentative`: TENTATIVE: a `model-view`'s asset path or entity name did not resolve to a mesh; its box…
- `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; a placeholder is drawn
- `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 scroll container
- `ui.locale.file`: a `ui/locales/<tag>.json` the engine cannot use; that one language is dropped
- `ui.locale.missing-param`: a `{name}` slot in a string has no parameter; it draws `[[key:name]]`
- `ui.draw.view-box-outside`: an `object-view-box` reaches past its image; the part inside is drawn
- `ui.font.face`: an `@font-face` file is missing or not a font the engine reads; that family's text draws…
- `ui.font.glyph-missing`: a bitmap font has no cell for a character in the text; it is skipped
- `ui.layout.image-zero-size`: an `image` whose file loaded laid out with no width or no height, so nothing of it is dra…
- `ui.font.unavailable`: the project has screens and no font was found, so the text on them is not drawn
- `build.typecheck`: a behaviour has a TypeScript type error at the line and column given
- `build.transpile`: a behaviour does not compile (esbuild's error)
- `build.import`: a behaviour imports something the engine does not bundle (an npm package, a Node built-in…
- `build.sandbox`: a behaviour touches something the engine's sandbox does not provide (`window`, `fetch`, `…
- `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.scene-invalid`: a scene breaks a contract rule; the message opens with the rule's code
- `build.scene-warning`: a scene triggers a contract warning; the message opens with the rule's code
- `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 names, or an asset of a pre…
- `build.material-layer-missing`: a file a material file's `layers` need (a layer material named by path from the material'…
- `build.font-unusable`: a `.ttf`/`.otf` under the revision's `ui/fonts/` does not parse as a font, has no readabl…
- `build.shader-scene-prewarm-heavy`: a scene's predicted shader pre-warm (pipeline count times the measured cost of one) is ov…
- `build.shader-hd-partial`: an HD project's export packs a user shader that HD's G-buffer pass draws, with paths stil…
- `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 were not checked
- `build.transpile-failed`: esbuild itself did not run to its end, or a `.js` behaviour does not parse
- `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
- `replay-bad-file`: the replay file cannot be read, is not a Talos replay, is a format this engine does not r…
- `replay-engine-mismatch`: the replay was recorded by another engine version, which does not promise the same simula…
- `replay-scene-mismatch`: the scene that loaded is not the one the replay was recorded on (the SHA-256 of the scene…
- `replay-seed-mismatch`: `--seed` names a different seed than the replay was recorded with
- `replay-start-mismatch`: the world is not at the tick the replay starts from
- `replay-camera-unknown`: `--replay-camera entity:ID` names an entity the scene does not have
- `plant-bake-missing`: a recipe has no cooked meshes in the project's state folder, or its `bake.json` lists a m…
- `plant-bake-stale`: the cooked meshes are from an older recipe, an older template it names or an older genera…
- `render.hd.ground-cover-over-budget`: reserved: the HD renderer will report this when a frame's ground cover wants more blades…
- `render.hd.ground-cover-no-height`: reserved: the HD renderer will report this when a layer's terrain has no height raster to…
- `road-source-missing`: the `road` component's `source` file is missing or unreadable, so the road, its walls and…
- `road-source-invalid`: the road file is there but is not a valid road (bad JSON, too few points, a width or step…
- `road-material-unknown`: the road file's `surface.material` is not a key of the scene's assets of kind `material`,…
- `road.at`: `ctx.world.road(name).at(s)` was given an `s` that is NaN or infinite (`RangeError`); not…
- `instances-source-missing`: the `instancedMesh` component's `source` file is missing or unreadable, so it has no inst…
- `instances-source-invalid`: the file is there but is not a valid instances file (wrong magic, a length or hash that d…
- `instances-format-unsupported`: the `.instances` file is a later format version or encoding than this build reads (a newe…
- `mesh-material-name-unknown`: a `materials` key is not the name of any material of the model (names are exact, and an u…
- `mesh-uv-missing`: a model has textured meshes and some meshes with no `TEXCOORD_0`: those meshes read every…
- `attach-bone-unknown`: the `attach` component's `bone` is not a bone of the owner's skeleton, by the rig's own n…
- `attach-skeleton-missing`: the `attach` owner has no animator that built (its asset has no skin or did not load), so…
- `sensor-shape-unsupported`: the attached entity's trigger collider is not a box, sphere or capsule, which is what a s…
- `lipsync-degraded`: the face cannot make every viseme as written: its model lacks some viseme or ARKit mouth…
- `face-degraded`: `<entity>: <what is missing>; that part is off`: the model has none of the ARKit shapes f…
- `spring-bone-unknown`: a chain or collider names a bone the skeleton does not have (the message lists the bones…
- `spring-chain-bad`: a chain is not a path down the skeleton: its `tip` is not below its `root`, a `joints` bo…
- `synth-bad-name`: `name` is missing or is not 1 to 64 of `a-z 0-9 - _` starting with a letter or digit; it…
- `synth-bad-spec`: the description names both `preset` and `voices` or neither, has a field that level does…
- `synth-unknown-preset`: `preset` is not one of the recipe's: `blip`, `whoosh`, `engine-loop`, `explosion`, `jingl…
- `synth-bad-param`: a parameter is the wrong kind or out of its range: a frequency outside 1 to 20,000 Hz, a…
- `synth-bad-sample-rate`: `sampleRate` is not a whole number from 8,000 to 48,000, or was given with a preset (a pr…
- `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 checkout), is not on this ma…
- `synth-failed`: the synthesiser ran and did not write the sound (it threw, printed no answer, or ran past…
- `unchecked-content`: a headless worker started with `--require-checked` was given no `--load-descriptor`, so i…
- `web-exporter-missing`: no Node, or no engine CLI, to run the web exporter: not named (`ARGUS_ENGINE_CLI`, `ARGUS…
- `web-exporter-failed`: the engine CLI ended with neither a report nor an error line: it crashed, or it is older…
- `web-export-cancelled`: the web export was cancelled and the CLI stopped; the output folder is as it was
- `selftest-not-found`: the named scenario is not `selftest/<name>.json` (or the project-relative `.json` named)…
- `selftest-bad-scenario`: the scenario is not JSON, lacks `"selfTest": 1`, has a key the format does not know, or n…
- `selftest-too-long`: `maxFrames` is over 36,000 (ten simulated minutes), or `timeout` is not 1 to 300 seconds
- `selftest-load-failed`: the scene did not load (it does not validate, or a file it needs is missing), so no step…
- `selftest-crashed`: the engine stopped with an internal error while playing the scenario

## Migrating

## Series

0.7

## Highlights

- The launcher connects your AI assistant (Claude Code or another MCP client) to a project in one step, and upgrades an older project to this version in place, keeping a backup you can restore.
- Build bigger worlds in the editor: shape roads, plant whole areas with foliage presets, nest prefabs inside prefabs, and see particle effects play without pressing Play.
- Richer scenes: boats and anything floating leave wakes and spray, terrain rock draws arches, overhangs and cliffs, and a named look such as sunny midday sets the sky, sun and haze in one step.
- Characters come alive: imported skeletons from the common tools are recognised, faces blink and follow the voice, and props can ride on a bone.
- Make a kart race in minutes: a Kart starter project, a race HUD kit (countdown, positions, lap timer, minimap) and a 15-minute walkthrough; vehicles can also float and drive on water.

## Migration

- Since 0.6.0 the engine ships no starter sounds, so a 0.5 project whose audio assets use builtin:sfx/, builtin:music/, builtin:ambient/ or builtin:voice/ paths does not open, and project migrate refused it until this release (asset-builtin-unknown). The 0.6.0 notes left this out. Fix: run `argus project migrate --apply` on the project. It points each of those sounds at a placeholder file of the project's own (assets/audio/retired-builtin/… beside the scene: a short beep, or silence for music and ambient), lists every one in its report, and never overwrites a file that is already there. Replace each placeholder with a real sound; `argus project migrate --restore` undoes the change. A prefab that uses one is still refused: give it a sound file of your own (the make-your-own-sounds recipe makes one). Meshes such as builtin:cube are not affected.
- NPC types compile in TypeScript: `npc({...})` runs the compiler when the module is evaluated and hands the engine a compact program (`__npcProgram`), which the engine checks (indices, bytecode stack bounds) and reads. The engine no longer links the NPC IR reader or compiler, so a module built by @argus/gameplay before 0.2.0 (IR only) is a script error that names the version to rebuild with. Fix: projects from source need nothing (the engine bundles each behaviour against its own @argus/gameplay when it loads it); a game exported earlier, whose bundled behaviours came from @argus/gameplay before 0.2.0, must be exported again with this engine. A type with a mistake now fails where its module is evaluated, with the same messages.

## Known

- Windows only, and the installer and engine are not code-signed yet: Windows shows "Windows protected your PC". Choose More info, then Run anyway, after checking the installer's SHA-256.
- Projects from 0.6 open as they are (the project format is unchanged). A project from 0.5 that used the starter sounds opens after `argus project migrate --apply`: see Migrating from 0.6. A game exported with 0.6 whose NPCs use TypeScript types must be exported again: see Migrating from 0.6.
- Sign-in is not open to everyone yet; a tester token from your invite still works.
- The editor's Log tab is noisy on every Play, and shows "423 busy" lines when your AI started the editor. Both are harmless.
- See talosengine.ai/known-issues/ for the full list, each with a way round it.

