Skip to main content
PDF Hell can fail a job on pass rate, emit JUnit XML, save the full JSON run, and bundle the PDFs and manifest into a hash-chained audit ZIP.

GitHub Actions

Use if: always() so failure evidence is uploaded even when the threshold gate returns nonzero.

GitLab CI

Choose the gate deliberately

  • Start with smoke to verify credentials and transport.
  • Use mini-v4-sample (170 cases) for routine regression checks.
  • Use mini-v4 (510 cases) when the additional per-family precision justifies the cost and runtime.
  • Set --fail-threshold from your own established baseline and product risk, not from another model’s leaderboard score.
  • Pin the pdfhell version in CI and retain the run’s suite hash.

Compare like with like

A valid before/after comparison keeps all of these fixed:
  • suite hash;
  • provider and model identifier;
  • PDF versus pixels-only modality;
  • DPI and rasterizer build for pixels-only runs;
  • generation version and case files.
Do not silently replace failed API calls with wrong answers. Current reports separate API errors, refusals, and incorrect answers; investigate transport errors before treating a red gate as a model regression.

Evidence packs

--audit-pack path.zip packages the generated documents, answer keys, result data, and integrity manifest. Keep the JSON and audit ZIP together for procurement, compliance, or incident review. The JUnit file is optimized for CI rendering and is not a substitute for the full result artifact.

Pixels-only CI

Name pixels artifacts explicitly and never compare their gate directly with a PDF-input baseline. They answer different questions about the model pipeline.