OPENHOOPS / 2K14Final team archive · November 9, 2026Reference libraryChecksums

Historical API55 integration guide. Use the final dev58 OpenAPI and current handoff for crowd additions and current limits.

HTTP v1 reference

Generated from the exact bundled OpenAPI contract. Every operation requires a private bearer token. See Integration for process lifetime, Requests for identity/roster selection and Controls for lease/precondition rules. JSON schemas below define the exact field domains; runtime capability and precondition checks still apply.

GET /v1/session

Capabilities and versions

{
  "summary": "Capabilities and versions",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/health

Source freshness

{
  "summary": "Source freshness",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/results

Durable result outbox

{
  "summary": "Durable result outbox",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/ResultPage"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "consumer_id",
      "in": "query",
      "schema": {
        "type": "string"
      }
    }
  ]
}

GET /v1/matches/{id}

Managed match

{
  "summary": "Managed match",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Match"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
      }
    }
  ]
}

GET /v1/snapshot

Latest observed snapshot

{
  "summary": "Latest observed snapshot",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Snapshot"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/events

Durable observation replay

{
  "summary": "Durable observation replay",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/EventPage"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "after",
      "in": "query",
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "limit",
      "in": "query",
      "schema": {
        "type": "string"
      }
    }
  ]
}

GET /v1/commands/{id}

Command receipt

{
  "summary": "Command receipt",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Receipt"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
      }
    }
  ]
}

POST /v1/matches

Bind current playing roster

{
  "summary": "Bind current playing roster",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/Bind"
        }
      }
    }
  }
}

POST /v1/matches/{id}/resume

Explicit timeline continuation

{
  "summary": "Explicit timeline continuation",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
      }
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/Resume"
        }
      }
    }
  }
}

POST /v1/matches/{id}/abandon

Abandon incomplete match

{
  "summary": "Abandon incomplete match",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
      }
    }
  ],
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/Abandon"
        }
      }
    }
  }
}

POST /v1/control/lease

Acquire or renew exclusive lease

{
  "summary": "Acquire or renew exclusive lease",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/Lease"
        }
      }
    }
  }
}

POST /v1/control/release

Release lease

{
  "summary": "Release lease",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/Release"
        }
      }
    }
  }
}

POST /v1/commands

Guarded native settings, preparation, launch and owned-session commands

{
  "summary": "Guarded native settings, preparation, launch and owned-session commands",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/Command"
        }
      }
    }
  }
}

POST /v1/results/ack

Acknowledge consumer result

{
  "summary": "Acknowledge consumer result",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "type": "object"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/Ack"
        }
      }
    }
  }
}

GET /v1/stream

SSE observation replay; reconnect after25 seconds

{
  "summary": "SSE observation replay; reconnect after25 seconds",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "text/event-stream": {
          "schema": {
            "type": "string"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "after",
      "in": "query",
      "schema": {
        "type": "string"
      }
    }
  ]
}

GET /v1/settings

Observed native settings, coaching and per-opponent defensive configuration

{
  "summary": "Observed native settings, coaching and per-opponent defensive configuration",
  "responses": {
    "200": {
      "description": "Current settings",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/SettingsResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/preparation

Current pre-simulation exhibition configuration and loaded arena/playbook choices

{
  "summary": "Current pre-simulation exhibition configuration and loaded arena/playbook choices",
  "responses": {
    "200": {
      "description": "Current exhibition preparation and loaded choices",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PreparationResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/preparation/catalog

Read a page of team or uniform rows on the game thread (ABI15)

{
  "summary": "Read a page of team or uniform rows on the game thread (ABI15)",
  "parameters": [
    {
      "name": "kind",
      "in": "query",
      "required": true,
      "schema": {
        "enum": [
          "teams",
          "uniforms"
        ]
      }
    },
    {
      "name": "start",
      "in": "query",
      "schema": {
        "type": "integer",
        "minimum": 0,
        "maximum": 65535,
        "default": 0
      }
    },
    {
      "name": "catalog_id",
      "in": "query",
      "schema": {
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "description": "A page from the current loaded roster catalog",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/PreparationCatalogResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/launch

Current native startup/load/Start context (ABI16)

{
  "summary": "Current native startup/load/Start context (ABI16)",
  "responses": {
    "200": {
      "description": "Current native startup/load/Start context (ABI16)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/LaunchResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

POST /v1/rosters

Import a hash-bound local standalone ROS without loading it

{
  "summary": "Import a hash-bound local standalone ROS without loading it",
  "responses": {
    "200": {
      "description": "Import a hash-bound local standalone ROS without loading it",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterMetadata"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/RosterImport"
        }
      }
    }
  }
}

GET /v1/rosters/{sha256}

Read admitted immutable roster metadata; not a native-load assertion

{
  "summary": "Read admitted immutable roster metadata; not a native-load assertion",
  "responses": {
    "200": {
      "description": "Read admitted immutable roster metadata; not a native-load assertion",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterMetadata"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

PUT /v1/rosters/{sha256}

Upload a stock/expanded standalone ROS with exact SHA256; source bytes remain unchanged

{
  "summary": "Upload a stock/expanded standalone ROS with exact SHA256; source bytes remain unchanged",
  "responses": {
    "200": {
      "description": "Upload a stock/expanded standalone ROS with exact SHA256; source bytes remain unchanged",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterMetadata"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/octet-stream": {
        "schema": {
          "type": "string",
          "format": "binary",
          "description": "Exactly 2672672 or 16777248 bytes; one Content-Length, no Transfer-Encoding"
        }
      }
    }
  }
}

GET /v1/lifecycle

Inspect ownership and lifetime of the broker-launched game

{
  "summary": "Inspect ownership and lifetime of the broker-launched game",
  "responses": {
    "200": {
      "description": "Owned process observation; attached games have no stop authority",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Lifecycle"
          }
        }
      }
    }
  }
}

GET /v1/launch/settings

Named startup preset catalog and original-setter readback status (ABI19)

{
  "summary": "Named startup preset catalog and original-setter readback status (ABI19)",
  "responses": {
    "200": {
      "description": "Runtime preset contract, no device/team assignment",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/StartupSettingsResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/roster-tools

Optional shared writer availability and named table inventory

{
  "summary": "Optional shared writer availability and named table inventory",
  "responses": {
    "200": {
      "description": "RosterTools",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterTools"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/roster-tools/fields

Paged named roster fields without binary layout offsets

{
  "summary": "Paged named roster fields without binary layout offsets",
  "parameters": [
    {
      "name": "table",
      "in": "query",
      "required": true,
      "schema": {
        "type": "string"
      }
    },
    {
      "name": "start",
      "in": "query",
      "schema": {
        "type": "integer",
        "minimum": 0
      }
    },
    {
      "name": "limit",
      "in": "query",
      "schema": {
        "type": "integer",
        "minimum": 1,
        "maximum": 256
      }
    }
  ],
  "responses": {
    "200": {
      "description": "RosterFieldPage",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterFieldPage"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

POST /v1/rosters/query

Read named fields from an immutable registered ROS

{
  "summary": "Read named fields from an immutable registered ROS",
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/RosterQueryRequest"
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "RosterQueryResponse",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterQueryResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

POST /v1/rosters/edit

Write named field edits to a new registered ROS; no game mutation

{
  "summary": "Write named field edits to a new registered ROS; no game mutation",
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/RosterEditRequest"
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "RosterAuthoringReceipt",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterAuthoringReceipt"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

POST /v1/rosters/prepare

Prepare roster order, starters and native minute preferences in a new ROS

{
  "summary": "Prepare roster order, starters and native minute preferences in a new ROS",
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/RosterPreparationRequest"
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "RosterAuthoringReceipt",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterAuthoringReceipt"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/launch/request

Current or named durable match-request receipt; no automatic restart/replay

{
  "summary": "Current or named durable match-request receipt; no automatic restart/replay",
  "parameters": [
    {
      "name": "request_id",
      "in": "query",
      "schema": {
        "type": "string"
      }
    }
  ],
  "responses": {
    "200": {
      "description": "Request progress and confirmed or unknown native outcome",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/MatchRequestResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/rosters/{sha256}/content

Download verified immutable standalone ROS bytes

{
  "summary": "Download verified immutable standalone ROS bytes",
  "description": "Authenticated existing registered hash only. No arbitrary path, query, game mutation or partial transfer contract. ETag contains the exact SHA256.",
  "parameters": [
    {
      "name": "sha256",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "pattern": "^[0-9a-f]{64}$"
      }
    }
  ],
  "responses": {
    "200": {
      "description": "Exact registered ROS content",
      "headers": {
        "ETag": {
          "schema": {
            "type": "string"
          }
        },
        "Content-Disposition": {
          "schema": {
            "type": "string"
          }
        }
      },
      "content": {
        "application/octet-stream": {
          "schema": {
            "type": "string",
            "format": "binary"
          }
        }
      }
    },
    "400": {
      "description": "Invalid identity or stored content"
    },
    "401": {
      "description": "Authentication required"
    },
    "404": {
      "description": "Roster not registered"
    }
  }
}

GET /v1/substitutions/requests

Read durable substitution request observations

{
  "summary": "Read durable substitution request observations",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/SubstitutionRequestPage"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/substitutions/requests/{id}

Read durable substitution request observations

{
  "summary": "Read durable substitution request observations",
  "responses": {
    "200": {
      "description": "Success",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/SubstitutionRequest"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "id",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
      }
    }
  ]
}

GET /v1/input-devices

Connected native input slots and control-record observations

{
  "summary": "Connected native input slots and control-record observations",
  "responses": {
    "200": {
      "description": "Process-local input catalog",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "run_id": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "health": {
                "type": "string"
              },
              "catalog": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/InputDevices"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "required": [
              "run_id",
              "health",
              "catalog"
            ],
            "additionalProperties": false
          }
        }
      }
    }
  }
}

GET /v1/rotations/plans

Durable rotation schedule observations, newest100

{
  "summary": "Durable rotation schedule observations, newest100",
  "responses": {
    "200": {
      "description": "Durable plan history",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "properties": {
              "plans": {
                "type": "array",
                "maxItems": 100,
                "items": {
                  "$ref": "#/components/schemas/RotationPlanObservation"
                }
              },
              "limit": {
                "const": 100
              }
            },
            "required": [
              "plans",
              "limit"
            ],
            "additionalProperties": false
          }
        }
      }
    }
  }
}

POST /v1/roster-metadata

Admit an immutable hash-bound local companion

{
  "summary": "Admit an immutable hash-bound local companion",
  "responses": {
    "200": {
      "description": "Admit an immutable hash-bound local companion",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterCompanionInfo"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/RosterImport"
        }
      }
    }
  }
}

GET /v1/roster-metadata/{sha256}

Read the descriptor of an immutable companion

{
  "summary": "Read the descriptor of an immutable companion",
  "responses": {
    "200": {
      "description": "Read the descriptor of an immutable companion",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterCompanionInfo"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

PUT /v1/roster-metadata/{sha256}

Upload a1–16MiB exact companion JSON; roster must already be registered

{
  "summary": "Upload a1\u201316MiB exact companion JSON; roster must already be registered",
  "responses": {
    "200": {
      "description": "Upload a stock/expanded standalone ROS with exact SHA256; source bytes remain unchanged",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterCompanionInfo"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/RosterCompanion"
        }
      }
    }
  }
}

GET /v1/roster-metadata/{sha256}/content

Download verified companion bytes with SHA256 ETag

{
  "summary": "Download verified companion bytes with SHA256 ETag",
  "responses": {
    "200": {
      "description": "Download verified companion bytes with SHA256 ETag",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterCompanion"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

POST /v1/roster-metadata/query

Page all companion scopes without guessing native effects

{
  "summary": "Page all companion scopes without guessing native effects",
  "responses": {
    "200": {
      "description": "Page all companion scopes without guessing native effects",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterMetadataPage"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/RosterMetadataQuery"
        }
      }
    }
  }
}

POST /v1/roster-metadata/resolve

Validate selection, source rows and effective overrides before native Start

{
  "summary": "Validate selection, source rows and effective overrides before native Start",
  "responses": {
    "200": {
      "description": "Validate selection, source rows and effective overrides before native Start",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RosterContextSpec"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/RosterMetadataResolve"
        }
      }
    }
  }
}

GET /v1/roster-metadata/catalog

Read the standard optional college vocabulary

{
  "summary": "Read the standard optional college vocabulary",
  "responses": {
    "200": {
      "description": "Read the standard optional college vocabulary",
      "content": {
        "application/json": {
          "schema": {
            "type": "object",
            "description": "Exact version1 openhoops.college.fields catalog with91 optional definitions and scopes."
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/rules

Rule extension capabilities, frozen configuration and integrity

{
  "summary": "Rule extension capabilities, frozen configuration and integrity",
  "responses": {
    "200": {
      "description": "Rule extension capabilities, frozen configuration and integrity",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/RuleRuntimeResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/ball-state

Per-field engine-committed ball state

{
  "summary": "Per-field engine-committed ball state",
  "responses": {
    "200": {
      "description": "Per-field engine-committed ball state",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/LegalBallResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

GET /v1/platform

{
  "responses": {
    "200": {
      "description": "Checked platform data",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/NativePlatformResponse"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

POST /v1/asset-packages

{
  "responses": {
    "200": {
      "description": "Checked platform data",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/AssetPackageDescriptor"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "path": {
              "type": "string"
            },
            "sha256": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            }
          },
          "required": [
            "path",
            "sha256"
          ],
          "additionalProperties": false
        }
      }
    }
  }
}

POST /v1/asset-packages/selection

{
  "responses": {
    "200": {
      "description": "Checked platform data",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/AssetOverlay"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "properties": {
            "ids": {
              "type": "array",
              "items": {
                "type": "string",
                "pattern": "^asset-package:[a-f0-9]{64}$"
              },
              "maxItems": 8,
              "minItems": 1,
              "uniqueItems": true
            }
          },
          "required": [
            "ids"
          ],
          "additionalProperties": false
        }
      }
    }
  }
}

GET /v1/asset-packages/{sha256}

{
  "responses": {
    "200": {
      "description": "Checked platform data",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/AssetPackageDescriptor"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "parameters": [
    {
      "name": "sha256",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "pattern": "^[a-f0-9]{64}$"
      }
    }
  ]
}

PUT /v1/asset-packages/{sha256}

{
  "responses": {
    "200": {
      "description": "Checked platform data",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/AssetPackageDescriptor"
          }
        }
      }
    },
    "default": {
      "description": "Structured failure (400/401/403/404/409/413/415/422/500/503)",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  },
  "requestBody": {
    "required": true,
    "content": {
      "application/zip": {
        "schema": {
          "type": "string",
          "format": "binary"
        }
      }
    }
  },
  "parameters": [
    {
      "name": "sha256",
      "in": "path",
      "required": true,
      "schema": {
        "type": "string",
        "pattern": "^[a-f0-9]{64}$"
      }
    }
  ]
}

POST /v1/compatibility

Read-only static match preflight. Scratch validation never reserves a request or starts a game; a pass does not establish live readiness.

{
  "description": "Read-only static match preflight. Scratch validation never reserves a request or starts a game; a pass does not establish live readiness.",
  "requestBody": {
    "required": true,
    "content": {
      "application/json": {
        "schema": {
          "$ref": "#/components/schemas/CompatibilityRequest"
        }
      }
    }
  },
  "responses": {
    "200": {
      "description": "Static compatibility report, including explicit failures/unknowns.",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/CompatibilityReport"
          }
        }
      }
    },
    "default": {
      "description": "HTTP contract error",
      "content": {
        "application/json": {
          "schema": {
            "$ref": "#/components/schemas/Error"
          }
        }
      }
    }
  }
}

Schema: Stats

{
  "type": "object",
  "properties": {
    "points": {
      "type": "integer"
    },
    "ftm": {
      "type": "integer"
    },
    "fta": {
      "type": "integer"
    },
    "two_made": {
      "type": "integer"
    },
    "two_attempts": {
      "type": "integer"
    },
    "three_made": {
      "type": "integer"
    },
    "three_attempts": {
      "type": "integer"
    },
    "offensive_rebounds": {
      "type": "integer"
    },
    "defensive_rebounds": {
      "type": "integer"
    },
    "assists": {
      "type": "integer"
    },
    "steals": {
      "type": "integer"
    },
    "blocks": {
      "type": "integer"
    },
    "turnovers": {
      "type": "integer"
    },
    "fouls": {
      "type": "integer"
    },
    "fgm": {
      "type": "integer"
    },
    "fga": {
      "type": "integer"
    },
    "total_rebounds": {
      "type": "integer"
    },
    "plus_minus": {
      "type": "integer"
    },
    "seconds_played": {
      "type": [
        "number",
        "null"
      ]
    }
  },
  "required": [
    "points",
    "ftm",
    "fta",
    "two_made",
    "two_attempts",
    "three_made",
    "three_attempts",
    "offensive_rebounds",
    "defensive_rebounds",
    "assists",
    "steals",
    "blocks",
    "turnovers",
    "fouls",
    "fgm",
    "fga",
    "total_rebounds"
  ],
  "additionalProperties": true
}

Schema: Player

{
  "type": "object",
  "properties": {
    "key": {
      "type": "string"
    },
    "side": {
      "enum": [
        "home",
        "away"
      ]
    },
    "slot": {
      "type": "integer"
    },
    "name": {
      "type": "string"
    },
    "on_court": {
      "type": "boolean"
    },
    "stats": {
      "$ref": "#/components/schemas/Stats"
    },
    "position": {
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "number",
          "null"
        ]
      },
      "minItems": 3,
      "maxItems": 3
    },
    "court_contact_samples": {
      "type": "object",
      "description": "Four original geometry samples plus original boundary projection; not authoritative shot/violation adjudication.",
      "properties": {
        "points": {
          "type": "array",
          "minItems": 4,
          "maxItems": 4,
          "items": {
            "type": "array",
            "minItems": 3,
            "maxItems": 3,
            "items": {
              "type": "number"
            }
          }
        },
        "boundary_projection": {
          "type": "array",
          "minItems": 3,
          "maxItems": 3,
          "items": {
            "type": "number"
          }
        },
        "boundary_projection_predicate_result": {
          "type": "integer"
        },
        "any_sample_on_or_beyond_boundary": {
          "type": "boolean"
        },
        "coordinate_space": {
          "const": "game_world_centimeters"
        },
        "authority": {
          "const": "original_four_point_transform_and_boundary_projection"
        },
        "legal_out_of_bounds_event_inferred": {
          "const": false
        },
        "shot_value_inferred": {
          "const": false
        }
      },
      "required": [
        "points",
        "boundary_projection",
        "boundary_projection_predicate_result",
        "any_sample_on_or_beyond_boundary",
        "coordinate_space",
        "authority",
        "legal_out_of_bounds_event_inferred",
        "shot_value_inferred"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "key",
    "side",
    "slot",
    "name",
    "on_court",
    "stats",
    "position"
  ],
  "additionalProperties": true
}

Schema: Team

{
  "type": "object",
  "properties": {
    "stats": {
      "$ref": "#/components/schemas/Stats"
    },
    "box_score_team_fouls": {
      "type": "integer"
    },
    "team_only_turnovers": {
      "type": "integer"
    },
    "scoring_buckets": {
      "type": "object",
      "properties": {
        "total": {
          "type": "integer"
        },
        "regulation": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "minItems": 4,
          "maxItems": 4
        },
        "overtime_combined": {
          "type": "integer"
        },
        "regulation_periods": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "type": {
                "enum": [
                  "half",
                  "overtime"
                ]
              },
              "number": {
                "type": "integer",
                "minimum": 1
              },
              "raw_period": {
                "type": "integer",
                "minimum": 1
              },
              "points": {
                "type": "integer",
                "minimum": 0
              }
            },
            "required": [
              "type",
              "number",
              "raw_period",
              "points"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "total",
        "regulation",
        "overtime_combined"
      ],
      "additionalProperties": true
    },
    "qualifying_fouls": {
      "type": "integer"
    },
    "last_two_minutes_qualifying_fouls": {
      "type": "integer"
    },
    "bonus_threshold_reached": {
      "type": "boolean"
    },
    "timeouts": {
      "type": "object",
      "properties": {
        "full": {
          "type": "integer"
        },
        "short": {
          "type": "integer"
        }
      },
      "required": [
        "full",
        "short"
      ],
      "additionalProperties": true
    },
    "bonus": {
      "type": "object",
      "properties": {
        "against_team": {
          "enum": [
            "none",
            "one_and_one",
            "double_bonus"
          ]
        },
        "qualifying_fouls": {
          "type": "integer"
        },
        "one_and_one_threshold": {
          "type": "integer",
          "minimum": 1,
          "maximum": 2147483647
        },
        "double_bonus_threshold": {
          "type": "integer",
          "minimum": 1,
          "maximum": 2147483647
        },
        "authority": {
          "const": "qualifying_foul_counter"
        },
        "individual_foul_eligibility_inferred": {
          "const": false
        }
      },
      "required": [
        "against_team",
        "qualifying_fouls",
        "one_and_one_threshold",
        "double_bonus_threshold",
        "authority",
        "individual_foul_eligibility_inferred"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "stats",
    "box_score_team_fouls",
    "team_only_turnovers",
    "scoring_buckets",
    "qualifying_fouls",
    "last_two_minutes_qualifying_fouls",
    "bonus_threshold_reached",
    "timeouts"
  ],
  "additionalProperties": true
}

Schema: Snapshot

{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "source_sequence": {
      "type": "integer"
    },
    "source_tick_ms": {
      "type": "integer"
    },
    "adapter_errors": {
      "type": "integer"
    },
    "valid": {
      "type": "boolean"
    },
    "boundary": {
      "type": "string"
    },
    "coherence": {
      "type": "string"
    },
    "phase_code": {
      "type": "integer"
    },
    "raw_period": {
      "type": "integer"
    },
    "finished": {
      "type": "boolean"
    },
    "winner": {
      "enum": [
        "home",
        "away",
        null
      ]
    },
    "clocks": {
      "type": "object",
      "properties": {
        "game_seconds": {
          "type": [
            "number",
            "null"
          ]
        },
        "shot_seconds": {
          "type": [
            "number",
            "null"
          ]
        },
        "backcourt_seconds": {
          "type": [
            "number",
            "null"
          ]
        },
        "game_timer_flags": {
          "type": "integer"
        },
        "shot_timer_flags": {
          "type": "integer"
        },
        "paused": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "replay_active": {
          "type": [
            "boolean",
            "null"
          ]
        }
      },
      "required": [
        "game_seconds",
        "shot_seconds",
        "backcourt_seconds",
        "game_timer_flags",
        "shot_timer_flags",
        "paused",
        "replay_active"
      ],
      "additionalProperties": true
    },
    "ball": {
      "type": "object",
      "properties": {
        "attached_player_key": {
          "type": [
            "string",
            "null"
          ]
        },
        "legal_possession": {
          "type": "null"
        },
        "live": {
          "type": "null"
        },
        "holder": {
          "anyOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "properties": {
                "player_key": {
                  "type": "string"
                },
                "team": {
                  "enum": [
                    "home",
                    "away"
                  ]
                },
                "authority": {
                  "const": "physical_ball_attachment"
                }
              },
              "required": [
                "player_key",
                "team",
                "authority"
              ],
              "additionalProperties": false
            }
          ],
          "description": "Current on-court roster attachment only. Null is not a possession change."
        }
      },
      "required": [
        "attached_player_key",
        "legal_possession",
        "live"
      ],
      "additionalProperties": true
    },
    "rules": {
      "type": "object",
      "properties": {
        "bonus_selector": {
          "type": "integer"
        },
        "parameters": {
          "anyOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "authority": {
                  "const": "engine_parameter_snapshot"
                },
                "three_point_selector": {
                  "type": "integer",
                  "minimum": 0
                },
                "backcourt_selector": {
                  "type": "integer",
                  "minimum": 0
                },
                "period_duration_seconds": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "full_shot_clock_seconds": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "conditional_shot_clock_minimum_seconds": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "three_point_geometry": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "units": {
                      "const": "game_units"
                    },
                    "arc_radius": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "corner_half_width": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "corner_start_oriented_z": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "basket_oriented_z": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "units",
                    "arc_radius",
                    "corner_half_width",
                    "corner_start_oriented_z",
                    "basket_oriented_z"
                  ]
                },
                "backcourt_duration_seconds": {
                  "type": "number",
                  "minimum": 1,
                  "maximum": 120
                }
              },
              "required": [
                "authority",
                "three_point_selector",
                "backcourt_selector",
                "period_duration_seconds",
                "full_shot_clock_seconds",
                "conditional_shot_clock_minimum_seconds",
                "three_point_geometry"
              ]
            }
          ]
        },
        "profile": {
          "anyOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/components/schemas/RuleProfile"
            }
          ]
        },
        "period": {
          "anyOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "enum": [
                    "half",
                    "overtime"
                  ]
                },
                "number": {
                  "type": "integer",
                  "minimum": 1
                },
                "raw_period": {
                  "type": "integer",
                  "minimum": 1
                },
                "at_boundary": {
                  "type": "boolean"
                },
                "authority": {
                  "const": "adapter_period_mapping"
                }
              },
              "required": [
                "type",
                "number",
                "raw_period",
                "at_boundary",
                "authority"
              ],
              "additionalProperties": false
            }
          ]
        },
        "media_timeouts": {
          "anyOf": [
            {
              "type": "null"
            },
            {
              "$ref": "#/components/schemas/MediaTimeouts"
            }
          ]
        },
        "court": {
          "type": "object",
          "description": "NCAA court definition with adapter parameter alignment and explicit verification limits. Present only for college profile revision3+.",
          "additionalProperties": true,
          "properties": {
            "definition_id": {
              "const": "ncaa_mens_2026_27"
            },
            "definition_revision": {
              "type": "integer",
              "enum": [
                2,
                3
              ]
            },
            "units": {
              "const": "centimeters"
            },
            "geometry": {
              "type": "object"
            },
            "alignment": {
              "type": "object"
            },
            "texture_mapping": {
              "type": "object"
            }
          },
          "required": [
            "definition_id",
            "definition_revision",
            "units",
            "geometry",
            "alignment",
            "texture_mapping"
          ]
        },
        "court_observation": {
          "type": "object",
          "description": "Actual runtime court boundaries, physical basket reference and offensive direction; ABI14+.",
          "properties": {
            "units": {
              "const": "centimeters"
            },
            "boundary_half_width": {
              "type": "number"
            },
            "boundary_half_length": {
              "type": "number"
            },
            "legacy_basket_reference_oriented_z": {
              "type": [
                "number",
                "null"
              ]
            },
            "offensive_direction": {
              "enum": [
                -1,
                1,
                null
              ]
            },
            "authority": {
              "const": "original_geometry_routines_on_game_thread"
            }
          },
          "required": [
            "units",
            "boundary_half_width",
            "boundary_half_length",
            "legacy_basket_reference_oriented_z",
            "offensive_direction",
            "authority"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "bonus_selector"
      ],
      "additionalProperties": true,
      "description": "Recovered parameters, declared profile/logical period, media ownership and court observations where available. Full-rulebook and legal-ball-state certification are not implied."
    },
    "free_throws": {
      "type": "object",
      "properties": {
        "total": {
          "type": "integer"
        },
        "remaining": {
          "type": "integer"
        },
        "award": {
          "anyOf": [
            {
              "type": "null"
            },
            {
              "type": "object",
              "properties": {
                "kind_code": {
                  "type": "integer",
                  "minimum": 0
                },
                "kind_name": {
                  "enum": [
                    "shooting",
                    "non_shooting_bonus",
                    null,
                    "one_and_one",
                    "double_bonus"
                  ]
                },
                "shooter_player_key": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "authority": {
                  "const": "engine_free_throw_schedule"
                }
              },
              "required": [
                "kind_code",
                "kind_name",
                "shooter_player_key",
                "authority"
              ],
              "additionalProperties": false
            }
          ]
        }
      },
      "required": [
        "total",
        "remaining"
      ],
      "additionalProperties": true
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "$ref": "#/components/schemas/Team"
        },
        "away": {
          "$ref": "#/components/schemas/Team"
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": true
    },
    "players": {
      "type": "array",
      "maxItems": 40,
      "items": {
        "$ref": "#/components/schemas/Player"
      }
    },
    "roster_fingerprint": {
      "type": "string"
    },
    "health": {
      "type": "string"
    },
    "age_seconds": {
      "type": [
        "number",
        "null"
      ]
    },
    "match_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "timeline_revision": {
      "type": [
        "integer",
        "null"
      ]
    },
    "engine_event_boundary": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "sequence": {
          "type": "integer",
          "minimum": 0
        },
        "faults": {
          "type": "integer",
          "minimum": 0
        }
      },
      "required": [
        "sequence",
        "faults"
      ],
      "additionalProperties": false,
      "description": "ABI v3 ordered record watermark copied with this frame; null on older adapters."
    },
    "adapter_abi_version": {
      "type": "integer",
      "minimum": 1,
      "description": "Private producer layout revision, used for capability negotiation; not a cross-platform public ABI promise."
    },
    "presentation": {
      "type": "object",
      "properties": {
        "state": {
          "enum": [
            "pregame",
            "inbound",
            "play",
            "period_ending",
            "halftime",
            "between_periods",
            "free_throw",
            "stoppage",
            "postgame",
            "timeout",
            null
          ]
        },
        "authority": {
          "const": "observed_engine_phase"
        },
        "scope": {
          "enum": [
            "four_quarter_exhibition",
            "college_research_exhibition"
          ]
        },
        "legal_ball_state": {
          "const": false
        }
      },
      "required": [
        "state",
        "authority",
        "scope",
        "legal_ball_state"
      ],
      "additionalProperties": false,
      "description": "Observed presentation cue, including timeout. Unknown phases remain null; pause/replay are independent; not legal ball state."
    },
    "settings": {
      "$ref": "#/components/schemas/GameSettings"
    },
    "options": {
      "$ref": "#/components/schemas/GameOptions"
    },
    "controllers": {
      "$ref": "#/components/schemas/ControllerSettings"
    },
    "cameras": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/CameraState"
        },
        {
          "type": "null"
        }
      ]
    },
    "timeout": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/TimeoutContext"
        },
        {
          "type": "null"
        }
      ]
    },
    "launch": {
      "$ref": "#/components/schemas/LaunchState"
    },
    "startup": {
      "$ref": "#/components/schemas/StartupState"
    },
    "launch_rules": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/LaunchRules"
        },
        {
          "type": "null"
        }
      ]
    },
    "startup_settings": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/StartupSettingsState"
        }
      ]
    },
    "startup_camera": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/StartupCameraState"
        }
      ]
    },
    "participation": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/ParticipationState"
        }
      ]
    },
    "coaching": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/CoachingState"
        },
        {
          "type": "null"
        }
      ]
    },
    "defense": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/DefenseState"
        }
      ]
    },
    "simulation_control": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/SimulationControl"
        }
      ]
    },
    "substitutions": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/Substitutions"
        },
        {
          "type": "null"
        }
      ]
    },
    "timeout_control": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/TimeoutControl"
        },
        {
          "type": "null"
        }
      ]
    },
    "rotations": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/Rotations"
        },
        {
          "type": "null"
        }
      ]
    },
    "input_devices": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/InputDevices"
        },
        {
          "type": "null"
        }
      ]
    },
    "roster_context": {
      "$ref": "#/components/schemas/RosterContextReference"
    },
    "legal_ball": {
      "$ref": "#/components/schemas/LegalBallState"
    },
    "rule_runtime": {
      "$ref": "#/components/schemas/RuleRuntime"
    },
    "extension_platform": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/NativePlatform"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "run_id",
    "source_sequence",
    "source_tick_ms",
    "adapter_errors",
    "valid",
    "boundary",
    "coherence",
    "phase_code",
    "raw_period",
    "finished",
    "winner",
    "clocks",
    "ball",
    "rules",
    "free_throws",
    "teams",
    "players",
    "roster_fingerprint",
    "health",
    "age_seconds",
    "match_id",
    "timeline_revision"
  ],
  "additionalProperties": true
}

Schema: Bind

{
  "type": "object",
  "properties": {
    "match_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "run_id": {
      "type": "string"
    },
    "roster_fingerprint": {
      "type": "string"
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "away": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": true
    },
    "players": {
      "type": "object",
      "additionalProperties": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
      }
    },
    "ruleset": {
      "type": "object"
    },
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "expected_names": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "metadata": {
      "type": "object"
    },
    "roster_context": {
      "$ref": "#/components/schemas/RosterContextSpec"
    }
  },
  "required": [
    "match_id",
    "client_id",
    "run_id",
    "roster_fingerprint",
    "teams",
    "players",
    "ruleset"
  ],
  "additionalProperties": true
}

Schema: Resume

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "run_id": {
      "type": "string"
    },
    "expected_revision": {
      "type": "integer"
    }
  },
  "required": [
    "client_id",
    "run_id",
    "expected_revision"
  ],
  "additionalProperties": true
}

Schema: Abandon

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    }
  },
  "required": [
    "client_id"
  ],
  "additionalProperties": true
}

Schema: Lease

{
  "type": "object",
  "properties": {
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "ttl_seconds": {
      "type": "number",
      "minimum": 1,
      "maximum": 60,
      "default": 30
    },
    "lease_token": {
      "type": "string"
    }
  },
  "required": [
    "client_id"
  ],
  "additionalProperties": true
}

Schema: Release

{
  "type": "object",
  "properties": {
    "lease_token": {
      "type": "string"
    }
  },
  "required": [
    "lease_token"
  ],
  "additionalProperties": true
}

Schema: Ack

{
  "type": "object",
  "properties": {
    "consumer_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "match_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "revision": {
      "type": "integer",
      "minimum": 1
    }
  },
  "required": [
    "consumer_id",
    "match_id",
    "revision"
  ],
  "additionalProperties": true
}

Schema: Command

{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "type": {
          "enum": [
            "clock.set",
            "shot_clock.set",
            "slider.set",
            "option.set",
            "controller.set",
            "camera.select",
            "camera.set",
            "preparation.set"
          ]
        },
        "expected_period": {
          "type": "integer"
        },
        "expected_value": {
          "oneOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 3600
            },
            {
              "type": "string",
              "pattern": "^(arena|playbook|team-row|uniform-row):[0-9]+$"
            }
          ]
        },
        "value": {
          "oneOf": [
            {
              "type": "number",
              "minimum": 0,
              "maximum": 3600
            },
            {
              "type": "string",
              "pattern": "^(arena|playbook|team-row|uniform-row):[0-9]+$"
            }
          ]
        },
        "setting_id": {
          "type": "string"
        },
        "side": {
          "enum": [
            "user",
            "cpu"
          ]
        },
        "player_slot": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9,
          "description": "Stored controller preference slot, not a roster player or connection state."
        },
        "camera_id": {
          "enum": [
            "broadcast_stadium",
            "broadcast_generic",
            "beluba",
            "parametric",
            "press",
            "2k",
            "player_lock",
            "turbo",
            "action",
            "action_2",
            "nosebleeds",
            "skybox",
            "side",
            "drive",
            "showtime",
            "wire",
            "high",
            "iso",
            "dunk_cam",
            "coach_view",
            "broadcast_dynamic",
            "drill_high",
            "drill_2k",
            "bench",
            "horse",
            "training_camp"
          ]
        },
        "expected_camera_id": {
          "enum": [
            "broadcast_stadium",
            "broadcast_generic",
            "beluba",
            "parametric",
            "press",
            "2k",
            "player_lock",
            "turbo",
            "action",
            "action_2",
            "nosebleeds",
            "skybox",
            "side",
            "drive",
            "showtime",
            "wire",
            "high",
            "iso",
            "dunk_cam",
            "coach_view",
            "broadcast_dynamic",
            "drill_high",
            "drill_2k",
            "bench",
            "horse",
            "training_camp"
          ]
        },
        "expected_revision": {
          "type": "integer",
          "minimum": 1
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "type"
      ],
      "additionalProperties": true,
      "allOf": [
        {
          "if": {
            "properties": {
              "type": {
                "const": "slider.set"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "required": [
              "setting_id",
              "side"
            ],
            "properties": {
              "value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "expected_value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "option.set"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "required": [
              "setting_id"
            ],
            "properties": {
              "value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "expected_value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "controller.set"
              }
            },
            "required": [
              "type"
            ]
          },
          "then": {
            "required": [
              "setting_id",
              "player_slot"
            ],
            "properties": {
              "value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              },
              "expected_value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "camera.select"
              }
            }
          },
          "then": {
            "required": [
              "camera_id",
              "expected_camera_id"
            ]
          },
          "else": {
            "required": [
              "value",
              "expected_value"
            ]
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "camera.set"
              }
            }
          },
          "then": {
            "required": [
              "camera_id",
              "setting_id"
            ],
            "properties": {
              "setting_id": {
                "enum": [
                  "zoom",
                  "height",
                  "key_zoom",
                  "reverse_angle",
                  "auto_flip",
                  "fixed_height"
                ]
              },
              "value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10
              },
              "expected_value": {
                "type": "integer",
                "minimum": 0,
                "maximum": 10
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "type": {
                "const": "preparation.set"
              }
            }
          },
          "then": {
            "required": [
              "expected_revision",
              "setting_id",
              "value",
              "expected_value"
            ],
            "properties": {
              "setting_id": {
                "enum": [
                  "difficulty",
                  "game_speed",
                  "quarter_length_minutes",
                  "fatigue",
                  "injuries",
                  "arena",
                  "home_playbook",
                  "away_playbook",
                  "game_style",
                  "home_team",
                  "away_team",
                  "home_uniform",
                  "away_uniform"
                ]
              }
            }
          },
          "else": {
            "required": [
              "expected_period"
            ],
            "properties": {
              "value": {
                "type": "number",
                "minimum": 0,
                "maximum": 3600
              },
              "expected_value": {
                "type": "number",
                "minimum": 0,
                "maximum": 3600
              }
            }
          }
        }
      ]
    },
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "type": {
          "enum": [
            "roster.load",
            "match.start"
          ]
        },
        "expected_revision": {
          "type": "integer",
          "minimum": 1
        },
        "expected_launch_revision": {
          "type": "integer",
          "minimum": 1
        },
        "catalog_id": {
          "type": "string"
        },
        "roster_id": {
          "type": "string",
          "pattern": "^roster:[0-9a-f]{64}$"
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "type",
        "expected_revision",
        "expected_launch_revision",
        "catalog_id",
        "roster_id"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "const": "session.stop"
        },
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "match_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "reason": {
          "enum": [
            "cancelled",
            "finished"
          ]
        }
      },
      "required": [
        "type",
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "match_id",
        "reason"
      ],
      "additionalProperties": false
    },
    {
      "$ref": "#/components/schemas/CoachingCommand"
    },
    {
      "$ref": "#/components/schemas/DefensiveCommand"
    },
    {
      "$ref": "#/components/schemas/SimulationCommand"
    },
    {
      "$ref": "#/components/schemas/SubstitutionCommand"
    },
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "expected_period": {
          "type": "integer",
          "minimum": 1,
          "maximum": 36
        },
        "expected_revision": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "type": {
          "const": "timeout.call"
        },
        "side": {
          "const": "home"
        },
        "kind": {
          "enum": [
            "short",
            "full"
          ]
        },
        "expected_remaining": {
          "type": "integer",
          "minimum": 1,
          "maximum": 64
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "expected_period",
        "expected_revision",
        "type",
        "side",
        "kind",
        "expected_remaining"
      ],
      "additionalProperties": false,
      "allOf": [
        {
          "if": {
            "properties": {
              "kind": {
                "const": "full"
              }
            }
          },
          "then": {
            "properties": {
              "expected_remaining": {
                "maximum": 32
              }
            }
          }
        }
      ]
    },
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "expected_period": {
          "type": "integer",
          "minimum": 1,
          "maximum": 36
        },
        "expected_revision": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "type": {
          "const": "timeout.call"
        },
        "side": {
          "const": "away"
        },
        "kind": {
          "enum": [
            "short",
            "full"
          ]
        },
        "expected_remaining": {
          "type": "integer",
          "minimum": 1,
          "maximum": 64
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "expected_period",
        "expected_revision",
        "type",
        "side",
        "kind",
        "expected_remaining"
      ],
      "additionalProperties": false,
      "allOf": [
        {
          "if": {
            "properties": {
              "kind": {
                "const": "full"
              }
            }
          },
          "then": {
            "properties": {
              "expected_remaining": {
                "maximum": 32
              }
            }
          }
        }
      ]
    },
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "expected_period": {
          "type": "integer",
          "minimum": 1,
          "maximum": 36
        },
        "expected_revision": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "type": {
          "const": "rotations.replace"
        },
        "entries": {
          "$ref": "#/components/schemas/RotationPlan"
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "expected_period",
        "expected_revision",
        "type",
        "entries"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "expected_period": {
          "type": "integer",
          "minimum": 1,
          "maximum": 36
        },
        "expected_revision": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "type": {
          "const": "rotations.cancel"
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "expected_period",
        "expected_revision",
        "type"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "type": {
          "const": "participation.assign"
        },
        "expected_launch_revision": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "expected_input_revision": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "assignments": {
          "type": "array",
          "minItems": 0,
          "maxItems": 10,
          "items": {
            "$ref": "#/components/schemas/InputAssignment"
          }
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "type",
        "expected_launch_revision",
        "expected_input_revision",
        "assignments"
      ],
      "additionalProperties": false
    }
  ]
}

Schema: Error

{
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string"
        },
        "details": {}
      },
      "required": [
        "code",
        "message",
        "details"
      ],
      "additionalProperties": true
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": true
}

Schema: Event

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string"
    },
    "run_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "observed_at": {
      "type": "number"
    },
    "payload": {
      "type": "object"
    },
    "sequence": {
      "type": "integer"
    },
    "event_id": {
      "type": "string"
    }
  },
  "required": [
    "type",
    "run_id",
    "observed_at",
    "payload",
    "sequence",
    "event_id"
  ],
  "additionalProperties": true,
  "allOf": [
    {
      "if": {
        "properties": {
          "type": {
            "enum": [
              "engine.record_stored",
              "engine.record_capture_failed",
              "stats.counter_changed",
              "stats.counter_unchanged",
              "stats.counter_unavailable",
              "game.phase_changed",
              "game.phase_reentered",
              "stats.team_counter_changed",
              "stats.team_counter_unchanged",
              "stats.team_counter_unavailable"
            ]
          }
        }
      },
      "then": {
        "properties": {
          "payload": {
            "$ref": "#/components/schemas/EngineRecordPayload"
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "type": {
            "const": "substitution.request_changed"
          }
        }
      },
      "then": {
        "properties": {
          "payload": {
            "$ref": "#/components/schemas/SubstitutionRequest"
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "type": {
            "const": "rotations.plan_changed"
          }
        }
      },
      "then": {
        "properties": {
          "payload": {
            "$ref": "#/components/schemas/RotationPlanObservation"
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "type": {
            "enum": [
              "rules.ball_state",
              "rules.decision",
              "rules.lifecycle",
              "rules.observation_context"
            ]
          }
        }
      },
      "then": {
        "properties": {
          "payload": {
            "$ref": "#/components/schemas/RuleEvent"
          }
        }
      }
    }
  ]
}

Schema: EngineActor

{
  "type": "object",
  "properties": {
    "side": {
      "enum": [
        "home",
        "away"
      ]
    },
    "slot": {
      "type": "integer",
      "minimum": 0,
      "maximum": 19
    },
    "player_key": {
      "type": "string"
    },
    "external_player_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "external_team_id": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "side",
    "slot",
    "player_key"
  ],
  "additionalProperties": true
}

Schema: CounterChange

{
  "type": "object",
  "properties": {
    "stat": {
      "enum": [
        "offensive_rebounds",
        "defensive_rebounds",
        "blocks",
        "assists",
        "steals",
        "personal_fouls",
        "turnovers",
        "free_throws_made",
        "three_pointers_made",
        "three_pointers_attempted",
        "two_pointers_made",
        "two_pointers_attempted",
        "free_throws_attempted",
        "points"
      ]
    },
    "operation": {
      "enum": [
        "credit",
        "retract"
      ]
    },
    "player": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/EngineActor"
        },
        {
          "type": "null"
        }
      ]
    },
    "before": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 4294967295
    },
    "after": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 4294967295
    },
    "delta": {
      "type": [
        "integer",
        "null"
      ]
    },
    "changed": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "wrapped": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "correction_of_event_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "Retained durable public event ID of the original counter credit, when established by the original engine path. Null when absent or expired; not inferred by proximity."
    },
    "correction_of_record_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "Original engine rebound-context source record selected by the observed correction path. This is not the original stat-credit event ID; may predate the current binding."
    },
    "correction_of_stat_record_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "Run-scoped source record ID of an original rebound or block counter credit, established by the instrumented engine owner and correction context. May predate binding or retained public history."
    }
  },
  "required": [
    "stat",
    "operation",
    "player",
    "before",
    "after",
    "delta",
    "changed",
    "wrapped",
    "correction_of_event_id"
  ],
  "additionalProperties": true
}

Schema: EngineRecordPayload

{
  "type": "object",
  "properties": {
    "source_event_id": {
      "type": "string"
    },
    "source_event_sequence": {
      "type": "integer"
    },
    "source_tick_ms": {
      "type": "integer"
    },
    "category_code": {
      "type": [
        "integer",
        "null"
      ]
    },
    "checkpoint_index": {
      "type": "integer"
    },
    "raw_period": {
      "type": "integer"
    },
    "phase_code": {
      "type": "integer"
    },
    "game_seconds": {
      "type": [
        "number",
        "null"
      ]
    },
    "shot_seconds": {
      "type": [
        "number",
        "null"
      ]
    },
    "engine_time": {
      "type": [
        "number",
        "null"
      ]
    },
    "engine_time_secondary": {
      "type": [
        "number",
        "null"
      ]
    },
    "capture_flags": {
      "type": "integer"
    },
    "authority": {
      "enum": [
        "engine_record_storage_completed",
        "player_counter_write_completed",
        "game_phase_transition_completed",
        "team_counter_write_completed"
      ]
    },
    "basketball_meaning": {
      "type": [
        "string",
        "null"
      ]
    },
    "stat_change": {
      "$ref": "#/components/schemas/CounterChange"
    },
    "violation_record": {
      "type": "object",
      "properties": {
        "kind_code": {
          "type": "integer"
        },
        "actors": {
          "type": "array",
          "minItems": 2,
          "maxItems": 2,
          "items": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/EngineActor"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "position": {
          "type": "array",
          "minItems": 3,
          "maxItems": 3,
          "items": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "offensive_direction": {
          "type": [
            "number",
            "null"
          ]
        },
        "kind_name": {
          "enum": [
            "eight_second_backcourt_violation",
            "ten_second_backcourt_violation",
            "double_dribble_violation",
            "out_of_bounds",
            "five_second_inbound_violation",
            "shot_clock_violation",
            "kicked_ball_violation",
            "reach_in_foul",
            "blocking_foul",
            "shooting_foul",
            null
          ]
        },
        "actor_roles": {
          "type": "array",
          "minItems": 2,
          "maxItems": 2,
          "items": {
            "enum": [
              "violating_player",
              "foul_committer",
              "fouled_player",
              null
            ]
          }
        },
        "role_authority": {
          "enum": [
            "original_handler_credit_arguments",
            "unresolved"
          ]
        },
        "detection_authority": {
          "const": "original_game_detection_not_independently_certified"
        }
      },
      "required": [
        "kind_code",
        "actors",
        "position",
        "offensive_direction"
      ],
      "additionalProperties": true
    },
    "phase_transition": {
      "type": "object",
      "properties": {
        "before": {
          "type": "integer"
        },
        "after": {
          "type": "integer"
        },
        "initialized": {
          "type": "boolean"
        },
        "changed": {
          "type": "boolean"
        }
      },
      "required": [
        "before",
        "after",
        "initialized",
        "changed"
      ],
      "additionalProperties": true
    },
    "team_stat_change": {
      "$ref": "#/components/schemas/TeamCounterChange"
    },
    "context": {
      "type": "object",
      "properties": {
        "status": {
          "enum": [
            "bound",
            "unbound"
          ]
        },
        "match_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "timeline_revision": {
          "type": [
            "integer",
            "null"
          ]
        },
        "reason": {
          "type": [
            "string",
            "null"
          ]
        },
        "authority": {
          "const": "snapshot_bracketed_binding"
        }
      },
      "required": [
        "status",
        "match_id",
        "timeline_revision",
        "reason",
        "authority"
      ],
      "additionalProperties": false
    },
    "rebound_record": {
      "type": "object",
      "properties": {
        "player": {
          "anyOf": [
            {
              "$ref": "#/components/schemas/EngineActor"
            },
            {
              "type": "null"
            }
          ]
        },
        "offensive": {
          "type": "boolean"
        },
        "position": {
          "type": "array",
          "minItems": 3,
          "maxItems": 3,
          "items": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "offensive_direction": {
          "type": [
            "number",
            "null"
          ]
        },
        "credit_source_event_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "Run-scoped source record ID of the counter credit associated by the original rebound-credit owner. Absent when linkage is unavailable; not a public HTTP cursor."
        }
      },
      "required": [
        "player",
        "offensive",
        "position",
        "offensive_direction"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "source_event_id",
    "source_event_sequence",
    "source_tick_ms",
    "category_code",
    "checkpoint_index",
    "raw_period",
    "phase_code",
    "game_seconds",
    "shot_seconds",
    "engine_time",
    "engine_time_secondary",
    "capture_flags",
    "authority",
    "basketball_meaning"
  ],
  "additionalProperties": true
}

Schema: EventPage

{
  "type": "object",
  "properties": {
    "events": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Event"
      }
    },
    "next_cursor": {
      "type": "string"
    },
    "latest_cursor": {
      "type": "string"
    }
  },
  "required": [
    "events",
    "next_cursor",
    "latest_cursor"
  ],
  "additionalProperties": true
}

Schema: Receipt

{
  "type": "object",
  "properties": {
    "command_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "status": {
      "enum": [
        "accepted",
        "applied",
        "rejected",
        "indeterminate"
      ]
    },
    "type": {
      "type": "string"
    },
    "run_id": {
      "type": "string"
    },
    "observed_camera_id": {
      "enum": [
        "broadcast_stadium",
        "broadcast_generic",
        "beluba",
        "parametric",
        "press",
        "2k",
        "player_lock",
        "turbo",
        "action",
        "action_2",
        "nosebleeds",
        "skybox",
        "side",
        "drive",
        "showtime",
        "wire",
        "high",
        "iso",
        "dunk_cam",
        "coach_view",
        "broadcast_dynamic",
        "drill_high",
        "drill_2k",
        "bench",
        "horse",
        "training_camp",
        null
      ]
    },
    "observed_pending_player_key": {
      "type": [
        "string",
        "null"
      ]
    },
    "observed_pending_known": {
      "type": "boolean"
    },
    "completed": {
      "type": "boolean"
    },
    "meaning": {
      "type": "string"
    }
  },
  "required": [
    "command_id",
    "status",
    "type",
    "run_id"
  ],
  "additionalProperties": true
}

Schema: Result

{
  "type": "object",
  "properties": {
    "match_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "timeline_revision": {
      "type": "integer"
    },
    "run_id": {
      "type": "string"
    },
    "winner": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "$ref": "#/components/schemas/Team"
        },
        "away": {
          "$ref": "#/components/schemas/Team"
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": true
    },
    "players": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "external_id": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
          },
          "side": {
            "enum": [
              "home",
              "away"
            ]
          },
          "stats": {
            "$ref": "#/components/schemas/Stats"
          }
        },
        "required": [
          "external_id",
          "side",
          "stats"
        ],
        "additionalProperties": true
      }
    },
    "ruleset": {
      "type": "object"
    },
    "source_executable_sha256": {
      "type": "string"
    },
    "completeness": {
      "type": "object",
      "properties": {
        "points_reconciled": {
          "type": "boolean"
        },
        "whole_match_events": {
          "type": "boolean"
        },
        "separate_overtime_periods": {
          "type": "boolean"
        },
        "started_mid_match": {
          "type": "boolean"
        },
        "rule_profile_verified": {
          "type": "boolean",
          "description": "Historical field name: follows the captured profile final_exports_verified (or original_game default). It describes reference export-profile evidence, not full basketball-rule or attached-binary certification. Read engine_rule_profile.full_rulebook_verified separately; inspect this result scoring_ledger and reconciliation flags."
        },
        "requested_rule_contract_intact": {
          "type": "boolean"
        }
      },
      "required": [
        "points_reconciled",
        "whole_match_events",
        "separate_overtime_periods",
        "started_mid_match"
      ],
      "additionalProperties": true
    },
    "finalization_reason": {
      "type": "string"
    },
    "result_revision": {
      "type": "integer"
    },
    "idempotency_key": {
      "type": "string"
    },
    "scoring_ledger": {
      "$ref": "#/components/schemas/ScoringLedger"
    },
    "engine_rule_profile": {
      "$ref": "#/components/schemas/RuleProfile",
      "description": "Profile declaration captured at finalization. Immutable historical result metadata is not rewritten when the broker evidence ledger changes. Use completeness and scoring_ledger to assess this result independently."
    },
    "metadata": {
      "type": "object"
    },
    "roster_context": {
      "$ref": "#/components/schemas/RosterContext"
    },
    "rule_extensions": {
      "$ref": "#/components/schemas/RuleResultContext"
    },
    "native_context": {
      "$ref": "#/components/schemas/NativeContextReceipt"
    },
    "match_assets": {
      "$ref": "#/components/schemas/NativeAssetStatus"
    }
  },
  "required": [
    "match_id",
    "timeline_revision",
    "run_id",
    "winner",
    "teams",
    "players",
    "ruleset",
    "source_executable_sha256",
    "completeness",
    "finalization_reason",
    "result_revision",
    "idempotency_key"
  ],
  "additionalProperties": true
}

Schema: ResultPage

{
  "type": "object",
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Result"
      }
    }
  },
  "required": [
    "results"
  ],
  "additionalProperties": true
}

Schema: Match

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "status": {
      "enum": [
        "active",
        "finalized",
        "review_required",
        "abandoned"
      ]
    },
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "run_id": {
      "type": "string"
    },
    "roster_fingerprint": {
      "type": "string"
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "away": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": true
    },
    "players": {
      "type": "object",
      "additionalProperties": {
        "type": "string",
        "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
      }
    },
    "ruleset": {
      "type": "object"
    },
    "timeline_revision": {
      "type": "integer"
    },
    "binding_request": {
      "$ref": "#/components/schemas/Bind"
    },
    "event_binding_boundary": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Snapshot event watermark at bind/resume; does not claim whole-match history."
    },
    "scoring_ledger": {
      "$ref": "#/components/schemas/ScoringLedger"
    },
    "metadata": {
      "type": "object"
    },
    "binding_phase_code": {
      "enum": [
        4,
        10
      ]
    },
    "started_before_opening_play": {
      "type": "boolean"
    },
    "roster_context": {
      "$ref": "#/components/schemas/RosterContext"
    },
    "binding_start_command": {
      "$ref": "#/components/schemas/RosterContextIdentifier"
    },
    "rule_epoch": {
      "type": "integer",
      "minimum": 0
    },
    "native_context": {
      "$ref": "#/components/schemas/NativeContextReceipt"
    },
    "match_assets": {
      "$ref": "#/components/schemas/NativeAssetStatus"
    }
  },
  "required": [
    "id",
    "status",
    "client_id",
    "run_id",
    "roster_fingerprint",
    "teams",
    "players",
    "ruleset",
    "timeline_revision",
    "binding_request"
  ],
  "additionalProperties": true
}

Schema: TeamCounterChange

{
  "type": "object",
  "properties": {
    "stat": {
      "const": "team_only_turnovers"
    },
    "operation": {
      "const": "credit"
    },
    "before": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 4294967295
    },
    "after": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 4294967295
    },
    "delta": {
      "type": [
        "integer",
        "null"
      ]
    },
    "changed": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "wrapped": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "team": {
      "enum": [
        "home",
        "away",
        null
      ]
    },
    "external_team_id": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "stat",
    "operation",
    "before",
    "after",
    "delta",
    "changed",
    "wrapped",
    "team"
  ],
  "additionalProperties": true
}

Schema: ScoringLedger

{
  "type": [
    "object",
    "null"
  ],
  "description": "Observed per-period scoring. Reconciled means continuous captured counter chains match all player points and engine regulation/combined OT buckets; not authoritative legal scoring. Partial ledgers must not be used as complete period exports.",
  "properties": {
    "status": {
      "enum": [
        "capturing",
        "partial",
        "reconciled"
      ]
    },
    "authority": {
      "const": "captured_point_counter_writes"
    },
    "timeline_revision": {
      "type": "integer",
      "minimum": 1
    },
    "baseline_complete": {
      "type": "boolean"
    },
    "separate_overtime_periods_reconciled": {
      "type": "boolean"
    },
    "record_count": {
      "type": "integer",
      "minimum": 0
    },
    "issues": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "periods": {
      "type": "object",
      "additionalProperties": {
        "type": "object",
        "required": [
          "home",
          "away"
        ],
        "properties": {
          "home": {
            "type": "integer"
          },
          "away": {
            "type": "integer"
          }
        },
        "additionalProperties": false
      }
    },
    "baseline_points": {
      "type": "object",
      "additionalProperties": {
        "type": "integer"
      }
    },
    "current_points": {
      "type": "object",
      "additionalProperties": {
        "type": "integer"
      }
    },
    "logical_periods": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "enum": [
              "half",
              "overtime"
            ]
          },
          "number": {
            "type": "integer",
            "minimum": 1
          },
          "raw_period": {
            "type": "integer",
            "minimum": 1
          },
          "home": {
            "type": "integer",
            "minimum": 0
          },
          "away": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "type",
          "number",
          "raw_period",
          "home",
          "away"
        ],
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false,
  "required": [
    "status",
    "authority",
    "timeline_revision",
    "baseline_complete",
    "record_count",
    "issues",
    "periods",
    "baseline_points",
    "current_points"
  ]
}

Schema: SliderValues

{
  "type": "object",
  "additionalProperties": {
    "type": [
      "number",
      "null"
    ],
    "minimum": 0,
    "maximum": 100
  }
}

Schema: GameSettings

{
  "type": [
    "object",
    "null"
  ],
  "properties": {
    "authority": {
      "const": "original_slider_profile"
    },
    "preset_code": {
      "type": "integer"
    },
    "persistence": {
      "type": "string"
    },
    "values": {
      "type": "object",
      "properties": {
        "user": {
          "$ref": "#/components/schemas/SliderValues"
        },
        "cpu": {
          "$ref": "#/components/schemas/SliderValues"
        }
      },
      "required": [
        "user",
        "cpu"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "authority",
    "preset_code",
    "persistence",
    "values"
  ],
  "additionalProperties": false
}

Schema: SettingsResponse

{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "health": {
      "type": "string"
    },
    "settings": {
      "$ref": "#/components/schemas/GameSettings"
    },
    "catalog": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "options": {
      "$ref": "#/components/schemas/GameOptions"
    },
    "options_catalog": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "controllers": {
      "$ref": "#/components/schemas/ControllerSettings"
    },
    "controllers_catalog": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "cameras_catalog": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/CameraDescriptor"
      },
      "minItems": 26,
      "maxItems": 26
    },
    "cameras": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/CameraState"
        },
        {
          "type": "null"
        }
      ]
    },
    "coaching": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/CoachingState"
        },
        {
          "type": "null"
        }
      ]
    },
    "coaching_catalog": {
      "type": "array",
      "maxItems": 9,
      "items": {
        "type": "object"
      }
    },
    "defense": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/DefenseState"
        }
      ]
    },
    "defense_catalog": {
      "type": "array",
      "maxItems": 6,
      "items": {
        "type": "object"
      }
    },
    "simulation_control": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/SimulationControl"
        }
      ]
    },
    "simulation_control_catalog": {
      "type": "object"
    },
    "substitutions": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/Substitutions"
        },
        {
          "type": "null"
        }
      ]
    },
    "substitution_catalog": {
      "type": "object"
    },
    "timeout_control": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/TimeoutControl"
        },
        {
          "type": "null"
        }
      ]
    },
    "rotations": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/Rotations"
        },
        {
          "type": "null"
        }
      ]
    },
    "timeout_catalog": {
      "type": "object"
    },
    "rotation_catalog": {
      "type": "object"
    }
  },
  "required": [
    "run_id",
    "health",
    "settings",
    "catalog"
  ],
  "additionalProperties": false
}

Schema: GameOptions

{
  "type": [
    "object",
    "null"
  ],
  "properties": {
    "authority": {
      "const": "engine_active_game_settings"
    },
    "persistence": {
      "const": "current_game_only"
    },
    "values": {
      "type": "object",
      "additionalProperties": {
        "type": [
          "integer",
          "null"
        ]
      }
    }
  },
  "required": [
    "authority",
    "persistence",
    "values"
  ],
  "additionalProperties": false
}

Schema: ControllerSettings

{
  "type": [
    "object",
    "null"
  ],
  "properties": {
    "authority": {
      "const": "engine_controller_profile"
    },
    "persistence": {
      "type": "string"
    },
    "slots": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "player_slot",
          "values"
        ],
        "properties": {
          "player_slot": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9,
            "description": "Stored controller preference slot, not a roster player or connection state."
          },
          "values": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "integer",
                "null"
              ],
              "minimum": 0,
              "maximum": 100
            }
          }
        },
        "additionalProperties": false
      },
      "minItems": 10,
      "maxItems": 10
    }
  },
  "required": [
    "authority",
    "persistence",
    "slots"
  ],
  "additionalProperties": false
}

Schema: CameraDescriptor

{
  "type": "object",
  "required": [
    "id",
    "label",
    "observed_in_exhibition_menu",
    "activation_supported",
    "activation_verification",
    "controls",
    "verification"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "label": {
      "type": "string"
    },
    "observed_in_exhibition_menu": {
      "type": "boolean"
    },
    "activation_supported": {
      "type": "boolean"
    },
    "activation_verification": {
      "type": "string"
    },
    "verification": {
      "type": "string"
    },
    "controls": {
      "type": "array",
      "minItems": 6,
      "maxItems": 6,
      "items": {
        "type": "object",
        "required": [
          "id",
          "minimum",
          "maximum",
          "step",
          "default",
          "engine_configurable"
        ],
        "properties": {
          "id": {
            "enum": [
              "zoom",
              "height",
              "key_zoom",
              "reverse_angle",
              "auto_flip",
              "fixed_height"
            ]
          },
          "minimum": {
            "type": "integer"
          },
          "maximum": {
            "type": "integer"
          },
          "step": {
            "const": 1
          },
          "default": {
            "type": "integer"
          },
          "engine_configurable": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}

Schema: CameraState

{
  "type": "object",
  "properties": {
    "active_camera_id": {
      "enum": [
        "broadcast_stadium",
        "broadcast_generic",
        "beluba",
        "parametric",
        "press",
        "2k",
        "player_lock",
        "turbo",
        "action",
        "action_2",
        "nosebleeds",
        "skybox",
        "side",
        "drive",
        "showtime",
        "wire",
        "high",
        "iso",
        "dunk_cam",
        "coach_view",
        "broadcast_dynamic",
        "drill_high",
        "drill_2k",
        "bench",
        "horse",
        "training_camp",
        null
      ]
    },
    "menu_open": {
      "type": "boolean"
    },
    "values": {
      "type": "object",
      "properties": {
        "broadcast_stadium": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "broadcast_generic": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "beluba": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "parametric": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "press": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "2k": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "player_lock": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "turbo": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "action": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "action_2": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "nosebleeds": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "skybox": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "side": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "drive": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "showtime": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "wire": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "high": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "iso": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "dunk_cam": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "coach_view": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "broadcast_dynamic": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "drill_high": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "drill_2k": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "bench": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "horse": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        },
        "training_camp": {
          "type": "object",
          "properties": {
            "zoom": {
              "type": "integer"
            },
            "height": {
              "type": "integer"
            },
            "key_zoom": {
              "type": "integer"
            },
            "reverse_angle": {
              "type": "integer"
            },
            "auto_flip": {
              "type": "integer"
            },
            "fixed_height": {
              "type": "integer"
            }
          },
          "required": [
            "zoom",
            "height",
            "key_zoom",
            "reverse_angle",
            "auto_flip",
            "fixed_height"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "broadcast_stadium",
        "broadcast_generic",
        "beluba",
        "parametric",
        "press",
        "2k",
        "player_lock",
        "turbo",
        "action",
        "action_2",
        "nosebleeds",
        "skybox",
        "side",
        "drive",
        "showtime",
        "wire",
        "high",
        "iso",
        "dunk_cam",
        "coach_view",
        "broadcast_dynamic",
        "drill_high",
        "drill_2k",
        "bench",
        "horse",
        "training_camp"
      ],
      "additionalProperties": false
    },
    "authority": {
      "const": "engine_camera_configuration"
    },
    "persistence": {
      "const": "runtime_only"
    }
  },
  "required": [
    "active_camera_id",
    "menu_open",
    "values",
    "authority",
    "persistence"
  ],
  "additionalProperties": false
}

Schema: TimeoutContext

{
  "type": "object",
  "properties": {
    "team": {
      "enum": [
        "home",
        "away",
        null
      ]
    },
    "kind": {
      "enum": [
        "short",
        "full",
        null
      ]
    },
    "seconds_remaining": {
      "type": [
        "number",
        "null"
      ],
      "minimum": 0,
      "maximum": 180
    },
    "authority": {
      "const": "engine_timeout_context"
    }
  },
  "required": [
    "team",
    "kind",
    "seconds_remaining",
    "authority"
  ],
  "additionalProperties": false
}

Schema: PreparationResponse

{
  "type": "object",
  "properties": {
    "run_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "health": {
      "enum": [
        "ready",
        "unavailable",
        "stale"
      ]
    },
    "configuration": {
      "oneOf": [
        {
          "type": "null"
        },
        {
          "type": "object",
          "properties": {
            "revision": {
              "type": "integer"
            },
            "values": {
              "type": "object",
              "properties": {
                "difficulty": {
                  "type": "integer"
                },
                "game_speed": {
                  "type": "integer"
                },
                "quarter_length_minutes": {
                  "type": "integer"
                },
                "fatigue": {
                  "type": "integer"
                },
                "injuries": {
                  "type": "integer"
                },
                "arena": {
                  "type": "string"
                },
                "home_playbook": {
                  "type": "string"
                },
                "away_playbook": {
                  "type": "string"
                },
                "game_style": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 3
                },
                "home_team": {
                  "type": "string",
                  "pattern": "^team-row:[0-9]+$"
                },
                "away_team": {
                  "type": "string",
                  "pattern": "^team-row:[0-9]+$"
                },
                "home_uniform": {
                  "type": "string",
                  "pattern": "^uniform-row:[0-9]+$"
                },
                "away_uniform": {
                  "type": "string",
                  "pattern": "^uniform-row:[0-9]+$"
                }
              },
              "required": [
                "difficulty",
                "game_speed",
                "quarter_length_minutes",
                "fatigue",
                "injuries",
                "arena",
                "home_playbook",
                "away_playbook"
              ],
              "additionalProperties": true
            },
            "game_style_code": {
              "type": "integer",
              "description": "Legacy raw options-profile code; not the Game Style menu selection. Use values.game_style on ABI15."
            },
            "teams": {
              "type": "object",
              "properties": {
                "home": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "name"
                  ],
                  "additionalProperties": true
                },
                "away": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "name": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "name"
                  ],
                  "additionalProperties": true
                }
              },
              "required": [
                "home",
                "away"
              ],
              "additionalProperties": true
            },
            "arenas": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "label": {
                    "type": "string"
                  },
                  "writable": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "id",
                  "label",
                  "writable"
                ],
                "additionalProperties": true
              }
            },
            "playbooks": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "label": {
                    "type": "string"
                  },
                  "writable": {
                    "type": "boolean"
                  }
                },
                "required": [
                  "id",
                  "label",
                  "writable"
                ],
                "additionalProperties": true
              }
            },
            "catalog_id": {
              "type": "string"
            },
            "scope": {
              "const": "exhibition_configuration_before_simulation"
            },
            "persistence": {
              "const": "runtime_only"
            },
            "launch_supported": {
              "type": "boolean",
              "description": "ABI16 native Start available; inspect /v1/launch for current eligibility"
            },
            "catalog_revision": {
              "type": "integer",
              "minimum": 1
            },
            "team_count": {
              "type": "integer",
              "minimum": 1
            },
            "uniform_count": {
              "type": "integer",
              "minimum": 1
            },
            "team_graphics_ids": {
              "type": "object",
              "properties": {
                "home": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 65535
                },
                "away": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 65535
                }
              },
              "required": [
                "home",
                "away"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "revision",
            "values",
            "game_style_code",
            "teams",
            "arenas",
            "playbooks",
            "catalog_id",
            "scope",
            "persistence",
            "launch_supported"
          ],
          "additionalProperties": true
        }
      ]
    },
    "catalog": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "minimum": {
            "type": "integer"
          },
          "maximum": {
            "type": "integer"
          },
          "step": {
            "type": "integer"
          }
        },
        "required": [
          "id",
          "label",
          "minimum",
          "maximum",
          "step"
        ],
        "additionalProperties": true
      }
    }
  },
  "required": [
    "run_id",
    "health",
    "configuration",
    "catalog"
  ],
  "additionalProperties": true
}

Schema: RuleProfile

{
  "type": "object",
  "properties": {
    "id": {
      "enum": [
        "original_game",
        "openhoops_college_research"
      ]
    },
    "revision": {
      "enum": [
        1,
        2,
        3,
        4
      ]
    },
    "authority": {
      "const": "adapter_configuration"
    },
    "status": {
      "const": "experimental"
    },
    "regulation_periods": {
      "const": 2
    },
    "regulation_period_type": {
      "const": "half"
    },
    "regulation_raw_periods": {
      "const": [
        1,
        3
      ]
    },
    "half_duration_seconds": {
      "type": "number",
      "minimum": 60,
      "maximum": 1200
    },
    "overtime_duration_seconds": {
      "enum": [
        60,
        120,
        180,
        240,
        300
      ]
    },
    "overtime_policy": {
      "enum": [
        "ceil_half_minutes_divided_by_four",
        "extension_frozen"
      ]
    },
    "elapsed_seconds": {
      "type": "number"
    },
    "full_rulebook_verified": {
      "const": false,
      "description": "Always false: the scoped OpenHoops college mode and user exclusions are not certification of the complete NCAA rulebook."
    },
    "final_exports_verified": {
      "type": "boolean",
      "description": "Reference export-scenario evidence for this profile revision in the current broker. True for newly decoded revision4 after natural36ct OT/player-team/ledger/independent-consumer checks. Does not certify the attached DLL or a particular match, whole-match events, or all rules. Stored revision4 recordings/results with false remain valid and immutable; revisions1\u20133 remain false."
    },
    "incomplete": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Verification limits rather than a list of wholly unimplemented features. Revision4 lists rare live injury/rim recovery/held-ball checks, exhaustive airborne/boundary semantics and the deferred uninstrumented-production full-match smoke. Earlier revisions preserve their historical coarse labels. These strings are descriptive, not capability IDs."
    },
    "configuration_variant": {
      "const": "extension_modified"
    },
    "extension_ids": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "extension_integrity": {
      "enum": [
        "applied",
        "degraded"
      ]
    }
  },
  "required": [
    "id",
    "revision",
    "authority"
  ],
  "additionalProperties": false,
  "description": "Adapter configuration, not a ruleset command or full NCAA certification. Absent on ABI1\u201311; null when unavailable. Current college revision4 has verified reference regulation/OT export scenarios. Historical stored results retain their original declarations.",
  "allOf": [
    {
      "if": {
        "properties": {
          "id": {
            "const": "original_game"
          }
        },
        "required": [
          "id"
        ]
      },
      "then": {
        "properties": {
          "revision": {
            "const": 1
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "id": {
            "const": "openhoops_college_research"
          },
          "revision": {
            "enum": [
              1,
              2,
              3
            ]
          }
        },
        "required": [
          "id",
          "revision"
        ]
      },
      "then": {
        "properties": {
          "final_exports_verified": {
            "const": false
          }
        }
      }
    }
  ]
}

Schema: MediaTimeouts

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "authority": {
      "const": "openhoops_media_scheduler"
    },
    "status": {
      "const": "experimental"
    },
    "enabled": {
      "type": "boolean"
    },
    "scheduled_breaks_per_half": {
      "type": "integer",
      "minimum": 0,
      "maximum": 4
    },
    "marks_seconds_remaining": {
      "type": "array",
      "items": {
        "type": "number",
        "minimum": 0
      },
      "maxItems": 4
    },
    "shortened_half_policy": {
      "enum": [
        "proportional_spacing",
        "fixed_clock_marks"
      ]
    },
    "duration_seconds": {
      "const": 60
    },
    "state_raw_period": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 1,
      "maximum": 64
    },
    "served_mark_numbers": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1,
        "maximum": 4
      },
      "uniqueItems": true
    },
    "active_break": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "reason": {
              "enum": [
                "scheduled_mark",
                "first_team_timeout",
                "injury_timeout"
              ]
            },
            "scheduled_mark_number": {
              "type": [
                "integer",
                "null"
              ],
              "minimum": 1,
              "maximum": 4
            },
            "counts_against_team_allowance": {
              "type": "boolean"
            },
            "seconds_remaining": {
              "type": [
                "number",
                "null"
              ],
              "minimum": 0,
              "maximum": 180
            }
          },
          "required": [
            "reason",
            "scheduled_mark_number",
            "counts_against_team_allowance",
            "seconds_remaining"
          ]
        }
      ]
    },
    "complete_rulebook_verified": {
      "const": false
    },
    "full_length_breaks_per_half": {
      "enum": [
        0,
        3,
        4
      ]
    }
  },
  "required": [
    "authority",
    "status",
    "enabled",
    "scheduled_breaks_per_half",
    "marks_seconds_remaining",
    "shortened_half_policy",
    "duration_seconds",
    "state_raw_period",
    "served_mark_numbers",
    "active_break",
    "complete_rulebook_verified"
  ]
}

Schema: PreparationCatalogResponse

{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "revision": {
      "type": "integer",
      "minimum": 1
    },
    "catalog_id": {
      "type": "string"
    },
    "kind": {
      "enum": [
        "teams",
        "uniforms"
      ]
    },
    "start": {
      "type": "integer",
      "minimum": 0
    },
    "total": {
      "type": "integer",
      "minimum": 0
    },
    "items": {
      "type": "array",
      "maxItems": 64,
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "row": {
            "type": "integer",
            "minimum": 0
          },
          "record_id": {
            "type": "integer"
          },
          "graphics_id": {
            "type": "integer"
          },
          "writable": {
            "type": "boolean"
          },
          "away": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "label": {
            "type": "string"
          },
          "resource": {
            "type": "string"
          }
        },
        "additionalProperties": false,
        "required": [
          "id",
          "row",
          "record_id",
          "graphics_id",
          "writable",
          "away",
          "label",
          "resource"
        ]
      }
    },
    "next_start": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0
    }
  },
  "required": [
    "run_id",
    "revision",
    "catalog_id",
    "kind",
    "start",
    "total",
    "items",
    "next_start"
  ],
  "additionalProperties": false
}

Schema: RosterMetadata

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "bytes": {
      "enum": [
        2672672,
        16777248
      ]
    },
    "schema": {
      "const": "nba2k14_pc_ros"
    },
    "expanded": {
      "type": "boolean"
    },
    "teams": {
      "type": "integer",
      "minimum": 2,
      "maximum": 2048
    },
    "players": {
      "type": "integer",
      "minimum": 1,
      "maximum": 65535
    },
    "uniforms": {
      "type": "integer",
      "minimum": 1,
      "maximum": 65535
    },
    "arenas": {
      "type": "integer",
      "minimum": 1,
      "maximum": 128
    },
    "playbooks": {
      "type": "integer",
      "minimum": 1,
      "maximum": 128
    },
    "native_loaded": {
      "const": false
    }
  },
  "required": [
    "id",
    "sha256",
    "bytes",
    "schema",
    "expanded",
    "teams",
    "players",
    "uniforms",
    "arenas",
    "playbooks",
    "native_loaded"
  ],
  "additionalProperties": false
}

Schema: RosterImport

{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "description": "Absolute local Windows ROS path, read without modifying the source"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    }
  },
  "required": [
    "path",
    "sha256"
  ],
  "additionalProperties": false
}

Schema: LaunchState

{
  "type": "object",
  "properties": {
    "available": {
      "type": "boolean"
    },
    "revision": {
      "type": "integer",
      "minimum": 0
    },
    "phase": {
      "enum": [
        "unavailable",
        "ready",
        "loading",
        "active",
        "other_menu",
        "startup",
        "unknown"
      ]
    },
    "menu": {
      "enum": [
        "home",
        "team_selection",
        null
      ]
    },
    "catalog_revision": {
      "type": "integer",
      "minimum": 0
    },
    "team_count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 2048
    },
    "player_count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 65535
    },
    "uniform_count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 65535
    },
    "roster_id": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "type": "string",
          "pattern": "^roster:[0-9a-f]{64}$"
        }
      ]
    }
  },
  "required": [
    "available",
    "revision",
    "phase",
    "menu",
    "catalog_revision",
    "team_count",
    "player_count",
    "uniform_count",
    "roster_id"
  ],
  "additionalProperties": false
}

Schema: LaunchResponse

{
  "type": "object",
  "properties": {
    "run_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "health": {
      "enum": [
        "ready",
        "unavailable",
        "stale"
      ]
    },
    "state": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/LaunchState"
        }
      ]
    },
    "bootstrap": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "starting",
                "ready",
                "failed"
              ]
            },
            "game_pid": {
              "type": "integer"
            },
            "acknowledgements": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "type": "string"
            },
            "mode": {
              "enum": [
                "native_managed"
              ]
            }
          },
          "required": [
            "status",
            "game_pid",
            "acknowledgements"
          ],
          "additionalProperties": false
        }
      ]
    },
    "startup": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/StartupState"
        }
      ]
    },
    "configuration": {
      "type": "object",
      "properties": {
        "requested": {
          "anyOf": [
            {
              "$ref": "#/components/schemas/LaunchConfiguration"
            },
            {
              "type": "null"
            }
          ]
        },
        "effective": {
          "anyOf": [
            {
              "$ref": "#/components/schemas/LaunchRules"
            },
            {
              "type": "null"
            }
          ]
        },
        "verified": {
          "type": [
            "boolean",
            "null"
          ]
        }
      },
      "required": [
        "requested",
        "effective",
        "verified"
      ],
      "additionalProperties": false
    },
    "startup_settings": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/StartupSettingsState"
        }
      ]
    },
    "startup_camera": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/StartupCameraState"
        }
      ]
    },
    "participation": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/ParticipationState"
        }
      ]
    },
    "rotations": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/Rotations"
        },
        {
          "type": "null"
        }
      ]
    },
    "rule_runtime": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/RuleRuntime"
        },
        {
          "type": "null"
        }
      ]
    },
    "extension_platform": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/NativePlatform"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "run_id",
    "health",
    "state",
    "bootstrap"
  ],
  "additionalProperties": false
}

Schema: StartupState

{
  "type": "object",
  "properties": {
    "available": {
      "type": "boolean"
    },
    "managed": {
      "type": "boolean"
    },
    "loading_presented": {
      "type": "boolean"
    },
    "match_revealed": {
      "type": "boolean"
    }
  },
  "required": [
    "available",
    "managed",
    "loading_presented",
    "match_revealed"
  ],
  "additionalProperties": false
}

Schema: LoadingScreenConfiguration

{
  "type": "object",
  "properties": {
    "version": {
      "type": "integer",
      "const": 1
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "subtitle": {
      "type": "string",
      "minLength": 1,
      "maxLength": 160
    },
    "background_color": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$"
    },
    "text_color": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$"
    },
    "muted_color": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$"
    },
    "accent_color": {
      "type": "string",
      "pattern": "^#[0-9a-fA-F]{6}$"
    },
    "logo_path": {
      "type": "string",
      "description": "Absolute local PNG, JPEG or BMP path, at most 16 MiB. Private immutable copy; decoded dimensions at most 8192 by 4320."
    },
    "background_path": {
      "type": "string",
      "description": "Absolute local PNG, JPEG or BMP path, at most 16 MiB. Private immutable copy; decoded dimensions at most 8192 by 4320."
    }
  },
  "additionalProperties": false,
  "description": "Optional version1 JSON file passed through broker --loading-screen. Neutral defaults are used for omitted fields."
}

Schema: LaunchRules

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "profile": {
      "enum": [
        "original",
        "college"
      ]
    },
    "half_length_minutes": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 1,
      "maximum": 20
    },
    "overtime_seconds": {
      "enum": [
        60,
        120,
        180,
        240,
        300
      ]
    },
    "media_timeouts": {
      "enum": [
        0,
        3,
        4
      ]
    },
    "authority": {
      "const": "adapter_startup_configuration"
    }
  },
  "required": [
    "version",
    "profile",
    "half_length_minutes",
    "overtime_seconds",
    "media_timeouts",
    "authority"
  ],
  "additionalProperties": false
}

Schema: LaunchConfiguration

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "rules": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "profile": {
              "const": "original"
            }
          },
          "required": [
            "profile"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "profile": {
              "const": "college"
            },
            "half_length_minutes": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20
            },
            "media_timeouts": {
              "enum": [
                0,
                3,
                4
              ]
            },
            "overtime_policy": {
              "const": "scaled"
            }
          },
          "required": [
            "profile"
          ],
          "additionalProperties": false
        }
      ]
    },
    "settings": {
      "$ref": "#/components/schemas/StartupSettingsPlan"
    },
    "participation": {
      "$ref": "#/components/schemas/ParticipationPlan"
    },
    "rotations": {
      "$ref": "#/components/schemas/RotationPlan"
    },
    "extensions": {
      "type": "array",
      "maxItems": 8,
      "items": {
        "$ref": "#/components/schemas/RuleExtensionRequest"
      }
    },
    "native_metadata": {
      "type": "boolean"
    },
    "assets": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^asset-package:[a-f0-9]{64}$"
      },
      "maxItems": 8,
      "minItems": 1,
      "uniqueItems": true
    }
  },
  "required": [
    "version",
    "rules"
  ],
  "additionalProperties": false
}

Schema: MatchIdentityPlan

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "match_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "away": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": false
    },
    "players": {
      "type": "object",
      "minProperties": 2,
      "maxProperties": 40,
      "propertyNames": {
        "pattern": "^(home|away):([0-9]|1[0-9])$"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      }
    },
    "ruleset": {
      "type": "object"
    },
    "metadata": {
      "type": "object"
    }
  },
  "required": [
    "version",
    "match_id",
    "teams",
    "players",
    "ruleset"
  ],
  "additionalProperties": false
}

Schema: Lifecycle

{
  "type": "object",
  "properties": {
    "available": {
      "type": "boolean"
    },
    "run_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "match_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "game_pid": {
      "type": [
        "integer",
        "null"
      ]
    },
    "game_running": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "scope": {
      "const": "broker_owned_process_only"
    }
  },
  "required": [
    "available",
    "run_id",
    "match_id",
    "game_pid",
    "game_running",
    "scope"
  ],
  "additionalProperties": false
}

Schema: StartupSettingsPlan

{
  "type": "object",
  "properties": {
    "options": {
      "type": "object",
      "properties": {
        "shooting_type": {
          "type": "integer",
          "minimum": 0,
          "maximum": 1,
          "multipleOf": 1
        },
        "ft_shooting_type": {
          "type": "integer",
          "minimum": 0,
          "maximum": 1,
          "multipleOf": 1
        },
        "ft_difficulty": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "multipleOf": 5
        },
        "commentary_volume": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "multipleOf": 5
        },
        "pa_volume": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "multipleOf": 5
        },
        "sound_effects_volume": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "multipleOf": 5
        },
        "crowd_volume": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "multipleOf": 5
        },
        "player_chatter_volume": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "multipleOf": 5
        },
        "in_game_music_volume": {
          "type": "integer",
          "minimum": 0,
          "maximum": 100,
          "multipleOf": 5
        },
        "action_replays": {
          "type": "integer",
          "minimum": 0,
          "maximum": 2,
          "multipleOf": 1
        },
        "after_basket_camera_cuts": {
          "type": "integer",
          "minimum": 0,
          "maximum": 2,
          "multipleOf": 1
        },
        "ball_handler_text": {
          "type": "integer",
          "minimum": 0,
          "maximum": 3,
          "multipleOf": 1
        },
        "free_throw_help": {
          "type": "integer",
          "minimum": 0,
          "maximum": 1,
          "multipleOf": 1
        },
        "free_throw_routines": {
          "type": "integer",
          "minimum": 0,
          "maximum": 1,
          "multipleOf": 1
        },
        "shot_feedback": {
          "type": "integer",
          "minimum": 0,
          "maximum": 3,
          "multipleOf": 1
        },
        "pick_and_roll_overlay": {
          "type": "integer",
          "minimum": 0,
          "maximum": 1,
          "multipleOf": 1
        }
      },
      "required": [],
      "additionalProperties": false
    },
    "sliders": {
      "type": "object",
      "properties": {
        "user": {
          "type": "object",
          "properties": {
            "stealing": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "blocking": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "speed": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "ball_handling": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "dunking_ability": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "offensive_awareness": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "defensive_awareness": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "offensive_rebounding": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "defensive_rebounding": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "strength": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "quickness": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "hustle": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "consistency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "durability": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "stamina": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "hands": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "vertical": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "on_ball_defense": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "alley_oop_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "contact_shot_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "inside_shot_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "close_shot_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "mid_range_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "3pt_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "layup_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "dunk_in_traffic_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "dunk_in_traffic_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "backdoor_cuts": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "pass_accuracy": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "steal_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "driving_contact_shot_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "inside_contact_shot_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "layup_defense_strength_takeoff": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "layup_defense_strength_release": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "jump_shot_defense_strength_gather": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "jump_shot_defense_strength_release": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "over_the_back_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "charging_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "blocking_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "reaching_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "shooting_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "loose_ball_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "injury_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "injury_severity": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "fatigue_rate": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "attempt_dunks": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "attempt_putbacks": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "play_passing_lanes": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "go_for_on_ball_steals": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "contest_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "post_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "help_defense_strength": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "take_inside_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "take_close_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "take_mid_range_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "take_3pt_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "attack_the_basket": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "look_for_post_players": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "throw_alley_oops": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            }
          },
          "required": [],
          "additionalProperties": false
        },
        "cpu": {
          "type": "object",
          "properties": {
            "stealing": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "blocking": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "speed": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "ball_handling": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "dunking_ability": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "offensive_awareness": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "defensive_awareness": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "offensive_rebounding": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "defensive_rebounding": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "strength": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "quickness": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "hustle": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "consistency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "durability": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "stamina": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "hands": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "vertical": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "on_ball_defense": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "alley_oop_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "contact_shot_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "inside_shot_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "close_shot_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "mid_range_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "3pt_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "layup_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "dunk_in_traffic_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "dunk_in_traffic_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "backdoor_cuts": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "pass_accuracy": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "steal_success": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "driving_contact_shot_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "inside_contact_shot_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "layup_defense_strength_takeoff": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "layup_defense_strength_release": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "jump_shot_defense_strength_gather": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "jump_shot_defense_strength_release": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "over_the_back_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "charging_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "blocking_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "reaching_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "shooting_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "loose_ball_foul_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "injury_frequency": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "injury_severity": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "fatigue_rate": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "attempt_dunks": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "attempt_putbacks": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "play_passing_lanes": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "go_for_on_ball_steals": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "contest_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "post_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "help_defense_strength": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "take_inside_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "take_close_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "take_mid_range_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "take_3pt_shots": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "attack_the_basket": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "look_for_post_players": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            },
            "throw_alley_oops": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            }
          },
          "required": [],
          "additionalProperties": false
        }
      },
      "required": [],
      "additionalProperties": false
    },
    "controllers": {
      "type": "array",
      "maxItems": 10,
      "items": {
        "type": "object",
        "properties": {
          "player_slot": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9
          },
          "values": {
            "type": "object",
            "properties": {
              "preferred_position": {
                "type": "integer",
                "minimum": 0,
                "maximum": 5,
                "multipleOf": 1
              },
              "vibration": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1,
                "multipleOf": 1
              },
              "pro_stick": {
                "type": "integer",
                "minimum": 0,
                "maximum": 2,
                "multipleOf": 1
              },
              "pro_stick_orientation": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1,
                "multipleOf": 1
              },
              "offball_freelance": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1,
                "multipleOf": 1
              },
              "passing_icons": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1,
                "multipleOf": 1
              },
              "icon_lead_passing": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1,
                "multipleOf": 1
              },
              "right_stick_passing": {
                "type": "integer",
                "minimum": 0,
                "maximum": 2,
                "multipleOf": 1
              },
              "right_stick_defense": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1,
                "multipleOf": 1
              },
              "defensive_icons": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1,
                "multipleOf": 1
              },
              "who_to_guard": {
                "type": "integer",
                "minimum": 0,
                "maximum": 1,
                "multipleOf": 1
              },
              "automatic_shot_contest": {
                "type": "integer",
                "minimum": 0,
                "maximum": 2,
                "multipleOf": 1
              },
              "defensive_assist_strength": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100,
                "multipleOf": 5
              }
            },
            "required": [],
            "additionalProperties": false
          }
        },
        "required": [
          "player_slot",
          "values"
        ],
        "additionalProperties": false
      }
    },
    "camera": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "broadcast_stadium"
            },
            "values": {
              "type": "object",
              "properties": {
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "broadcast_generic"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "beluba"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "parametric"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "press"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "2k"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "auto_flip": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "fixed_height": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "player_lock"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "fixed_height": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "action"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "action_2"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "nosebleeds"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "skybox"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "side"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "drive"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "auto_flip": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "wire"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "high"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "auto_flip": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "iso"
            },
            "values": {
              "type": "object",
              "properties": {
                "zoom": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "height": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 10
                },
                "key_zoom": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                },
                "reverse_angle": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 1
                }
              },
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "id": {
              "const": "coach_view"
            },
            "values": {
              "type": "object",
              "properties": {},
              "required": [],
              "additionalProperties": false
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        }
      ]
    },
    "coaching": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "home": {
          "$ref": "#/components/schemas/CoachingPlanValues"
        },
        "away": {
          "$ref": "#/components/schemas/CoachingPlanValues"
        }
      }
    },
    "defense": {
      "$ref": "#/components/schemas/StartupDefensePlan"
    }
  },
  "required": [],
  "additionalProperties": false
}

Schema: StartupSettingsState

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "requested_count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 426
    },
    "applied_count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 426
    },
    "attempted": {
      "type": "boolean"
    },
    "failed": {
      "type": "boolean"
    },
    "ready": {
      "type": "boolean"
    },
    "failed_index": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 263
    },
    "failure_reason": {
      "enum": [
        null,
        "opening_boundary_missed",
        "native_settings_unavailable",
        "native_setter_exception",
        "readback_mismatch"
      ]
    },
    "authority": {
      "const": "original_setters_with_readback"
    }
  },
  "required": [
    "version",
    "requested_count",
    "applied_count",
    "attempted",
    "failed",
    "ready",
    "failed_index",
    "failure_reason",
    "authority"
  ],
  "additionalProperties": false
}

Schema: StartupSettingsResponse

{
  "type": "object",
  "properties": {
    "run_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/StartupSettingsState"
        }
      ]
    },
    "catalog": {
      "type": "object"
    },
    "requested": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/StartupSettingsPlan"
        }
      ]
    },
    "camera_status": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/StartupCameraState"
        }
      ]
    }
  },
  "required": [
    "run_id",
    "status",
    "catalog",
    "requested"
  ],
  "additionalProperties": false
}

Schema: RosterTools

{
  "type": "object",
  "properties": {
    "available": {
      "type": "boolean"
    },
    "backend_version": {
      "type": [
        "string",
        "null"
      ]
    },
    "backend_fingerprint": {
      "type": [
        "string",
        "null"
      ]
    },
    "tables": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "fields": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "id",
          "fields"
        ],
        "additionalProperties": false
      }
    },
    "maximum_edit_cells": {
      "const": 512
    },
    "maximum_query_rows": {
      "const": 128
    },
    "maximum_query_fields": {
      "const": 32
    },
    "maximum_query_text_characters": {
      "const": 4096
    },
    "native_loaded": {
      "const": false
    },
    "scope": {
      "type": "string"
    }
  },
  "required": [
    "available",
    "backend_version",
    "backend_fingerprint",
    "tables",
    "maximum_edit_cells",
    "maximum_query_rows",
    "maximum_query_fields",
    "maximum_query_text_characters",
    "native_loaded",
    "scope"
  ],
  "additionalProperties": false
}

Schema: RosterFieldPage

{
  "type": "object",
  "properties": {
    "table": {
      "type": "string"
    },
    "total": {
      "type": "integer",
      "minimum": 0
    },
    "start": {
      "type": "integer",
      "minimum": 0
    },
    "fields": {
      "type": "array",
      "maxItems": 256,
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "reference_table": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "type",
          "reference_table"
        ],
        "additionalProperties": true
      }
    }
  },
  "required": [
    "table",
    "total",
    "start",
    "fields"
  ],
  "additionalProperties": false
}

Schema: RosterQueryRequest

{
  "type": "object",
  "properties": {
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "table": {
      "type": "string"
    },
    "start": {
      "type": "integer",
      "minimum": 0
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 128
    },
    "fields": {
      "type": "array",
      "minItems": 1,
      "maxItems": 32,
      "uniqueItems": true,
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "roster_id",
    "table"
  ],
  "additionalProperties": false
}

Schema: RosterQueryResponse

{
  "type": "object",
  "properties": {
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "table": {
      "type": "string"
    },
    "total": {
      "type": "integer",
      "minimum": 0
    },
    "start": {
      "type": "integer",
      "minimum": 0
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "rows": {
      "type": "array",
      "maxItems": 128,
      "items": {
        "type": "object",
        "properties": {
          "row": {
            "type": "integer",
            "minimum": 0
          },
          "values": {
            "type": "object"
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          }
        },
        "required": [
          "row",
          "values",
          "errors"
        ],
        "additionalProperties": false
      }
    },
    "native_loaded": {
      "const": false
    }
  },
  "required": [
    "roster_id",
    "table",
    "total",
    "start",
    "fields",
    "rows",
    "native_loaded"
  ],
  "additionalProperties": false
}

Schema: RosterEditRequest

{
  "type": "object",
  "properties": {
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "changes": {
      "type": "array",
      "minItems": 1,
      "maxItems": 512,
      "items": {
        "type": "object",
        "properties": {
          "table": {
            "type": "string"
          },
          "row": {
            "type": "integer",
            "minimum": 0
          },
          "field": {
            "type": "string"
          },
          "value": {
            "type": [
              "string",
              "number",
              "boolean",
              "null"
            ]
          }
        },
        "required": [
          "table",
          "row",
          "field",
          "value"
        ],
        "additionalProperties": false
      }
    },
    "metadata_id": {
      "type": "string",
      "pattern": "^roster-metadata:[0-9a-f]{64}$"
    }
  },
  "required": [
    "roster_id",
    "changes"
  ],
  "additionalProperties": false
}

Schema: RosterPreparationRequest

{
  "type": "object",
  "properties": {
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "type": "object",
          "properties": {
            "team_row": {
              "type": "integer",
              "minimum": 0,
              "maximum": 2047
            },
            "roster_order": {
              "type": "array",
              "minItems": 5,
              "maxItems": 20,
              "uniqueItems": true,
              "items": {
                "type": "integer",
                "minimum": 0,
                "maximum": 65534
              }
            },
            "minutes": {
              "type": "array",
              "maxItems": 20,
              "items": {
                "type": "object",
                "properties": {
                  "player_row": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 65534
                  },
                  "value": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 48
                  }
                },
                "required": [
                  "player_row",
                  "value"
                ],
                "additionalProperties": false
              }
            }
          },
          "required": [
            "team_row"
          ],
          "additionalProperties": false
        },
        "away": {
          "type": "object",
          "properties": {
            "team_row": {
              "type": "integer",
              "minimum": 0,
              "maximum": 2047
            },
            "roster_order": {
              "type": "array",
              "minItems": 5,
              "maxItems": 20,
              "uniqueItems": true,
              "items": {
                "type": "integer",
                "minimum": 0,
                "maximum": 65534
              }
            },
            "minutes": {
              "type": "array",
              "maxItems": 20,
              "items": {
                "type": "object",
                "properties": {
                  "player_row": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 65534
                  },
                  "value": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 48
                  }
                },
                "required": [
                  "player_row",
                  "value"
                ],
                "additionalProperties": false
              }
            }
          },
          "required": [
            "team_row"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": false
    },
    "metadata_id": {
      "type": "string",
      "pattern": "^roster-metadata:[0-9a-f]{64}$"
    }
  },
  "required": [
    "roster_id",
    "teams"
  ],
  "additionalProperties": false
}

Schema: RosterAuthoringReceipt

{
  "type": "object",
  "properties": {
    "receipt_id": {
      "type": "string",
      "pattern": "^roster-authoring:[0-9a-f]{64}$"
    },
    "operation": {
      "enum": [
        "edit",
        "prepare"
      ]
    },
    "source_roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "roster": {
      "$ref": "#/components/schemas/RosterMetadata"
    },
    "backend_version": {
      "type": "string"
    },
    "backend_fingerprint": {
      "type": "string"
    },
    "native_loaded": {
      "const": false
    },
    "scope": {
      "type": "string"
    },
    "edited_cells": {
      "type": "integer",
      "minimum": 1,
      "maximum": 512
    },
    "teams": {
      "type": "array"
    },
    "roster_metadata": {
      "$ref": "#/components/schemas/RosterCompanionInfo"
    }
  },
  "required": [
    "receipt_id",
    "operation",
    "source_roster_id",
    "roster",
    "backend_version",
    "backend_fingerprint",
    "native_loaded",
    "scope"
  ],
  "additionalProperties": false
}

Schema: MatchRequest

{
  "type": "object",
  "properties": {
    "format": {
      "const": "openhoops.match_request"
    },
    "version": {
      "const": 1
    },
    "request_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_-]{0,95}$"
    },
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "roster": {
      "oneOf": [
        {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "pattern": "^roster:[0-9a-f]{64}$"
            }
          },
          "required": [
            "id"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "path": {
              "type": "string"
            },
            "sha256": {
              "type": "string",
              "pattern": "^[0-9a-f]{64}$"
            }
          },
          "required": [
            "path",
            "sha256"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {
            "archive_path": {
              "type": "string",
              "minLength": 1
            },
            "sha256": {
              "type": "string",
              "pattern": "^[0-9a-f]{64}$"
            }
          },
          "required": [
            "archive_path",
            "sha256"
          ],
          "additionalProperties": false
        }
      ]
    },
    "launch_configuration": {
      "$ref": "#/components/schemas/LaunchConfiguration"
    },
    "preparation": {
      "type": "object",
      "description": "Documented preparation IDs; row/choice membership is checked against loaded ROS"
    },
    "identity": {
      "$ref": "#/components/schemas/MatchIdentityPlan"
    },
    "roster_edits": {
      "type": "array",
      "minItems": 0,
      "maxItems": 512,
      "items": {
        "type": "object",
        "properties": {
          "table": {
            "type": "string"
          },
          "row": {
            "type": "integer",
            "minimum": 0
          },
          "field": {
            "type": "string"
          },
          "value": {
            "type": [
              "string",
              "number",
              "boolean",
              "null"
            ]
          }
        },
        "required": [
          "table",
          "row",
          "field",
          "value"
        ],
        "additionalProperties": false
      }
    },
    "roster_preparation": {
      "type": "object",
      "properties": {
        "home": {
          "type": "object",
          "properties": {
            "team_row": {
              "type": "integer",
              "minimum": 0,
              "maximum": 2047
            },
            "roster_order": {
              "type": "array",
              "minItems": 5,
              "maxItems": 20,
              "uniqueItems": true,
              "items": {
                "type": "integer",
                "minimum": 0,
                "maximum": 65534
              }
            },
            "minutes": {
              "type": "array",
              "maxItems": 20,
              "items": {
                "type": "object",
                "properties": {
                  "player_row": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 65534
                  },
                  "value": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 48
                  }
                },
                "required": [
                  "player_row",
                  "value"
                ],
                "additionalProperties": false
              }
            }
          },
          "required": [
            "team_row"
          ],
          "additionalProperties": false
        },
        "away": {
          "type": "object",
          "properties": {
            "team_row": {
              "type": "integer",
              "minimum": 0,
              "maximum": 2047
            },
            "roster_order": {
              "type": "array",
              "minItems": 5,
              "maxItems": 20,
              "uniqueItems": true,
              "items": {
                "type": "integer",
                "minimum": 0,
                "maximum": 65534
              }
            },
            "minutes": {
              "type": "array",
              "maxItems": 20,
              "items": {
                "type": "object",
                "properties": {
                  "player_row": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 65534
                  },
                  "value": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 48
                  }
                },
                "required": [
                  "player_row",
                  "value"
                ],
                "additionalProperties": false
              }
            }
          },
          "required": [
            "team_row"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": false
    },
    "loading_screen": {
      "$ref": "#/components/schemas/LoadingScreenConfiguration"
    },
    "roster_metadata": {
      "$ref": "#/components/schemas/RosterMetadataSelection"
    },
    "asset_packages": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^asset-package:[a-f0-9]{64}$"
              }
            },
            "required": [
              "id"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "path": {
                "type": "string"
              },
              "sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              }
            },
            "required": [
              "path",
              "sha256"
            ],
            "additionalProperties": false
          }
        ]
      },
      "maxItems": 8,
      "minItems": 1
    }
  },
  "required": [
    "format",
    "version",
    "request_id",
    "client_id",
    "roster",
    "launch_configuration",
    "preparation",
    "identity"
  ],
  "additionalProperties": false
}

Schema: MatchRequestStatus

{
  "type": "object",
  "properties": {
    "request_id": {
      "type": "string"
    },
    "request_sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "status": {
      "enum": [
        "accepted",
        "preparing",
        "starting",
        "started",
        "failed"
      ]
    },
    "started": {
      "type": [
        "boolean",
        "null"
      ],
      "description": "Null preserves an unknown native Start outcome; inspect saved command IDs before retrying"
    },
    "result": {
      "type": "object"
    },
    "error": {
      "type": "string"
    },
    "receipts": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "authoring_receipts": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/RosterAuthoringReceipt"
      }
    }
  },
  "required": [
    "request_id",
    "request_sha256",
    "status",
    "started"
  ],
  "additionalProperties": false
}

Schema: MatchRequestResponse

{
  "type": "object",
  "properties": {
    "available": {
      "type": "boolean"
    },
    "request": {
      "anyOf": [
        {
          "type": "null"
        },
        {
          "$ref": "#/components/schemas/MatchRequestStatus"
        }
      ]
    }
  },
  "required": [
    "available",
    "request"
  ],
  "additionalProperties": false
}

Schema: StartupCameraState

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "requested": {
      "type": "boolean"
    },
    "camera_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "attempted": {
      "type": "boolean"
    },
    "failed": {
      "type": "boolean"
    },
    "ready": {
      "type": "boolean"
    },
    "failure_reason": {
      "enum": [
        null,
        "opening_boundary_missed",
        "native_camera_unavailable",
        "native_setter_exception",
        "readback_mismatch"
      ]
    },
    "authority": {
      "const": "original_camera_selection_with_descriptor_readback"
    }
  },
  "required": [
    "version",
    "requested",
    "camera_id",
    "attempted",
    "failed",
    "ready",
    "failure_reason",
    "authority"
  ],
  "additionalProperties": false
}

Schema: ParticipationPlan

{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "mode": {
          "enum": [
            "cpu_vs_cpu",
            "primary_home",
            "primary_away"
          ]
        }
      },
      "required": [
        "mode"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "mode": {
          "const": "assigned"
        },
        "assignments": {
          "type": "array",
          "minItems": 1,
          "maxItems": 10,
          "items": {
            "$ref": "#/components/schemas/InputAssignment"
          }
        }
      },
      "required": [
        "mode",
        "assignments"
      ],
      "additionalProperties": false
    }
  ]
}

Schema: ParticipationState

{
  "type": "object",
  "properties": {
    "version": {
      "enum": [
        1,
        2
      ]
    },
    "requested": {
      "type": "boolean"
    },
    "mode": {
      "enum": [
        "cpu_vs_cpu",
        "primary_home",
        "primary_away",
        null,
        "assigned"
      ]
    },
    "primary_input_slot": {
      "enum": [
        0,
        null
      ]
    },
    "attempted": {
      "type": "boolean"
    },
    "failed": {
      "type": "boolean"
    },
    "ready": {
      "type": "boolean"
    },
    "committed": {
      "type": "boolean"
    },
    "failure_reason": {
      "enum": [
        null,
        "opening_boundary_missed",
        "native_input_unavailable",
        "native_setter_exception",
        "control_record_mismatch",
        "other_participants_present"
      ]
    },
    "authority": {
      "const": "native_picker_and_game_control_commit_readback"
    },
    "scope": {
      "type": "string"
    }
  },
  "required": [
    "version",
    "requested",
    "mode",
    "primary_input_slot",
    "attempted",
    "failed",
    "ready",
    "committed",
    "failure_reason",
    "authority",
    "scope"
  ],
  "additionalProperties": false
}

Schema: CoachingPlanValues

{
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "timeouts": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1
    },
    "substitutions": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1
    },
    "substitution_method": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1
    },
    "playvision": {
      "type": "integer",
      "minimum": 0,
      "maximum": 2
    },
    "playvision_display": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1
    },
    "playcall_messages": {
      "type": "integer",
      "minimum": 0,
      "maximum": 2
    },
    "offense_playcalling": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1
    },
    "defense_playcalling": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1
    },
    "late_game_fouling": {
      "type": "integer",
      "minimum": 0,
      "maximum": 1
    }
  }
}

Schema: CoachingValues

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "timeouts",
    "substitutions",
    "substitution_method",
    "playvision",
    "playvision_display",
    "playcall_messages",
    "offense_playcalling",
    "defense_playcalling",
    "late_game_fouling"
  ],
  "properties": {
    "timeouts": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "substitutions": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "substitution_method": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "playvision": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 2
        },
        {
          "type": "null"
        }
      ]
    },
    "playvision_display": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "playcall_messages": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 2
        },
        {
          "type": "null"
        }
      ]
    },
    "offense_playcalling": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "defense_playcalling": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    },
    "late_game_fouling": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 1
        },
        {
          "type": "null"
        }
      ]
    }
  }
}

Schema: CoachingState

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "authority",
    "persistence",
    "teams"
  ],
  "properties": {
    "authority": {
      "const": "native_team_coaching_settings"
    },
    "persistence": {
      "const": "current_match_only"
    },
    "teams": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "home",
        "away"
      ],
      "properties": {
        "home": {
          "$ref": "#/components/schemas/CoachingValues"
        },
        "away": {
          "$ref": "#/components/schemas/CoachingValues"
        }
      }
    },
    "revision": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 1,
      "maximum": 4294967295
    }
  }
}

Schema: DefensiveSettings

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "on_ball_pressure",
    "off_ball_pressure",
    "double_team",
    "screen_defense",
    "hedge"
  ],
  "properties": {
    "on_ball_pressure": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 3
    },
    "off_ball_pressure": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 4
    },
    "double_team": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 4
    },
    "screen_defense": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 3
    },
    "hedge": {
      "type": [
        "integer",
        "null"
      ],
      "minimum": 0,
      "maximum": 4
    }
  }
}

Schema: DefensiveOpponent

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "opponent_player_key",
    "settings",
    "preferred_defender_player_key",
    "preferred_defender_known"
  ],
  "properties": {
    "opponent_player_key": {
      "type": "string",
      "pattern": "^(home|away):([0-9]|1[01])$"
    },
    "settings": {
      "$ref": "#/components/schemas/DefensiveSettings"
    },
    "preferred_defender_player_key": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^(home|away):([0-9]|1[01])$"
    },
    "preferred_defender_known": {
      "type": "boolean"
    }
  }
}

Schema: DefenseState

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "authority",
    "revision",
    "persistence",
    "teams",
    "actual_guarding_assignments_observed"
  ],
  "properties": {
    "authority": {
      "const": "native_defensive_configuration"
    },
    "revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "persistence": {
      "const": "current_match_only"
    },
    "teams": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "home",
        "away"
      ],
      "properties": {
        "home": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "opponents",
            "eligible_defender_player_keys"
          ],
          "properties": {
            "opponents": {
              "type": "array",
              "maxItems": 12,
              "items": {
                "$ref": "#/components/schemas/DefensiveOpponent"
              }
            },
            "eligible_defender_player_keys": {
              "type": "array",
              "maxItems": 12,
              "uniqueItems": true,
              "items": {
                "type": "string",
                "pattern": "^(home|away):([0-9]|1[01])$"
              }
            }
          }
        },
        "away": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "opponents",
            "eligible_defender_player_keys"
          ],
          "properties": {
            "opponents": {
              "type": "array",
              "maxItems": 12,
              "items": {
                "$ref": "#/components/schemas/DefensiveOpponent"
              }
            },
            "eligible_defender_player_keys": {
              "type": "array",
              "maxItems": 12,
              "uniqueItems": true,
              "items": {
                "type": "string",
                "pattern": "^(home|away):([0-9]|1[01])$"
              }
            }
          }
        }
      }
    },
    "actual_guarding_assignments_observed": {
      "const": false
    }
  }
}

Schema: CoachingCommand

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "command_id",
    "client_id",
    "lease_token",
    "run_id",
    "expected_period",
    "expected_revision",
    "side",
    "type",
    "setting_id",
    "value",
    "expected_value"
  ],
  "properties": {
    "command_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "lease_token": {
      "type": "string"
    },
    "run_id": {
      "type": "string"
    },
    "expected_period": {
      "type": "integer"
    },
    "expected_revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "side": {
      "enum": [
        "home",
        "away"
      ]
    },
    "type": {
      "const": "coaching.set"
    },
    "setting_id": {
      "enum": [
        "timeouts",
        "substitutions",
        "substitution_method",
        "playvision",
        "playvision_display",
        "playcall_messages",
        "offense_playcalling",
        "defense_playcalling",
        "late_game_fouling"
      ]
    },
    "value": {},
    "expected_value": {}
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "timeouts"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "substitutions"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "substitution_method"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "playvision"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "playvision_display"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "playcall_messages"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "offense_playcalling"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "defense_playcalling"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "late_game_fouling"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    }
  ]
}

Schema: DefensiveCommand

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "command_id",
    "client_id",
    "lease_token",
    "run_id",
    "expected_period",
    "expected_revision",
    "side",
    "type",
    "setting_id",
    "value",
    "expected_value",
    "opponent_player_key"
  ],
  "properties": {
    "command_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "lease_token": {
      "type": "string"
    },
    "run_id": {
      "type": "string"
    },
    "expected_period": {
      "type": "integer"
    },
    "expected_revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "side": {
      "enum": [
        "home",
        "away"
      ]
    },
    "type": {
      "const": "defense.set"
    },
    "setting_id": {
      "enum": [
        "on_ball_pressure",
        "off_ball_pressure",
        "double_team",
        "screen_defense",
        "hedge",
        "preferred_defender"
      ]
    },
    "value": {},
    "expected_value": {},
    "opponent_player_key": {
      "type": "string",
      "pattern": "^(home|away):([0-9]|1[01])$"
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "on_ball_pressure"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 3
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 3
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "off_ball_pressure"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "double_team"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "screen_defense"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 3
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 3
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "hedge"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          },
          "expected_value": {
            "type": "integer",
            "minimum": 0,
            "maximum": 4
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "setting_id": {
            "const": "preferred_defender"
          }
        },
        "required": [
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^(home|away):([0-9]|1[01])$"
          },
          "expected_value": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^(home|away):([0-9]|1[01])$"
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "side": {
            "const": "home"
          }
        },
        "required": [
          "side"
        ]
      },
      "then": {
        "properties": {
          "opponent_player_key": {
            "type": "string",
            "pattern": "^away:([0-9]|1[01])$"
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "side": {
            "const": "home"
          },
          "setting_id": {
            "const": "preferred_defender"
          }
        },
        "required": [
          "side",
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^home:([0-9]|1[01])$"
          },
          "expected_value": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^home:([0-9]|1[01])$"
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "side": {
            "const": "away"
          }
        },
        "required": [
          "side"
        ]
      },
      "then": {
        "properties": {
          "opponent_player_key": {
            "type": "string",
            "pattern": "^home:([0-9]|1[01])$"
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "side": {
            "const": "away"
          },
          "setting_id": {
            "const": "preferred_defender"
          }
        },
        "required": [
          "side",
          "setting_id"
        ]
      },
      "then": {
        "properties": {
          "value": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^away:([0-9]|1[01])$"
          },
          "expected_value": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^away:([0-9]|1[01])$"
          }
        }
      }
    }
  ]
}

Schema: SimulationControl

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "authority",
    "adapter_owned",
    "expires_in_seconds",
    "maximum_duration_seconds",
    "native_pause_layers_cleared"
  ],
  "properties": {
    "authority": {
      "const": "adapter_owned_native_pause_layer"
    },
    "adapter_owned": {
      "type": "boolean"
    },
    "expires_in_seconds": {
      "type": [
        "number",
        "null"
      ],
      "minimum": 0,
      "maximum": 60
    },
    "maximum_duration_seconds": {
      "const": 60
    },
    "native_pause_layers_cleared": {
      "const": false
    }
  }
}

Schema: SimulationCommand

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "command_id",
    "client_id",
    "lease_token",
    "run_id",
    "expected_period",
    "expected_revision",
    "type",
    "expected_owned"
  ],
  "properties": {
    "command_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "lease_token": {
      "type": "string"
    },
    "run_id": {
      "type": "string"
    },
    "expected_period": {
      "type": "integer"
    },
    "expected_revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "type": {
      "enum": [
        "simulation.pause",
        "simulation.resume"
      ]
    },
    "expected_owned": {
      "type": "boolean"
    },
    "duration_seconds": {
      "type": "integer",
      "minimum": 1,
      "maximum": 60
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "type": {
            "const": "simulation.pause"
          }
        }
      },
      "then": {
        "required": [
          "duration_seconds"
        ]
      }
    },
    {
      "if": {
        "properties": {
          "type": {
            "const": "simulation.resume"
          }
        }
      },
      "then": {
        "not": {
          "required": [
            "duration_seconds"
          ]
        }
      }
    }
  ]
}

Schema: Substitutions

{
  "type": "object",
  "properties": {
    "authority": {
      "const": "native_team_position_array_and_pending_queue"
    },
    "revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "type": "object",
          "properties": {
            "positions": {
              "type": "array",
              "minItems": 5,
              "maxItems": 5,
              "items": {
                "type": "object",
                "properties": {
                  "position": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 5
                  },
                  "player_key": {
                    "type": "string"
                  },
                  "pending_player_key": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "position",
                  "player_key",
                  "pending_player_key"
                ],
                "additionalProperties": false
              }
            },
            "eligible_bench_player_keys": {
              "type": "array",
              "maxItems": 7,
              "uniqueItems": true,
              "items": {
                "type": "string"
              }
            },
            "pending_count": {
              "type": "integer",
              "minimum": 0,
              "maximum": 5
            },
            "native_queue_editable": {
              "type": "boolean"
            },
            "user_requested": {
              "type": "boolean"
            }
          },
          "required": [
            "positions",
            "eligible_bench_player_keys",
            "pending_count",
            "native_queue_editable",
            "user_requested"
          ],
          "additionalProperties": false
        },
        "away": {
          "type": "object",
          "properties": {
            "positions": {
              "type": "array",
              "minItems": 5,
              "maxItems": 5,
              "items": {
                "type": "object",
                "properties": {
                  "position": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 5
                  },
                  "player_key": {
                    "type": "string"
                  },
                  "pending_player_key": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "position",
                  "player_key",
                  "pending_player_key"
                ],
                "additionalProperties": false
              }
            },
            "eligible_bench_player_keys": {
              "type": "array",
              "maxItems": 7,
              "uniqueItems": true,
              "items": {
                "type": "string"
              }
            },
            "pending_count": {
              "type": "integer",
              "minimum": 0,
              "maximum": 5
            },
            "native_queue_editable": {
              "type": "boolean"
            },
            "user_requested": {
              "type": "boolean"
            }
          },
          "required": [
            "positions",
            "eligible_bench_player_keys",
            "pending_count",
            "native_queue_editable",
            "user_requested"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": false
    },
    "acceptance_is_not_completion": {
      "const": true
    },
    "legal_substitution_window_inferred": {
      "const": false
    }
  },
  "required": [
    "authority",
    "revision",
    "teams",
    "acceptance_is_not_completion",
    "legal_substitution_window_inferred"
  ],
  "additionalProperties": false
}

Schema: SubstitutionCommand

{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "expected_period": {
          "type": "integer"
        },
        "expected_revision": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "side": {
          "enum": [
            "home",
            "away"
          ]
        },
        "outgoing_player_key": {
          "type": "string"
        },
        "expected_pending_player_key": {
          "type": "null"
        },
        "type": {
          "const": "substitution.queue"
        },
        "incoming_player_key": {
          "type": "string"
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "expected_period",
        "expected_revision",
        "side",
        "outgoing_player_key",
        "expected_pending_player_key",
        "type",
        "incoming_player_key"
      ],
      "additionalProperties": false,
      "allOf": [
        {
          "if": {
            "properties": {
              "side": {
                "const": "home"
              }
            }
          },
          "then": {
            "properties": {
              "outgoing_player_key": {
                "type": "string",
                "pattern": "^home:([0-9]|1[01])$"
              },
              "incoming_player_key": {
                "type": "string",
                "pattern": "^home:([0-9]|1[01])$"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "side": {
                "const": "away"
              }
            }
          },
          "then": {
            "properties": {
              "outgoing_player_key": {
                "type": "string",
                "pattern": "^away:([0-9]|1[01])$"
              },
              "incoming_player_key": {
                "type": "string",
                "pattern": "^away:([0-9]|1[01])$"
              }
            }
          }
        }
      ]
    },
    {
      "type": "object",
      "properties": {
        "command_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "client_id": {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        "lease_token": {
          "type": "string"
        },
        "run_id": {
          "type": "string"
        },
        "expected_period": {
          "type": "integer"
        },
        "expected_revision": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4294967295
        },
        "side": {
          "enum": [
            "home",
            "away"
          ]
        },
        "outgoing_player_key": {
          "type": "string"
        },
        "expected_pending_player_key": {
          "type": "string"
        },
        "type": {
          "const": "substitution.cancel"
        }
      },
      "required": [
        "command_id",
        "client_id",
        "lease_token",
        "run_id",
        "expected_period",
        "expected_revision",
        "side",
        "outgoing_player_key",
        "expected_pending_player_key",
        "type"
      ],
      "additionalProperties": false,
      "allOf": [
        {
          "if": {
            "properties": {
              "side": {
                "const": "home"
              }
            }
          },
          "then": {
            "properties": {
              "outgoing_player_key": {
                "type": "string",
                "pattern": "^home:([0-9]|1[01])$"
              },
              "expected_pending_player_key": {
                "type": "string",
                "pattern": "^home:([0-9]|1[01])$"
              }
            }
          }
        },
        {
          "if": {
            "properties": {
              "side": {
                "const": "away"
              }
            }
          },
          "then": {
            "properties": {
              "outgoing_player_key": {
                "type": "string",
                "pattern": "^away:([0-9]|1[01])$"
              },
              "expected_pending_player_key": {
                "type": "string",
                "pattern": "^away:([0-9]|1[01])$"
              }
            }
          }
        }
      ]
    }
  ]
}

Schema: SubstitutionRequest

{
  "type": "object",
  "properties": {
    "request_command_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "client_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "run_id": {
      "type": "string"
    },
    "roster_fingerprint": {
      "type": "string"
    },
    "side": {
      "enum": [
        "home",
        "away"
      ]
    },
    "outgoing_player_key": {
      "type": "string"
    },
    "incoming_player_key": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    },
    "match_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "position": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5
    },
    "status": {
      "enum": [
        "pending",
        "awaiting_entry",
        "removed",
        "superseded",
        "observed_in_lineup",
        "cancelled",
        "context_changed",
        "ended_before_entry"
      ]
    },
    "accepted_source_sequence": {
      "type": "integer",
      "minimum": 0
    },
    "observed_source_sequence": {
      "type": "integer",
      "minimum": 0
    },
    "completion_authority": {
      "const": "observed_native_position_and_on_court_transition"
    },
    "cancel_command_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "pending_observed": {
      "type": "boolean"
    }
  },
  "required": [
    "request_command_id",
    "client_id",
    "run_id",
    "roster_fingerprint",
    "side",
    "outgoing_player_key",
    "incoming_player_key",
    "reason",
    "match_id",
    "position",
    "status",
    "accepted_source_sequence",
    "observed_source_sequence",
    "completion_authority"
  ],
  "additionalProperties": false
}

Schema: SubstitutionRequestPage

{
  "type": "object",
  "properties": {
    "requests": {
      "type": "array",
      "maxItems": 100,
      "items": {
        "$ref": "#/components/schemas/SubstitutionRequest"
      }
    },
    "limit": {
      "const": 100
    }
  },
  "required": [
    "requests",
    "limit"
  ],
  "additionalProperties": false
}

Schema: StartupDefensePlan

{
  "type": "object",
  "properties": {
    "home": {
      "type": "object",
      "maxProperties": 12,
      "patternProperties": {
        "^away:([0-9]|1[01])$": {
          "type": "object",
          "properties": {
            "on_ball_pressure": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3
            },
            "off_ball_pressure": {
              "type": "integer",
              "minimum": 0,
              "maximum": 4
            },
            "double_team": {
              "type": "integer",
              "minimum": 0,
              "maximum": 4
            },
            "screen_defense": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3
            },
            "hedge": {
              "type": "integer",
              "minimum": 0,
              "maximum": 4
            },
            "preferred_defender": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^home:([0-9]|1[01])$"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    },
    "away": {
      "type": "object",
      "maxProperties": 12,
      "patternProperties": {
        "^home:([0-9]|1[01])$": {
          "type": "object",
          "properties": {
            "on_ball_pressure": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3
            },
            "off_ball_pressure": {
              "type": "integer",
              "minimum": 0,
              "maximum": 4
            },
            "double_team": {
              "type": "integer",
              "minimum": 0,
              "maximum": 4
            },
            "screen_defense": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3
            },
            "hedge": {
              "type": "integer",
              "minimum": 0,
              "maximum": 4
            },
            "preferred_defender": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^away:([0-9]|1[01])$"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    }
  },
  "additionalProperties": false
}

Schema: TimeoutControl

{
  "type": "object",
  "properties": {
    "revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "authority": {
      "const": "original_timeout_eligibility_predicate"
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "type": "object",
          "properties": {
            "native_eligible": {
              "type": "boolean"
            },
            "full": {
              "type": "integer",
              "minimum": 0,
              "maximum": 32
            },
            "short": {
              "type": "integer",
              "minimum": 0,
              "maximum": 64
            }
          },
          "required": [
            "native_eligible",
            "full",
            "short"
          ],
          "additionalProperties": false
        },
        "away": {
          "type": "object",
          "properties": {
            "native_eligible": {
              "type": "boolean"
            },
            "full": {
              "type": "integer",
              "minimum": 0,
              "maximum": 32
            },
            "short": {
              "type": "integer",
              "minimum": 0,
              "maximum": 64
            }
          },
          "required": [
            "native_eligible",
            "full",
            "short"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "home",
        "away"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "revision",
    "authority",
    "teams"
  ],
  "additionalProperties": false
}

Schema: RotationPlanEntry

{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "side": {
          "const": "home"
        },
        "period": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "type": {
                  "const": "half"
                },
                "number": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 2
                }
              },
              "required": [
                "type",
                "number"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "const": "quarter"
                },
                "number": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 4
                }
              },
              "required": [
                "type",
                "number"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "const": "overtime"
                },
                "number": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 32
                }
              },
              "required": [
                "type",
                "number"
              ],
              "additionalProperties": false
            }
          ]
        },
        "game_seconds": {
          "type": "number",
          "minimum": 0,
          "maximum": 3600
        },
        "lineup": {
          "type": "array",
          "minItems": 5,
          "maxItems": 5,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "pattern": "^home:(?:[0-9]|1[01])$"
          }
        }
      },
      "required": [
        "side",
        "period",
        "game_seconds",
        "lineup"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "side": {
          "const": "away"
        },
        "period": {
          "oneOf": [
            {
              "type": "object",
              "properties": {
                "type": {
                  "const": "half"
                },
                "number": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 2
                }
              },
              "required": [
                "type",
                "number"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "const": "quarter"
                },
                "number": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 4
                }
              },
              "required": [
                "type",
                "number"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "const": "overtime"
                },
                "number": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 32
                }
              },
              "required": [
                "type",
                "number"
              ],
              "additionalProperties": false
            }
          ]
        },
        "game_seconds": {
          "type": "number",
          "minimum": 0,
          "maximum": 3600
        },
        "lineup": {
          "type": "array",
          "minItems": 5,
          "maxItems": 5,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "pattern": "^away:(?:[0-9]|1[01])$"
          }
        }
      },
      "required": [
        "side",
        "period",
        "game_seconds",
        "lineup"
      ],
      "additionalProperties": false
    }
  ]
}

Schema: RotationPlan

{
  "type": "array",
  "maxItems": 64,
  "items": {
    "$ref": "#/components/schemas/RotationPlanEntry"
  }
}

Schema: RotationEntryObservation

{
  "type": "object",
  "properties": {
    "index": {
      "type": "integer",
      "minimum": 0,
      "maximum": 63
    },
    "side": {
      "enum": [
        "home",
        "away"
      ]
    },
    "raw_period": {
      "type": "integer",
      "minimum": 1,
      "maximum": 36
    },
    "game_seconds": {
      "type": "number",
      "minimum": 0,
      "maximum": 3600
    },
    "lineup": {
      "type": "array",
      "minItems": 5,
      "maxItems": 5,
      "uniqueItems": true,
      "items": {
        "type": "string",
        "pattern": "^(home|away):(?:[0-9]|1[01])$"
      }
    },
    "status": {
      "enum": [
        "scheduled",
        "due",
        "queued",
        "observed_in_lineup",
        "missed",
        "blocked",
        "cancelled",
        "fault",
        "superseded"
      ]
    },
    "reason": {
      "type": [
        "string",
        "null"
      ]
    },
    "due_game_seconds": {
      "type": [
        "number",
        "null"
      ],
      "minimum": 0,
      "maximum": 3600
    },
    "queued_game_seconds": {
      "type": [
        "number",
        "null"
      ],
      "minimum": 0,
      "maximum": 3600
    },
    "observed_game_seconds": {
      "type": [
        "number",
        "null"
      ],
      "minimum": 0,
      "maximum": 3600
    }
  },
  "required": [
    "index",
    "side",
    "raw_period",
    "game_seconds",
    "lineup",
    "status",
    "reason",
    "due_game_seconds",
    "queued_game_seconds",
    "observed_game_seconds"
  ],
  "additionalProperties": false
}

Schema: Rotations

{
  "type": "object",
  "properties": {
    "revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "entries": {
      "type": "array",
      "maxItems": 64,
      "items": {
        "$ref": "#/components/schemas/RotationEntryObservation"
      }
    },
    "startup_requested": {
      "type": "boolean"
    },
    "startup_ready": {
      "type": "boolean"
    },
    "startup_failed": {
      "type": "boolean"
    },
    "authority": {
      "type": "string"
    },
    "completed_at_requested_clock_guaranteed": {
      "const": false
    }
  },
  "required": [
    "revision",
    "entries",
    "startup_requested",
    "startup_ready",
    "startup_failed",
    "authority",
    "completed_at_requested_clock_guaranteed"
  ],
  "additionalProperties": false
}

Schema: InputAssignment

{
  "type": "object",
  "properties": {
    "input_id": {
      "type": "string",
      "pattern": "^native-input:[0-9]$"
    },
    "kind": {
      "enum": [
        "keyboard",
        "game_controller"
      ]
    },
    "side": {
      "enum": [
        "home",
        "away"
      ]
    }
  },
  "required": [
    "input_id",
    "kind",
    "side"
  ],
  "additionalProperties": false
}

Schema: InputDevices

{
  "type": "object",
  "properties": {
    "revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "devices": {
      "type": "array",
      "maxItems": 10,
      "items": {
        "type": "object",
        "properties": {
          "input_id": {
            "type": "string",
            "pattern": "^native-input:[0-9]$"
          },
          "kind": {
            "enum": [
              "keyboard",
              "game_controller",
              "unsupported_native"
            ]
          },
          "native_type": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10
          },
          "label": {
            "type": "string"
          },
          "current_side": {
            "enum": [
              null,
              "home",
              "away"
            ]
          },
          "saved_side": {
            "enum": [
              null,
              "home",
              "away"
            ]
          },
          "control_record_present": {
            "type": "boolean"
          },
          "requested_side": {
            "enum": [
              null,
              "home",
              "away"
            ]
          },
          "assignment_supported": {
            "type": "boolean"
          }
        },
        "required": [
          "input_id",
          "kind",
          "native_type",
          "label",
          "current_side",
          "saved_side",
          "control_record_present",
          "requested_side"
        ],
        "additionalProperties": false
      }
    },
    "authority": {
      "type": "string"
    },
    "identity_scope": {
      "type": "string"
    },
    "physical_multicontroller_verified": {
      "const": false
    }
  },
  "required": [
    "revision",
    "devices",
    "authority",
    "identity_scope",
    "physical_multicontroller_verified"
  ],
  "additionalProperties": false
}

Schema: RotationPlanObservation

{
  "type": "object",
  "properties": {
    "revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    },
    "entries": {
      "type": "array",
      "maxItems": 64,
      "items": {
        "$ref": "#/components/schemas/RotationEntryObservation"
      }
    },
    "startup_requested": {
      "type": "boolean"
    },
    "startup_ready": {
      "type": "boolean"
    },
    "startup_failed": {
      "type": "boolean"
    },
    "authority": {
      "type": "string"
    },
    "completed_at_requested_clock_guaranteed": {
      "const": false
    },
    "plan_id": {
      "type": "string"
    },
    "run_id": {
      "type": "string"
    },
    "match_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "superseded_by_revision": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4294967295
    }
  },
  "required": [
    "revision",
    "entries",
    "startup_requested",
    "startup_ready",
    "startup_failed",
    "authority",
    "completed_at_requested_clock_guaranteed",
    "plan_id",
    "run_id",
    "match_id"
  ],
  "additionalProperties": false
}

Schema: RosterExtraFields

{
  "type": "object",
  "maxProperties": 256,
  "propertyNames": {
    "pattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*){2,7}$",
    "maxLength": 160
  },
  "additionalProperties": {
    "oneOf": [
      {
        "type": "string",
        "maxLength": 16384
      },
      {
        "type": "integer",
        "minimum": -9007199254740991,
        "maximum": 9007199254740991
      },
      {
        "type": "number",
        "not": {
          "type": "integer"
        }
      },
      {
        "type": "boolean"
      },
      {
        "type": "null"
      }
    ]
  }
}

Schema: RosterCompanion

{
  "type": "object",
  "properties": {
    "format": {
      "const": "openhoops.roster.extensions"
    },
    "version": {
      "const": 1
    },
    "roster_sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "roster_bytes": {
      "enum": [
        2672672,
        16777248
      ]
    },
    "fields": {
      "$ref": "#/components/schemas/RosterExtraFields"
    },
    "records": {
      "type": "array",
      "maxItems": 100000,
      "items": {
        "type": "object",
        "properties": {
          "section": {
            "type": "integer",
            "enum": [
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              15,
              16,
              17,
              18,
              19,
              20,
              21,
              22,
              23,
              24,
              25,
              26,
              27,
              28,
              29,
              30,
              31,
              32,
              33,
              34,
              35,
              36,
              37,
              38,
              39,
              40,
              45
            ]
          },
          "row": {
            "type": "integer",
            "minimum": 0,
            "maximum": 65534
          },
          "fields": {
            "$ref": "#/components/schemas/RosterExtraFields"
          }
        },
        "required": [
          "section",
          "row",
          "fields"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "format",
    "version",
    "roster_sha256",
    "roster_bytes",
    "fields",
    "records"
  ],
  "additionalProperties": false
}

Schema: RosterCompanionInfo

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^roster-metadata:[0-9a-f]{64}$"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "bytes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 16777216
    },
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "format": {
      "const": "openhoops.roster.extensions"
    },
    "version": {
      "const": 1
    },
    "records": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "native_effects": {
      "const": false
    }
  },
  "required": [
    "id",
    "sha256",
    "bytes",
    "roster_id",
    "format",
    "version",
    "records",
    "native_effects"
  ],
  "additionalProperties": false
}

Schema: RosterMetadataPatch

{
  "type": "object",
  "properties": {
    "fields": {
      "$ref": "#/components/schemas/RosterExtraFields"
    },
    "unset": {
      "type": "array",
      "uniqueItems": true,
      "maxItems": 256,
      "items": {
        "type": "string",
        "pattern": "^[a-z][a-z0-9_]*(\\.[a-z][a-z0-9_]*){2,7}$",
        "maxLength": 160
      }
    }
  },
  "required": [],
  "additionalProperties": false
}

Schema: RosterMetadataOverrides

{
  "type": "object",
  "properties": {
    "roster": {
      "$ref": "#/components/schemas/RosterMetadataPatch"
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "$ref": "#/components/schemas/RosterMetadataPatch"
        },
        "away": {
          "$ref": "#/components/schemas/RosterMetadataPatch"
        }
      },
      "additionalProperties": false
    },
    "players": {
      "type": "object",
      "maxProperties": 40,
      "patternProperties": {
        "^(home|away):([0-9]|1[0-9])$": {
          "$ref": "#/components/schemas/RosterMetadataPatch"
        }
      },
      "additionalProperties": false
    },
    "arena": {
      "$ref": "#/components/schemas/RosterMetadataPatch"
    },
    "uniforms": {
      "type": "object",
      "properties": {
        "home": {
          "$ref": "#/components/schemas/RosterMetadataPatch"
        },
        "away": {
          "$ref": "#/components/schemas/RosterMetadataPatch"
        }
      },
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false
}

Schema: RosterContextSpec

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "metadata_id": {
      "type": "string",
      "pattern": "^roster-metadata:[0-9a-f]{64}$"
    },
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "selection": {
      "type": "object",
      "properties": {
        "home_team": {
          "type": "string",
          "pattern": "^team-row:(0|[1-9][0-9]{0,4})$"
        },
        "away_team": {
          "type": "string",
          "pattern": "^team-row:(0|[1-9][0-9]{0,4})$"
        },
        "home_uniform": {
          "type": "string",
          "pattern": "^uniform-row:(0|[1-9][0-9]{0,4})$"
        },
        "away_uniform": {
          "type": "string",
          "pattern": "^uniform-row:(0|[1-9][0-9]{0,4})$"
        },
        "arena": {
          "type": "string",
          "pattern": "^arena:(0|[1-9][0-9]{0,4})$"
        }
      },
      "required": [
        "home_team",
        "away_team",
        "home_uniform",
        "away_uniform",
        "arena"
      ],
      "additionalProperties": false
    },
    "player_rows": {
      "type": "object",
      "maxProperties": 40,
      "patternProperties": {
        "^(home|away):([0-9]|1[0-9])$": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65534
        }
      },
      "additionalProperties": false
    },
    "player_ids": {
      "type": "object",
      "maxProperties": 40,
      "patternProperties": {
        "^(home|away):([0-9]|1[0-9])$": {
          "$ref": "#/components/schemas/RosterContextIdentifier"
        }
      },
      "additionalProperties": false
    },
    "overrides": {
      "$ref": "#/components/schemas/RosterMetadataOverrides"
    },
    "mapping_authority": {
      "enum": [
        "explicit_client_rows",
        "unique_name_within_selected_roster_team"
      ]
    }
  },
  "required": [
    "version",
    "metadata_id",
    "roster_id",
    "selection",
    "player_rows",
    "player_ids",
    "overrides",
    "mapping_authority"
  ],
  "additionalProperties": false
}

Schema: RosterContextEntity

{
  "type": "object",
  "properties": {
    "fields": {
      "$ref": "#/components/schemas/RosterExtraFields"
    },
    "field_sources": {
      "type": "object",
      "additionalProperties": {
        "enum": [
          "roster_companion",
          "match_override"
        ]
      }
    },
    "section": {
      "type": "integer"
    },
    "row": {
      "type": "integer",
      "minimum": 0,
      "maximum": 65534
    },
    "external_id": {
      "$ref": "#/components/schemas/RosterContextIdentifier"
    }
  },
  "required": [
    "fields",
    "field_sources"
  ],
  "additionalProperties": false
}

Schema: RosterContext

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "metadata": {
      "$ref": "#/components/schemas/RosterCompanionInfo"
    },
    "mapping_authority": {
      "enum": [
        "explicit_client_rows",
        "unique_name_within_selected_roster_team"
      ]
    },
    "native_effects": {
      "const": false
    },
    "native_save_policy": {
      "const": "frozen_source_context_no_automatic_rebind"
    },
    "roster": {
      "$ref": "#/components/schemas/RosterContextEntity"
    },
    "teams": {
      "type": "object",
      "properties": {
        "home": {
          "$ref": "#/components/schemas/RosterContextEntity"
        },
        "away": {
          "$ref": "#/components/schemas/RosterContextEntity"
        }
      },
      "additionalProperties": false
    },
    "players": {
      "type": "object",
      "maxProperties": 40,
      "patternProperties": {
        "^(home|away):([0-9]|1[0-9])$": {
          "$ref": "#/components/schemas/RosterContextEntity"
        }
      },
      "additionalProperties": false
    },
    "uninstantiated_players": {
      "type": "object",
      "maxProperties": 40,
      "patternProperties": {
        "^(home|away):([0-9]|1[0-9])$": {
          "$ref": "#/components/schemas/RosterContextEntity"
        }
      },
      "additionalProperties": false
    },
    "uniforms": {
      "type": "object",
      "properties": {
        "home": {
          "$ref": "#/components/schemas/RosterContextEntity"
        },
        "away": {
          "$ref": "#/components/schemas/RosterContextEntity"
        }
      },
      "additionalProperties": false
    },
    "arena": {
      "$ref": "#/components/schemas/RosterContextEntity"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    }
  },
  "required": [
    "version",
    "roster_id",
    "metadata",
    "mapping_authority",
    "native_effects",
    "native_save_policy",
    "roster",
    "teams",
    "players",
    "uninstantiated_players",
    "uniforms",
    "arena",
    "sha256"
  ],
  "additionalProperties": false
}

Schema: RosterContextReference

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "metadata_id": {
      "type": "string",
      "pattern": "^roster-metadata:[0-9a-f]{64}$"
    },
    "match_id": {
      "$ref": "#/components/schemas/RosterContextIdentifier"
    },
    "frozen": {
      "const": true
    }
  },
  "required": [
    "version",
    "sha256",
    "roster_id",
    "metadata_id",
    "match_id",
    "frozen"
  ],
  "additionalProperties": false
}

Schema: RosterMetadataSelection

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^roster-metadata:[0-9a-f]{64}$"
    },
    "path": {
      "type": "string",
      "minLength": 1
    },
    "sha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "overrides": {
      "$ref": "#/components/schemas/RosterMetadataOverrides"
    },
    "player_rows": {
      "type": "object",
      "maxProperties": 40,
      "patternProperties": {
        "^(home|away):([0-9]|1[0-9])$": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65534
        }
      },
      "additionalProperties": false
    }
  },
  "required": [],
  "additionalProperties": false,
  "allOf": [
    {
      "not": {
        "required": [
          "id",
          "path"
        ]
      }
    },
    {
      "not": {
        "required": [
          "id",
          "sha256"
        ]
      }
    },
    {
      "if": {
        "required": [
          "path"
        ]
      },
      "then": {
        "required": [
          "sha256"
        ]
      }
    },
    {
      "if": {
        "required": [
          "sha256"
        ]
      },
      "then": {
        "required": [
          "path"
        ]
      }
    }
  ]
}

Schema: RosterMetadataQuery

{
  "type": "object",
  "properties": {
    "metadata_id": {
      "type": "string",
      "pattern": "^roster-metadata:[0-9a-f]{64}$"
    },
    "section": {
      "type": "integer",
      "enum": [
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11,
        12,
        13,
        14,
        15,
        16,
        17,
        18,
        19,
        20,
        21,
        22,
        23,
        24,
        25,
        26,
        27,
        28,
        29,
        30,
        31,
        32,
        33,
        34,
        35,
        36,
        37,
        38,
        39,
        40,
        45
      ]
    },
    "start": {
      "type": "integer",
      "minimum": 0
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 128
    }
  },
  "required": [
    "metadata_id"
  ],
  "additionalProperties": false
}

Schema: RosterMetadataPage

{
  "type": "object",
  "properties": {
    "metadata": {
      "$ref": "#/components/schemas/RosterCompanionInfo"
    },
    "fields": {
      "$ref": "#/components/schemas/RosterExtraFields"
    },
    "records": {
      "type": "array",
      "maxItems": 100000,
      "items": {
        "type": "object",
        "properties": {
          "section": {
            "type": "integer",
            "enum": [
              3,
              4,
              5,
              6,
              7,
              8,
              9,
              10,
              11,
              12,
              13,
              14,
              15,
              16,
              17,
              18,
              19,
              20,
              21,
              22,
              23,
              24,
              25,
              26,
              27,
              28,
              29,
              30,
              31,
              32,
              33,
              34,
              35,
              36,
              37,
              38,
              39,
              40,
              45
            ]
          },
          "row": {
            "type": "integer",
            "minimum": 0,
            "maximum": 65534
          },
          "fields": {
            "$ref": "#/components/schemas/RosterExtraFields"
          }
        },
        "required": [
          "section",
          "row",
          "fields"
        ],
        "additionalProperties": false
      }
    },
    "total": {
      "type": "integer",
      "minimum": 0
    },
    "start": {
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "metadata",
    "fields",
    "records",
    "total",
    "start"
  ],
  "additionalProperties": false
}

Schema: RosterMetadataResolve

{
  "type": "object",
  "properties": {
    "metadata_id": {
      "type": "string",
      "pattern": "^roster-metadata:[0-9a-f]{64}$"
    },
    "roster_id": {
      "type": "string",
      "pattern": "^roster:[0-9a-f]{64}$"
    },
    "preparation": {
      "type": "object"
    },
    "identity": {
      "$ref": "#/components/schemas/MatchIdentityPlan"
    },
    "overrides": {
      "$ref": "#/components/schemas/RosterMetadataOverrides"
    },
    "player_rows": {
      "type": "object",
      "maxProperties": 40,
      "patternProperties": {
        "^(home|away):([0-9]|1[0-9])$": {
          "type": "integer",
          "minimum": 0,
          "maximum": 65534
        }
      },
      "additionalProperties": false
    }
  },
  "required": [
    "metadata_id",
    "roster_id",
    "preparation",
    "identity"
  ],
  "additionalProperties": false
}

Schema: RosterContextIdentifier

{
  "type": "string",
  "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
}

Schema: RuleExtensionRequest

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9._:-]{1,63}$"
    },
    "path": {
      "type": "string",
      "minLength": 1,
      "maxLength": 1023,
      "description": "Explicit trusted x86 DLL path, admitted/frozen before owned child creation; not a runtime load command"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "configuration": {
      "type": "object"
    },
    "required": {
      "type": "boolean"
    }
  },
  "required": [
    "id",
    "path",
    "sha256"
  ],
  "additionalProperties": false
}

Schema: RuleAttempt

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "kind": {
      "enum": [
        "none",
        "field_goal",
        "free_throw",
        "unknown"
      ]
    },
    "stage": {
      "enum": [
        "absent",
        "registered",
        "flight",
        "settled"
      ]
    },
    "shooter": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/EngineActor"
        },
        {
          "type": "null"
        }
      ]
    },
    "scoring_points": {
      "enum": [
        1,
        2,
        3,
        null
      ]
    },
    "can_score": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ]
    },
    "known_fields": {
      "type": "array",
      "items": {
        "enum": [
          "identity",
          "shooter",
          "scoring_points",
          "can_score"
        ]
      },
      "uniqueItems": true
    }
  },
  "required": [
    "id",
    "kind",
    "stage",
    "shooter",
    "scoring_points",
    "can_score",
    "known_fields"
  ],
  "additionalProperties": false
}

Schema: RuleRestart

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "kind": {
      "enum": [
        "none",
        "throw_in",
        "free_throw",
        "jump_ball"
      ]
    },
    "stage": {
      "enum": [
        "absent",
        "awarded",
        "disposed",
        "released",
        "legal_touch",
        "completed"
      ]
    },
    "team": {
      "enum": [
        "home",
        "away",
        null
      ]
    },
    "thrower": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/EngineActor"
        },
        {
          "type": "null"
        }
      ]
    },
    "count_complete": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ]
    },
    "throw_in_complete": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ]
    },
    "arrow_consumed": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ]
    },
    "known_fields": {
      "type": "array",
      "items": {
        "enum": [
          "identity",
          "team",
          "thrower",
          "count_complete",
          "throw_in_complete",
          "arrow_consumed"
        ]
      },
      "uniqueItems": true
    }
  },
  "required": [
    "id",
    "kind",
    "stage",
    "team",
    "thrower",
    "count_complete",
    "throw_in_complete",
    "arrow_consumed",
    "known_fields"
  ],
  "additionalProperties": false
}

Schema: RuleFreeThrows

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "shooter": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/EngineActor"
        },
        {
          "type": "null"
        }
      ]
    },
    "attempt_ordinal": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 3
        },
        {
          "type": "null"
        }
      ]
    },
    "total": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 3
        },
        {
          "type": "null"
        }
      ]
    },
    "remaining": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 3
        },
        {
          "type": "null"
        }
      ]
    },
    "conditional_next": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ]
    },
    "retained_team": {
      "enum": [
        "home",
        "away",
        null
      ]
    },
    "following_restart": {
      "enum": [
        "none",
        "throw_in",
        "free_throw",
        "jump_ball",
        null
      ]
    },
    "known_fields": {
      "type": "array",
      "items": {
        "enum": [
          "identity",
          "shooter",
          "attempt_ordinal",
          "total",
          "remaining",
          "conditional_next",
          "retained_team",
          "following_restart"
        ]
      },
      "uniqueItems": true
    }
  },
  "required": [
    "id",
    "shooter",
    "attempt_ordinal",
    "total",
    "remaining",
    "conditional_next",
    "retained_team",
    "following_restart",
    "known_fields"
  ],
  "additionalProperties": false
}

Schema: LegalBallState

{
  "type": "object",
  "properties": {
    "authority": {
      "const": "engine_committed_profile_interpretation"
    },
    "model": {
      "enum": [
        "nba2k14",
        "openhoops_college"
      ]
    },
    "epoch": {
      "type": "integer",
      "minimum": 0
    },
    "revision": {
      "type": "integer",
      "minimum": 0
    },
    "evidence_sequence": {
      "type": "integer",
      "minimum": 0
    },
    "continuity_faults": {
      "type": "integer",
      "minimum": 0
    },
    "fields": {
      "type": "object",
      "properties": {
        "live": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        },
        "alive": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        },
        "player_control": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/EngineActor"
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        },
        "team_control": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "enum": [
                    "home",
                    "away",
                    null
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        },
        "team_possession": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "enum": [
                    "home",
                    "away",
                    null
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        },
        "entitlement": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "enum": [
                    "home",
                    "away",
                    null
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        },
        "attempt": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/RuleAttempt"
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        },
        "restart": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/RuleRestart"
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        },
        "free_throws": {
          "type": "object",
          "properties": {
            "status": {
              "enum": [
                "known",
                "unknown",
                "inapplicable"
              ]
            },
            "value": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/RuleFreeThrows"
                },
                {
                  "type": "null"
                }
              ]
            },
            "evidence_sequence": {
              "type": "integer",
              "minimum": 0
            },
            "reason": {
              "enum": [
                "new_match",
                "accepted_control",
                "pass_release",
                "attempt",
                "contact",
                "rim",
                "adjudication",
                "goal",
                "period",
                "restart",
                "free_throw",
                "capture_gap",
                "unclassified_transition",
                "match_end",
                null
              ]
            }
          },
          "required": [
            "status",
            "value",
            "evidence_sequence",
            "reason"
          ],
          "additionalProperties": false,
          "allOf": [
            {
              "if": {
                "properties": {
                  "status": {
                    "enum": [
                      "unknown",
                      "inapplicable"
                    ]
                  }
                }
              },
              "then": {
                "properties": {
                  "value": {
                    "type": "null"
                  }
                }
              }
            }
          ]
        }
      },
      "required": [
        "live",
        "alive",
        "player_control",
        "team_control",
        "team_possession",
        "entitlement",
        "attempt",
        "restart",
        "free_throws"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "authority",
    "model",
    "epoch",
    "revision",
    "evidence_sequence",
    "continuity_faults",
    "fields"
  ],
  "additionalProperties": false
}

Schema: RuleDecision

{
  "type": "object",
  "properties": {
    "kind": {
      "enum": [
        "permission",
        "shot_clock_full",
        "shot_clock_minimum",
        "backcourt_seconds",
        "personal_foul_limit",
        "bonus_threshold",
        "late_bonus_threshold",
        "one_and_one_threshold",
        "overtime_seconds",
        "period_seconds",
        "three_point_classification",
        "free_throw_count",
        "shot_clock_rim"
      ]
    },
    "value": {
      "type": [
        "number",
        "null"
      ]
    }
  },
  "required": [
    "kind",
    "value"
  ],
  "additionalProperties": false
}

Schema: RuleExtensionStatus

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "configuration_sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "required": {
      "type": "boolean"
    },
    "calls": {
      "type": "integer",
      "minimum": 0
    },
    "overrides": {
      "type": "integer",
      "minimum": 0
    },
    "faults": {
      "type": "integer",
      "minimum": 0
    },
    "disabled": {
      "type": "boolean"
    },
    "last_fault": {
      "enum": [
        null,
        "exception",
        "invalid_result",
        "context_mutation",
        "over_budget",
        "reentrant",
        "floating_point_environment"
      ]
    },
    "last_exception_code": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ]
    },
    "decisions": {
      "type": "array",
      "items": {
        "enum": [
          "permission",
          "shot_clock_full",
          "shot_clock_minimum",
          "backcourt_seconds",
          "personal_foul_limit",
          "bonus_threshold",
          "late_bonus_threshold",
          "one_and_one_threshold",
          "overtime_seconds",
          "period_seconds",
          "three_point_classification",
          "free_throw_count",
          "shot_clock_rim"
        ]
      },
      "uniqueItems": true
    },
    "permissions": {
      "type": "array",
      "items": {
        "enum": [
          "shot_clock",
          "out_of_bounds",
          "backcourt",
          "eight_second",
          "offensive_three_second",
          "defensive_three_second",
          "back_to_basket",
          "goaltending",
          "traveling",
          "double_dribble",
          "illegal_screen",
          "over_the_back",
          "charging",
          "blocking",
          "reaching",
          "shooting",
          "loose_ball",
          "intentional",
          "kicked_ball"
        ]
      },
      "uniqueItems": true
    },
    "events": {
      "type": "array",
      "items": {
        "enum": [
          "ball_state",
          "adjudication_record",
          "stat_delta",
          "phase",
          "decision",
          "lifecycle"
        ]
      },
      "uniqueItems": true
    },
    "maximum_microseconds": {
      "type": "integer",
      "minimum": 0
    },
    "last_fault_surface": {
      "enum": [
        null,
        "decision",
        "observer"
      ]
    },
    "last_fault_decision_id": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ]
    },
    "last_fault_observation_sequence": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ]
    },
    "last_fault_sequence": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "id",
    "version",
    "sha256",
    "configuration_sha256",
    "required",
    "calls",
    "overrides",
    "faults",
    "disabled",
    "last_fault",
    "last_exception_code",
    "decisions",
    "permissions",
    "events",
    "maximum_microseconds",
    "last_fault_surface",
    "last_fault_decision_id",
    "last_fault_observation_sequence",
    "last_fault_sequence"
  ],
  "additionalProperties": false
}

Schema: RuleRuntime

{
  "type": "object",
  "properties": {
    "available": {
      "type": "boolean"
    },
    "version": {
      "enum": [
        1,
        2
      ]
    },
    "interpreter_version": {
      "type": "integer",
      "minimum": 0
    },
    "profile": {
      "enum": [
        "original",
        "college"
      ]
    },
    "profile_revision": {
      "type": "integer",
      "minimum": 0
    },
    "initialized": {
      "type": "boolean"
    },
    "configuration_frozen": {
      "type": "boolean"
    },
    "active": {
      "type": "boolean"
    },
    "degraded": {
      "type": "boolean"
    },
    "halted": {
      "type": "boolean"
    },
    "halt_pending": {
      "type": "boolean"
    },
    "host_faults": {
      "type": "integer",
      "minimum": 0
    },
    "continuity_faults": {
      "type": "integer",
      "minimum": 0
    },
    "off_thread": {
      "type": "integer",
      "minimum": 0
    },
    "match_epoch": {
      "type": "integer",
      "minimum": 0
    },
    "evaluation_epoch": {
      "type": "integer",
      "minimum": 0
    },
    "decision_sequence": {
      "type": "integer",
      "minimum": 0
    },
    "evidence_sequence": {
      "type": "integer",
      "minimum": 0
    },
    "configuration_decisions": {
      "type": "array",
      "items": {
        "enum": [
          "permission",
          "shot_clock_full",
          "shot_clock_minimum",
          "backcourt_seconds",
          "personal_foul_limit",
          "bonus_threshold",
          "late_bonus_threshold",
          "one_and_one_threshold",
          "overtime_seconds",
          "period_seconds",
          "three_point_classification",
          "free_throw_count",
          "shot_clock_rim"
        ]
      },
      "uniqueItems": true
    },
    "runtime_decisions": {
      "type": "array",
      "items": {
        "enum": [
          "permission",
          "shot_clock_full",
          "shot_clock_minimum",
          "backcourt_seconds",
          "personal_foul_limit",
          "bonus_threshold",
          "late_bonus_threshold",
          "one_and_one_threshold",
          "overtime_seconds",
          "period_seconds",
          "three_point_classification",
          "free_throw_count",
          "shot_clock_rim"
        ]
      },
      "uniqueItems": true
    },
    "permissions": {
      "type": "array",
      "items": {
        "enum": [
          "shot_clock",
          "out_of_bounds",
          "backcourt",
          "eight_second",
          "offensive_three_second",
          "defensive_three_second",
          "back_to_basket",
          "goaltending",
          "traveling",
          "double_dribble",
          "illegal_screen",
          "over_the_back",
          "charging",
          "blocking",
          "reaching",
          "shooting",
          "loose_ball",
          "intentional",
          "kicked_ball"
        ]
      },
      "uniqueItems": true
    },
    "events": {
      "type": "array",
      "items": {
        "enum": [
          "ball_state",
          "adjudication_record",
          "stat_delta",
          "phase",
          "decision",
          "lifecycle"
        ]
      },
      "uniqueItems": true
    },
    "ball_field_families": {
      "type": "array",
      "items": {
        "enum": [
          "live",
          "alive",
          "player_control",
          "team_control",
          "team_possession",
          "entitlement",
          "attempt",
          "restart",
          "free_throws"
        ]
      },
      "uniqueItems": true
    },
    "frozen_values": {
      "$ref": "#/components/schemas/FrozenRuleValues"
    },
    "modules": {
      "type": "array",
      "maxItems": 8,
      "items": {
        "$ref": "#/components/schemas/RuleExtensionStatus"
      }
    },
    "ball": {
      "$ref": "#/components/schemas/LegalBallState"
    },
    "boundary": {
      "type": "object",
      "properties": {
        "sequence": {
          "type": "integer",
          "minimum": 0
        },
        "errors": {
          "type": "integer",
          "minimum": 0
        }
      },
      "required": [
        "sequence",
        "errors"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "available",
    "version",
    "interpreter_version",
    "profile",
    "profile_revision",
    "initialized",
    "configuration_frozen",
    "active",
    "degraded",
    "halted",
    "halt_pending",
    "host_faults",
    "continuity_faults",
    "off_thread",
    "match_epoch",
    "evaluation_epoch",
    "decision_sequence",
    "evidence_sequence",
    "configuration_decisions",
    "runtime_decisions",
    "permissions",
    "events",
    "ball_field_families",
    "frozen_values",
    "modules",
    "ball",
    "boundary"
  ],
  "additionalProperties": false
}

Schema: RuleEvent

{
  "type": "object",
  "properties": {
    "source_rule_sequence": {
      "type": "integer",
      "minimum": 0
    },
    "kind": {
      "enum": [
        "ball_state",
        "adjudication_record",
        "stat_delta",
        "phase",
        "decision",
        "lifecycle"
      ]
    },
    "match_epoch": {
      "type": "integer",
      "minimum": 0
    },
    "decision_id": {
      "type": "integer",
      "minimum": 0
    },
    "raw_period": {
      "type": "integer",
      "minimum": 0
    },
    "phase_code": {
      "type": "integer",
      "minimum": 0
    },
    "game_seconds": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "shot_seconds": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "ball": {
      "$ref": "#/components/schemas/LegalBallState"
    },
    "evidence_sequence": {
      "type": "integer",
      "minimum": 0
    },
    "transaction_id": {
      "type": "integer",
      "minimum": 0
    },
    "parent_transaction": {
      "type": "integer",
      "minimum": 0
    },
    "engine_event_watermark": {
      "type": "integer",
      "minimum": 0
    },
    "record_stage": {
      "type": "integer",
      "minimum": 0
    },
    "fault_code": {
      "type": "integer",
      "minimum": 0
    },
    "actors": {
      "type": "array",
      "minItems": 2,
      "maxItems": 2,
      "items": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/EngineActor"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "record_kind_code": {
      "type": "integer",
      "minimum": 0
    },
    "record_kind_name": {
      "enum": [
        "eight_second_backcourt_violation",
        "ten_second_backcourt_violation",
        "double_dribble_violation",
        "out_of_bounds",
        "five_second_inbound_violation",
        "shot_clock_violation",
        "kicked_ball_violation",
        "reach_in_foul",
        "blocking_foul",
        "shooting_foul",
        null
      ]
    },
    "actor_roles": {
      "type": "array",
      "minItems": 2,
      "maxItems": 2,
      "items": {
        "enum": [
          "violating_player",
          "foul_committer",
          "fouled_player",
          null
        ]
      }
    },
    "role_authority": {
      "enum": [
        "original_handler_credit_arguments",
        "unresolved"
      ]
    },
    "detection_authority": {
      "const": "original_game_detection_not_independently_certified"
    },
    "scope": {
      "enum": [
        "match_configuration",
        "simulation_step",
        "native_transaction"
      ]
    },
    "reason": {
      "enum": [
        null,
        "field_goal_release",
        "shooting_foul",
        "conditional_bonus",
        "double_bonus",
        "administrative_free_throws",
        "other_free_throws"
      ]
    }
  },
  "required": [
    "source_rule_sequence",
    "kind",
    "match_epoch",
    "decision_id",
    "raw_period",
    "phase_code",
    "game_seconds",
    "shot_seconds",
    "ball",
    "evidence_sequence",
    "transaction_id",
    "parent_transaction",
    "engine_event_watermark",
    "record_stage",
    "fault_code",
    "actors"
  ],
  "additionalProperties": true
}

Schema: RuleResultContext

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "profile": {
      "enum": [
        "original",
        "college"
      ]
    },
    "profile_revision": {
      "type": "integer",
      "minimum": 0
    },
    "interpreter_version": {
      "type": "integer",
      "minimum": 0
    },
    "match_epoch": {
      "type": "integer",
      "minimum": 0
    },
    "configuration_frozen": {
      "type": "boolean"
    },
    "frozen_values": {
      "$ref": "#/components/schemas/FrozenRuleValues"
    },
    "modules": {
      "type": "array",
      "maxItems": 8,
      "items": {
        "$ref": "#/components/schemas/RuleExtensionStatus"
      }
    },
    "degraded": {
      "type": "boolean"
    },
    "halted": {
      "type": "boolean"
    },
    "halt_pending": {
      "type": "boolean"
    },
    "host_faults": {
      "type": "integer",
      "minimum": 0
    },
    "continuity_faults": {
      "type": "integer",
      "minimum": 0
    },
    "event_boundary": {
      "type": "object",
      "properties": {
        "sequence": {
          "type": "integer",
          "minimum": 0
        },
        "errors": {
          "type": "integer",
          "minimum": 0
        }
      },
      "required": [
        "sequence",
        "errors"
      ],
      "additionalProperties": false
    },
    "transport_gaps": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "first": {
            "type": "integer",
            "minimum": 0
          },
          "last": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "first",
          "last"
        ],
        "additionalProperties": false
      },
      "maxItems": 128
    },
    "fault_receipts": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "maxItems": 128
    },
    "semantic_coverage": {
      "const": "per_field_validity; unknown_and_inapplicable_are_explicit"
    },
    "fault_receipts_omitted": {
      "type": "integer",
      "minimum": 0
    },
    "transport_gaps_omitted": {
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "version",
    "profile",
    "profile_revision",
    "interpreter_version",
    "match_epoch",
    "configuration_frozen",
    "frozen_values",
    "modules",
    "degraded",
    "halted",
    "halt_pending",
    "host_faults",
    "continuity_faults",
    "event_boundary",
    "transport_gaps",
    "fault_receipts",
    "semantic_coverage"
  ],
  "additionalProperties": false
}

Schema: RuleRuntimeResponse

{
  "type": "object",
  "properties": {
    "run_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "health": {
      "enum": [
        "ready",
        "unavailable",
        "stale"
      ]
    },
    "state": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/RuleRuntime"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "run_id",
    "health",
    "state"
  ],
  "additionalProperties": false
}

Schema: LegalBallResponse

{
  "type": "object",
  "properties": {
    "run_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "health": {
      "enum": [
        "ready",
        "unavailable",
        "stale"
      ]
    },
    "state": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/LegalBallState"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "run_id",
    "health",
    "state"
  ],
  "additionalProperties": false
}

Schema: AssetFile

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9_.-]{0,119}\\.iff$"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "kind": {
      "enum": [
        "arena",
        "court",
        "uniform",
        "logo",
        "support"
      ]
    },
    "bytes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 536870912
    }
  },
  "required": [
    "name",
    "sha256",
    "kind",
    "bytes"
  ],
  "additionalProperties": false
}

Schema: AssetFileObservation

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9_.-]{0,119}\\.iff$"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "kind": {
      "enum": [
        "arena",
        "court",
        "uniform",
        "logo",
        "support"
      ]
    },
    "bytes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 536870912
    },
    "opens": {
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "name",
    "sha256",
    "kind",
    "bytes",
    "opens"
  ],
  "additionalProperties": false
}

Schema: AssetContainerValidation

{
  "type": "object",
  "properties": {
    "family": {
      "const": "94ef3bff"
    },
    "segments": {
      "type": "integer",
      "minimum": 1,
      "maximum": 4096
    },
    "resources": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100000
    },
    "decoded_bytes": {
      "type": "integer",
      "minimum": 0,
      "maximum": 536870912
    }
  },
  "required": [
    "family",
    "segments",
    "resources",
    "decoded_bytes"
  ],
  "additionalProperties": false
}

Schema: AssetPackageFile

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9_.-]{0,119}\\.iff$"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "kind": {
      "enum": [
        "arena",
        "court",
        "uniform",
        "logo",
        "support"
      ]
    },
    "bytes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 536870912
    },
    "path": {
      "type": "string",
      "pattern": "^files/"
    },
    "container": {
      "$ref": "#/components/schemas/AssetContainerValidation"
    }
  },
  "required": [
    "name",
    "sha256",
    "kind",
    "bytes",
    "path",
    "container"
  ],
  "additionalProperties": false
}

Schema: AssetPackageDescriptor

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^asset-package:[a-f0-9]{64}$"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "archive_bytes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 536870912
    },
    "expanded_bytes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2147483648
    },
    "files": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AssetPackageFile"
      },
      "maxItems": 512,
      "minItems": 1
    },
    "native_loaded": {
      "const": false
    }
  },
  "required": [
    "id",
    "sha256",
    "archive_bytes",
    "expanded_bytes",
    "files",
    "native_loaded"
  ],
  "additionalProperties": false
}

Schema: AssetPackageReference

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "pattern": "^asset-package:[a-f0-9]{64}$"
    },
    "sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    }
  },
  "required": [
    "id",
    "sha256"
  ],
  "additionalProperties": false
}

Schema: AssetOverlay

{
  "type": "object",
  "properties": {
    "version": {
      "const": 1
    },
    "packages": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AssetPackageReference"
      },
      "maxItems": 8,
      "minItems": 1
    },
    "files": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AssetFile"
      },
      "maxItems": 512,
      "minItems": 1
    },
    "sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    }
  },
  "required": [
    "version",
    "packages",
    "files",
    "sha256"
  ],
  "additionalProperties": false
}

Schema: NativeMetadataStatus

{
  "type": "object",
  "properties": {
    "required": {
      "type": "boolean"
    },
    "state": {
      "enum": [
        "inactive",
        "waiting",
        "committed"
      ]
    },
    "epoch": {
      "type": "integer",
      "minimum": 0
    },
    "context_sha256": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[a-f0-9]{64}$"
        },
        {
          "type": "null"
        }
      ]
    },
    "match_id": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
        },
        {
          "type": "null"
        }
      ]
    },
    "bytes": {
      "type": "integer",
      "minimum": 0,
      "maximum": 524288
    },
    "entities": {
      "type": "integer",
      "minimum": 0,
      "maximum": 46
    },
    "simulation_blocked": {
      "type": "boolean"
    },
    "error": {
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "required",
    "state",
    "epoch",
    "context_sha256",
    "match_id",
    "bytes",
    "entities",
    "simulation_blocked",
    "error"
  ],
  "additionalProperties": false
}

Schema: NativeAssetStatus

{
  "type": "object",
  "properties": {
    "active": {
      "type": "boolean"
    },
    "sha256": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^[a-f0-9]{64}$"
        },
        {
          "type": "null"
        }
      ]
    },
    "packages": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AssetPackageReference"
      },
      "maxItems": 8,
      "minItems": 0
    },
    "files": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/AssetFileObservation"
      },
      "maxItems": 512,
      "minItems": 0
    },
    "reads": {
      "type": "integer",
      "minimum": 0
    },
    "write_refusals": {
      "type": "integer",
      "minimum": 0
    }
  },
  "required": [
    "active",
    "sha256",
    "packages",
    "files",
    "reads",
    "write_refusals"
  ],
  "additionalProperties": false
}

Schema: NativePlatform

{
  "type": "object",
  "properties": {
    "available": {
      "const": true
    },
    "version": {
      "const": 1
    },
    "metadata": {
      "$ref": "#/components/schemas/NativeMetadataStatus"
    },
    "assets": {
      "$ref": "#/components/schemas/NativeAssetStatus"
    }
  },
  "required": [
    "available",
    "version",
    "metadata",
    "assets"
  ],
  "additionalProperties": false
}

Schema: NativePlatformResponse

{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "health": {
      "type": "string"
    },
    "platform": {
      "anyOf": [
        {
          "$ref": "#/components/schemas/NativePlatform"
        },
        {
          "type": "null"
        }
      ]
    }
  },
  "required": [
    "run_id",
    "health",
    "platform"
  ],
  "additionalProperties": false
}

Schema: NativeContextReceipt

{
  "type": "object",
  "properties": {
    "status": {
      "const": "committed"
    },
    "epoch": {
      "type": "integer",
      "minimum": 1
    },
    "match_id": {
      "type": "string",
      "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:-]{0,95}$"
    },
    "context_sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "payload_sha256": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "bytes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2097152
    },
    "entities": {
      "type": "integer",
      "minimum": 6,
      "maximum": 46
    }
  },
  "required": [
    "status",
    "epoch",
    "match_id",
    "context_sha256",
    "payload_sha256",
    "bytes",
    "entities"
  ],
  "additionalProperties": false
}

Schema: CompatibilityCheck

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "enum": [
        "pass",
        "fail",
        "warning",
        "unknown"
      ]
    },
    "message": {
      "type": "string"
    },
    "fix": {
      "type": [
        "string",
        "null"
      ]
    },
    "evidence": {
      "type": "object",
      "additionalProperties": true
    }
  },
  "required": [
    "id",
    "status",
    "message",
    "fix",
    "evidence"
  ],
  "additionalProperties": false
}

Schema: CompatibilityReport

{
  "type": "object",
  "properties": {
    "format": {
      "const": "openhoops.compatibility_report"
    },
    "version": {
      "const": 1
    },
    "status": {
      "enum": [
        "passed",
        "failed",
        "incomplete"
      ]
    },
    "scope": {
      "const": "static_preflight"
    },
    "live_readiness": {
      "const": "not_established"
    },
    "game_started": {
      "const": false
    },
    "request_reserved": {
      "const": false
    },
    "source_files_modified": {
      "const": false
    },
    "summary": {
      "type": "object",
      "properties": {
        "pass": {
          "type": "integer",
          "minimum": 0
        },
        "fail": {
          "type": "integer",
          "minimum": 0
        },
        "warning": {
          "type": "integer",
          "minimum": 0
        },
        "unknown": {
          "type": "integer",
          "minimum": 0
        }
      },
      "required": [
        "pass",
        "fail",
        "warning",
        "unknown"
      ],
      "additionalProperties": false
    },
    "checks": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/CompatibilityCheck"
      }
    }
  },
  "required": [
    "format",
    "version",
    "status",
    "scope",
    "live_readiness",
    "game_started",
    "request_reserved",
    "source_files_modified",
    "summary",
    "checks"
  ],
  "additionalProperties": false
}

Schema: CompatibilityRequest

{
  "type": "object",
  "properties": {
    "request": {
      "$ref": "#/components/schemas/MatchRequest"
    },
    "game_path": {
      "type": "string"
    }
  },
  "required": [
    "request"
  ],
  "additionalProperties": false
}

Schema: FrozenRuleValues

{
  "type": "object",
  "properties": {
    "shot_clock_full": {
      "type": "number",
      "minimum": 1,
      "maximum": 120
    },
    "shot_clock_minimum": {
      "type": "number",
      "minimum": 1,
      "maximum": 120
    },
    "personal_foul_limit": {
      "enum": [
        5,
        6
      ]
    },
    "shot_clock_rim": {
      "type": "number",
      "minimum": 1,
      "maximum": 120
    },
    "backcourt_seconds": {
      "type": "number",
      "minimum": 1,
      "maximum": 120
    },
    "overtime_seconds": {
      "type": "number",
      "minimum": 60,
      "maximum": 300,
      "multipleOf": 60
    },
    "period_seconds": {
      "type": "number",
      "minimum": 60,
      "maximum": 1200,
      "multipleOf": 60
    },
    "bonus_threshold": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2147483647
    },
    "one_and_one_threshold": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2147483647
    }
  },
  "required": [],
  "additionalProperties": false
}