{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Spanda Core API Contract",
  "version": 2,
  "description": "Stable JSON boundary between Spanda tooling (spanda-driver / spanda-cli / bindings) and TypeScript/React clients. Schema is implementation-agnostic; see docs/api-documentation.md.",
  "definitions": {
    "Diagnostic": {
      "type": "object",
      "required": ["line", "column", "message"],
      "properties": {
        "line": { "type": "integer", "minimum": 1 },
        "column": { "type": "integer", "minimum": 1 },
        "message": { "type": "string" },
        "severity": { "enum": ["error", "warning"] }
      }
    },
    "CompatSeverity": {
      "enum": ["pass", "warning", "error"]
    },
    "CompatItem": {
      "type": "object",
      "required": ["category", "message", "severity", "line", "column"],
      "properties": {
        "category": { "type": "string" },
        "message": { "type": "string" },
        "severity": { "$ref": "#/definitions/CompatSeverity" },
        "line": { "type": "integer", "minimum": 1 },
        "column": { "type": "integer", "minimum": 1 }
      }
    },
    "MatrixCell": {
      "type": "object",
      "required": ["robot", "target", "compatible"],
      "properties": {
        "robot": { "type": "string" },
        "target": { "type": "string" },
        "compatible": { "type": "boolean" }
      }
    },
    "CompatibilityMatrix": {
      "type": "object",
      "required": ["cells"],
      "properties": {
        "cells": {
          "type": "array",
          "items": { "$ref": "#/definitions/MatrixCell" }
        }
      }
    },
    "RobotState": {
      "type": "object",
      "required": ["pose", "velocity", "emergencyStop"],
      "properties": {
        "pose": {
          "type": "object",
          "properties": {
            "x": { "type": "number" },
            "y": { "type": "number" },
            "theta": { "type": "number" },
            "z": { "type": "number" }
          }
        },
        "velocity": {
          "type": "object",
          "properties": {
            "linear": { "type": "number" },
            "angular": { "type": "number" }
          }
        },
        "emergencyStop": { "type": "boolean" }
      }
    },
    "CheckResponse": {
      "type": "object",
      "required": ["ok"],
      "properties": {
        "ok": { "type": "boolean" },
        "diagnostics": {
          "type": "array",
          "items": { "$ref": "#/definitions/Diagnostic" }
        }
      }
    },
    "VerifyResponse": {
      "type": "object",
      "required": ["ok", "items"],
      "properties": {
        "ok": { "type": "boolean" },
        "target": { "type": "string" },
        "items": {
          "type": "array",
          "items": { "$ref": "#/definitions/CompatItem" }
        },
        "matrix": { "$ref": "#/definitions/CompatibilityMatrix" }
      }
    },
    "RunResponse": {
      "type": "object",
      "required": ["state", "events"],
      "properties": {
        "state": { "$ref": "#/definitions/RobotState" },
        "events": { "type": "array", "items": { "type": "string" } },
        "logs": { "type": "array", "items": { "type": "string" } }
      }
    }
  }
}
