{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://slowsystems.app/proof/schema/session-feature-update.schema.json",
  "title": "SlowSystems Session Feature Update Event",
  "description": "Draft technical event schema for optional device context during a structured learning session. It does not represent a learning score, mental-state classification, or live-device claim.",
  "type": "object",
  "required": [
    "event_type",
    "schema_version",
    "runtime_status",
    "timestamp_ms",
    "session",
    "input",
    "signal_quality",
    "features",
    "learning_outcome_inference",
    "claim_boundary"
  ],
  "additionalProperties": false,
  "properties": {
    "event_type": {"const": "session_feature_update"},
    "schema_version": {"const": "0.2-draft"},
    "runtime_status": {
      "type": "string",
      "enum": ["simulated_fixture_only", "approved_stream_runtime_available", "open_platform_runtime_available"]
    },
    "timestamp_ms": {"type": "integer", "minimum": 0, "maximum": 9007199254740991},
    "session": {
      "type": "object",
      "required": ["session_id", "phase", "elapsed_ms", "educational_use"],
      "additionalProperties": false,
      "properties": {
        "session_id": {"type": "string", "minLength": 1, "maxLength": 160, "pattern": "^[A-Za-z0-9._~-]+$"},
        "phase": {"type": "string", "enum": ["preparation", "guided_learning", "break", "knowledge_check", "reflection"]},
        "elapsed_ms": {"type": "integer", "minimum": 0, "maximum": 9007199254740991},
        "educational_use": {"const": "technical_context_only"}
      }
    },
    "input": {
      "type": "object",
      "required": ["source_type", "vendor_specific_source", "sampling_window_ms"],
      "additionalProperties": false,
      "properties": {
        "source_type": {"type": "string", "enum": ["simulator_fixture", "approved_stream", "open_platform_runtime"]},
        "source_name": {"type": "string", "minLength": 1, "maxLength": 120},
        "vendor_specific_source": {"type": "boolean"},
        "sampling_window_ms": {"type": "integer", "minimum": 500, "maximum": 30000},
        "sampling_rate_hz": {"type": "number", "exclusiveMinimum": 0, "maximum": 4096}
      }
    },
    "signal_quality": {
      "type": "object",
      "required": ["status", "artifact_flags"],
      "additionalProperties": false,
      "properties": {
        "status": {"type": "string", "enum": ["usable", "limited", "rejected"]},
        "artifact_flags": {
          "type": "array",
          "maxItems": 32,
          "items": {"type": "string", "minLength": 1, "maxLength": 80, "pattern": "^[a-z0-9_]+$"},
          "uniqueItems": true
        },
        "dropout_ratio": {"type": "number", "minimum": 0, "maximum": 1}
      }
    },
    "features": {
      "type": "object",
      "required": ["alpha_relative", "theta_relative", "beta_relative", "delta_relative", "gamma_relative"],
      "additionalProperties": false,
      "properties": {
        "alpha_relative": {"type": "number", "minimum": 0, "maximum": 1},
        "theta_relative": {"type": "number", "minimum": 0, "maximum": 1},
        "beta_relative": {"type": "number", "minimum": 0, "maximum": 1},
        "delta_relative": {"type": "number", "minimum": 0, "maximum": 1},
        "gamma_relative": {"type": "number", "minimum": 0, "maximum": 1}
      }
    },
    "learning_outcome_inference": {"const": false},
    "claim_boundary": {"const": "non_medical"}
  },
  "allOf": [
    {
      "if": {
        "type": "object",
        "properties": {"runtime_status": {"const": "simulated_fixture_only"}},
        "required": ["runtime_status"]
      },
      "then": {
        "type": "object",
        "properties": {
          "input": {
            "type": "object",
            "properties": {
              "source_type": {"const": "simulator_fixture"},
              "vendor_specific_source": {"const": false}
            }
          }
        }
      }
    },
    {
      "if": {
        "type": "object",
        "properties": {"runtime_status": {"const": "approved_stream_runtime_available"}},
        "required": ["runtime_status"]
      },
      "then": {
        "type": "object",
        "properties": {
          "input": {
            "type": "object",
            "required": ["source_name"],
            "properties": {
              "source_name": {"type": "string", "minLength": 1, "maxLength": 120},
              "source_type": {"const": "approved_stream"},
              "vendor_specific_source": {"const": true}
            }
          }
        }
      }
    },
    {
      "if": {
        "type": "object",
        "properties": {"runtime_status": {"const": "open_platform_runtime_available"}},
        "required": ["runtime_status"]
      },
      "then": {
        "type": "object",
        "properties": {
          "input": {
            "type": "object",
            "required": ["source_name"],
            "properties": {
              "source_name": {"type": "string", "minLength": 1, "maxLength": 120},
              "source_type": {"const": "open_platform_runtime"},
              "vendor_specific_source": {"const": false}
            }
          }
        }
      }
    },
    {
      "if": {
        "type": "object",
        "properties": {
          "signal_quality": {
            "type": "object",
            "properties": {"status": {"const": "rejected"}},
            "required": ["status"]
          }
        }
      },
      "then": {
        "type": "object",
        "properties": {
          "signal_quality": {
            "type": "object",
            "required": ["artifact_flags"],
            "properties": {
              "artifact_flags": {"type": "array", "minItems": 1}
            }
          }
        }
      }
    }
  ]
}
