{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://law.arxo.io/schema/decision-record.schema.json",
  "title": "law serve decision record 0.1",
  "description": "Append-only host record. `recordHash` covers the canonical bytes excluding `recordHash` and timing; `executionReceipt` carries its own receipt hash. Hash verification is performed by the journal reader.",
  "$comment": "DECISION-0369 R9-R10",
  "type": "object",
  "additionalProperties": false,
  "required": ["schemaVersion", "decisionId", "sequence", "attempt", "world", "engine", "request", "outcome", "executionReceipt", "recordHash", "timing"],
  "properties": {
    "schemaVersion": {"const": "law.serve.decision-record/0.1"},
    "decisionId": {"type": "string", "minLength": 1},
    "sequence": {"type": "integer", "minimum": 1},
    "attempt": {"type": "integer", "minimum": 1},
    "idempotencyKey": {"type": "string", "minLength": 1},
    "world": {
      "type": "object",
      "additionalProperties": false,
      "required": ["pin", "programHash"],
      "properties": {
        "pin": {"$ref": "serve-envelope.schema.json#/$defs/Pin"},
        "programHash": {"$ref": "#/$defs/Digest"}
      }
    },
    "engine": {
      "type": "object",
      "additionalProperties": false,
      "required": ["host", "version", "binaryDigest"],
      "properties": {
        "host": {"const": "law-serve-core"},
        "version": {"type": "string", "minLength": 1},
        "binaryDigest": {"$ref": "#/$defs/Digest"}
      }
    },
    "request": {
      "type": "object",
      "additionalProperties": false,
      "required": ["envelope", "requestHash", "admission"],
      "properties": {
        "envelope": {
          "oneOf": [
            {"$ref": "#/$defs/ParsedHttpEnvelope"},
            {"$ref": "#/$defs/CheckFileEnvelope"}
          ]
        },
        "requestHash": {"$ref": "#/$defs/Digest"},
        "admission": {
          "type": "object",
          "additionalProperties": false,
          "required": ["maxAssertions"],
          "properties": {"maxAssertions": {"type": "integer", "minimum": 0}, "maxResponse": {"type": "integer", "minimum": 0}}
        },
        "wire": {
          "description": "EvaluationRequest without ir, preserved for replay; semantic validation uses the pinned world.",
          "type": "object",
          "required": ["case", "query"],
          "not": {"required": ["ir"]}
        }
      }
    },
    "outcome": {
      "oneOf": [{"$ref": "#/$defs/DocumentOutcome"}, {"$ref": "#/$defs/RefusalOutcome"}]
    },
    "executionReceipt": {"$ref": "evaluation.schema.json#/$defs/ExecutionReceipt"},
    "recordHash": {"$ref": "#/$defs/Digest"},
    "timing": {
      "type": "object",
      "additionalProperties": false,
      "required": ["receivedAt", "completedAt"],
      "properties": {
        "receivedAt": {"$ref": "evaluation.schema.json#/$defs/Instant"},
        "completedAt": {"$ref": "evaluation.schema.json#/$defs/Instant"}
      }
    }
  },
  "$defs": {
    "Digest": {"type": "string", "pattern": "^sha256:[0-9a-f]{64}$"},
    "ParsedHttpEnvelope": {
      "description": "The exact parsed HTTP request, including a question that may later be refused by preparation.",
      "type": "object",
      "additionalProperties": false,
      "required": ["pin", "case"],
      "properties": {
        "pin": {"$ref": "serve-envelope.schema.json#/$defs/RequestPin"},
        "case": {"type": "string", "minLength": 1},
        "query": {"type": "object"},
        "evaluate": {"type": "string"},
        "queryId": {"type": "string", "minLength": 1},
        "proof": {"enum": ["full", "omit"]}
      },
      "oneOf": [{"required": ["query"]}, {"required": ["evaluate", "queryId"]}]
    },
    "CheckFileEnvelope": {
      "type": "object",
      "additionalProperties": false,
      "required": ["source", "row", "case", "templateHash", "caseSource", "input", "queryId", "question"],
      "properties": {
        "source": {"const": "check-file"},
        "row": {"type": "integer", "minimum": 1},
        "case": {"type": "string"},
        "templateHash": {"$ref": "#/$defs/Digest"},
        "caseSource": {"type": ["string", "null"]},
        "input": {"type": "object", "additionalProperties": {"type": "string"}},
        "queryId": {"type": "string", "minLength": 1},
        "question": {
          "type": "object",
          "additionalProperties": false,
          "oneOf": [
            {"required": ["query"], "properties": {"query": {"type": "object"}}},
            {"required": ["evaluate"], "properties": {"evaluate": {"type": "string"}}}
          ]
        }
      }
    },
    "DocumentOutcome": {
      "type": "object",
      "additionalProperties": false,
      "required": ["kind", "proofMode", "outcomeHash", "caseHash", "results"],
      "properties": {
        "kind": {"const": "document"},
        "proofMode": {"enum": ["full", "omitted"]},
        "outcomeHash": {"$ref": "#/$defs/Digest"},
        "resultHash": {"$ref": "#/$defs/Digest"},
        "caseHash": {"$ref": "#/$defs/Digest"},
        "legalTime": {"$ref": "evaluation.schema.json#/$defs/LegalTime"},
        "results": {"type": "array", "items": {"type": "object"}}
      },
      "oneOf": [
        {"required": ["resultHash"], "properties": {"proofMode": {"const": "full"}}},
        {"properties": {"proofMode": {"const": "omitted"}}, "not": {"required": ["resultHash"]}}
      ]
    },
    "RefusalOutcome": {
      "type": "object",
      "additionalProperties": false,
      "required": ["kind", "error"],
      "properties": {
        "kind": {"const": "refusal"},
        "error": {
          "type": "object",
          "additionalProperties": false,
          "required": ["code", "message", "status"],
          "properties": {
            "code": {"type": "string", "minLength": 1},
            "message": {"type": "string"},
            "status": {"type": "integer", "minimum": 400, "maximum": 599}
          }
        }
      }
    }
  }
}
