# Talos 0.6.0 for AI

Generated from the same sources as the agent knowledge pack (pack 5871240b5f3b). 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, feet: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
- `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, step:number
- `giVolume`: size*:Vec3, indirectIntensity*:number, blend:number, mode:GiVolumeMode
- `goal`: id*:string, labelKey*:string, order:number
- `hud`: element*:HudElement, textKey:string
- `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
- `mesh`: asset*:string, material:string, color:string, castShadow:boolean, receiveShadow:boolean, 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
- `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
- `splat`: asset*:string, radianceNits:number, visible:boolean, axes:SplatAxes
- `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
- `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, 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
- camera: CameraHandle
- audio: AudioHandle
- particles: ParticlesHandle
- labels: LabelsHandle
- render: RenderHandle
- strings: StringsHandle
- save: SaveHandle
- files: FilesHandle
- session: SessionHandle
- 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[]
- 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
- readonly count: number
- raycast(from: Vec3, dir: Vec3, max?: number, opts?: CastOptions): Hit | null
- shapeCast(shape: CastShape, from: Vec3, dir: Vec3, max?: number, opts?: CastOptions): Hit | null
- 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
- 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): ActionBinding | null
- rebind(action: string, binding: Binding): void
- resetBindings(): 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
- ik(chain: string, target: Vec3 | EntityHandle | null, weight?: number): void
- lookAt(target: Vec3 | EntityHandle | null): void
- play(name: string, opts?: AnimatorPlayOptions): boolean
- speed: number

### ctx.events (EventBus)

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

### ctx.hud (HudHandle)

- set(field: HudField, value: string | number | null): 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): void

### ctx.camera (CameraHandle)

- set(kind: CameraKind, params?: CameraParams): void
- follow(target: EntityHandle | string | null): void
- readonly yaw: number
- readonly pitch: number
- readonly viewYaw: number
- readonly fov: number
- readonly viewSize: ViewSize | 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
- readonly music: AudioMusicHandle

### ctx.particles (ParticlesHandle)

- emit(preset: ParticlePreset, at: Vec3, params?: Record<string, unknown>): void

### 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.

- `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-invalid` (error): An animation event sits outside its clip (`at` not in 0..1), or names no clip or no event.
- `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-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 `..`.
- `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-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-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…
- `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.
- `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 the pose stayed still while the state said it…
- `feel/anim-loop-seam` (warning): a looping state plays a clip whose last frame does not meet its first (or, in a clips state, one cl…
- `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 was in while standing, so the chara…
- `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: in the centre they a…
- `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 a kinematic body moves went into the ground under it (its bounds more than 0.15…
- `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-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: more than 30° off by half a second (up…
- `feel/facing-actions-silent` (warning): the aimed buttons (fire, use, interact) raised no event at all once a teleport faced the player at…
- `feel/look-capped` (error): mouse look has a top speed: a fast synthetic mouse sweep turned the view fewer degrees per pixel th…
- `feel/roll-mismatch` (warning): a ball moving along the ground spun against its travel: backwards (backspin at the rolling rate rea…
- `feel/skipped` (info): a feel probe could not run on this scene and says why
- `feel/teleport-facing-ignored` (error): a tool's teleport with a heading faced the player at something the game runs, and a few ticks later…
- `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-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
- `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…
- `material-field-ignored` (warning): A `*.material.json` field that nothing reads: `alphaCutoff` without `alphaMode` mask, a `normalScal…
- `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…
- `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.
- `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/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/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/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
- `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-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-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-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-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.
- `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` or `material.rules` op of a terrain file names a layer the file's `layers` does not d…
- `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/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/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.
- `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…
- `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…
- `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 live context binds no action by that name
- `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-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-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-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…
- `audio-loops-stacked`: three or more loops of one sound play at once with none placed in the world (`ctx.audio.p…
- `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 or sprite, or `ctx.ui.s…
- `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…
- `wheel.not-finite`: `ctx.wheel.setMotorTorque`, `setBrakeTorque` or `setSteer` was given a NaN or infinite nu…
- `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…
- `render.hd.unavailable`: the HD renderer could not start on this device, so the standard renderer draws instead
- `render-backend-forced-unavailable`: the project forces a graphics backend (`render.backend` `"vulkan"` or `"dx12"`) that cann…
- `render.hd.rt_unavailable`: the device or build has no ray tracing, so HD3 ray-traced effects are off
- `render.hd.cloud_shadow_unavailable`: the device allows fewer than 17 sampled textures per shader stage, so the HD cloud layer…
- `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.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…
- `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.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
- `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.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-test: 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.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, or a texture its material file names) is not in this re…
- `build.material-layer-missing`: a file a material file's `layers` need (a layer material named by path from the material'…
- `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
- `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…
- `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…

## Migrating

## Series

0.6

## Highlights

- Water and terrain: oceans, lakes, rivers and sculptable terrain, plus procedural trees and grass (first versions, still improving).
- A Profiler tab, a Presentation view (F11) and Play controls users of other editors expect: speed, Eject (F8) and Simulate.
- Camera shots and blends: argus run --shots plays a shot list, so recordings get cinematic moves with no script.
- More export targets: Linux packages (tarball, AppImage), web builds, and early macOS, iOS and Android output.
- Agents can drive the editor without being locked out of Play, capture and the UI tools.

## Migration

No breaking changes.

## Known

- The installer and engine are not code-signed yet, so Windows SmartScreen warns on first run: choose More info, then Run anyway.
- Exported games that use your own shaders or screen effects are refused at export with a clear message; they still work in the editor. A fix is coming in the next release.
- Beaches and waterfalls are first versions and look rough up close.

