{
  "additionalProperties": false,
  "properties": {
    "assertions": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "code": {
            "pattern": "^[A-Z][A-Z0-9_]+$",
            "type": "string"
          },
          "id": {
            "maxLength": 160,
            "minLength": 1,
            "type": "string"
          },
          "kind": {
            "maxLength": 40,
            "minLength": 1,
            "type": "string"
          },
          "verdict": {
            "enum": [
              "PASS",
              "FAIL",
              "INCONCLUSIVE"
            ]
          }
        },
        "required": [
          "id",
          "kind",
          "verdict",
          "code"
        ],
        "type": "object"
      },
      "maxItems": 84,
      "minItems": 1,
      "type": "array"
    },
    "byteLength": {
      "maximum": 1048576,
      "minimum": 0,
      "type": "integer"
    },
    "contentEncoding": {
      "maxLength": 16384,
      "minLength": 1,
      "type": "string"
    },
    "contentType": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "decodedByteLength": {
      "anyOf": [
        {
          "maximum": 1048576,
          "minimum": 0,
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "evidenceId": {
      "pattern": "^sha256:[a-f0-9]{64}$",
      "type": "string"
    },
    "finalUrl": {
      "maxLength": 2048,
      "minLength": 1,
      "type": "string"
    },
    "hashSemantics": {
      "const": "sha256 of complete HTTP entity bytes before content decoding; excludes transfer framing"
    },
    "observedAt": {
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$",
      "type": "string"
    },
    "observedStatus": {
      "maximum": 599,
      "minimum": 200,
      "type": "integer"
    },
    "rawBodySha256": {
      "pattern": "^[a-f0-9]{64}$",
      "type": "string"
    },
    "receipt": {
      "additionalProperties": false,
      "properties": {
        "format": {
          "const": "pennybot-url-assertions-receipt-v1"
        },
        "payload": {
          "additionalProperties": false,
          "properties": {
            "assertions": {
              "items": {
                "additionalProperties": false,
                "properties": {
                  "code": {
                    "pattern": "^[A-Z][A-Z0-9_]+$",
                    "type": "string"
                  },
                  "id": {
                    "maxLength": 160,
                    "minLength": 1,
                    "type": "string"
                  },
                  "kind": {
                    "maxLength": 40,
                    "minLength": 1,
                    "type": "string"
                  },
                  "verdict": {
                    "enum": [
                      "PASS",
                      "FAIL",
                      "INCONCLUSIVE"
                    ]
                  }
                },
                "required": [
                  "id",
                  "kind",
                  "verdict",
                  "code"
                ],
                "type": "object"
              },
              "maxItems": 84,
              "minItems": 1,
              "type": "array"
            },
            "byteLength": {
              "maximum": 1048576,
              "minimum": 0,
              "type": "integer"
            },
            "contentEncoding": {
              "maxLength": 16384,
              "minLength": 1,
              "type": "string"
            },
            "contentType": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "decodedByteLength": {
              "anyOf": [
                {
                  "maximum": 1048576,
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ]
            },
            "finalUrl": {
              "maxLength": 2048,
              "minLength": 1,
              "type": "string"
            },
            "hashSemantics": {
              "const": "sha256 of complete HTTP entity bytes before content decoding; excludes transfer framing"
            },
            "observedAt": {
              "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$",
              "type": "string"
            },
            "observedStatus": {
              "maximum": 599,
              "minimum": 200,
              "type": "integer"
            },
            "rawBodySha256": {
              "pattern": "^[a-f0-9]{64}$",
              "type": "string"
            },
            "redirects": {
              "items": {
                "additionalProperties": false,
                "properties": {
                  "from": {
                    "maxLength": 2048,
                    "minLength": 1,
                    "type": "string"
                  },
                  "status": {
                    "maximum": 599,
                    "minimum": 200,
                    "type": "integer"
                  },
                  "to": {
                    "maxLength": 2048,
                    "minLength": 1,
                    "type": "string"
                  }
                },
                "required": [
                  "from",
                  "to",
                  "status"
                ],
                "type": "object"
              },
              "maxItems": 3,
              "type": "array"
            },
            "requestSha256": {
              "pattern": "^[a-f0-9]{64}$",
              "type": "string"
            },
            "requestedUrl": {
              "maxLength": 2048,
              "minLength": 1,
              "type": "string"
            },
            "ruleSetVersion": {
              "const": "url-assertions/1.0.0"
            },
            "semanticTruthClaim": {
              "const": false
            },
            "truncated": {
              "const": false
            },
            "unsupported": {
              "type": "boolean"
            },
            "unsupportedReasons": {
              "items": {
                "maxLength": 64,
                "minLength": 1,
                "type": "string"
              },
              "maxItems": 5,
              "type": "array"
            },
            "verdict": {
              "enum": [
                "PASS",
                "FAIL",
                "INCONCLUSIVE"
              ]
            }
          },
          "required": [
            "ruleSetVersion",
            "verdict",
            "assertions",
            "requestedUrl",
            "finalUrl",
            "redirects",
            "observedStatus",
            "contentType",
            "contentEncoding",
            "byteLength",
            "decodedByteLength",
            "rawBodySha256",
            "observedAt",
            "truncated",
            "unsupported",
            "unsupportedReasons",
            "requestSha256",
            "hashSemantics",
            "semanticTruthClaim"
          ],
          "type": "object"
        },
        "serialization": {
          "const": "sorted-key-json-v1"
        },
        "signature": {
          "type": "null"
        }
      },
      "required": [
        "format",
        "serialization",
        "signature",
        "payload"
      ],
      "type": "object"
    },
    "redirects": {
      "items": {
        "additionalProperties": false,
        "properties": {
          "from": {
            "maxLength": 2048,
            "minLength": 1,
            "type": "string"
          },
          "status": {
            "maximum": 599,
            "minimum": 200,
            "type": "integer"
          },
          "to": {
            "maxLength": 2048,
            "minLength": 1,
            "type": "string"
          }
        },
        "required": [
          "from",
          "to",
          "status"
        ],
        "type": "object"
      },
      "maxItems": 3,
      "type": "array"
    },
    "requestSha256": {
      "pattern": "^[a-f0-9]{64}$",
      "type": "string"
    },
    "requestedUrl": {
      "maxLength": 2048,
      "minLength": 1,
      "type": "string"
    },
    "ruleSetVersion": {
      "const": "url-assertions/1.0.0"
    },
    "semanticTruthClaim": {
      "const": false
    },
    "truncated": {
      "const": false
    },
    "unsupported": {
      "type": "boolean"
    },
    "unsupportedReasons": {
      "items": {
        "maxLength": 64,
        "minLength": 1,
        "type": "string"
      },
      "maxItems": 5,
      "type": "array"
    },
    "verdict": {
      "enum": [
        "PASS",
        "FAIL",
        "INCONCLUSIVE"
      ]
    }
  },
  "required": [
    "ruleSetVersion",
    "verdict",
    "assertions",
    "requestedUrl",
    "finalUrl",
    "redirects",
    "observedStatus",
    "contentType",
    "contentEncoding",
    "byteLength",
    "decodedByteLength",
    "rawBodySha256",
    "observedAt",
    "truncated",
    "unsupported",
    "unsupportedReasons",
    "requestSha256",
    "hashSemantics",
    "semanticTruthClaim",
    "evidenceId",
    "receipt"
  ],
  "type": "object"
}
