{
  "additionalProperties": false,
  "properties": {
    "evidence": {
      "additionalProperties": false,
      "properties": {
        "code": {
          "maxLength": 64,
          "minLength": 1,
          "type": "string"
        },
        "document": {
          "anyOf": [
            {
              "additionalProperties": false,
              "properties": {
                "bytes": {
                  "maximum": 2097152,
                  "minimum": 0,
                  "type": "integer"
                },
                "metadata": {
                  "additionalProperties": false,
                  "properties": {
                    "Author": {
                      "maxLength": 512,
                      "minLength": 0,
                      "type": "string"
                    },
                    "CreationDate": {
                      "maxLength": 512,
                      "minLength": 0,
                      "type": "string"
                    },
                    "Creator": {
                      "maxLength": 512,
                      "minLength": 0,
                      "type": "string"
                    },
                    "ModDate": {
                      "maxLength": 512,
                      "minLength": 0,
                      "type": "string"
                    },
                    "Producer": {
                      "maxLength": 512,
                      "minLength": 0,
                      "type": "string"
                    },
                    "Subject": {
                      "maxLength": 512,
                      "minLength": 0,
                      "type": "string"
                    },
                    "Title": {
                      "maxLength": 512,
                      "minLength": 0,
                      "type": "string"
                    }
                  },
                  "required": [],
                  "type": "object"
                },
                "pageCount": {
                  "anyOf": [
                    {
                      "maximum": 25,
                      "minimum": 1,
                      "type": "integer"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sha256": {
                  "pattern": "^[a-f0-9]{64}$",
                  "type": "string"
                }
              },
              "required": [
                "sha256",
                "bytes",
                "pageCount",
                "metadata"
              ],
              "type": "object"
            },
            {
              "type": "null"
            }
          ]
        },
        "ignoredActiveContent": {
          "type": "boolean"
        },
        "pages": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "end": {
                "maximum": 32000,
                "minimum": 0,
                "type": "integer"
              },
              "pageNumber": {
                "maximum": 25,
                "minimum": 1,
                "type": "integer"
              },
              "reference": {
                "maxLength": 300,
                "minLength": 1,
                "type": "string"
              },
              "start": {
                "const": 0
              },
              "text": {
                "maxLength": 32000,
                "minLength": 0,
                "type": "string"
              },
              "textSha256": {
                "pattern": "^[a-f0-9]{64}$",
                "type": "string"
              },
              "warnings": {
                "items": {
                  "maxLength": 64,
                  "minLength": 1,
                  "type": "string"
                },
                "maxItems": 8,
                "type": "array"
              }
            },
            "required": [
              "pageNumber",
              "text",
              "textSha256",
              "start",
              "end",
              "reference",
              "warnings"
            ],
            "type": "object"
          },
          "maxItems": 25,
          "type": "array"
        },
        "parser": {
          "additionalProperties": false,
          "properties": {
            "cpuSeconds": {
              "const": 4
            },
            "isolation": {
              "anyOf": [
                {
                  "enum": [
                    "windows-job-object",
                    "posix-rlimit"
                  ]
                },
                {
                  "type": "null"
                }
              ]
            },
            "memoryBytes": {
              "const": 201326592
            },
            "name": {
              "const": "pypdf"
            },
            "version": {
              "const": "6.1.1"
            },
            "wallMs": {
              "const": 5500
            }
          },
          "required": [
            "name",
            "version",
            "isolation",
            "memoryBytes",
            "cpuSeconds",
            "wallMs"
          ],
          "type": "object"
        },
        "quotes": {
          "items": {
            "additionalProperties": false,
            "properties": {
              "matches": {
                "items": {
                  "additionalProperties": false,
                  "properties": {
                    "end": {
                      "maximum": 32000,
                      "minimum": 0,
                      "type": "integer"
                    },
                    "pageNumber": {
                      "maximum": 25,
                      "minimum": 1,
                      "type": "integer"
                    },
                    "reference": {
                      "maxLength": 300,
                      "minLength": 1,
                      "type": "string"
                    },
                    "start": {
                      "maximum": 32000,
                      "minimum": 0,
                      "type": "integer"
                    }
                  },
                  "required": [
                    "pageNumber",
                    "start",
                    "end",
                    "reference"
                  ],
                  "type": "object"
                },
                "maxItems": 256,
                "type": "array"
              },
              "quote": {
                "maxLength": 512,
                "minLength": 1,
                "type": "string"
              },
              "verdict": {
                "enum": [
                  "PASS",
                  "FAIL",
                  "INCONCLUSIVE"
                ]
              }
            },
            "required": [
              "quote",
              "verdict",
              "matches"
            ],
            "type": "object"
          },
          "maxItems": 16,
          "type": "array"
        },
        "requestSha256": {
          "pattern": "^[a-f0-9]{64}$",
          "type": "string"
        },
        "ruleSet": {
          "const": "pdf-citation-evidence/1.0.0+pypdf-6.1.1"
        },
        "selectedPages": {
          "items": {
            "maximum": 25,
            "minimum": 1,
            "type": "integer"
          },
          "maxItems": 25,
          "type": "array"
        },
        "semantics": {
          "additionalProperties": false,
          "properties": {
            "documentSha256": {
              "const": "sha256 of complete PDF bytes after HTTP Content-Encoding decoding; uploads use exact supplied bytes"
            },
            "evidenceId": {
              "const": "sha256 of sorted-key-json-v1 evidence object; timestamps excluded; parser version and request hash included"
            },
            "extraction": {
              "const": "pypdf plain content-stream order; hidden text may be included; no OCR, layout, visual, truth or legal attestation"
            },
            "httpSha256": {
              "const": "sha256 of complete final HTTP entity before Content-Encoding decoding; excludes headers and HTTP transfer framing"
            },
            "offsets": {
              "const": "zero-based Unicode code points in returned page text; half-open [start,end); no Unicode or whitespace normalization"
            },
            "pageSha256": {
              "const": "sha256 of UTF-8 extracted page text after CRLF/CR to LF only; not a hash of serialized page objects or appearance"
            }
          },
          "required": [
            "documentSha256",
            "pageSha256",
            "offsets",
            "extraction",
            "httpSha256",
            "evidenceId"
          ],
          "type": "object"
        },
        "source": {
          "additionalProperties": false,
          "properties": {
            "contentEncoding": {
              "anyOf": [
                {
                  "maxLength": 100,
                  "minLength": 0,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "contentType": {
              "anyOf": [
                {
                  "maxLength": 200,
                  "minLength": 0,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "finalUrl": {
              "anyOf": [
                {
                  "maxLength": 2048,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "httpStatus": {
              "anyOf": [
                {
                  "maximum": 599,
                  "minimum": 200,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ]
            },
            "mode": {
              "enum": [
                "upload",
                "url"
              ]
            },
            "rawBodySha256": {
              "anyOf": [
                {
                  "pattern": "^[a-f0-9]{64}$",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "rawBytes": {
              "anyOf": [
                {
                  "maximum": 2097152,
                  "minimum": 0,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ]
            },
            "redirects": {
              "items": {
                "additionalProperties": false,
                "properties": {
                  "from": {
                    "maxLength": 2048,
                    "minLength": 1,
                    "type": "string"
                  },
                  "status": {
                    "maximum": 308,
                    "minimum": 301,
                    "type": "integer"
                  },
                  "to": {
                    "maxLength": 2048,
                    "minLength": 1,
                    "type": "string"
                  }
                },
                "required": [
                  "from",
                  "to",
                  "status"
                ],
                "type": "object"
              },
              "maxItems": 3,
              "type": "array"
            },
            "requestedUrl": {
              "anyOf": [
                {
                  "maxLength": 2048,
                  "minLength": 1,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [
            "mode",
            "requestedUrl",
            "finalUrl",
            "httpStatus",
            "rawBodySha256",
            "rawBytes",
            "contentEncoding",
            "contentType",
            "redirects"
          ],
          "type": "object"
        },
        "verdict": {
          "enum": [
            "PASS",
            "FAIL",
            "INCONCLUSIVE"
          ]
        },
        "warnings": {
          "items": {
            "maxLength": 64,
            "minLength": 1,
            "type": "string"
          },
          "maxItems": 16,
          "type": "array"
        }
      },
      "required": [
        "ruleSet",
        "requestSha256",
        "verdict",
        "code",
        "document",
        "source",
        "pages",
        "quotes",
        "selectedPages",
        "warnings",
        "ignoredActiveContent",
        "semantics",
        "parser"
      ],
      "type": "object"
    },
    "evidenceId": {
      "pattern": "^sha256:[a-f0-9]{64}$",
      "type": "string"
    },
    "fetchedAt": {
      "anyOf": [
        {
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$",
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "observedAt": {
      "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$",
      "type": "string"
    },
    "receipt": {
      "additionalProperties": false,
      "properties": {
        "payloadSha256": {
          "pattern": "^[a-f0-9]{64}$",
          "type": "string"
        },
        "serialization": {
          "const": "sorted-key-json-v1"
        },
        "signature": {
          "type": "null"
        }
      },
      "required": [
        "serialization",
        "payloadSha256",
        "signature"
      ],
      "type": "object"
    },
    "schemaVersion": {
      "const": "1.0"
    }
  },
  "required": [
    "schemaVersion",
    "evidence",
    "evidenceId",
    "observedAt",
    "fetchedAt",
    "receipt"
  ],
  "type": "object",
  "title": "PDF Text Extraction, Page Citations & Quote Matching — output"
}
