Files
XZBT/schema/xzbt-0.1.schema.json
LabyricornandClaude Opus 5 1cde2f9f68 feat(scenario): implement the phase 6 scenario director
Add Format Specification section 21 (Scenario Model 0.1) and the runtime
that realizes it: the scenario director, seven trigger classes, timelines
with repeats and branches, admission and concurrency control, nested
ownership with bounded cleanup, and the production GC5 resource counters.

Exhibit E provides a reproducible forty-minute long-scenario reference and
scenario-challenge.xzbt covers the PRD 131 cases. A standalone
acceptance/soak page is built by tools/build-scenario-acceptance.mjs.

252 automated checks pass. The two-hour real-duration development soak
required by the GC6 schedule remains pending.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01M7dgfQ12mpM4JjSMv3inLA
2026-09-06 22:54:31 +00:00

4198 lines
102 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://xzbt.org/schemas/0.1/exhibit.json",
"title": "XZBT Exhibit Schema 0.1",
"description": "Authoritative structural schema for XZBT 0.1 declarative exhibits.",
"type": "object",
"required": [
"xzbt",
"meta"
],
"additionalProperties": false,
"properties": {
"xzbt": {
"type": "string",
"const": "0.1",
"description": "XZBT format specification version. Must be '0.1'."
},
"meta": {
"type": "object",
"description": "Exhibit metadata and descriptive properties.",
"required": [
"id",
"name"
],
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$",
"maxLength": 64,
"description": "Unique exhibit identifier."
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 128,
"description": "Human-readable exhibit title."
},
"version": {
"type": "string",
"description": "Exhibit author semantic version string."
},
"author": {
"type": "string",
"maxLength": 128,
"description": "Author or entity attribution."
},
"description": {
"type": "string",
"maxLength": 1024,
"description": "Short description of exhibit behavior and theme."
},
"license": {
"type": "string",
"description": "License or rights attribution."
},
"tags": {
"type": "array",
"maxItems": 16,
"items": {
"type": "string",
"maxLength": 32
}
}
}
},
"runtime": {
"type": "object",
"additionalProperties": false,
"properties": {
"seed": {
"oneOf": [
{
"type": "integer"
},
{
"type": "string",
"const": "random"
}
],
"description": "PRNG seed: integer for deterministic reproduction, or 'random'."
}
}
},
"parameters": {
"type": "object",
"description": "User-tunable exhibit parameters.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"$ref": "#/definitions/ParameterSpec"
}
},
"additionalProperties": false
},
"state": {
"type": "object",
"description": "Simulation-owned runtime state variables.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"$ref": "#/definitions/StateSpec"
}
},
"additionalProperties": false
},
"signals": {
"type": "object",
"description": "Read-only environmental and input signals.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"type": "object"
}
},
"additionalProperties": false
},
"ui": {
"type": "object",
"description": "Generated UI grouping and presentation preferences.",
"additionalProperties": true
},
"components": {
"type": "object",
"description": "Modular audio and visual reusable components.",
"additionalProperties": false,
"properties": {
"audio": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/AudioComponent"
}
},
"visual": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualComponent"
}
}
}
},
"visuals": {
"type": "object",
"additionalProperties": false,
"required": [
"scene"
],
"description": "The visual subsystem (sections 17-19): scene, layers, systems, fields, camera, post-effects, and exhibit-scope automation.",
"properties": {
"scene": {
"type": "object",
"additionalProperties": false,
"properties": {
"coordinateSpace": {
"enum": [
"normalized",
"viewport",
"virtual"
]
},
"width": {
"type": "number",
"minimum": 1,
"maximum": 16384
},
"height": {
"type": "number",
"minimum": 1,
"maximum": 16384
},
"fit": {
"enum": [
"contain",
"cover",
"stretch"
]
},
"background": {
"type": "string",
"description": "Color literal (section 2)."
},
"depthFog": {
"type": "object",
"required": [
"color",
"far"
],
"additionalProperties": false,
"properties": {
"color": {
"type": "string",
"description": "Color literal (section 2)."
},
"near": {
"type": "number"
},
"far": {
"type": "number"
},
"density": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
}
},
"layers": {
"type": "object",
"minProperties": 1,
"maxProperties": 16,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"type": "object",
"additionalProperties": false,
"properties": {
"opacity": {
"$ref": "#/definitions/ValueSpec"
},
"blend": {
"enum": [
"normal",
"add",
"screen",
"multiply",
"overlay",
"lighten",
"darken",
"difference"
]
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"parallax": {
"type": "number"
}
}
}
},
"systems": {
"type": "object",
"maxProperties": 64,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualSystem"
}
},
"fields": {
"type": "object",
"maxProperties": 8,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualField"
}
},
"camera": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"zoom": {
"$ref": "#/definitions/ValueSpec"
},
"rotation": {
"$ref": "#/definitions/ValueSpec"
},
"projection": {
"enum": [
"orthographic",
"perspective"
]
},
"focalLength": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"effects": {
"type": "array",
"maxItems": 4,
"items": {
"$ref": "#/definitions/VisualEffect"
}
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
}
}
},
"audio": {
"type": "object",
"description": "Synthesizer graphs, buses, and routing.",
"additionalProperties": false,
"properties": {
"buses": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$",
"not": {
"const": "master"
}
},
"additionalProperties": {
"$ref": "#/definitions/AudioBus"
}
},
"recipes": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/AudioRecipe"
}
}
}
},
"sounds": {
"type": "object",
"description": "Sound definitions separating metadata from synthesis.",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/Sound"
}
},
"cadence": {
"type": "object",
"description": "Procedural rhythm clocks, intensity, and automatic one-shot sound policies (sections 20.3-20.7).",
"additionalProperties": false,
"properties": {
"intensity": {
"$ref": "#/definitions/ValueSpec"
},
"minGap": {
"$ref": "#/definitions/DurationSpec"
},
"clocks": {
"type": "object",
"additionalProperties": false,
"properties": {
"routine": {
"$ref": "#/definitions/CadenceClockRange"
},
"intermittent": {
"$ref": "#/definitions/CadenceClockRange"
},
"occasional": {
"$ref": "#/definitions/CadenceClockRange"
},
"rare": {
"$ref": "#/definitions/CadenceClockRange"
}
}
}
}
},
"modulators": {
"type": "object",
"description": "Continuous LFOs, noise generators, and sample-and-hold signals.",
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"type": "object"
}
},
"additionalProperties": false
},
"bindings": {
"type": "array",
"description": "Directed value propagation links.",
"items": {
"$ref": "#/definitions/BindingSpec"
}
},
"events": {
"type": "object",
"description": "Discrete lifecycle and state change event triggers (section 20.10, PRD 90).",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/EventDefinition"
}
},
"scenarios": {
"type": "object",
"maxProperties": 64,
"patternProperties": {
"^[a-z][a-z0-9_-]*$": {
"$ref": "#/definitions/ScenarioDefinition"
}
},
"additionalProperties": false
}
},
"definitions": {
"ParameterSpec": {
"type": "object",
"required": [
"type",
"default"
],
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"number",
"integer",
"boolean",
"string",
"color",
"enum"
]
},
"default": {},
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"step": {
"type": "number",
"exclusiveMinimum": 0
},
"values": {
"type": "array",
"items": {
"type": "string"
}
},
"label": {
"type": "string",
"maxLength": 128
},
"unit": {
"type": "string",
"maxLength": 16
}
}
},
"StateSpec": {
"type": "object",
"required": [
"type",
"initial"
],
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"number",
"integer",
"boolean",
"string"
]
},
"initial": {},
"min": {
"type": "number"
},
"max": {
"type": "number"
}
}
},
"BindingSpec": {
"type": "object",
"required": [
"source",
"target"
],
"additionalProperties": false,
"properties": {
"source": {
"type": "string",
"description": "Source reference path (e.g. 'parameters.activity')."
},
"target": {
"type": "string",
"description": "Target reference path (e.g. 'audio.buses.ambient.gain')."
},
"scale": {
"type": "number",
"description": "Numeric source multiplier. Defaults to 1."
},
"offset": {
"type": "number",
"description": "Numeric offset applied after scaling. Defaults to 0."
},
"clamp": {
"type": "array",
"minItems": 2,
"maxItems": 2,
"items": {
"type": "number"
},
"description": "Inclusive [minimum, maximum] clamp applied to the transformed binding value."
},
"smoothing": {
"$ref": "#/definitions/DurationSpec",
"description": "Optional smoothing low-pass duration."
},
"when": {
"$ref": "#/definitions/ConditionSpec",
"description": "Optional condition; defaults to true."
}
}
},
"ValueSpec": {
"description": "Universal value expression (literal, reference, random, weighted choice, or operation).",
"oneOf": [
{
"type": "number",
"description": "Literal numeric constant."
},
{
"type": "boolean",
"description": "Literal boolean constant."
},
{
"type": "string",
"description": "Literal string or color constant."
},
{
"type": "object",
"required": [
"ref"
],
"additionalProperties": false,
"properties": {
"ref": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*(\\.[a-z][a-z0-9_-]*)+$",
"description": "Dot-separated reference path."
}
}
},
{
"type": "object",
"required": [
"random"
],
"additionalProperties": false,
"properties": {
"random": {
"type": "object",
"required": [
"min",
"max"
],
"additionalProperties": false,
"properties": {
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"integer": {
"type": "boolean"
},
"distribution": {
"type": "string",
"enum": [
"uniform",
"gaussian"
]
}
}
}
}
},
{
"type": "object",
"required": [
"choose"
],
"additionalProperties": false,
"properties": {
"choose": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": [
"value",
"weight"
],
"additionalProperties": false,
"properties": {
"value": {},
"weight": {
"type": "number",
"exclusiveMinimum": 0
}
}
}
}
}
},
{
"type": "object",
"required": [
"op",
"args"
],
"additionalProperties": false,
"properties": {
"op": {
"type": "string",
"enum": [
"abs",
"negate",
"round",
"floor",
"ceil",
"add",
"subtract",
"multiply",
"divide",
"min",
"max",
"clamp",
"lerp"
]
},
"args": {
"type": "array",
"items": {
"$ref": "#/definitions/ValueSpec"
}
}
}
}
]
},
"ConditionSpec": {
"description": "Boolean condition expression (comparison, and, or, not).",
"oneOf": [
{
"type": "object",
"required": [
"op",
"left",
"right"
],
"additionalProperties": false,
"properties": {
"op": {
"type": "string",
"enum": [
"eq",
"ne",
"gt",
"gte",
"lt",
"lte"
]
},
"left": {
"$ref": "#/definitions/ValueSpec"
},
"right": {
"$ref": "#/definitions/ValueSpec"
}
}
},
{
"type": "object",
"required": [
"and"
],
"additionalProperties": false,
"properties": {
"and": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/definitions/ConditionSpec"
}
}
}
},
{
"type": "object",
"required": [
"or"
],
"additionalProperties": false,
"properties": {
"or": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/definitions/ConditionSpec"
}
}
}
},
{
"type": "object",
"required": [
"not"
],
"additionalProperties": false,
"properties": {
"not": {
"$ref": "#/definitions/ConditionSpec"
}
}
}
]
},
"DurationSpec": {
"type": "string",
"pattern": "^([0-9]+(\\.[0-9]+)?)(ms|s|m|h)$",
"description": "Normalized duration literal string (e.g. '250ms', '4s', '1.5m', '1h')."
},
"AudioPartial": {
"type": "object",
"description": "One custom-waveform partial (Format Specification 14.7).",
"required": [
"ratio",
"gain"
],
"additionalProperties": false,
"properties": {
"ratio": {
"description": "Partial frequency as a multiple of the node frequency.",
"anyOf": [
{
"type": "number",
"minimum": 0.001,
"maximum": 256
},
{
"type": "object"
}
]
},
"gain": {
"description": "Linear amplitude relative to the fundamental.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"phase": {
"description": "Starting phase offset in degrees.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"exclusiveMaximum": 360
},
{
"type": "object"
}
]
}
}
},
"AudioResonatorMode": {
"type": "object",
"description": "One resonator mode (Format Specification 15.10).",
"additionalProperties": false,
"oneOf": [
{
"required": [
"ratio"
]
},
{
"required": [
"frequency"
]
}
],
"properties": {
"ratio": {
"description": "Mode frequency as a multiple of the fundamental.",
"anyOf": [
{
"type": "number",
"minimum": 0.001,
"maximum": 256
},
{
"type": "object"
}
]
},
"frequency": {
"description": "Absolute mode frequency in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.1,
"maximum": 24000
},
{
"type": "object"
}
]
},
"gain": {
"description": "Linear amplitude of the mode.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"decay": {
"$ref": "#/definitions/DurationSpec"
}
}
},
"AudioNode": {
"type": "object",
"description": "One audio graph node, keyed by node ID (Format Specification 14.3).",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"enum": [
"oscillator",
"noise",
"impulse",
"constant",
"lfo",
"sample-hold",
"gain",
"filter",
"compressor",
"waveshaper",
"delay",
"reverb",
"stereo-pan",
"mixer",
"resonator",
"component"
]
}
},
"allOf": [
{
"if": {
"properties": {
"type": {
"const": "oscillator"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Oscillator (14.7).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"waveform": {
"type": "string",
"enum": [
"sine",
"triangle",
"square",
"sawtooth",
"custom"
]
},
"frequency": {
"description": "Frequency in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.1,
"maximum": 24000
},
{
"type": "object"
}
]
},
"detune": {
"description": "Detune in cents.",
"anyOf": [
{
"type": "number",
"minimum": -4800,
"maximum": 4800
},
{
"type": "object"
}
]
},
"harmonics": {
"type": "array",
"minItems": 1,
"maxItems": 64,
"items": {
"$ref": "#/definitions/AudioPartial"
}
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "noise"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Noise (14.8).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"color": {
"type": "string",
"enum": [
"white",
"pink",
"brown"
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "impulse"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Impulse (14.9).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"color": {
"type": "string",
"enum": [
"white",
"pink",
"brown"
]
},
"duration": {
"$ref": "#/definitions/DurationSpec"
},
"amplitude": {
"description": "Peak amplitude.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"decay": {
"type": "string",
"enum": [
"flat",
"linear",
"exponential"
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "constant"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Constant control source (14.10).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"value": {
"description": "Constant control value.",
"anyOf": [
{
"type": "number",
"minimum": -1000,
"maximum": 1000
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "lfo"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "LFO control source (14.11).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"waveform": {
"type": "string",
"enum": [
"sine",
"triangle",
"square",
"sawtooth"
]
},
"frequency": {
"description": "LFO rate in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.001,
"maximum": 40
},
{
"type": "object"
}
]
},
"amplitude": {
"description": "Output amplitude.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1000
},
{
"type": "object"
}
]
},
"polarity": {
"type": "string",
"enum": [
"bipolar",
"unipolar"
]
},
"phase": {
"description": "Starting phase in degrees.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"exclusiveMaximum": 360
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "sample-hold"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Sample-and-hold control source (14.12).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"rate": {
"description": "Tick rate in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.01,
"maximum": 100
},
{
"type": "object"
}
]
},
"min": {
"description": "Lower draw bound.",
"anyOf": [
{
"type": "number",
"minimum": -1000,
"maximum": 1000
},
{
"type": "object"
}
]
},
"max": {
"description": "Upper draw bound.",
"anyOf": [
{
"type": "number",
"minimum": -1000,
"maximum": 1000
},
{
"type": "object"
}
]
},
"slew": {
"$ref": "#/definitions/DurationSpec"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "gain"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Gain (15.2).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"gain": {
"description": "Linear gain.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 4
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "filter"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Filter (15.3).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"mode": {
"type": "string",
"enum": [
"lowpass",
"highpass",
"bandpass",
"notch",
"peaking",
"lowshelf",
"highshelf",
"allpass"
]
},
"frequency": {
"description": "Cutoff or center frequency in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 10,
"maximum": 24000
},
{
"type": "object"
}
]
},
"q": {
"description": "Filter Q.",
"anyOf": [
{
"type": "number",
"minimum": 0.0001,
"maximum": 100
},
{
"type": "object"
}
]
},
"gain": {
"description": "Shelf or peak gain in dB.",
"anyOf": [
{
"type": "number",
"minimum": -40,
"maximum": 40
},
{
"type": "object"
}
]
},
"detune": {
"description": "Detune in cents.",
"anyOf": [
{
"type": "number",
"minimum": -4800,
"maximum": 4800
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "compressor"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Compressor (15.4).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"threshold": {
"description": "Threshold in dB.",
"anyOf": [
{
"type": "number",
"minimum": -100,
"maximum": 0
},
{
"type": "object"
}
]
},
"knee": {
"description": "Knee width in dB.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 40
},
{
"type": "object"
}
]
},
"ratio": {
"description": "Compression ratio.",
"anyOf": [
{
"type": "number",
"minimum": 1,
"maximum": 20
},
{
"type": "object"
}
]
},
"attack": {
"$ref": "#/definitions/DurationSpec"
},
"release": {
"$ref": "#/definitions/DurationSpec"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "waveshaper"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Waveshaper (15.5).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"shape": {
"type": "string",
"enum": [
"soft-clip",
"hard-clip",
"saturation"
]
},
"amount": {
"description": "Shaping amount.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"oversample": {
"type": "string",
"enum": [
"none",
"2x",
"4x"
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "delay"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Delay (15.6).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"time": {
"$ref": "#/definitions/DurationSpec"
},
"feedback": {
"description": "Internal feedback amount.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 0.95
},
{
"type": "object"
}
]
},
"mix": {
"description": "Dry/wet blend.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "reverb"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Reverb (15.7).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"size": {
"description": "Perceived space size.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"decay": {
"$ref": "#/definitions/DurationSpec"
},
"damping": {
"description": "High-frequency damping.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
},
"predelay": {
"$ref": "#/definitions/DurationSpec"
},
"mix": {
"description": "Dry/wet blend.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "stereo-pan"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Stereo pan (15.8).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"pan": {
"description": "Stereo position.",
"anyOf": [
{
"type": "number",
"minimum": -1,
"maximum": 1
},
{
"type": "object"
}
]
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "mixer"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Mixer (15.9).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
}
}
}
},
{
"if": {
"properties": {
"type": {
"const": "resonator"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Resonator (15.10).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"fundamental": {
"description": "Fundamental frequency in Hz.",
"anyOf": [
{
"type": "number",
"minimum": 0.1,
"maximum": 24000
},
{
"type": "object"
}
]
},
"modes": {
"type": "array",
"minItems": 1,
"maxItems": 16,
"items": {
"$ref": "#/definitions/AudioResonatorMode"
}
},
"mix": {
"description": "Dry/wet blend.",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 1
},
{
"type": "object"
}
]
}
},
"required": [
"type",
"modes"
]
}
},
{
"if": {
"properties": {
"type": {
"const": "component"
}
},
"required": [
"type"
]
},
"then": {
"type": "object",
"description": "Component instance (15.11).",
"additionalProperties": false,
"properties": {
"type": {
"type": "string"
},
"use": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"values": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"required": [
"type",
"use"
]
}
}
]
},
"AudioRoute": {
"type": "object",
"description": "An audio or modulation route (Format Specification 15.12).",
"required": [
"from",
"to"
],
"additionalProperties": false,
"properties": {
"from": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"to": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*(\\.[a-z][a-z0-9_-]*)?$"
},
"depth": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"AudioNodeMap": {
"type": "object",
"minProperties": 1,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$",
"not": {
"enum": [
"output",
"input"
]
}
},
"additionalProperties": {
"$ref": "#/definitions/AudioNode"
}
},
"AudioRouteList": {
"type": "array",
"items": {
"$ref": "#/definitions/AudioRoute"
}
},
"AudioAutomationList": {
"type": "array",
"maxItems": 64,
"description": "Graph-local tracks (16.1); expanded totals and target capabilities are semantic checks.",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"target",
"points"
],
"properties": {
"target": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*\\.[a-z][a-z0-9_-]*$"
},
"mode": {
"enum": [
"absolute",
"offset",
"scale"
],
"default": "absolute"
},
"interpolation": {
"enum": [
"step",
"linear",
"exponential",
"smooth"
],
"default": "linear"
},
"points": {
"type": "array",
"minItems": 2,
"maxItems": 256,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"at",
"value"
],
"properties": {
"at": {
"$ref": "#/definitions/DurationSpec"
},
"value": {
"allOf": [
{
"$ref": "#/definitions/ValueSpec"
},
{
"type": [
"number",
"object"
]
}
],
"description": "ValueSpec<number>; numeric references and expression leaves are checked semantically."
}
}
}
}
}
}
},
"AudioRecipe": {
"type": "object",
"description": "A recipe graph, or a reference to a shared recipe (15.16).",
"oneOf": [
{
"additionalProperties": false,
"required": [
"nodes"
],
"properties": {
"nodes": {
"$ref": "#/definitions/AudioNodeMap"
},
"routes": {
"$ref": "#/definitions/AudioRouteList"
},
"automation": {
"$ref": "#/definitions/AudioAutomationList"
},
"mode": {
"type": "string",
"enum": [
"oneshot",
"continuous"
]
},
"release": {
"$ref": "#/definitions/DurationSpec"
}
}
},
{
"additionalProperties": false,
"required": [
"use"
],
"properties": {
"use": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
}
}
]
},
"AudioComponent": {
"type": "object",
"description": "A reusable audio component graph (15.15).",
"required": [
"nodes"
],
"additionalProperties": false,
"properties": {
"nodes": {
"$ref": "#/definitions/AudioNodeMap"
},
"routes": {
"$ref": "#/definitions/AudioRouteList"
},
"automation": {
"$ref": "#/definitions/AudioAutomationList"
},
"input": {
"type": "boolean"
},
"parameters": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"const": "number"
},
"default": {
"type": "number"
},
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"unit": {
"type": "string"
}
}
}
}
}
},
"AudioBus": {
"type": "object",
"description": "A declared bus (15.17).",
"additionalProperties": false,
"properties": {
"gain": {
"description": "Bus gain in [0, 4].",
"anyOf": [
{
"type": "number",
"minimum": 0,
"maximum": 4
},
{
"type": "object"
}
]
}
}
},
"Sound": {
"type": "object",
"description": "A sound definition (15.16).",
"required": [
"name",
"recipe"
],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"tags": {
"type": "array",
"maxItems": 16,
"items": {
"type": "string",
"maxLength": 32
}
},
"usage": {
"type": "array",
"minItems": 1,
"items": {
"type": "string",
"enum": [
"automatic",
"manual",
"scenario"
]
}
},
"cadence": {
"$ref": "#/definitions/SoundCadence"
},
"bus": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"recipe": {
"$ref": "#/definitions/AudioRecipe"
}
}
},
"CadenceClockRange": {
"type": "object",
"description": "Interval range for a cadence clock class (section 20.3).",
"required": [
"min",
"max"
],
"additionalProperties": false,
"properties": {
"min": {
"$ref": "#/definitions/DurationSpec"
},
"max": {
"$ref": "#/definitions/DurationSpec"
}
}
},
"SoundCadence": {
"type": "object",
"description": "Cadence configuration for a sound definition (section 20.4).",
"required": [
"class"
],
"additionalProperties": false,
"properties": {
"class": {
"type": "string",
"enum": [
"ambient",
"routine",
"intermittent",
"occasional",
"rare",
"scenario"
]
},
"weight": {
"$ref": "#/definitions/ValueSpec"
},
"cooldown": {
"$ref": "#/definitions/DurationSpec"
},
"overlap": {
"type": "boolean"
},
"when": {
"$ref": "#/definitions/ConditionSpec"
}
}
},
"ActionSpec": {
"type": "object",
"description": "An Action Model 0.1 action (sections 22-30, 20.11-20.12).",
"required": [
"type"
],
"properties": {
"type": {
"type": "string",
"enum": [
"set",
"override",
"sound",
"event",
"spawn",
"remove",
"control"
]
},
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"when": {
"$ref": "#/definitions/ConditionSpec"
},
"chance": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"critical": {
"type": "boolean"
},
"target": {
"type": "string"
},
"value": {
"$ref": "#/definitions/ValueSpec"
},
"sound": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"event": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"command": {
"type": "string",
"enum": [
"start",
"stop",
"enable",
"disable",
"pause",
"resume",
"reset"
]
},
"with": {
"type": "object"
},
"scope": {
"type": "string",
"enum": [
"scenario",
"duration"
]
},
"duration": {
"$ref": "#/definitions/DurationSpec"
},
"lifetime": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"$ref": "#/definitions/ValueSpec"
}
]
},
"ownership": {
"type": "string",
"enum": [
"performance",
"scenario",
"persistent"
]
},
"transition": {
"type": "object"
},
"priority": {
"type": "integer",
"minimum": -1000,
"maximum": 1000
}
},
"additionalProperties": false
},
"EventDefinition": {
"type": "object",
"description": "A reusable named action bundle (section 20.10, PRD 90).",
"required": [
"actions"
],
"additionalProperties": false,
"properties": {
"inputs": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/ParameterSpec"
}
},
"actions": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/definitions/ActionSpec"
}
}
}
},
"VisualPoint": {
"type": "object",
"additionalProperties": false,
"required": [
"x",
"y"
],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"z": {
"type": "number"
}
},
"description": "A geometry point. A point's z offsets the object's depth (17.9) and does not sort independently."
},
"VisualPaint": {
"description": "A flat color ValueSpec, a gradient paint object, or null (17.12).",
"oneOf": [
{
"type": "null"
},
{
"$ref": "#/definitions/ValueSpec"
},
{
"type": "object",
"required": [
"type",
"stops"
],
"additionalProperties": false,
"properties": {
"type": {
"enum": [
"linear-gradient",
"radial-gradient",
"conic-gradient"
]
},
"stops": {
"type": "array",
"minItems": 2,
"maxItems": 16,
"items": {
"type": "object",
"required": [
"offset",
"color"
],
"additionalProperties": false,
"properties": {
"offset": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"color": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"from": {
"$ref": "#/definitions/VisualPoint"
},
"to": {
"$ref": "#/definitions/VisualPoint"
},
"center": {
"$ref": "#/definitions/VisualPoint"
},
"radius": {
"type": "number"
},
"innerRadius": {
"type": "number"
},
"angle": {
"type": "number"
}
}
}
]
},
"VisualStyle": {
"type": "object",
"additionalProperties": false,
"description": "Appearance (17.12). Inherited per field by a group's descendants.",
"properties": {
"fill": {
"$ref": "#/definitions/VisualPaint"
},
"stroke": {
"$ref": "#/definitions/VisualPaint"
},
"strokeWidth": {
"$ref": "#/definitions/ValueSpec"
},
"strokeCap": {
"enum": [
"butt",
"round",
"square"
]
},
"strokeJoin": {
"enum": [
"miter",
"round",
"bevel"
]
},
"strokeDash": {
"type": "array",
"minItems": 1,
"maxItems": 8,
"items": {
"type": "number"
}
},
"strokeDashOffset": {
"$ref": "#/definitions/ValueSpec"
},
"pointSize": {
"$ref": "#/definitions/ValueSpec"
},
"opacity": {
"$ref": "#/definitions/ValueSpec"
},
"blend": {
"enum": [
"normal",
"add",
"screen",
"multiply",
"overlay",
"lighten",
"darken",
"difference"
]
},
"glow": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"color": {
"$ref": "#/definitions/ValueSpec"
},
"radius": {
"type": "number"
},
"strength": {
"type": "number",
"minimum": 0,
"maximum": 1
}
}
}
]
},
"shadow": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"color": {
"$ref": "#/definitions/ValueSpec"
},
"blurRadius": {
"type": "number"
},
"offsetX": {
"type": "number"
},
"offsetY": {
"type": "number"
}
}
}
]
},
"blur": {
"$ref": "#/definitions/ValueSpec"
},
"filters": {
"type": "array",
"maxItems": 4,
"items": {
"type": "object",
"required": [
"type"
],
"additionalProperties": false,
"properties": {
"type": {
"enum": [
"brightness",
"contrast",
"saturate",
"hue-rotate",
"grayscale",
"sepia",
"invert"
]
},
"amount": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"clip": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"shape",
"x",
"y",
"width",
"height"
],
"additionalProperties": false,
"properties": {
"shape": {
"enum": [
"rectangle",
"ellipse"
]
},
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
}
}
}
]
},
"mask": {
"type": [
"string",
"null"
]
}
}
},
"VisualTransform": {
"type": "object",
"additionalProperties": false,
"description": "Transform model (17.11). Composition order is normative.",
"properties": {
"translate": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"rotation": {
"$ref": "#/definitions/ValueSpec"
},
"scale": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"skew": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"origin": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
}
}
},
"VisualBehavior": {
"type": "object",
"required": [
"type"
],
"description": "Behavior instance (18.6). Type-specific fields are validated semantically.",
"properties": {
"type": {
"enum": [
"drift",
"rotate",
"oscillate",
"orbit",
"wander",
"follow-path",
"point-wander",
"pulse",
"twinkle",
"noise-displace",
"face-motion",
"wrap",
"bounce",
"attract",
"repel",
"field-follow",
"morph"
]
}
}
},
"VisualDistribution": {
"type": "object",
"required": [
"type"
],
"description": "Placement distribution (18.3). A path distribution carries inline commands; sibling keys have no container at system scope.",
"properties": {
"type": {
"enum": [
"point",
"uniform",
"line",
"rectangle",
"ellipse",
"ring",
"path",
"grid",
"depth"
]
}
}
},
"VisualObject": {
"type": "object",
"required": [
"type"
],
"description": "A visual object: one of the fourteen primitives of Visual Primitive Set 0.1, or the `component` object type of 18.1. Carries no `id`; its key in the containing map is its identity (17.8).",
"properties": {
"type": {
"enum": [
"point",
"line",
"polyline",
"polygon",
"rectangle",
"rounded-rectangle",
"ellipse",
"arc",
"ring",
"path",
"bezier",
"spline",
"text",
"group",
"component"
]
},
"position": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"z": {
"$ref": "#/definitions/ValueSpec"
},
"size": {
"type": "object",
"additionalProperties": false,
"properties": {
"width": {
"$ref": "#/definitions/ValueSpec"
},
"height": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"transform": {
"$ref": "#/definitions/VisualTransform"
},
"style": {
"$ref": "#/definitions/VisualStyle"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifetime": {
"$ref": "#/definitions/DurationSpec"
},
"to": {
"$ref": "#/definitions/VisualPoint"
},
"c": {
"$ref": "#/definitions/VisualPoint"
},
"c1": {
"$ref": "#/definitions/VisualPoint"
},
"c2": {
"$ref": "#/definitions/VisualPoint"
},
"points": {
"type": "array",
"minItems": 2,
"maxItems": 512,
"items": {
"$ref": "#/definitions/VisualPoint"
}
},
"radius": {},
"innerRadius": {
"type": "number"
},
"startAngle": {
"type": "number"
},
"endAngle": {
"type": "number"
},
"direction": {
"enum": [
"clockwise",
"counter-clockwise"
]
},
"commands": {
"type": "array",
"minItems": 1,
"maxItems": 512,
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"enum": [
"move",
"line",
"quadratic",
"cubic",
"arc",
"close"
]
}
}
}
},
"fillRule": {
"enum": [
"nonzero",
"evenodd"
]
},
"mode": {
"enum": [
"catmull-rom",
"bezier",
"linear"
]
},
"closed": {
"type": "boolean"
},
"tension": {
"$ref": "#/definitions/ValueSpec"
},
"text": {
"$ref": "#/definitions/ValueSpec"
},
"font": {
"enum": [
"sans-serif",
"serif",
"monospace"
]
},
"weight": {
"enum": [
"normal",
"bold"
]
},
"italic": {
"type": "boolean"
},
"align": {
"enum": [
"left",
"center",
"right"
]
},
"baseline": {
"enum": [
"top",
"middle",
"alphabetic",
"bottom"
]
},
"letterSpacing": {
"$ref": "#/definitions/ValueSpec"
},
"maxWidth": {
"$ref": "#/definitions/ValueSpec"
},
"children": {
"type": "object",
"minProperties": 1,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualObject"
}
},
"component": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"inputs": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/ValueSpec"
}
},
"trail": false,
"id": false
},
"additionalProperties": false
},
"VisualObjectMap": {
"type": "object",
"minProperties": 1,
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"$ref": "#/definitions/VisualObject"
},
"description": "Visual objects keyed by object ID (17.8)."
},
"VisualComponent": {
"type": "object",
"required": [
"content"
],
"additionalProperties": false,
"description": "Reusable visual sub-assembly (18.1).",
"properties": {
"parameters": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"additionalProperties": false,
"properties": {
"type": {
"enum": [
"number",
"boolean",
"string",
"color"
]
},
"default": {},
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"unit": {
"type": "string"
}
}
}
},
"content": {
"$ref": "#/definitions/VisualObjectMap"
},
"transform": {
"$ref": "#/definitions/VisualTransform"
},
"style": {
"$ref": "#/definitions/VisualStyle"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
}
}
},
"VisualTrail": {
"type": "object",
"additionalProperties": false,
"description": "Trail or ribbon (18.8). Declared on the system, never on a render object.",
"properties": {
"length": {
"type": "integer",
"minimum": 2,
"maximum": 128
},
"interval": {
"$ref": "#/definitions/DurationSpec"
},
"mode": {
"enum": [
"line",
"ribbon",
"points"
]
},
"width": {
"$ref": "#/definitions/ValueSpec"
},
"taper": {
"$ref": "#/definitions/ValueSpec"
},
"fade": {
"$ref": "#/definitions/ValueSpec"
},
"style": {
"$ref": "#/definitions/VisualStyle"
},
"curve": {
"enum": [
"linear",
"catmull-rom"
]
}
}
},
"VisualLinks": {
"type": "object",
"additionalProperties": false,
"description": "Distance links (18.8).",
"properties": {
"rule": {
"enum": [
"distance",
"nearest",
"index"
]
},
"maxDistance": {
"$ref": "#/definitions/ValueSpec"
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 8
},
"stride": {
"type": "integer",
"minimum": 1
},
"closed": {
"type": "boolean"
},
"maxLinks": {
"type": "integer",
"minimum": 1,
"maximum": 1024
},
"style": {
"$ref": "#/definitions/VisualStyle"
},
"fadeWithDistance": {
"type": "boolean"
}
}
},
"VisualAutomationTrack": {
"type": "object",
"required": [
"target",
"points"
],
"additionalProperties": false,
"description": "Visual automation track (19.1). `at` is a duration literal only.",
"properties": {
"target": {
"type": "string"
},
"mode": {
"enum": [
"absolute",
"offset",
"scale"
]
},
"interpolation": {
"enum": [
"step",
"linear",
"exponential",
"smooth"
]
},
"loop": {
"type": "object",
"required": [
"mode"
],
"additionalProperties": false,
"properties": {
"mode": {
"enum": [
"repeat",
"ping-pong"
]
},
"count": {
"oneOf": [
{
"const": "infinite"
},
{
"type": "integer",
"minimum": 1
}
]
}
}
},
"points": {
"type": "array",
"minItems": 2,
"maxItems": 256,
"items": {
"type": "object",
"required": [
"at",
"value"
],
"additionalProperties": false,
"properties": {
"at": {
"$ref": "#/definitions/DurationSpec"
},
"value": {
"$ref": "#/definitions/ValueSpec"
}
}
}
}
}
},
"VisualSpawn": {
"type": "object",
"additionalProperties": false,
"description": "Spawned-instance lifecycle configuration (19.2). Its `lifetime` is the instance's, never an item's.",
"properties": {
"lifetime": {
"$ref": "#/definitions/DurationSpec"
},
"release": {
"$ref": "#/definitions/DurationSpec"
},
"ownership": {
"const": "persistent"
},
"inputs": {
"type": "object",
"propertyNames": {
"pattern": "^[a-z][a-z0-9_-]*$"
},
"additionalProperties": {
"type": "object",
"required": [
"type"
],
"additionalProperties": false,
"properties": {
"type": {
"enum": [
"number",
"boolean",
"string",
"color"
]
},
"default": {},
"min": {
"type": "number"
},
"max": {
"type": "number"
},
"unit": {
"type": "string"
}
}
}
},
"cancelWithScenario": {
"type": "boolean"
}
}
},
"VisualSystem": {
"required": [
"type"
],
"description": "A visual system (17.7). The addressable unit of the visual subsystem.",
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": [
"type",
"content"
],
"properties": {
"type": {
"const": "graphic"
},
"layer": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifecycle": {
"enum": [
"persistent",
"spawned"
]
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
},
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"content": {
"$ref": "#/definitions/VisualObjectMap"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"type",
"render"
],
"properties": {
"type": {
"const": "particles"
},
"layer": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifecycle": {
"enum": [
"persistent",
"spawned"
]
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
},
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"position": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"velocity": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"acceleration": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"drag": {
"$ref": "#/definitions/ValueSpec"
},
"distribution": {
"$ref": "#/definitions/VisualDistribution"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
},
"fields": {
"type": "array",
"maxItems": 4,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
},
"burst": {
"type": "array",
"maxItems": 16,
"items": {
"type": "object",
"required": [
"at",
"count"
],
"additionalProperties": false,
"properties": {
"at": {
"$ref": "#/definitions/DurationSpec"
},
"count": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"rate": {
"$ref": "#/definitions/ValueSpec"
},
"limit": {
"type": "integer",
"minimum": 1
},
"lifetime": {
"$ref": "#/definitions/DurationSpec"
},
"render": {
"$ref": "#/definitions/VisualObject"
},
"capacity": {
"type": "integer",
"minimum": 1,
"maximum": 4096
},
"count": {
"$ref": "#/definitions/ValueSpec"
},
"size": {},
"rotation": {
"$ref": "#/definitions/ValueSpec"
},
"angularVelocity": {
"$ref": "#/definitions/ValueSpec"
},
"opacity": {},
"color": {},
"z": {
"$ref": "#/definitions/ValueSpec"
},
"trail": {
"$ref": "#/definitions/VisualTrail"
},
"links": {
"$ref": "#/definitions/VisualLinks"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"type",
"emit"
],
"properties": {
"type": {
"const": "emitter"
},
"layer": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifecycle": {
"enum": [
"persistent",
"spawned"
]
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
},
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"position": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"velocity": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"acceleration": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
},
"z": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"drag": {
"$ref": "#/definitions/ValueSpec"
},
"distribution": {
"$ref": "#/definitions/VisualDistribution"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
},
"fields": {
"type": "array",
"maxItems": 4,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
},
"burst": {
"type": "array",
"maxItems": 16,
"items": {
"type": "object",
"required": [
"at",
"count"
],
"additionalProperties": false,
"properties": {
"at": {
"$ref": "#/definitions/DurationSpec"
},
"count": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"rate": {
"$ref": "#/definitions/ValueSpec"
},
"limit": {
"type": "integer",
"minimum": 1
},
"lifetime": {
"$ref": "#/definitions/DurationSpec"
},
"emit": {
"$ref": "#/definitions/VisualObject"
},
"capacity": {
"type": "integer",
"minimum": 1,
"maximum": 512
},
"align": {
"type": "boolean"
},
"trail": {
"$ref": "#/definitions/VisualTrail"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": [
"type",
"repeat",
"count"
],
"properties": {
"type": {
"const": "repeater"
},
"layer": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"visible": {
"$ref": "#/definitions/ValueSpec"
},
"lifecycle": {
"enum": [
"persistent",
"spawned"
]
},
"automation": {
"type": "array",
"items": {
"$ref": "#/definitions/VisualAutomationTrack"
}
},
"spawn": {
"$ref": "#/definitions/VisualSpawn"
},
"repeat": {
"$ref": "#/definitions/VisualObject"
},
"count": {
"$ref": "#/definitions/ValueSpec"
},
"position": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"distribution": {
"$ref": "#/definitions/VisualDistribution"
},
"behaviors": {
"type": "array",
"maxItems": 8,
"items": {
"$ref": "#/definitions/VisualBehavior"
}
},
"fields": {
"type": "array",
"maxItems": 4,
"items": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
},
"links": {
"$ref": "#/definitions/VisualLinks"
}
}
}
]
},
"VisualField": {
"type": "object",
"required": [
"type"
],
"description": "Procedural field (18.7). Fields draw nothing; systems and behaviors read them.",
"properties": {
"type": {
"enum": [
"directional",
"radial",
"vortex",
"attractor",
"repulsor",
"noise"
]
},
"bounds": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"width": {
"type": "number"
},
"height": {
"type": "number"
}
}
},
"enabled": {
"$ref": "#/definitions/ValueSpec"
},
"direction": {
"type": "number"
},
"strength": {
"type": "number"
},
"center": {
"type": "object",
"additionalProperties": false,
"properties": {
"x": {
"$ref": "#/definitions/ValueSpec"
},
"y": {
"$ref": "#/definitions/ValueSpec"
}
}
},
"falloff": {
"enum": [
"none",
"linear",
"inverse",
"inverse-square"
]
},
"minDistance": {
"type": "number"
},
"maxDistance": {
"type": "number"
},
"scale": {
"type": "number",
"exclusiveMinimum": 0
},
"speed": {
"type": "number"
},
"octaves": {
"type": "integer",
"minimum": 1,
"maximum": 4
},
"persistence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"amplitude": {
"type": "number"
},
"mode": {
"enum": [
"curl",
"gradient",
"value"
]
},
"size": {
"type": "object",
"additionalProperties": false,
"properties": {
"width": {
"$ref": "#/definitions/ValueSpec"
},
"height": {
"$ref": "#/definitions/ValueSpec"
}
}
}
},
"additionalProperties": false
},
"VisualEffect": {
"type": "object",
"required": [
"type"
],
"description": "Post-effect entry (19.4), applied in normative array order.",
"properties": {
"type": {
"enum": [
"vignette",
"scanlines",
"grain",
"color-adjust",
"blur",
"bloom",
"fade"
]
},
"enabled": {
"$ref": "#/definitions/ValueSpec"
},
"amount": {
"$ref": "#/definitions/ValueSpec"
},
"radius": {
"$ref": "#/definitions/ValueSpec"
},
"softness": {
"$ref": "#/definitions/ValueSpec"
},
"color": {
"type": "string",
"description": "Color literal (section 2)."
},
"spacing": {
"$ref": "#/definitions/ValueSpec"
},
"thickness": {
"$ref": "#/definitions/ValueSpec"
},
"speed": {
"$ref": "#/definitions/ValueSpec"
},
"scale": {
"$ref": "#/definitions/ValueSpec"
},
"brightness": {
"$ref": "#/definitions/ValueSpec"
},
"contrast": {
"$ref": "#/definitions/ValueSpec"
},
"saturation": {
"$ref": "#/definitions/ValueSpec"
},
"hueRotate": {
"$ref": "#/definitions/ValueSpec"
},
"threshold": {
"$ref": "#/definitions/ValueSpec"
},
"intensity": {
"$ref": "#/definitions/ValueSpec"
}
},
"additionalProperties": false
},
"ScenarioTrigger": {
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"const": "manual"
}
},
"required": [
"type"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"const": "once"
},
"at": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
}
},
"required": [
"type"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"const": "interval"
},
"every": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
}
},
"required": [
"type",
"every"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"const": "random-interval"
},
"min": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
"max": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
}
},
"required": [
"type",
"min",
"max"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"const": "probability"
},
"every": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
"chance": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"type",
"every",
"chance"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"const": "condition"
},
"when": {
"$ref": "#/definitions/ConditionSpec"
},
"for": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
}
},
"required": [
"type",
"when"
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"type": {
"const": "event"
},
"event": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
}
},
"required": [
"type",
"event"
]
}
]
},
"ScenarioEntry": {
"type": "object",
"additionalProperties": false,
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"at": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
"after": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"delay": {
"anyOf": [
{
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"random": {
"type": "object",
"additionalProperties": false,
"properties": {
"min": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
"max": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
}
},
"required": [
"min",
"max"
]
}
},
"required": [
"random"
]
}
]
},
"repeat": {
"type": "object",
"additionalProperties": false,
"properties": {
"count": {
"type": "integer",
"minimum": 1,
"maximum": 1024
},
"every": {
"anyOf": [
{
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"random": {
"type": "object",
"additionalProperties": false,
"properties": {
"min": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
"max": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
}
},
"required": [
"min",
"max"
]
}
},
"required": [
"random"
]
}
]
}
},
"required": [
"count",
"every"
]
},
"actions": {
"type": "array",
"items": {
"$ref": "#/definitions/ActionSpec"
}
},
"choose": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"additionalProperties": false,
"properties": {
"weight": {
"type": "number",
"minimum": 0
},
"when": {
"$ref": "#/definitions/ConditionSpec"
},
"actions": {
"type": "array",
"items": {
"$ref": "#/definitions/ActionSpec"
}
}
},
"required": [
"weight",
"actions"
]
}
}
},
"allOf": [
{
"oneOf": [
{
"required": [
"at"
],
"not": {
"required": [
"after"
]
}
},
{
"required": [
"after"
],
"not": {
"required": [
"at"
]
}
}
]
},
{
"oneOf": [
{
"required": [
"actions"
],
"not": {
"required": [
"choose"
]
}
},
{
"required": [
"choose"
],
"not": {
"required": [
"actions"
]
}
}
]
}
]
},
"ScenarioDefinition": {
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string"
},
"enabled": {
"type": "boolean"
},
"priority": {
"type": "integer",
"minimum": 0,
"maximum": 100
},
"group": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]*$"
},
"trigger": {
"$ref": "#/definitions/ScenarioTrigger"
},
"eligibility": {
"type": "object",
"additionalProperties": false,
"properties": {
"when": {
"$ref": "#/definitions/ConditionSpec"
},
"timeout": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
}
}
},
"concurrency": {
"type": "object",
"additionalProperties": false,
"properties": {
"mode": {
"enum": [
"parallel",
"exclusive"
]
},
"scope": {
"enum": [
"group",
"global"
]
},
"policy": {
"enum": [
"defer",
"reject",
"replace"
]
}
},
"required": [
"mode"
]
},
"cooldown": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
"duration": {
"anyOf": [
{
"$ref": "#/definitions/DurationSpec"
},
{
"type": "number",
"minimum": 0
}
]
},
"onStart": {
"type": "array",
"items": {
"$ref": "#/definitions/ActionSpec"
}
},
"onComplete": {
"type": "array",
"items": {
"$ref": "#/definitions/ActionSpec"
}
},
"onCancel": {
"type": "array",
"items": {
"$ref": "#/definitions/ActionSpec"
}
},
"timeline": {
"type": "array",
"maxItems": 1024,
"items": {
"$ref": "#/definitions/ScenarioEntry"
}
},
"tags": {
"type": "array",
"maxItems": 16,
"items": {
"type": "string",
"maxLength": 32
}
}
},
"required": [
"timeline"
]
}
}
}