{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://law.arxo.io/schema/serve-envelope.schema.json",
  "title": "law serve HTTP envelopes 0.1",
  "description": "Host transport of the serve API. The evaluation document is embedded unchanged; this schema does not redefine its semantics.",
  "$comment": "DECISION-0369",
  "oneOf": [
    {"$ref": "#/$defs/AskRequest"},
    {"$ref": "#/$defs/Answer"},
    {"$ref": "#/$defs/Refusal"},
    {"$ref": "#/$defs/World"}
  ],
  "$defs": {
    "Digest": {"type": "string", "pattern": "^sha256:[0-9a-f]{64}$"},
    "Pin": {
      "type": "object",
      "additionalProperties": false,
      "required": ["world", "resolutionHash"],
      "properties": {
        "world": {"type": "string", "minLength": 1},
        "resolutionHash": {"$ref": "#/$defs/Digest"}
      }
    },
    "RequestPin": {
      "description": "The supplied pin may differ from the world; a mismatch is a journalled refusal.",
      "type": "object",
      "additionalProperties": false,
      "required": ["world", "resolutionHash"],
      "properties": {
        "world": {"type": "string", "minLength": 1},
        "resolutionHash": {"type": "string", "minLength": 1}
      }
    },
    "AskRequest": {
      "type": "object",
      "additionalProperties": false,
      "required": ["pin"],
      "properties": {
        "pin": {"$ref": "#/$defs/RequestPin"},
        "case": {
          "oneOf": [
            {"type": "string", "minLength": 1},
            {"$ref": "evaluation-request.schema.json#/$defs/Case"}
          ]
        },
        "facts": {
          "type": "array",
          "items": {"$ref": "evaluation-request.schema.json#/$defs/FactInput"}
        },
        "context": {"type": "object"},
        "options": {"$ref": "evaluation-request.schema.json#/$defs/EvaluationOptions"},
        "evidence": {"type": "array", "items": {"$ref": "legal-ir.schema.json#/$defs/EvidenceItem"}},
        "supportEdges": {"type": "array", "items": {"$ref": "legal-ir.schema.json#/$defs/SupportEdge"}},
        "evidencePolicy": {"type": "string", "minLength": 1},
        "query": {"$ref": "query.schema.json"},
        "evaluate": {"type": "string", "minLength": 1},
        "queryId": {"type": "string", "minLength": 1},
        "proof": {"enum": ["full", "omit"]}
      },
      "allOf": [
        {"oneOf": [{"required": ["case"]}, {"required": ["facts"]}]},
        {"oneOf": [{"required": ["query"]}, {"required": ["evaluate", "queryId"]}]},
        {"not": {"required": ["query", "evaluate"]}},
        {"if": {"required": ["case"], "properties": {"case": {"type": "object"}}},
         "then": {"required": ["query"]}},
        {"if": {"required": ["facts"]},
         "then": {"required": ["context", "options", "query"]},
         "else": {"not": {"anyOf": [
           {"required": ["context"]}, {"required": ["options"]},
           {"required": ["evidence"]}, {"required": ["supportEdges"]},
           {"required": ["evidencePolicy"]}
         ]}}}
      ]
    },
    "Answer": {
      "type": "object",
      "additionalProperties": false,
      "required": ["pin", "programHash", "proofMode", "requestHash", "outcomeHash"],
      "properties": {
        "decisionId": {"type": "string", "minLength": 1},
        "pin": {"$ref": "#/$defs/Pin"},
        "programHash": {"$ref": "#/$defs/Digest"},
        "proofMode": {"enum": ["full", "omitted"]},
        "requestHash": {"$ref": "#/$defs/Digest"},
        "outcomeHash": {"$ref": "#/$defs/Digest"},
        "resultHash": {"$ref": "#/$defs/Digest"},
        "document": {"$ref": "evaluation.schema.json"},
        "outcome": {"type": "object"}
      },
      "oneOf": [
        {"required": ["document", "resultHash"], "properties": {"proofMode": {"const": "full"}}, "not": {"required": ["outcome"]}},
        {"required": ["outcome"], "properties": {"proofMode": {"const": "omitted"}}, "not": {"required": ["resultHash"]}}
      ]
    },
    "Refusal": {
      "type": "object",
      "additionalProperties": false,
      "required": ["error"],
      "properties": {
        "error": {
          "type": "object",
          "additionalProperties": false,
          "required": ["code", "message"],
          "properties": {
            "code": {"type": "string", "minLength": 1},
            "message": {"type": "string"}
          }
        }
      }
    },
    "World": {
      "type": "object",
      "additionalProperties": false,
      "required": ["pin", "programHash"],
      "properties": {
        "pin": {"$ref": "#/$defs/Pin"},
        "programHash": {"$ref": "#/$defs/Digest"}
      }
    }
  }
}
