{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://termverify.dev/schemas/termverify.transcript/v1.schema.json",
  "title": "TermVerify transcript v1 record",
  "description": "A non-exhaustive structural and local-validation aid for one UTF-8 JSONL record. Schema acceptance is not a conformance verdict; termverify.transcript remains authoritative for all protocol acceptance, including rules or record kinds not encoded here.",
  "$comment": "This inception schema specializes run.started. Other payload kinds retain envelope validation until the separate schema-conformance workstream defines and tests them. Runtime validation owns termverify.key/v1 registry membership, canonical chord structure, modifier ordering, and modified-only base-key rules for input.key.",
  "$defs": {
    "selectorToken": {
      "type": "string",
      "pattern": "^[a-z0-9._-]+$"
    },
    "versionedSelector": {
      "type": "object",
      "required": ["id", "version"],
      "properties": {
        "id": {"$ref": "#/$defs/selectorToken"},
        "version": {"$ref": "#/$defs/selectorToken"}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "applicationSelector": {
      "type": "object",
      "required": ["id", "version", "build"],
      "properties": {
        "id": {"$ref": "#/$defs/selectorToken"},
        "version": {"$ref": "#/$defs/selectorToken"},
        "build": {"$ref": "#/$defs/selectorToken"}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "platformSelector": {
      "type": "object",
      "required": ["os", "architecture"],
      "properties": {
        "os": {"$ref": "#/$defs/selectorToken"},
        "architecture": {"$ref": "#/$defs/selectorToken"}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "replaySubject": {
      "type": "object",
      "required": [
        "format",
        "application",
        "fixture",
        "adapter",
        "normalizer",
        "state_schema"
      ],
      "properties": {
        "format": {"const": "termverify.replay-subject/v1"},
        "application": {"$ref": "#/$defs/applicationSelector"},
        "fixture": {"$ref": "#/$defs/versionedSelector"},
        "adapter": {"$ref": "#/$defs/versionedSelector"},
        "normalizer": {"$ref": "#/$defs/versionedSelector"},
        "state_schema": {"$ref": "#/$defs/versionedSelector"},
        "platform": {"$ref": "#/$defs/platformSelector"}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "clockConfig": {
      "type": "object",
      "required": ["mode", "initial_ms"],
      "properties": {
        "mode": {"const": "manual"},
        "initial_ms": {"type": "integer", "minimum": 0}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "terminalConfig": {
      "type": "object",
      "required": ["columns", "rows", "capabilities"],
      "properties": {
        "columns": {"type": "integer", "minimum": 1},
        "rows": {"type": "integer", "minimum": 1},
        "capabilities": {
          "type": "array",
          "items": {"type": "string", "minLength": 1},
          "uniqueItems": true,
          "$comment": "termverify.transcript additionally requires lexicographic ordering."
        }
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "filesystemConfig": {
      "type": "object",
      "required": ["mode", "root_id"],
      "properties": {
        "mode": {"const": "sandbox"},
        "root_id": {"type": "string", "minLength": 1}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "networkAllowEntry": {
      "type": "object",
      "required": ["host", "port"],
      "properties": {
        "host": {"type": "string", "minLength": 1},
        "port": {"type": "integer", "minimum": 1, "maximum": 65535}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "networkConfig": {
      "oneOf": [
        {
          "type": "object",
          "required": ["mode"],
          "properties": {"mode": {"const": "deny"}},
          "patternProperties": {"^x-": true},
          "additionalProperties": false
        },
        {
          "type": "object",
          "required": ["mode", "allowed"],
          "properties": {
            "mode": {"const": "allow-list"},
            "allowed": {
              "type": "array",
              "items": {"$ref": "#/$defs/networkAllowEntry"},
              "uniqueItems": true,
              "$comment": "termverify.transcript additionally requires host/port ordering and uniqueness projected onto the host/port pair."
            }
          },
          "patternProperties": {"^x-": true},
          "additionalProperties": false
        }
      ]
    },
    "runtimeConfig": {
      "type": "object",
      "required": [
        "seed",
        "clock",
        "locale",
        "timezone",
        "terminal",
        "filesystem",
        "network"
      ],
      "properties": {
        "seed": {
          "type": "string",
          "pattern": "^(?:0|[1-9][0-9]{0,18}|1[0-7][0-9]{18}|18[0-3][0-9]{17}|184[0-3][0-9]{16}|1844[0-5][0-9]{15}|18446[0-6][0-9]{14}|184467[0-3][0-9]{13}|1844674[0-3][0-9]{12}|184467440[0-6][0-9]{10}|1844674407[0-2][0-9]{9}|18446744073[0-6][0-9]{8}|1844674407370[0-8][0-9]{6}|18446744073709[0-4][0-9]{5}|184467440737095[0-4][0-9]{4}|18446744073709550[0-9]{3}|18446744073709551[0-5][0-9]{2}|1844674407370955160[0-9]|1844674407370955161[0-5])$"
        },
        "clock": {"$ref": "#/$defs/clockConfig"},
        "locale": {"type": "string", "minLength": 1},
        "timezone": {
          "type": "string",
          "minLength": 1,
          "$comment": "termverify.transcript runtime validation owns membership in the protocol-bound termverify.timezone/v1 registry."
        },
        "terminal": {"$ref": "#/$defs/terminalConfig"},
        "filesystem": {"$ref": "#/$defs/filesystemConfig"},
        "network": {"$ref": "#/$defs/networkConfig"}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    },
    "runStartedPayload": {
      "type": "object",
      "required": ["config", "subject"],
      "properties": {
        "config": {"$ref": "#/$defs/runtimeConfig"},
        "subject": {"$ref": "#/$defs/replaySubject"}
      },
      "patternProperties": {"^x-": true},
      "additionalProperties": false
    }
  },
  "type": "object",
  "required": ["protocol", "run_id", "seq", "id", "kind", "payload"],
  "properties": {
    "protocol": {"const": "termverify.transcript/v1"},
    "run_id": {"type": "string", "minLength": 1},
    "seq": {"type": "integer", "minimum": 0},
    "id": {"type": "string", "minLength": 1},
    "kind": {"type": "string", "minLength": 1},
    "payload": {"type": "object"}
  },
  "patternProperties": {
    "^x-": true
  },
  "additionalProperties": false,
  "allOf": [
    {
      "if": {
        "properties": {"kind": {"const": "run.started"}},
        "required": ["kind"]
      },
      "then": {
        "properties": {
          "payload": {"$ref": "#/$defs/runStartedPayload"}
        }
      }
    }
  ]
}
