{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://oms.local/schemas/session-payload.schema.json",
  "title": "OMS durable session registry payload",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "session_id",
    "role_id",
    "engine",
    "mode",
    "transport",
    "run_id",
    "ticket_id",
    "native_session_ref",
    "provider_native_session_sha256",
    "tmux_pane_id",
    "policy_version",
    "policy_digest",
    "started_at",
    "last_observed_at",
    "heartbeat_deadline_at",
    "parked_until",
    "stop_reason",
    "ended_at",
    "source_event_id",
    "last_event_id"
  ],
  "properties": {
    "session_id": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$" },
    "role_id": {
      "type": "string",
      "enum": [
        "oms.conductor",
        "oms.exec-advisor",
        "oms.ticket-executor",
        "oms.goal-long-executor",
        "oms.grader.codex",
        "oms.grader.claude",
        "oms.bounded-dreamer"
      ]
    },
    "engine": { "type": "string", "enum": ["claude", "codex"] },
    "mode": { "type": "string", "enum": ["pane", "goal", "exec"] },
    "transport": { "type": "string", "enum": ["claude_interactive", "codex_goal", "codex_exec"] },
    "run_id": {
      "type": ["string", "null"],
      "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$"
    },
    "ticket_id": {
      "type": ["string", "null"],
      "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$"
    },
    "native_session_ref": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$" },
    "provider_native_session_sha256": {
      "type": ["string", "null"],
      "pattern": "^[a-f0-9]{64}$"
    },
    "tmux_pane_id": { "type": ["string", "null"], "pattern": "^%[0-9]{1,10}$" },
    "policy_version": { "const": 2 },
    "policy_digest": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
    "started_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$" },
    "last_observed_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$" },
    "heartbeat_deadline_at": {
      "type": ["string", "null"],
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"
    },
    "parked_until": {
      "type": ["string", "null"],
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"
    },
    "stop_reason": { "type": ["string", "null"], "minLength": 1, "maxLength": 512 },
    "ended_at": {
      "type": ["string", "null"],
      "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"
    },
    "source_event_id": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$" },
    "last_event_id": { "type": "string", "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$" }
  }
}
