Skip to main content
PDF Hell ships JUnit XML output and a --fail-threshold CI gate — drop it into any CI runner that renders JUnit (which is all of them).

GitHub Actions

Failures show up as red rows on the PR with the expected and observed answers in the failure message. The audit ZIP is downloadable from the workflow artifacts — attach it to a procurement appendix without any post-processing.

GitLab CI

CircleCI

pytest integration

pdfhell isn’t a pytest plugin (deliberately — it’s a benchmark, not a test framework), but you can call the runner from a pytest test:
Run with pytest tests/test_pdfhell_gate.py. If your CI uses pytest already, this slots into the existing test pipeline without changing the report format.

Reading the JUnit output

JUnit dialect — passes, failures, and “skipped” (refusals):
Failure types:
  • fell_for_trap — the model returned exactly the wrong answer the trap was designed to elicit. A known failure mode. Most diagnostic.
  • hallucination — the model returned something neither expected nor forbidden. A different kind of wrong.
Skipped cases are model refusals ("I can't determine...") — they don’t count as quality failures, but they don’t count as passes either.

The audit pack

--audit-pack <path> writes a ZIP procurement teams can attach to a diligence appendix. Contents:
Auditors verify the pack with:
If any file in the ZIP was edited after delivery, its hash diverges from the manifest and verification fails. Tamper-evident by construction.