{
  "methodVersion": "1.0.0",
  "fixedDate": "2026-11-04T00:00:00.000Z",
  "note": "Hashes are reproducible with the same library versions: run scripts/research/document-repair-lab/run.ts --verify. r3-after is byte-identical to control-docx by design.",
  "environment": {
    "node": "v24.16.0",
    "platform": "win32 x64",
    "generators": [
      {
        "name": "docx",
        "version": "9.6.1",
        "license": "MIT"
      },
      {
        "name": "pdfkit",
        "version": "0.18.0",
        "license": "MIT"
      },
      {
        "name": "fontkit",
        "version": "2.0.4",
        "license": "MIT"
      },
      {
        "name": "jszip",
        "version": "3.10.1",
        "license": "(MIT OR GPL-3.0-or-later)"
      }
    ],
    "parsers": [
      {
        "name": "pdf-parse",
        "version": "2.4.5",
        "license": "Apache-2.0"
      },
      {
        "name": "pdfjs-dist",
        "version": "5.4.296",
        "license": "Apache-2.0"
      },
      {
        "name": "mammoth",
        "version": "1.12.0",
        "license": "BSD-2-Clause"
      }
    ],
    "font": {
      "file": "node_modules/pdfjs-dist/standard_fonts/LiberationSans-Regular.ttf",
      "sha256": "f8ace1f892b2bd9dc1792ba7f097fa7588f84fed48321480e04de5390828221f",
      "license": "SIL Open Font License 1.1"
    },
    "extractor": "lib/extract.ts (pdf-parse for PDF, mammoth for DOCX); measures scripts/research/shared/measure.ts; flags lib/tools/parser-preview.ts"
  },
  "fixtures": [
    {
      "id": "control-docx",
      "file": "fixtures/control-docx.docx",
      "kind": "docx",
      "role": "control",
      "label": "Word, single column, contact line in the body",
      "bytes": 9033,
      "sha256": "adba30f38b3daf123997bd6c4e14325de0cbcb3948fba0c49b482c2e3231bf9a"
    },
    {
      "id": "control-pdf",
      "file": "fixtures/control-pdf.pdf",
      "kind": "pdf",
      "role": "control",
      "label": "PDF, single column, contact line in the body",
      "bytes": 2725,
      "sha256": "089a0aefdae0aa98a3ceda344a249e12113fc83f6cfc478619fdb0ef1a9b44e3"
    },
    {
      "id": "r1-before",
      "file": "fixtures/r1-before-two-column.pdf",
      "kind": "pdf",
      "role": "before",
      "label": "PDF, two columns drawn as two text streams (sidebar first)",
      "bytes": 2797,
      "sha256": "e26a9e2e18b1bcd4615b8692c0abc4524baa016ebee47f93b8c6ae60507a8dad"
    },
    {
      "id": "r1-after",
      "file": "fixtures/r1-after-single-column.pdf",
      "kind": "pdf",
      "role": "after",
      "label": "PDF, the same content in one column",
      "bytes": 2730,
      "sha256": "1f812df5eab2d232c34231a9fa5bb9814ad2982f47359cd8608e532ea93c2a16"
    },
    {
      "id": "r2-before",
      "file": "fixtures/r2-before-table.docx",
      "kind": "docx",
      "role": "before",
      "label": "Word, sidebar and main column built as a table",
      "bytes": 9178,
      "sha256": "93c6be019f71313a0542160c58327c4b44b1718afcc47071f327f001d92c0cab"
    },
    {
      "id": "r2-after",
      "file": "fixtures/r2-after-single-column.docx",
      "kind": "docx",
      "role": "after",
      "label": "Word, the same paragraphs in one column",
      "bytes": 9028,
      "sha256": "ebfaa47a2e9591edf383c64cfb2365bf6f5aea6f97b66aedd9e3e3e26c5f782e"
    },
    {
      "id": "r3-before",
      "file": "fixtures/r3-before-header-contact.docx",
      "kind": "docx",
      "role": "before",
      "label": "Word, contact line only in the page header",
      "bytes": 9936,
      "sha256": "55e47ffdef7242f5d806ea04b835124da8299452f7018c114589f93e2bd94e16"
    },
    {
      "id": "r3-after",
      "file": "fixtures/r3-after-body-contact.docx",
      "kind": "docx",
      "role": "after",
      "label": "Word, the contact line in the body",
      "bytes": 9033,
      "sha256": "adba30f38b3daf123997bd6c4e14325de0cbcb3948fba0c49b482c2e3231bf9a"
    },
    {
      "id": "r4-before",
      "file": "fixtures/r4-before-running-header.pdf",
      "kind": "pdf",
      "role": "before",
      "label": "PDF, two pages with a running contact header",
      "bytes": 3636,
      "sha256": "2c25030556a09413289472bd4079104e9609217c2b099ff4f7add1b2e78aff3c"
    },
    {
      "id": "r4-after",
      "file": "fixtures/r4-after-no-running-header.pdf",
      "kind": "pdf",
      "role": "after",
      "label": "PDF, the same two pages without the running header",
      "bytes": 3538,
      "sha256": "2c3ff223cc6d2b83bc6b874221da79eecd7bf40398000a6dd176a90dde3dad4d"
    },
    {
      "id": "r5-before",
      "file": "fixtures/r5-before-outlined-text.pdf",
      "kind": "pdf",
      "role": "before",
      "label": "PDF, text drawn as outlines (no text layer)",
      "bytes": 51832,
      "sha256": "8def9a235951a48c0d7da912e93657f2bbb19fddd7d75b91e4143bbce7180cf6"
    },
    {
      "id": "r5-after",
      "file": "fixtures/r5-after-real-text.pdf",
      "kind": "pdf",
      "role": "after",
      "label": "PDF, the same lines as real text",
      "bytes": 21873,
      "sha256": "62ee08b2c4e914c3f32f7dbd07008e4658d6a2b78d94dddc61f354fc0e91bb46"
    }
  ],
  "fixturesZip": {
    "file": "fixtures.zip",
    "sha256": "1e3dbdc029dc695ac8031adf39443e297c611ca4971bac58b2fb4750ff642cd9"
  },
  "contentLicence": "Synthetic, fictional content written for this lab; free to reuse with attribution to Luceria."
}
