Evidence for Semantic Nondeterminism — identical bytes that yield multiple valid machine-readable interpretations across different consumers. PDF is where it is measured; the property is the point.
Executive Summary
This is an independent study, conducted entirely with our own forensic engine. We ran every PDF in the DOJ "Epstein Files Transparency Act" disclosure — all 16,971 documents, all 47 engines, zero files skipped or failed — and report what the scanner found at the object level.
The corpus is clean of malware. That is the expected, correct result for a government document production, and it is not the story. The story is provenance — what these files are, how they were made, and what they carry that a human reader never sees:
- Two distinct production pipelines partition the entire release, visible in the bytes (PDF 1.3 + compressed object streams + three EOF markers vs PDF 1.5 + two).
- A dated production timeline — the documents were processed in distinct waves between December 2025 and February 2026, with a single 6,583-document batch on one day.
- The corpus underwent a digital-to-image transformation workflow before release — OCR-captured, rasterized, re-saved — with image and structural characteristics far more uniform than native scanner output.
- 96.7% carry data the renderer never shows: invisible text layers, OCR text that diverges from the image, hidden compressed objects, orphaned objects — including the original metadata the active document appears to have erased.
- 18.6% present different content to a human than to a machine, and 61.9% make PDF parsers disagree about the document's own structure.
The release is safe to open. Its risk is to interpretation. Note the deliberate limit of these findings: structure can show that a digital-to-image transformation occurred; it cannot, by itself, establish whether the underlying content was altered. We report the observable technical facts and stop there.
Corpus & Method
| Documents analyzed | 16,971 PDFs — the complete released corpus |
|---|---|
| Failed / unscanned | 0 |
| Total pages | 67,143 (mean 4.0, median 1, max 1,523) |
| Bates-numbered range | EFTA00000001–EFTA02853705 (2,853,705 numbered pages); the release covers 67,143 — 2.4%, in 16 contiguous islands (Finding 13) |
| Total PDF objects | 1,864,023 (mean 110/file, max 42,581) |
| Total streams | 437,548 (incl. 29,870 image XObjects) |
| Engine | PQ PDF forensic scanner — 47 independent passes per file |
| Verdict model | Multi-axis: threat (malware/exploit), deception (content-integrity), structural (neutral capability) — scored separately |
Each document received the full suite: a six-parser differential (MuPDF, Poppler, Ghostscript, qpdf, pdfminer, pdf.js), a dynamic behavioral sandbox, YARA, ClamAV, ML anomaly detection, JavaScript AST analysis, signature and revision forensics, xref-graph integrity, OCR text-layer integrity, reading-order analysis, object-stream decompression, font forensics, accessibility-tree analysis, physical-entropy topology, and content-integrity / AI-ingestion detection. Verdicts separate capability from malice, so a complex-but-legitimate scan is never mistaken for an attack.
What We Did Not Do
This is a structural forensic study of the PDF release. Its boundaries are deliberate, and every finding should be read inside them:
- We did not assess the truth, accuracy, or meaning of any document's contents. Every finding concerns how the files were produced and encoded, not what they say.
- We did not attribute motive or intent. Metadata stripping, redaction, OCR drift, and the numbering gaps are reported as observable facts; whether any was deliberate, incidental, or procedural is outside what PDF structure can establish.
- We did not read, reconstruct, or republish redacted content. Where a side channel exists (Finding 10) we report its existence and scope only.
- We did not analyze the non-PDF exhibits. Video, audio, and spreadsheet files in the release were outside this study; every figure here is computed over the 16,971 PDFs.
- We did not identify individuals or make any claim about a person named in the files.
Verdict Distribution
The malware (threat) axis is effectively empty; the high-risk population is driven entirely by content-integrity (deception).
Finding 1 — Two Distinct Production Pipelines
Two assembly pipelines produced the release — a 10,718-document population (header 1.3, with compressed object streams) and a 5,828-document population (header 1.5) — cleanly separable from the bytes alone.
The release was not produced by a single process. The header PDF version partitions the corpus into two tightly-correlated populations, and the correlation is near-total:
| Trait | Pipeline A (header 1.3) | Pipeline B (header 1.5) |
|---|---|---|
| Documents | 10,718 | 5,828 (+425 at 1.4 — the ReportLab sub-pipeline, Finding 4) |
Compressed object streams (/ObjStm) | 10,499 | 14 |
| Mixed xref table + stream | 10,499 | 14 |
Three %%EOF markers | 10,499 | 14 |
Pipeline A's documents claim PDF 1.3 in their header but use 1.5-era object streams internally — the inconsistency that makes parsers disagree (Finding 6). Both populations share the same OCR toolchain (Finding 4); the split reflects two assembly passes or source batches, cleanly separable from the bytes alone.
Finding 2 — Universal Post-Creation Modification
Not one of the 16,971 documents survives in its original single-save state — every file was modified after creation, and 96.1% still carry orphaned objects from earlier revisions.
All 16,971 documents (100%) contain incremental updates: objects appended after the original save, and existing object IDs re-defined in later revisions. 16,306 (96.1%) retain orphaned objects in the cross-reference table. Incremental injections average 13 new objects and reach 3,049 in one revision; 2,323 files (13.7%) carry a large final-pass injection — the Bates-numbering stamp applied as a separate generation. A measured 22.5% show an entropy cliff at a revision boundary, the physical trace of content appended in a later pass.
No document is in its original single-save state. Every one carries two or three revision
layers; the cross-reference graph confirms it, with 21,012 superseded /XRef
and 10,513 /ObjStm objects left orphaned across the corpus.
Finding 3 — A Dated Production Timeline
Surviving timestamps cluster into dated processing waves from December 2025 to February 2026 — batch production, not a single export — while 14 files retain an original 2013 creation date.
The revision metadata that survived processing carries timestamps, and they cluster into distinct dated processing waves — not a single export. Of the ~10,947 documents whose dates are readable, the production ran from December 2025 into February 2026, dominated by one 6,583-document batch:
Two observations follow. First, the production is batch-processed in waves,
consistent with the two-pipeline split in Finding 1. Second, 14 documents
retain a pre-2025 original creation date (2013-04-16) — and the recovered
metadata names them as Microsoft® Office Word 2007 documents
(Finding 4): genuine born-digital originals whose provenance survived the
transformation in the orphaned metadata, a reminder that the underlying documents predate
this release by years.
Finding 4 — Metadata Stripped From View, but the Toolchain Is Recoverable
Active authoring metadata is 100% empty, but the orphaned /Info
dictionary recovers the production toolchain on 65.8% of files — resolving the corpus
into four generators that match the structural pipelines exactly.
All 16,971 documents (100%) have empty Producer, Creator, Title and Author fields in their active metadata, and none carry XMP. The strip is total, not near-total: not one document in the corpus retains a populated Title, Author, Subject, Keywords or Trapped value. On the surface the authoring fingerprints look erased.
They were not erased — only unlinked. The pipeline left the original
/Info dictionary behind as an orphaned object inside a compressed
object stream, unreferenced by the final trailer. Walking every cross-reference
object recovers it. Measured across the full corpus, 11,165 documents (65.8%)
still carry a recoverable authoring fingerprint in that orphaned metadata —
every one of them with an empty active /Info. The recovered values do
not describe one pipeline; they resolve the corpus into four distinct generators, and each
one lines up exactly with a structural population identified elsewhere in this study:
| Recovered toolchain | Files | Header | What it is |
|---|---|---|---|
Creator OmniPage CSDK 21.1 + Producer Processing-CLI | 10,499 | 1.3 | Commercial OCR / document-capture SDK → batch assembly — the Pipeline A scanning toolchain (exactly the parser-disagreement population, Finding 6) |
Producer pypdf | 227 | — | Python PDF library — a final manipulation pass on a minority of files |
Creator + Producer ReportLab PDF Library | 425 | 1.4 | Python PDF generation — a distinct born-digital sub-pipeline, precisely the +425 v1.4 population in Finding 1 |
Creator Microsoft® Office Word 2007 | 14 | 1.5 | The genuine born-digital originals — all 14 carry the 2013-04-16 creation date of Finding 3 |
Across the dominant population of 10,499 documents the recovered metadata names the tools that touched the files — OmniPage OCR, a Processing-CLI assembly step, and pypdf; the OmniPage → Processing-CLI → pypdf ordering is the assembly sequence those fingerprints most plausibly imply, not a recorded log — the metadata establishes which toolchain processed the files more firmly than the exact order in which it did. But the metadata recovery does more than name it: the 425 ReportLab files and the 14 Word 2007 originals are independently generated populations the visible metadata strip had completely hidden — and each maps one-to-one onto a structural cohort we isolated from the bytes alone. The provenance the active metadata appears to remove is not merely recoverable; it corroborates the pipeline partition from an entirely separate signal. The full cohort catalog and a pipeline diagram are in Appendix C.
Finding 6 — Parser Disagreement
61.9% of files make independent PDF parsers disagree about the document's own declared version — a 1.3 header over 1.5-era object streams — so tools differ on how to decode the file, even though they agree on its page and object counts.
10,499 files (61.9%) make independent PDF parsers disagree about the document's own declared version: MuPDF and Poppler read PDF 1.5; qpdf reads 1.3 — from the same bytes. The cause is structural and is Pipeline A's signature: a 1.3 header over 1.5-era object streams.
The root is a genuine spec violation we measured across the whole corpus: in
exactly 10,499 documents (61.9%) the file header declares %PDF-1.3
while the document catalog carries a /Version /1.5 override —
and the catalog /Version key is only valid in PDF 1.4 and later. A 1.3
file is, by its own rules, not allowed to contain the entry that upgrades it to 1.5.
Parsers that honor the header read 1.3; parsers that honor the catalog read 1.5. Both are
reading the same bytes correctly — the document is internally contradictory. (The
remaining 6,472 documents carry no catalog /Version and are self-consistent.)
| Structural condition | Files | Share |
|---|---|---|
| Parser version mismatch (MuPDF/Poppler 1.5 vs qpdf 1.3) | 10,499 | 61.9% |
| Mixed xref table and xref stream | 10,513 | 61.9% |
/ObjStm object streams | 10,513 | 61.9% |
| Data carried in PDF comments between revisions | 10,499 | 61.9% |
Multiple %%EOF markers | 10,513 | 61.9% |
| Original save missing required binary-data comment (ISO 32000-2 §7.5.2) | 10,508 | 61.9% |
| Entropy cliff at a revision boundary | 3,814 | 22.5% |
The same Pipeline-A population carries a second, independent spec defect at the very top of the file. ISO 32000-2 §7.5.2 requires a PDF whose body contains binary data to place a comment of at least four bytes >127 on the second line, so byte-unaware transports do not corrupt it. In 10,508 documents (61.9%) that comment is absent from the original save — and every one of those 10,508 files is a header-1.3 Pipeline-A document, a 100% correlation. The assembly tool emitted a technically non-conformant base file and then layered conformant incremental updates on top of it; the defect is a fingerprint of the generator, not of any one document.
It is worth being precise about what disagrees. The parsers agree on page count, object count, encryption state, form fields, and embedded files; the disagreement is specifically the document's declared PDF version and the cross-reference structure that follows from it — MuPDF and Poppler resolve the object-stream layer and report 1.5, while qpdf reads the header and reports 1.3. This is not six parsers extracting six different texts; it is a split over how the file should be decoded — the layer that governs which recovery path a tool takes, and the structural root of the reality drift in Finding 7.
Finding 7 — Reality Drift: Human-Visible vs Machine-Readable
On 18.6% of documents the machine-readable text layer diverges from the visible page image — the human view and the machine view are measurably different records.
3,159 documents (18.6%), across 4,243 individual pages, contain a hidden OCR text layer that does not match the rendered image — measured by word-overlap (Jaccard) between what the page shows and what its text layer says. This is the single most consequential finding for automated use of the release:
- A human investigator reads the image.
- A search index, e-discovery tool, or AI/RAG pipeline reads the text layer.
- When they disagree, automated analysis silently ingests text that is not what the document visibly says — degrading search and corrupting any AI summarization or retrieval built on the corpus.
How this is measured. For each scanned page (up to five per document) the engine re-OCRs the rendered image with Tesseract and compares the result to the embedded text layer as normalized word sets (lower-cased, punctuation-stripped). A page is counted as divergent only when the Jaccard word-overlap falls below 0.3 — i.e. more than roughly 70% of words differ — and only when both layers carry real text (≥5 embedded and ≥6 re-OCR'd words, so blank and figure-only pages are excluded). The 0.3 bar is deliberately conservative: it flags substantial textual divergence, not transcription noise such as a single misspelled name. It establishes that the two text streams differ, not which one is correct.
Most affected documents drift on a single page, but the tail runs deep — some carry mismatches across a dozen pages:
Finding 9 — A Digital-to-Image Transformation Workflow
Uniform low-entropy rasters, near-zero page skew, a fixed 96-DPI render size, zero camera/scanner JPEGs, and no embedded fonts converge on one conclusion: the corpus was rendered to page images and OCR'd, not emitted as native documents.
The structural evidence converges on a single observable conclusion: the corpus underwent a digital-to-image transformation workflow before release — content rendered to page images, OCR-captured, and re-assembled, rather than emitted as native digital documents. The signals:
Three independent measurements point the same way:
- Image rasters are extraordinarily uniform. Across 29,870 image XObjects the mean entropy is 1.01 (median 1.02), with 49% below 1.0 — heavily-compressible, low-variation raster data unlike the texture and sensor noise of native paper scanning.
- Skew is uniform and near-zero. On a rendered sample we measured page skew directly: 91% of pages sit within 0.5° of true horizontal, and the skew spread within a multi-page document averages 0.55°. Physical scanning of paper introduces per-page skew variation; this consistency is the signature of programmatic rendering, not a feed scanner.
- No born-digital structure, redundant color encoding. 99.9% carry no structure tree, no document embeds a font or attachment, and 33% store grayscale content in an RGB color space — a re-encoding artifact of a rasterization pass.
Taken together — uniform low-entropy rasters, near-zero uniform skew, redundant color encoding, and an OCR text layer in place of real fonts — the signature is a render-to-image pipeline applied at scale. We note one measurement that did not hold: page borders are not uniformly flat (border pixel variance is non-trivial), so we make no claim about the absence of edge artifacts; the conclusion rests on the skew, entropy, and structural evidence above.
The image and font encoding nail it down further. We extracted image and font tables directly from a sample:
| Image resolution | 96 DPI on 91.5% of all 25,614 page images (23,427) — a fixed render resolution, not the 200–600 DPI of document scanners |
|---|---|
| JPEG / DCTDecode images | 0 — 100% are FlateDecode bitmaps; despite photographic content, no image uses a camera/scanner codec |
| Color | Indexed device-dependent color (17,370 images) and DeviceGray (8,244) — no device-independent color space anywhere |
| Page raster size | Dominant 816×1056 (18,028 images = US Letter at exactly 96 DPI) and 769×1152 — standard page geometries at a fixed scale |
| Fonts | 0 embedded fonts in all 16,971 documents — Helvetica (Bates numbers & headers, present in every file), Times-Roman, Courier; the text is drawn entirely with non-embedded standard fonts |
816×1056 is 8.5″×11″ multiplied by exactly 96 — a digital page rendered to raster at a fixed resolution, not paper measured by a scanner. Combined with the complete absence of embedded fonts across all 16,971 files (every glyph is drawn with non-embedded standard fonts the OCR layer references), the encoding describes a render-to-image assembly line, not a scanning operation.
The zero-JPEG result is worth dwelling on, because the choice is consequential. A JPEG
(DCTDecode) image is the native output of every camera and most document
scanners, and it travels with an EXIF/IPTC/XMP sidecar — camera model and serial,
operator, software, timestamps, and frequently GPS coordinates. Re-encoding every
photographic page as a bare FlateDecode bitmap discards that sidecar wholesale.
Whether by design or as a side effect of the rasterization step, the format choice
forecloses the richest channel of source-device metadata a release like this could
otherwise leak — consistent with the same total metadata strip seen in
Finding 4.
A small structural tell corroborates this. 619 documents (3.6%) carry a
FontDescriptor with a non-negative /Descent value — invalid
per ISO 32000, which defines /Descent as the depth below the
baseline and requires it to be negative. These descriptors describe real Windows
typefaces (ArialMT in 478 files, TimesNewRomanPSMT in 212, CourierNewPSMT in 113) that the
pipeline referenced without embedding, and 98% of every document that carries such
a descriptor has the defect — a consistent fingerprint of the same
automated font-handling step, not random corruption. (These descriptors live inside
compressed object streams, invisible to byte-level inspection; our engine reads into the
object streams to find them.)
A deliberate limit: this is an observation about process, not content. The structure shows a digital-to-image transformation occurred before release. It does not, on its own, establish that the underlying content was altered — that requires evidence beyond PDF structure. We report the technical finding and stop short of any claim about fabrication.
Finding 10 — Redaction: Sound Method, One Side Channel
Redactions are done correctly — burned into the page-image pixels, so hidden text can't be lifted by copy-paste or overlay-stripping — leaving only one side channel: monospaced-font redactions leak their character length, never their content.
Redactions in this release are applied correctly at the structural level: they are black boxes burned into the page image pixels, not PDF rectangle objects drawn over still-present text. Because the underlying content is a rasterized image and the redacted region is painted into those pixels, the hidden text is not recoverable by copy-paste or by stripping an overlay — the common, catastrophic redaction failure seen in other releases does not occur here. This is the right way to redact a document.
We state the negative result plainly, because it is the question most readers will ask: across all 16,971 documents we found no instance of the overlay-style redaction failure — no black rectangle drawn as a vector object over text that remains live and extractable underneath. Where this corpus redacts, the characters are gone from the pixel data, not merely covered. The recoverable side channel below is about redaction length, not redaction content; the content itself is not retrievable from the file.
One side channel remains. Where redacted passages sit over text rendered in Courier — a monospaced font — every character occupies an identical width, so the length of a redaction is proportional to the width of the black box. An analyst can count character cells under the bar and estimate how many characters were removed, even though the characters themselves are gone. This does not recover content, but redaction length is itself sometimes sensitive (it distinguishes a short name from a long one, a two-digit number from a nine-digit one). It is a property of the monospaced-font choice, not a processing error.
Finding 11 — The Absent Semantic Layer
The files are inert page-image carriers — 99.9% untagged, with zero Alt text, attachments, forms, or links — so the only machine-readable content is an OCR text layer that is itself unstable.
Modern document workflows often leave behind a semantic layer — a tagged structure
tree, headings, /Alt text — that humans never see but parsers and AI
systems ingest. This release has almost none:
- 16,957 of 16,971 (99.9%) are untagged — no structure tree.
- 0 documents carry
/Altor/ActualTextaccessibility annotations.
The emptiness runs deeper than the semantic layer. Measured across the whole corpus, the release carries none of the interactive or container features a PDF can hold: 0 encrypted documents, 0 linearized (web-optimized) documents, 0 embedded files or attachments, 0 form fields, 0 annotations, and 0 link objects — not as a sampled estimate but as an exact count over all 16,971. The files are inert page-image carriers: a raster, an invisible OCR layer, and Bates numbering, with every optional structure that could aid — or mislead — a machine reader stripped away.
That Bates numbering is mechanically uniform across the entire corpus.
Every one of the 16,971 documents applies the page identifier the same way: a
dedicated content stream that draws the Bates id —
hex-encoded (100%) — in Helvetica (100%), at
12 point on 80.9% of files (the remainder are the same 12 pt
stamp scaled by the page transform). And every file retains the bloat that stamping
pipeline leaves behind: a legacy /ProcSet resource array (100%),
an empty leftover content stream (100%), and a retained
page /Thumb thumbnail (97.4%). The overlay resolves into
exactly two physical page layouts — a five-stream page with the Bates
stamp at content-stream index 3 (83.1%) or a four-stream page with it
at index 2 (16.9%) — and nothing else. A release assembled by
hand, or by more than one tool, does not converge on a single five-byte-precise stamping
shape across seventeen thousand files; this is the signature of one automated stamping pass.
The implication cuts two ways. There is no hidden semantic content injected for machines to misread — but there is also no reliable machine-readable structure at all. For a RAG or AI pipeline, the only machine-readable content is the OCR text layer — the same layer that diverges from the visible image in 18.6% of documents (Finding 7). And that layer is not even fixed: OCR ran on every file (present on 100%, evaluated on the 13,108 scanned-image documents), but at a uniform 96 DPI the rasters are low enough resolution that a modern OCR engine re-run over the same images would produce a different text layer than the one shipped — recovering text the original pass missed and correcting text it got wrong. The machine-readable content of this corpus is therefore not a fixed quantity; it is a function of whatever OCR last touched it. The corpus is, by construction, a difficult and partly unreliable substrate for automated analysis.
Finding 12 — There Is No Single Canonical Reading
Read together, the findings make one argument: this corpus has no single canonical reading — the page a human sees and the machine-interpreted layer that travels with it are two different representations that routinely diverge, and which one governs depends on the context.
The preceding findings are usually treated as separate defects. Read together, they make one structural argument that is the central result of this study:
For this corpus there is no single authoritative version of a document. The page a human sees and the machine-interpreted layer that travels with it are two different representations — and across thousands of documents they say something different from each other, or cannot be agreed upon at all. Which one governs is a matter of context, not of the file: a court or produced exhibit treats the rendered page as authoritative; a search index or AI/RAG system treats the text layer as authoritative. What this release removes is the safe assumption that the two are the same.
Every content-integrity signal we measured is a different way the same thing is true:
| Signal | Prevalence | How the visible page and the machine layer diverge |
|---|---|---|
| Invisible text layer (render mode 3) | 83.4% | A whole text layer exists that is never painted to screen |
| OCR text vs image mismatch | 18.6% | The hidden layer disagrees with the visible image (median overlap 0.16) |
| Hidden layer carries email headers | 53% of drift pages | Machine reads From/To/Subject/Date the image degrades |
| Parser disagreement | 61.9% | Readers disagree on the file's declared version and decode path (page and object counts agree) |
| Reading-order ambiguity | 44.7% | The order a machine reads text in is not determinate |
| Digital-to-image transformation | corpus-wide | The "page" is a rendered raster, not the original document |
| Orphaned metadata / objects | 96.1% | Superseded content (incl. original /Info) the reader never sees |
| Email-transport encoding residue | ~1.2% | Raw base64 / quoted-printable artifacts only a machine ingests |
This reframes what "reading" the Epstein files even means. A person opens a page image. A search index, an e-discovery platform, or an AI/RAG system ingests the text layer, the object graph, and the orphaned metadata — a different representation, one that for nearly one document in five does not match the visible page, and that no two PDF parsers fully agree on. There is no single canonical reading of this corpus: there is the human view and there is the machine view, and the gap between them is measurable, widespread, and — for automated analysis at scale — the most important property of the release.
The limit holds here too: that the machine layer diverges from the page is an observable technical fact. Whether any specific divergence reflects intent, OCR error, or conversion artifact requires evidence beyond PDF structure. We report the divergence and its scale, not a motive.
Finding 13 — The Numbering Shows a 2.4%-Complete Production
The Bates numbering is page-perfect and reuse-free, yet the released pages occupy just 2.4% of their 2.85-million-page numbered range, in 16 islands with three contiguous multi-hundred-thousand-page gaps.
Every file is named by a Bates number (EFTA + eight digits), stamped onto
the page by the dedicated per-page overlay characterized in Finding 11. That makes the
corpus a sequence — and the sequence proves the numbering is strictly per
page: for 16,914 of 16,970 consecutive document boundaries, the
next document's first Bates number equals the previous document's first number plus its
exact page count, with zero overlaps anywhere in the corpus. The documents were sliced from
continuous scan runs, the release preserves production order, and no Bates number is reused.
It is a clean, mechanically-produced numbering — which is precisely what makes its
gaps measurable.
The 16,971 released documents total 67,143 numbered pages, but their Bates numbers run from
EFTA00000001 to EFTA02853705 — a numbered range of
2,853,705 pages. The release therefore accounts for 2.4% of its own
numbering range; roughly 2.79 million numbered pages inside that range
are absent from the release. And the absences are not spread evenly — the
released documents collapse into 16 contiguous islands, with
87% of all documents (14,723) packed into the first ~40,000 Bates numbers,
followed by three contiguous deserts:
| Absent contiguous range (between two released documents) | Numbered pages absent |
|---|---|
EFTA00039881 → EFTA01262782 | 1,222,900 |
EFTA01264396 → EFTA02209722 | 945,325 |
EFTA02212972 → EFTA02730265 | 517,290 |
| + 53 further gap boundaries | 10 still exceed 1,000 pages each |
The limit applies with full force here. What our data establishes is structural: the released PDFs occupy 2.4% of a page-contiguous, reuse-free Bates range, in sixteen islands, with three multi-hundred-thousand-page contiguous gaps. What it cannot establish is the cause of the absences — numbered pages may have been withheld, redacted in full, released only as non-PDF native exhibits (the video and spreadsheet files we did not scan), or assigned to separate productions outside this corpus. We report the shape and scale of what is absent, not the reason for it.
Finding 14 — Malware: Clean
For all the integrity questions it raises, the release is malware-clean — zero known-malware hashes, zero working exploit vectors, across all 16,971 documents.
One result underlies every finding above: for all the integrity questions this release raises, it carries no malware. Across all 16,971 documents:
- 0 known-malware hash matches (offline threat intelligence, 6.4M+ indicators).
- 0 confirmed malicious executables, dropper chains, or weaponized JavaScript actions. No file carries a genuine exploit execution vector.
- A handful of files initially tripped a heap-spray byte heuristic. We verified these as
false positives: the patterns are flat regions and incidental byte
sequences inside compressed scanned-page images, not shellcode — no
%uheap-spray strings, no NOP sled, no executable JavaScript action, only image data. The engine was corrected so these image-entropy patterns no longer escalate, and every figure here reflects the corrected engine.
The release is safe to open. Its risks are to interpretation, not to the system.
Methodology note: a false positive we found and fixed
This finding is itself a result of the study. On the first full pass, 467
documents tripped a heap-spray byte heuristic, and four scored as
"JavaScript + Heapspray Shellcode" with a maximum threat score. Rather
than report them, we pulled the highest-scoring files and inspected the bytes directly.
The root cause was benign: the "heap-spray" pattern was a flat region inside a
compressed scanned-page image, and the "/JS" was an incidental byte substring
inside a Flate stream — no %u heap-spray string, no NOP sled, no
JavaScript action dictionary.
We corrected three detector roots so image entropy can no longer masquerade as an
exploit: the YARA NOP-sled literal was raised from 16 bytes to a 200-byte run (a real
sled cannot survive Flate compression); the JavaScript test was changed from a raw
substring to PDF action syntax (/S /JavaScript, /JS with a
string/stream/indirect reference); and the raw heap-fill byte-run heuristics were gated
on a genuine JavaScript spray context. The four flagged files dropped to a zero threat
score, and every figure in this report reflects the corrected engine. We document the
error because a forensic tool that hides its own false positives cannot be trusted to
report anyone else's.
Implications for AI & RAG Systems
The findings above are not only a record of how the release was made; together they describe a substrate that is actively hostile to automated reading. Anyone who indexes, searches, or feeds this corpus to a retrieval or language-model pipeline inherits every one of these properties. The consequences are concrete:
- You ingest the hidden OCR layer, not the page a human sees. The only machine-readable content is the invisible text drawn behind the image (Finding 5), and on 18.6% of documents that layer diverges from the visible page (Finding 7) — median word-overlap 0.16 on the divergent pages. A model can answer fluently from text the source image does not support, with no visible cue that the answer is ungrounded.
-
There is nothing to chunk on. 99.9% of documents are untagged — no
structure tree, headings, reading order, or
/Alttext (Finding 11). Structure-aware chunking degrades to raw OCR text flow, whose reading order is ambiguous on 44.7% of documents (Finding 6), so chunk boundaries fall mid-thought and retrieval recall suffers. - Your corpus can depend on your parser. On 61.9% of files independent PDF libraries disagree about how to decode the document — its declared version and the recovery path that follows (Finding 6) — and a tool that takes the wrong path can extract different text. Pin one parser and version it, or two teams can build measurably different indexes from the identical release.
- The shipped text is provisional, not authoritative. Every page is a fixed 96-DPI raster (Finding 9); at that resolution a modern OCR engine re-run over the same images yields a different — usually better — text layer than the one bundled in the file. Treat the embedded OCR as a draft and re-OCR before indexing if accuracy matters.
-
Naive object walks surface buried content. 96.1% of files retain
orphaned objects, including superseded
/Infodictionaries and data in compressed object streams (Finding 5). An extractor that walks every object — not just the live page tree — ingests superseded and non-rendered content; decide deliberately whether that belongs in your index. - The release is a 2.4% slice — absence is not evidence of absence. The Bates numbering shows the released pages occupy just 2.4% of their numbered range (Finding 13). A system that returns “no documents about X” is reporting the contents of this slice, not of the underlying production; do not let a model infer that something did not happen from its absence here.
A practical checklist for anyone building on this corpus:
| Do this | Because |
|---|---|
| Re-OCR every page at higher resolution before indexing | The bundled text layer is a provisional 96-DPI pass and diverges from the image on 18.6% |
| Pin and version a single PDF text extractor | 61.9% parser disagreement makes the extracted corpus parser-dependent |
| Validate extracted text against the rendered page image | The hidden layer is the only machine-readable content and is not guaranteed to match the page |
| Decide explicitly whether to include orphaned / non-rendered objects | 96.1% retain superseded content a full object walk will surface |
| Scope retrieval coverage to this 2.4% slice | The numbering shows most of the production range is absent from the release |
None of this concerns document content or its truth. It concerns whether an automated reader can faithfully recover what the page shows — and for this corpus, by construction, it often cannot without deliberate countermeasures.
What This Means
- Provenance is partly recoverable, partly gone. Active metadata is stripped, but the OmniPage→Processing-CLI toolchain, the dated processing waves, and a few original 2013 dates survive in orphaned objects.
- The release is a render-to-image production, processed in batches by two pipelines — an observation about process, not a claim about content.
- For nearly one document in five, the machine interpretation differs from the visible record: the OCR text layer diverges from the page image, and there is no semantic layer to fall back on. Any party indexing, searching, or feeding this corpus to an AI system is, for thousands of documents, operating on text that does not match what the page shows.
- The release is a small, clustered slice of its own numbering. The Bates sequence is page-perfect and reuse-free, yet the released pages occupy just 2.4% of their numbered range — the documents fall into sixteen islands with three contiguous, multi-hundred-thousand-page gaps. The structural absence is precise; its cause is not something PDF forensics alone can resolve.
These are exactly the conditions a multi-axis forensic engine is built to surface — and they are invisible to malware-signature scanning, which would correctly report this entire corpus as clean.
Appendix A — Every Indicator, by Prevalence
All distinct forensic indicators raised across the corpus, as a share of 16,971 documents. Capability and structure indicators are reported on their own axes and do not drive the malware verdict.
| Indicator | Files | Share |
|---|---|---|
| Empty active metadata | 16,971 | 100% |
| Recoverable toolchain in orphaned metadata (active /Info empty) | 11,165 | 65.8% |
| Bates overlay in a dedicated content stream (hex-encoded id, Helvetica) | 16,971 | 100% |
| Empty leftover content stream (stamping-pipeline bloat) | 16,971 | 100% |
| Legacy /ProcSet resource array retained | 16,971 | 100% |
| Bates stamp at 12.0 pt exactly (remainder matrix-scaled) | 13,730 | 80.9% |
| Retained page /Thumb thumbnail | 16,532 | 97.4% |
| Incremental update: new objects in later revisions | 16,971 | 100% |
| Incremental object override: existing OID re-defined | 16,971 | 100% |
| Orphan objects in xref | 16,306 | 96.1% |
| Invisible text (rendering mode 3/7) | 14,152 | 83.4% |
| Multiple %%EOF markers | 10,513 | 61.9% |
| /ObjStm object streams | 10,513 | 61.9% |
| Mixed xref table and xref stream | 10,513 | 61.9% |
| Data in PDF comment between revisions | 10,499 | 61.9% |
| Differential parsing: PDF version mismatch | 10,499 | 61.9% |
| Original save missing required binary-data comment (§7.5.2) | 10,508 | 61.9% |
| Email-structured text (From/To/Subject/Date) | 8,702 | 51.3% |
| Multi-column layout with ambiguous reading order | 7,587 | 44.7% |
| Grayscale image stored as RGB | 5,673 | 33.4% |
| Entropy cliff at revision boundary | 3,814 | 22.5% |
| OCR/text-layer mismatch (any page) | 3,159 | 18.6% |
| Large incremental injection in final revision | 2,323 | 13.7% |
| Overlapping text blocks | 1,293 | 7.6% |
| High-entropy streams | 984 | 5.8% |
| /Trans presentation dictionary | 439 | 2.6% |
| /ASCII85Decode | 425 | 2.5% |
| Invalid FontDescriptor /Descent (non-negative) | 619 | 3.6% |
| base64 fragment in text layer | 70 | 0.4% |
| Quoted-printable residue in text layer | 57 | 0.3% |
A long tail of indicators appears on fewer than 0.2% of files (isolated CVE-pattern byte matches, a single /XFA, a single calculation-order array). All were individually reviewed; none corresponded to a working exploit.
Structural negatives (exact counts over all 16,971): 0 encrypted, 0
linearized, 0 embedded files/attachments, 0 form fields, 0 annotations, 0 link objects, 0
embedded fonts, 0 documents carrying /Alt or /ActualText. The
absence of these features is as much a fingerprint of the production pipeline as the
indicators above — the corpus is a uniform population of inert page-image carriers.
Appendix B — Engine Coverage
All 47 analysis passes ran on every document. The provenance-relevant engines and what each contributed to this study:
| Engine | Contribution here |
|---|---|
| OCR Text-Layer Integrity | Jaccard image-vs-text divergence — the 18.6% reality-drift cohort |
| Six-Parser Differential | Version/structure disagreement — 61.9% |
| Revision History + Trailer Chain | Generations, Bates-stamp passes, dated production waves |
| XRef Integrity Graph | Orphaned & superseded objects (incl. recoverable /Info) |
| Metadata Analyzer + Reconciliation | Active-metadata stripping, orphaned-toolchain recovery, date correlation |
| Physical Entropy Topology | Image-stream uniformity, revision-boundary entropy cliffs |
| Reading-Order Analysis | Multi-column / overlapping-text ambiguity (44.7%) |
| Unicode & Invisible Text | Render-mode-3 hidden text layers (83.4%) |
| Accessibility-Tree Forensics | Absent semantic layer (99.9% untagged) |
| Object-Stream Analysis | Hidden compressed objects (61.9%) |
| Sandbox · YARA · ClamAV · ML · Threat-Intel | Malware axis — clean across the corpus |
Appendix C — Production Pipelines & Structural Cohorts
The release resolves into four production pipelines and a set of structural cohorts isolated from the bytes — each cross-referenced to the finding that establishes it. The diagram shows the four generators named by recovered metadata (Finding 4); the table catalogs every cohort with its defining structural signal.
| Cohort | Files | Header | Defining structural signal | Findings |
|---|---|---|---|---|
| Pipeline A | 10,718 | 1.3 | Render-to-image scan; /ObjStm + mixed xref table/stream + 3× %%EOF | 1, 6 |
| Pipeline B | 5,828 | 1.5 | Single-pass structure, 2× %%EOF (includes the 14 Word originals) | 1 |
| ReportLab sub-cohort | 425 | 1.4 | Born-digital generation; /ASCII85Decode | 1, 4 |
| By header version these three rows partition the corpus exactly: 10,718 + 425 + 5,828 = 16,971. | ||||
| OmniPage CSDK 21.1 → Processing-CLI | 10,499 | 1.3 | OCR + batch-assembly toolchain recovered from orphaned /Info | 4 |
| pypdf | 227 | — | Python pypdf Producer in orphaned /Info — a late manipulation pass | 4 |
| ReportLab | 425 | 1.4 | ReportLab generator recovered from orphaned /Info | 4 |
| Microsoft Word 2007 | 14 | 1.5 | Word 2007 generator; 2013-04-16 creation date | 3, 4 |
| No recoverable fingerprint | 5,806 | mixed | Orphaned /Info empty as well as active metadata | 4 |
| The four recovered generators account for 10,499 + 227 + 425 + 14 = 11,165 (65.8%); the remaining 5,806 carry no recoverable authoring fingerprint. | ||||
Reproducibility
Every figure above derives from machine-readable per-document JSON — one result file per PDF, all 16,971, zero failures. The verdict model, indicator definitions, and per-engine output are the standard PQ PDF scanner outputs; any document's full forensic record can be regenerated by re-scanning the corresponding PDF with the PDF Forensics Scanner.