{
  "corpus_version": "1.0.0",
  "mode": "offline controlled fixtures; real extraction and matching handlers",
  "fixture_manifest": [
    {
      "path": "/article.html",
      "content_type": "text/html; charset=utf-8",
      "bytes": 1080,
      "sha256": "c83ed374b1cced8b22db978c271f19490e86cf3d4a3408cc00955aa16efe1213"
    },
    {
      "path": "/layout-v1.pdf",
      "content_type": "application/pdf",
      "bytes": 2134,
      "sha256": "53e3b6fd379c98fbe572ab0afd90daa28e1e47e29db3cef14140835f8cd2e4de"
    },
    {
      "path": "/long.txt",
      "content_type": "text/plain; charset=utf-8",
      "bytes": 115249,
      "sha256": "51571cf7def028e293e059e7339bb53394e388fb3f8ee9d4f62209adc55e300c"
    },
    {
      "path": "/whitespace.txt",
      "content_type": "text/plain; charset=utf-8",
      "bytes": 46,
      "sha256": "615bd7e8259dac63a05913e313e8395ed14b1a9d266444c297fdefc12b6318c9"
    }
  ],
  "total": 14,
  "passed": 14,
  "results": [
    {
      "id": "unicode-exact",
      "label": "Unicode punctuation and emoji offsets",
      "input": {
        "citations": [
          {
            "id": "unicode-exact",
            "url": "https://corpus.example.org/article.html",
            "quote": "The researcher wrote “café”—not “cafe”."
          }
        ]
      },
      "expected": {
        "id": "unicode-exact",
        "label": "Unicode punctuation and emoji offsets",
        "path": "/article.html",
        "quote": "The researcher wrote “café”—not “cafe”.",
        "status": "exact_match",
        "matched": true,
        "passage": "The researcher wrote “café”—not “cafe”."
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/article.html",
        "id": "unicode-exact",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/article.html",
        "final_url": "https://corpus.example.org/article.html",
        "redirected": false,
        "redirects": [],
        "content_type": "text/html",
        "title": "Extraction field report",
        "source_sha256": "c83ed374b1cced8b22db978c271f19490e86cf3d4a3408cc00955aa16efe1213",
        "source_bytes": 1080,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The researcher wrote “café”—not “cafe”.",
        "quote_check": {
          "status": "exact_match",
          "matched": true,
          "match_counts": {
            "total": 1,
            "exact": 1,
            "normalized": 0
          },
          "matches": [
            {
              "kind": "exact_match",
              "text": "The researcher wrote “café”—not “cafe”.",
              "start": 201,
              "end": 240,
              "utf16_start": 202,
              "utf16_end": 241,
              "line_start": 5,
              "line_end": 5,
              "before": "nary article text, tables, punctuation, and quotations. It is a test document and makes no claim about a real study.\n\n🧭 ",
              "after": "\n\nThe primary group recorded 24 samples across three sessions. These values are invented to test whether a changed numbe"
            }
          ],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "03b5aa3a9a96f15fada2cfa15fb4be60f03d1a2559b1227238aaeb17e4485a53",
          "source_truncated": false,
          "source": {
            "representation": "extracted_html_text",
            "characters": 566,
            "full_characters": 566
          },
          "warnings": []
        }
      }
    },
    {
      "id": "unicode-changed",
      "label": "Straight quotes differ from curly quotes",
      "input": {
        "citations": [
          {
            "id": "unicode-changed",
            "url": "https://corpus.example.org/article.html",
            "quote": "The researcher wrote \"café\"—not \"cafe\"."
          }
        ]
      },
      "expected": {
        "id": "unicode-changed",
        "label": "Straight quotes differ from curly quotes",
        "path": "/article.html",
        "quote": "The researcher wrote \"café\"—not \"cafe\".",
        "status": "not_found",
        "matched": false
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/article.html",
        "id": "unicode-changed",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/article.html",
        "final_url": "https://corpus.example.org/article.html",
        "redirected": false,
        "redirects": [],
        "content_type": "text/html",
        "title": "Extraction field report",
        "source_sha256": "c83ed374b1cced8b22db978c271f19490e86cf3d4a3408cc00955aa16efe1213",
        "source_bytes": 1080,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The researcher wrote \"café\"—not \"cafe\".",
        "quote_check": {
          "status": "not_found",
          "matched": false,
          "match_counts": {
            "total": 0,
            "exact": 0,
            "normalized": 0
          },
          "matches": [],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "03b5aa3a9a96f15fada2cfa15fb4be60f03d1a2559b1227238aaeb17e4485a53",
          "source_truncated": false,
          "source": {
            "representation": "extracted_html_text",
            "characters": 566,
            "full_characters": 566
          },
          "warnings": []
        }
      }
    },
    {
      "id": "number-changed",
      "label": "Changed count in article text",
      "input": {
        "citations": [
          {
            "id": "number-changed",
            "url": "https://corpus.example.org/article.html",
            "quote": "The primary group recorded 25 samples"
          }
        ]
      },
      "expected": {
        "id": "number-changed",
        "label": "Changed count in article text",
        "path": "/article.html",
        "quote": "The primary group recorded 25 samples",
        "status": "not_found",
        "matched": false
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/article.html",
        "id": "number-changed",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/article.html",
        "final_url": "https://corpus.example.org/article.html",
        "redirected": false,
        "redirects": [],
        "content_type": "text/html",
        "title": "Extraction field report",
        "source_sha256": "c83ed374b1cced8b22db978c271f19490e86cf3d4a3408cc00955aa16efe1213",
        "source_bytes": 1080,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The primary group recorded 25 samples",
        "quote_check": {
          "status": "not_found",
          "matched": false,
          "match_counts": {
            "total": 0,
            "exact": 0,
            "normalized": 0
          },
          "matches": [],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "03b5aa3a9a96f15fada2cfa15fb4be60f03d1a2559b1227238aaeb17e4485a53",
          "source_truncated": false,
          "source": {
            "representation": "extracted_html_text",
            "characters": 566,
            "full_characters": 566
          },
          "warnings": []
        }
      }
    },
    {
      "id": "navigation-excluded",
      "label": "Navigation is not article evidence",
      "input": {
        "citations": [
          {
            "id": "navigation-excluded",
            "url": "https://corpus.example.org/article.html",
            "quote": "Navigation says the trial succeeded."
          }
        ]
      },
      "expected": {
        "id": "navigation-excluded",
        "label": "Navigation is not article evidence",
        "path": "/article.html",
        "quote": "Navigation says the trial succeeded.",
        "status": "not_found",
        "matched": false
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/article.html",
        "id": "navigation-excluded",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/article.html",
        "final_url": "https://corpus.example.org/article.html",
        "redirected": false,
        "redirects": [],
        "content_type": "text/html",
        "title": "Extraction field report",
        "source_sha256": "c83ed374b1cced8b22db978c271f19490e86cf3d4a3408cc00955aa16efe1213",
        "source_bytes": 1080,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "Navigation says the trial succeeded.",
        "quote_check": {
          "status": "not_found",
          "matched": false,
          "match_counts": {
            "total": 0,
            "exact": 0,
            "normalized": 0
          },
          "matches": [],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "03b5aa3a9a96f15fada2cfa15fb4be60f03d1a2559b1227238aaeb17e4485a53",
          "source_truncated": false,
          "source": {
            "representation": "extracted_html_text",
            "characters": 566,
            "full_characters": 566
          },
          "warnings": []
        }
      }
    },
    {
      "id": "html-table",
      "label": "A row extracted from an HTML table",
      "input": {
        "citations": [
          {
            "id": "html-table",
            "url": "https://corpus.example.org/article.html",
            "quote": "Primary 24 18 ms"
          }
        ]
      },
      "expected": {
        "id": "html-table",
        "label": "A row extracted from an HTML table",
        "path": "/article.html",
        "quote": "Primary 24 18 ms",
        "status": "normalized_match",
        "matched": true
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/article.html",
        "id": "html-table",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/article.html",
        "final_url": "https://corpus.example.org/article.html",
        "redirected": false,
        "redirects": [],
        "content_type": "text/html",
        "title": "Extraction field report",
        "source_sha256": "c83ed374b1cced8b22db978c271f19490e86cf3d4a3408cc00955aa16efe1213",
        "source_bytes": 1080,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "Primary 24 18 ms",
        "quote_check": {
          "status": "normalized_match",
          "matched": true,
          "match_counts": {
            "total": 1,
            "exact": 0,
            "normalized": 1
          },
          "matches": [
            {
              "kind": "normalized_match",
              "text": "Primary\n\n24\n\n18 ms",
              "start": 459,
              "end": 477,
              "utf16_start": 460,
              "utf16_end": 478,
              "line_start": 19,
              "line_end": 23,
              "before": "ether a changed number can be distinguished from the source wording.\n\nControlled observations\n\nGroup\n\nSamples\n\nDelay\n\n\n\n",
              "after": "\n\n\n\nControl\n\n19\n\n21 ms\n\n\n\nSeparate\n   whitespace remains visible in the original passage."
            }
          ],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "03b5aa3a9a96f15fada2cfa15fb4be60f03d1a2559b1227238aaeb17e4485a53",
          "source_truncated": false,
          "source": {
            "representation": "extracted_html_text",
            "characters": 566,
            "full_characters": 566
          },
          "warnings": []
        }
      }
    },
    {
      "id": "whitespace",
      "label": "Line breaks normalize but the passage is preserved",
      "input": {
        "citations": [
          {
            "id": "whitespace",
            "url": "https://corpus.example.org/whitespace.txt",
            "quote": "The measured value is 42."
          }
        ]
      },
      "expected": {
        "id": "whitespace",
        "label": "Line breaks normalize but the passage is preserved",
        "path": "/whitespace.txt",
        "quote": "The measured value is 42.",
        "status": "normalized_match",
        "matched": true,
        "passage": "The measured\n  value is 42."
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/whitespace.txt",
        "id": "whitespace",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/whitespace.txt",
        "final_url": "https://corpus.example.org/whitespace.txt",
        "redirected": false,
        "redirects": [],
        "content_type": "text/plain",
        "title": "whitespace.txt",
        "source_sha256": "615bd7e8259dac63a05913e313e8395ed14b1a9d266444c297fdefc12b6318c9",
        "source_bytes": 46,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The measured value is 42.",
        "quote_check": {
          "status": "normalized_match",
          "matched": true,
          "match_counts": {
            "total": 1,
            "exact": 0,
            "normalized": 1
          },
          "matches": [
            {
              "kind": "normalized_match",
              "text": "The measured\n  value is 42.",
              "start": 10,
              "end": 37,
              "utf16_start": 11,
              "utf16_end": 38,
              "line_start": 2,
              "line_end": 3,
              "before": "🧭 Start.\r\n",
              "after": "\r\nEnd."
            }
          ],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "615bd7e8259dac63a05913e313e8395ed14b1a9d266444c297fdefc12b6318c9",
          "source_truncated": false,
          "source": {
            "representation": "literal_text",
            "characters": 43,
            "full_characters": 43
          },
          "warnings": []
        }
      }
    },
    {
      "id": "pdf-left",
      "label": "Left PDF column, page 1",
      "input": {
        "citations": [
          {
            "id": "pdf-left",
            "url": "https://corpus.example.org/layout-v1.pdf",
            "quote": "The left column reports 24 samples."
          }
        ]
      },
      "expected": {
        "id": "pdf-left",
        "label": "Left PDF column, page 1",
        "path": "/layout-v1.pdf",
        "quote": "The left column reports 24 samples.",
        "status": "exact_match",
        "matched": true,
        "page": 1
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/layout-v1.pdf",
        "id": "pdf-left",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/layout-v1.pdf",
        "final_url": "https://corpus.example.org/layout-v1.pdf",
        "redirected": false,
        "redirects": [],
        "content_type": "application/pdf",
        "title": "layout-v1.pdf",
        "source_sha256": "53e3b6fd379c98fbe572ab0afd90daa28e1e47e29db3cef14140835f8cd2e4de",
        "source_bytes": 2134,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The left column reports 24 samples.",
        "quote_check": {
          "status": "exact_match",
          "matched": true,
          "match_counts": {
            "total": 1,
            "exact": 1,
            "normalized": 0
          },
          "matches": [
            {
              "kind": "exact_match",
              "text": "The left column reports 24 samples.",
              "start": 93,
              "end": 128,
              "utf16_start": 93,
              "utf16_end": 128,
              "line_start": 4,
              "line_end": 4,
              "page_start": 1,
              "page_end": 1,
              "before": "Source extraction field report\nBOZOS controlled fixture - fictional data - CC0\nPrimary group\n",
              "after": "\nThe observed delay was 18 milliseconds.\nThis column is written before the right one.\nControl group\nThe control group co"
            }
          ],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "pages": "page_start/page_end are one-based PDF page numbers",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "80c4fe2a43eecc8d18d5b206fcd4b95c6423bfc96cee79ed8d9aaf0119aaef46",
          "source_truncated": false,
          "source": {
            "representation": "pdf_text_layer",
            "characters": 615,
            "full_characters": 615
          },
          "warnings": [
            "PDF text comes from the file's text layer. Reading order, columns, ligatures, and hyphenated line breaks may differ from the printed page."
          ]
        }
      }
    },
    {
      "id": "pdf-right",
      "label": "Right PDF column, page 1",
      "input": {
        "citations": [
          {
            "id": "pdf-right",
            "url": "https://corpus.example.org/layout-v1.pdf",
            "quote": "The control group contains 19 samples."
          }
        ]
      },
      "expected": {
        "id": "pdf-right",
        "label": "Right PDF column, page 1",
        "path": "/layout-v1.pdf",
        "quote": "The control group contains 19 samples.",
        "status": "exact_match",
        "matched": true,
        "page": 1
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/layout-v1.pdf",
        "id": "pdf-right",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/layout-v1.pdf",
        "final_url": "https://corpus.example.org/layout-v1.pdf",
        "redirected": false,
        "redirects": [],
        "content_type": "application/pdf",
        "title": "layout-v1.pdf",
        "source_sha256": "53e3b6fd379c98fbe572ab0afd90daa28e1e47e29db3cef14140835f8cd2e4de",
        "source_bytes": 2134,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The control group contains 19 samples.",
        "quote_check": {
          "status": "exact_match",
          "matched": true,
          "match_counts": {
            "total": 1,
            "exact": 1,
            "normalized": 0
          },
          "matches": [
            {
              "kind": "exact_match",
              "text": "The control group contains 19 samples.",
              "start": 228,
              "end": 266,
              "utf16_start": 228,
              "utf16_end": 266,
              "line_start": 8,
              "line_end": 8,
              "page_start": 1,
              "page_end": 1,
              "before": " reports 24 samples.\nThe observed delay was 18 milliseconds.\nThis column is written before the right one.\nControl group\n",
              "after": "\nThe recorded delay was 21 milliseconds.\nNeither column describes a real experiment.\nPage 1 - two independently position"
            }
          ],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "pages": "page_start/page_end are one-based PDF page numbers",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "80c4fe2a43eecc8d18d5b206fcd4b95c6423bfc96cee79ed8d9aaf0119aaef46",
          "source_truncated": false,
          "source": {
            "representation": "pdf_text_layer",
            "characters": 615,
            "full_characters": 615
          },
          "warnings": [
            "PDF text comes from the file's text layer. Reading order, columns, ligatures, and hyphenated line breaks may differ from the printed page."
          ]
        }
      }
    },
    {
      "id": "pdf-table",
      "label": "PDF table cells, page 2",
      "input": {
        "citations": [
          {
            "id": "pdf-table",
            "url": "https://corpus.example.org/layout-v1.pdf",
            "quote": "Treatment 42 7.5"
          }
        ]
      },
      "expected": {
        "id": "pdf-table",
        "label": "PDF table cells, page 2",
        "path": "/layout-v1.pdf",
        "quote": "Treatment 42 7.5",
        "status": "exact_match",
        "matched": true,
        "passage": "Treatment 42 7.5",
        "page": 2
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/layout-v1.pdf",
        "id": "pdf-table",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/layout-v1.pdf",
        "final_url": "https://corpus.example.org/layout-v1.pdf",
        "redirected": false,
        "redirects": [],
        "content_type": "application/pdf",
        "title": "layout-v1.pdf",
        "source_sha256": "53e3b6fd379c98fbe572ab0afd90daa28e1e47e29db3cef14140835f8cd2e4de",
        "source_bytes": 2134,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "Treatment 42 7.5",
        "quote_check": {
          "status": "exact_match",
          "matched": true,
          "match_counts": {
            "total": 1,
            "exact": 1,
            "normalized": 0
          },
          "matches": [
            {
              "kind": "exact_match",
              "text": "Treatment 42 7.5",
              "start": 494,
              "end": 510,
              "utf16_start": 494,
              "utf16_end": 510,
              "line_start": 16,
              "line_end": 16,
              "page_start": 2,
              "page_end": 2,
              "before": "tly positioned text columns\n\nTabulated observations\nText cells use separate drawing positions.\nGroup Samples Delay (ms)\n",
              "after": "\nControl 38 9.0\nThe table reports selected fictional values.\nPage 2 - table cells and a complete sentence"
            }
          ],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "pages": "page_start/page_end are one-based PDF page numbers",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "80c4fe2a43eecc8d18d5b206fcd4b95c6423bfc96cee79ed8d9aaf0119aaef46",
          "source_truncated": false,
          "source": {
            "representation": "pdf_text_layer",
            "characters": 615,
            "full_characters": 615
          },
          "warnings": [
            "PDF text comes from the file's text layer. Reading order, columns, ligatures, and hyphenated line breaks may differ from the printed page."
          ]
        }
      }
    },
    {
      "id": "pdf-page",
      "label": "PDF sentence, page 2",
      "input": {
        "citations": [
          {
            "id": "pdf-page",
            "url": "https://corpus.example.org/layout-v1.pdf",
            "quote": "The table reports selected fictional values."
          }
        ]
      },
      "expected": {
        "id": "pdf-page",
        "label": "PDF sentence, page 2",
        "path": "/layout-v1.pdf",
        "quote": "The table reports selected fictional values.",
        "status": "exact_match",
        "matched": true,
        "page": 2
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/layout-v1.pdf",
        "id": "pdf-page",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/layout-v1.pdf",
        "final_url": "https://corpus.example.org/layout-v1.pdf",
        "redirected": false,
        "redirects": [],
        "content_type": "application/pdf",
        "title": "layout-v1.pdf",
        "source_sha256": "53e3b6fd379c98fbe572ab0afd90daa28e1e47e29db3cef14140835f8cd2e4de",
        "source_bytes": 2134,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The table reports selected fictional values.",
        "quote_check": {
          "status": "exact_match",
          "matched": true,
          "match_counts": {
            "total": 1,
            "exact": 1,
            "normalized": 0
          },
          "matches": [
            {
              "kind": "exact_match",
              "text": "The table reports selected fictional values.",
              "start": 526,
              "end": 570,
              "utf16_start": 526,
              "utf16_end": 570,
              "line_start": 18,
              "line_end": 18,
              "page_start": 2,
              "page_end": 2,
              "before": "ulated observations\nText cells use separate drawing positions.\nGroup Samples Delay (ms)\nTreatment 42 7.5\nControl 38 9.0\n",
              "after": "\nPage 2 - table cells and a complete sentence"
            }
          ],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "pages": "page_start/page_end are one-based PDF page numbers",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "80c4fe2a43eecc8d18d5b206fcd4b95c6423bfc96cee79ed8d9aaf0119aaef46",
          "source_truncated": false,
          "source": {
            "representation": "pdf_text_layer",
            "characters": 615,
            "full_characters": 615
          },
          "warnings": [
            "PDF text comes from the file's text layer. Reading order, columns, ligatures, and hyphenated line breaks may differ from the printed page."
          ]
        }
      }
    },
    {
      "id": "redirect",
      "label": "Redirected article keeps final URL provenance",
      "input": {
        "citations": [
          {
            "id": "redirect",
            "url": "https://corpus.example.org/old-article",
            "quote": "The researcher wrote “café”—not “cafe”."
          }
        ]
      },
      "expected": {
        "id": "redirect",
        "label": "Redirected article keeps final URL provenance",
        "path": "/old-article",
        "quote": "The researcher wrote “café”—not “cafe”.",
        "status": "exact_match",
        "matched": true,
        "final_path": "/article.html",
        "redirects": 1
      },
      "passed": true,
      "problems": [],
      "source_requests": 3,
      "evidence": {
        "url": "https://corpus.example.org/old-article",
        "id": "redirect",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/old-article",
        "final_url": "https://corpus.example.org/article.html",
        "redirected": true,
        "redirects": [
          {
            "from": "https://corpus.example.org/old-article",
            "to": "https://corpus.example.org/article.html",
            "status": 301
          }
        ],
        "content_type": "text/html",
        "title": "Extraction field report",
        "source_sha256": "c83ed374b1cced8b22db978c271f19490e86cf3d4a3408cc00955aa16efe1213",
        "source_bytes": 1080,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The researcher wrote “café”—not “cafe”.",
        "quote_check": {
          "status": "exact_match",
          "matched": true,
          "match_counts": {
            "total": 1,
            "exact": 1,
            "normalized": 0
          },
          "matches": [
            {
              "kind": "exact_match",
              "text": "The researcher wrote “café”—not “cafe”.",
              "start": 201,
              "end": 240,
              "utf16_start": 202,
              "utf16_end": 241,
              "line_start": 5,
              "line_end": 5,
              "before": "nary article text, tables, punctuation, and quotations. It is a test document and makes no claim about a real study.\n\n🧭 ",
              "after": "\n\nThe primary group recorded 24 samples across three sessions. These values are invented to test whether a changed numbe"
            }
          ],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "03b5aa3a9a96f15fada2cfa15fb4be60f03d1a2559b1227238aaeb17e4485a53",
          "source_truncated": false,
          "source": {
            "representation": "extracted_html_text",
            "characters": 566,
            "full_characters": 566
          },
          "warnings": []
        }
      }
    },
    {
      "id": "fetched-truncation",
      "label": "Missing quotation beyond the fetched output limit",
      "input": {
        "citations": [
          {
            "id": "fetched-truncation",
            "url": "https://corpus.example.org/long.txt",
            "quote": "The final section contains the missing quotation."
          }
        ]
      },
      "expected": {
        "id": "fetched-truncation",
        "label": "Missing quotation beyond the fetched output limit",
        "path": "/long.txt",
        "quote": "The final section contains the missing quotation.",
        "status": "source_truncated",
        "matched": null,
        "truncated": true
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/long.txt",
        "id": "fetched-truncation",
        "status": "readable",
        "error": null,
        "message": null,
        "http_status": 200,
        "requested_url": "https://corpus.example.org/long.txt",
        "final_url": "https://corpus.example.org/long.txt",
        "redirected": false,
        "redirects": [],
        "content_type": "text/plain",
        "title": "long.txt",
        "source_sha256": "51571cf7def028e293e059e7339bb53394e388fb3f8ee9d4f62209adc55e300c",
        "source_bytes": 115249,
        "retrieved_at": "2026-10-26T00:00:00.000Z",
        "quote": "The final section contains the missing quotation.",
        "quote_check": {
          "status": "source_truncated",
          "matched": null,
          "match_counts": {
            "total": 0,
            "exact": 0,
            "normalized": 0
          },
          "matches": [],
          "matches_truncated": false,
          "matching": {
            "normalize_whitespace": true,
            "case_sensitive": true,
            "punctuation_sensitive": true,
            "word_boundaries": true,
            "fuzzy_matching": false
          },
          "offsets": {
            "unit": "Unicode code points",
            "start": "zero-based inclusive",
            "end": "exclusive",
            "utf16": "utf16_start/end are JavaScript string offsets",
            "lines": "one-based; CRLF counts as one line break",
            "relative_to": "checked source text, not raw HTML or Source Reader Markdown"
          },
          "checked_text_sha256": "4192c31edd65e15a1cd98c8863b4be3e3515a732912b00607b2ac1ad3385b6fc",
          "source_truncated": true,
          "source": {
            "representation": "literal_text",
            "characters": 100000,
            "full_characters": 115249
          },
          "warnings": [
            "Output was truncated to 100000 Unicode code points; use a larger max_characters to request more.",
            "Only a prefix was checked. A missing quotation is inconclusive for the complete source."
          ]
        }
      }
    },
    {
      "id": "missing-source",
      "label": "HTTP 404 keeps quotation unchecked",
      "input": {
        "citations": [
          {
            "id": "missing-source",
            "url": "https://corpus.example.org/missing",
            "quote": "No source was read."
          }
        ]
      },
      "expected": {
        "id": "missing-source",
        "label": "HTTP 404 keeps quotation unchecked",
        "path": "/missing",
        "quote": "No source was read.",
        "error": "upstream_error",
        "http_status": 404
      },
      "passed": true,
      "problems": [],
      "source_requests": 2,
      "evidence": {
        "url": "https://corpus.example.org/missing",
        "id": "missing-source",
        "status": "failed",
        "error": "upstream_error",
        "message": "The source returned HTTP 404.",
        "http_status": 404,
        "upstream": {
          "stage": "source",
          "http_status": 404,
          "retry_after_seconds": null
        },
        "recovery": "check_url",
        "requested_url": null,
        "final_url": null,
        "redirected": null,
        "redirects": [],
        "content_type": null,
        "title": null,
        "source_sha256": null,
        "source_bytes": null,
        "retrieved_at": null,
        "quote": "No source was read.",
        "quote_check": null
      }
    },
    {
      "id": "robots-denied",
      "label": "A robots denial keeps quotation unchecked",
      "input": {
        "citations": [
          {
            "id": "robots-denied",
            "url": "https://corpus.example.org/denied",
            "quote": "No source was read."
          }
        ]
      },
      "expected": {
        "id": "robots-denied",
        "label": "A robots denial keeps quotation unchecked",
        "path": "/denied",
        "quote": "No source was read.",
        "error": "robots_disallowed"
      },
      "passed": true,
      "problems": [],
      "source_requests": 1,
      "evidence": {
        "url": "https://corpus.example.org/denied",
        "id": "robots-denied",
        "status": "failed",
        "error": "robots_disallowed",
        "message": "This site disallows BOZOSReader at this path. Longest matching rule: Disallow: /denied (line 3)",
        "http_status": null,
        "upstream": null,
        "recovery": "respect_robots",
        "requested_url": null,
        "final_url": null,
        "redirected": null,
        "redirects": [],
        "content_type": null,
        "title": null,
        "source_sha256": null,
        "source_bytes": null,
        "retrieved_at": null,
        "quote": "No source was read.",
        "quote_check": null
      }
    }
  ]
}
