manually-bumped integer — see Report.outputVersion / report.ts's OUTPUT_VERSION.
the same QA report extractText/extractOcr/pdfToMarkdown return, always measured off real markdown (OCR: the shared core's output; TEXT: buildMarkdown's reflowed output, not this coarser IR) — never stale relative to the IR.
analyze()'s output: plain, JSON-serializable per-page words/blocks plus the same QA
reportthe other entry points return.