{
  "$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": {"type": "string", "pattern": "^0\\.[0-9]+-draft$"},
    "runtime_status": {
      "type": "string",
      "enum": ["simulated_fixture_only", "approved_stream_runtime_available", "open_platform_runtime_available"]
    },
    "timestamp_ms": {"type": "integer", "minimum": 0},
    "session": {
      "type": "object",
      "required": ["session_id", "phase", "elapsed_ms", "educational_use"],
      "additionalProperties": false,
      "properties": {
        "session_id": {"type": "string", "minLength": 1, "maxLength": 160},
        "phase": {"type": "string", "enum": ["preparation", "guided_learning", "break", "knowledge_check", "reflection"]},
        "elapsed_ms": {"type": "integer", "minimum": 0},
        "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", "maxLength": 120},
        "vendor_specific_source": {"type": "boolean"},
        "sampling_window_ms": {"type": "integer", "minimum": 500, "maximum": 30000},
        "sampling_rate_hz": {"type": "number", "minimum": 1, "maximum": 4096}
      }
    },
    "signal_quality": {
      "type": "object",
      "required": ["status", "artifact_flags"],
      "additionalProperties": false,
      "properties": {
        "status": {"type": "string", "enum": ["usable", "limited", "rejected"]},
        "artifact_flags": {"type": "array", "items": {"type": "string"}, "uniqueItems": true},
        "dropout_ratio": {"type": "number", "minimum": 0, "maximum": 1}
      }
    },
    "features": {
      "type": "object",
      "required": ["alpha_relative", "theta_relative", "beta_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"}
  }
}
