{
  "methodVersion": "1.0.0",
  "measuredAt": "2026-11-04T05:17:25.652Z",
  "environment": {
    "node": "v24.16.0",
    "platform": "win32 x64",
    "extractor": "lib/extract.ts (pdf-parse for PDF, mammoth for DOCX)",
    "sectionDetector": "lib/ai/schemas/ats-evaluation detectCvSections via lib/ats/public-cv-check toEngineMarkdown"
  },
  "question": "How reliably does Luceria's server-side document extractor recover the text, reading order, section headings, bullets and contact details of a CV across common layouts?",
  "metrics": {
    "tokenRecall": "Share of distinct expected content tokens (3+ characters) present anywhere in the extracted text.",
    "lineOrder": "Share of expected lines recovered in the expected reading order (longest increasing subsequence of matched expected lines over the total expected lines).",
    "bulletsRecovered": "Expected bullet sentences found verbatim (normalised) in the extracted text.",
    "headingsRecognised": "Expected section headings that Luceria's heading promotion recognises as standalone headings.",
    "sectionsPresent": "Sections the ATS engine's detector reports as present.",
    "contact": "Whether the fictional email address and phone number were readable.",
    "artefactFlags": "Layout artefacts the parser-preview heuristics raise (tabs, wide gaps, short lines, long lines, all-caps body, repeated contact)."
  },
  "fixtures": [
    {
      "id": "docx-single-column",
      "label": "Word, single column, real headings and list bullets",
      "file": "docx-single-column.docx",
      "kind": "docx",
      "risk": "none",
      "bytes": 9406,
      "extraction": {
        "ok": true,
        "chars": 1117,
        "durationMs": 325
      },
      "tokenRecall": 1,
      "lineOrder": 1,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Contact details",
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": true,
        "phone": true
      },
      "artefactFlags": []
    },
    {
      "id": "docx-two-column-table",
      "label": "Word, two-column layout built with a table (sidebar + main)",
      "file": "docx-two-column-table.docx",
      "kind": "docx",
      "risk": "table layout",
      "bytes": 9541,
      "extraction": {
        "ok": true,
        "chars": 1115,
        "durationMs": 21
      },
      "tokenRecall": 1,
      "lineOrder": 0.5455,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Contact details",
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": true,
        "phone": true
      },
      "artefactFlags": []
    },
    {
      "id": "docx-header-contact",
      "label": "Word, contact details only in the page header",
      "file": "docx-header-contact.docx",
      "kind": "docx",
      "risk": "header/footer content",
      "bytes": 11068,
      "extraction": {
        "ok": true,
        "chars": 1061,
        "durationMs": 13
      },
      "tokenRecall": 0.955,
      "lineOrder": 0.9545,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": false,
        "phone": false
      },
      "artefactFlags": []
    },
    {
      "id": "pdf-single-column",
      "label": "PDF, single column, bold headings, standard bullets",
      "file": "pdf-single-column.pdf",
      "kind": "pdf",
      "risk": "none",
      "bytes": 2628,
      "extraction": {
        "ok": true,
        "chars": 1120,
        "pages": 1,
        "durationMs": 1733
      },
      "tokenRecall": 1,
      "lineOrder": 1,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Contact details",
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": true,
        "phone": true
      },
      "artefactFlags": []
    },
    {
      "id": "pdf-decorative-bullets",
      "label": "PDF, single column with decorative bullet glyphs",
      "file": "pdf-decorative-bullets.pdf",
      "kind": "pdf",
      "risk": "bullet glyphs",
      "bytes": 2630,
      "extraction": {
        "ok": true,
        "chars": 1125,
        "pages": 1,
        "durationMs": 11
      },
      "tokenRecall": 1,
      "lineOrder": 0.9545,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Contact details",
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": true,
        "phone": true
      },
      "artefactFlags": []
    },
    {
      "id": "pdf-two-column-sidebar-first",
      "label": "PDF, two columns, sidebar drawn before the main column",
      "file": "pdf-two-column-sidebar-first.pdf",
      "kind": "pdf",
      "risk": "column reading order",
      "bytes": 2701,
      "extraction": {
        "ok": true,
        "chars": 1116,
        "pages": 1,
        "durationMs": 10
      },
      "tokenRecall": 1,
      "lineOrder": 0.5455,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Contact details",
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": true,
        "phone": true
      },
      "artefactFlags": []
    },
    {
      "id": "pdf-two-column-main-first",
      "label": "PDF, two columns, main column drawn before the sidebar",
      "file": "pdf-two-column-main-first.pdf",
      "kind": "pdf",
      "risk": "column reading order",
      "bytes": 2697,
      "extraction": {
        "ok": true,
        "chars": 1116,
        "pages": 1,
        "durationMs": 10
      },
      "tokenRecall": 1,
      "lineOrder": 0.8182,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Contact details",
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": true,
        "phone": true
      },
      "artefactFlags": []
    },
    {
      "id": "pdf-tabular-experience",
      "label": "PDF, experience laid out as a dates | detail table",
      "file": "pdf-tabular-experience.pdf",
      "kind": "pdf",
      "risk": "table rows",
      "bytes": 2650,
      "extraction": {
        "ok": true,
        "chars": 1108,
        "pages": 1,
        "durationMs": 10
      },
      "tokenRecall": 1,
      "lineOrder": 0.9091,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Contact details",
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": true,
        "phone": true
      },
      "artefactFlags": []
    },
    {
      "id": "pdf-two-pages-repeated-header",
      "label": "PDF, two pages with a repeated contact header",
      "file": "pdf-two-pages-repeated-header.pdf",
      "kind": "pdf",
      "risk": "page break and repeated header",
      "bytes": 3540,
      "extraction": {
        "ok": true,
        "chars": 3575,
        "pages": 2,
        "durationMs": 14
      },
      "tokenRecall": 1,
      "lineOrder": 1,
      "bulletsRecovered": {
        "found": 5,
        "total": 5
      },
      "headingsRecognised": {
        "found": [
          "Profile",
          "Experience",
          "Education",
          "Skills"
        ],
        "total": 4
      },
      "sectionsPresent": [
        "Contact details",
        "Personal summary",
        "Work experience",
        "Education",
        "Skills"
      ],
      "contact": {
        "email": true,
        "phone": true
      },
      "artefactFlags": [
        "repeated-contact"
      ]
    }
  ],
  "aggregates": {
    "fixtures": 9,
    "meanTokenRecall": 0.995,
    "meanLineOrder": 0.8586,
    "allHeadingsRecognised": 9,
    "contactFullyReadable": 8,
    "cleanLayouts": 8
  },
  "limitations": [
    "Synthetic fixtures with one fictional CV; real documents vary in fonts, software and content. Nine layouts cannot represent every template.",
    "Measures Luceria's own extractor (lib/extract.ts) and heading recognition. It does not test any employer's applicant tracking system, which may use a different parser, and it cannot predict hiring outcomes.",
    "Scanned (image-only) PDFs are not included; the extractor reports them as unreadable by design rather than guessing.",
    "Reading-order scoring credits an expected line longer than 40 characters when an extracted line holds more than 30 characters of it, so a line the extractor split in two still counts; lineOrder is lenient on PDFs that break lines, not conservative.",
    "Results are from one machine and one run; timing figures are indicative only."
  ]
}