/target
pdfluent-examples/dotnet/**/bin/
pdfluent-examples/dotnet/**/obj/
.env
.env.*
*.pem
*.key
*.p12
*.pfx
*.swp
*.swo
.DS_Store
*.pdf
!/tests/fixtures/*.pdf
!/fixtures/formcalc/*.pdf
!/fixtures/xfa-layout/*.pdf
!/fixtures/xfa-data/*.pdf
!/fixtures/scanned/*.pdf
# Hostile PDFs: small, hand-built files that must not crash the renderer (#262).
!/fixtures/pdf/*.pdf
# The document every binding's structured-extraction suite reads (#573). It is
# built and pinned by crates/pdf-engine/tests/the_api_over_the_block_model.rs;
# the older files beside it are tracked from before `*.pdf` was ignored at all,
# which is why only this one needs saying.
!/fixtures/structured.pdf
# Three text pages under a two-level outline, which the chunk suites of both
# bindings read for per-page toc_items. Built by
# scripts/make-outlined-fixture.py, byte-deterministic.
!/fixtures/outlined.pdf
# The four-page report with a running head and page numbers that the markdown
# furniture suites read. Built and pinned by
# crates/pdf-engine/tests/markdown_furniture_and_separators.rs.
!/fixtures/running-head.pdf
# One page with two hand-built image XObjects (7x5 RGB Flate, 4x3 Gray raw)
# that every binding's known-images suite reads. Built by
# fixtures/gen/known_images.py, byte-deterministic (#643).
!/fixtures/known-images.pdf
!/tests/corpus-mini/*.pdf
!/crates/pdf-java/src/test/resources/*.pdf
!/crates/visual-regression/fixtures/*.pdf
# One DocLayNet train page, registered in corpus_herkomst.py: the operator
# page of the list-splitting model (#599).
!/crates/pdf-engine/tests/fixtures/doclaynet/*.pdf
# PubTables-1M train pages, registered in corpus_herkomst.py (#574).
!/crates/pdf-engine/tests/fixtures/pubtables/*.pdf
metadata.sqlite
/reports/
/renders/
/crates/xfa-wasm/pkg/
/fuzz/artifacts/
/fuzz/corpus/*/
!/fuzz/corpus/*/seed_*
node_modules/
package-lock.json
!/test-data/xfa-golden/*.pdf
/benchmarks/weekly/benchmark-*.json
/benchmarks/weekly/benchmark-*-report.md
/benchmarks/weekly/regression-*.md
/benchmarks/stress-fixtures/
# Any __pycache__, at any depth. The narrower `scripts/__pycache__/` did not match
# scripts/ci/__pycache__/, so bytecode from the CI helpers kept turning up staged.
__pycache__/
*.pyc
.cache/
out/

# M8-CLEANUP-04 (#1380): VPS/local expensive validation reports
validation-reports/

# Build artifacts: Python bindings (maturin/PyO3 compiled extensions).
# Machine-specific, must never be committed.
crates/pdf-python/python/**/*.so
crates/pdf-python/python/**/*.pyd
crates/pdf-python/dist/
# Project-local Python environment (`maturin develop` installs here).
.venv/

# Build artifacts: Node.js bindings (napi-rs compiled .node files).
crates/pdf-node/index.*.node
crates/pdf-node/artifacts/

# Build artifacts: the @pdfluent/extract wrapper (tsc emit, never source).
integrations/pdfluent-extract-js/dist/

# Belt-and-suspenders for wasm-pack output within pkg/ (already covered by /crates/xfa-wasm/pkg/ above).
crates/xfa-wasm/pkg/*.js
crates/xfa-wasm/pkg/*.wasm
crates/xfa-wasm/pkg/*.d.ts

# .NET and Java build outputs (added wave1-release)
bindings/dotnet/**/bin/
bindings/dotnet/**/obj/
bindings/java/target/
crates/pdf-java/target/

# .NET runtime-specific native bundles (regenerated at release time)
bindings/dotnet/**/runtimes/

# Java JNA native bundles (built by release pipeline, not committed)
bindings/java/src/main/resources/native/

# .NET NuGet packages
*.nupkg

# Doxygen generated output
crates/pdf-capi/doxygen-out/

# Compiled C example binaries (built by examples/Makefile)
crates/pdf-capi/examples/license_activate

# M9-A hygiene: generated publish dry-run logs embed machine-local /Users/ paths
benchmarks/runs/**/dry_run_logs*/
benchmarks/runs/**/dry_run_logs/
**/audit_rust_post_commit.log

# Corpus PDFs: large public-domain input files; not needed for CI builds.
# Exception: small test fixtures referenced by non-ignored integration tests.
# Note: only ignore the PDFs/JSONs, not the directory itself, so exceptions work.
corpus/*.pdf
!/corpus/PDFBOX-4322-3.pdf
!/corpus/f1040.pdf
!/corpus/sf15.pdf
!/corpus/sf181.pdf
!/corpus/fw7.pdf
corpus/*.json
# The gate corpus is a manifest, not a directory of PDFs: URLs pinned to an
# upstream commit plus a SHA-256 each. Text, so it publishes safely (#215),
# and it is the thing the pull-request gates are pinned to (#276).
!/corpus/GATE_CORPUS_MANIFEST.json
!/corpus/GATE_CORPUS_KNOWN_CRASHES.json
# Where fetch_gate_corpus.py materialises that manifest. Never committed.
/corpus/gate/
# ...but the gate manifests are inputs, not outputs. They are tracked, and
# `corpus/*.json` above would silently drop a re-added one -- the others
# survive only because they predate that line. Declared, so the next person
# who deletes and restores one does not lose it without being told.
!/corpus/SSIM_GATE_MANIFEST.json

benchmarks/runs/xfa_enterprise_plan/sprint2/heatmaps_demo/
crates/pdf-capi/tests/test_text_blocks
crates/pdf-capi/tests/test_structured_extraction
crates/pdf-capi/tests/test_journal
crates/pdf-capi/tests/test_form_write
crates/pdf-capi/tests/test_plain_images
benchmarks/runs/xfa_enterprise_plan/custom_defects/xfa_test_flatten/artifacts/
/dist/

# ── Fuzz build outputs ────────────────────────────────────────────────────────
# The root /target rule only covers the workspace target. Every fuzz crate builds
# its own target/ under its fuzz/ subdirectory and these are never source.
/fuzz/target/
**/fuzz/target/

# ── WASM pkg-release directory ────────────────────────────────────────────────
# /crates/xfa-wasm/pkg/ is already covered above; pkg-release/ is the optimised
# release variant produced by wasm-pack --release and is equally reproducible.
/crates/xfa-wasm/pkg-release/

# ── Native binary artifacts (belt-and-suspenders) ─────────────────────────────
# Specific directories are already covered above (bindings/**/runtimes/, etc.).
# These global patterns guard against any new crate that adds a native output
# path not yet covered by a directory rule.
# Exceptions: none expected — no legitimate source file has these extensions.
*.dylib
*.dylib.dSYM/
**/*.dSYM/
*.dll
*.so
# *.rlib and *.rmeta live inside target/ (already ignored) but cover edge cases
# where cargo or fuzz builds emit them outside the workspace target directory.
*.rlib
*.rmeta

# ── pdfluent-examples example node_modules ───────────────────────────────────
# The top-level node_modules/ rule covers workspace root, but examples that run
# npm install inside their own subdirectory need this explicit pattern.
pdfluent-examples/**/node_modules/
crates/pdf-node/node_modules/

# ── local measurement output ───────────────────────────────────────────────
# Jobs write evidence under meas-out/<name>/ inside the workspace; the
# launcher copies it out afterwards. Never committed, and invisible to the
# clean-tree gates (a run that refused itself over its own output dir).
# Measurement outputs: local proof logs, never tracked (#574).
meas-out/
# Measurement evidence, same rule: train Q carried meas/p4l-3f/ into the repo.
meas/
