{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://mypraxisos.com/ontology/packet.schema.json",
  "title": "PRAXIS primitive packet",
  "description": "The only payload that leaves the device. No raw audio, video, inertial stream, keystroke content or location.",
  "type": "object",
  "required": [
    "person_key",
    "consent_version",
    "sent_at",
    "raw_signals_included",
    "primitives"
  ],
  "additionalProperties": false,
  "properties": {
    "person_key": {
      "type": "string",
      "description": "pseudonymous per-person key"
    },
    "consent_version": {
      "type": "string"
    },
    "sent_at": {
      "type": "string",
      "format": "date-time"
    },
    "raw_signals_included": {
      "const": false
    },
    "model_version": {
      "type": "integer"
    },
    "primitives": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "primitive_id",
          "t_start",
          "t_end",
          "value",
          "quality"
        ],
        "additionalProperties": false,
        "properties": {
          "primitive_id": {
            "enum": [
              "speech.rate",
              "speech.pause_ratio",
              "speech.pitch_var",
              "aac.message_length",
              "aac.vocab_breadth",
              "fine.stroke_jerk",
              "fine.stroke_tremor",
              "fine.tap_precision",
              "fine.tap_rhythm_cv",
              "fine.aac_selection",
              "fine.hold_tremor",
              "fine.typing_rhythm",
              "gait.step_time_cv",
              "gait.stride_regularity",
              "gait.cadence",
              "gait.turn_smoothness",
              "gait.toe_walking",
              "gait.arm_swing_asym",
              "posture.sway",
              "posture.sit_to_stand",
              "posture.trunk_alignment",
              "praxis.reach_straightness",
              "praxis.bilateral_index",
              "praxis.transition_latency",
              "stereotypy.episodes",
              "infant.gm_complexity",
              "infant.milestone_timing",
              "sleep.nocturnal_movement",
              "autonomic.hrv",
              "context.env_load"
            ]
          },
          "t_start": {
            "type": "string",
            "format": "date-time"
          },
          "t_end": {
            "type": "string",
            "format": "date-time"
          },
          "value": {
            "type": "number"
          },
          "quality": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "context_class": {
            "enum": [
              "quiet",
              "moderate",
              "loud",
              "unmeasured",
              "home",
              "school",
              "clinic"
            ]
          },
          "layout": {
            "enum": [
              "reference",
              "adapted"
            ],
            "description": "for board primitives: whether the value was taken on the fixed reference layout"
          }
        }
      }
    }
  }
}