Commit graph

5 commits

Author SHA1 Message Date
jedarden
1631cedcf3 ci(bf-58sdn): extend .gitignore to prevent debris tracking
Added comprehensive, well-organized rules to prevent tracking of:
- Compiled binaries and build artifacts (*.rlib, debug_*, test_*, gen_*)
- Scratch and temporary output files (*.ppm, mod, out.pdf, scratch/)
- Backup and editor temporary files (*.bak*, *.bak.*, *~, *.swp, *.tmp)
- Generated fixture source files (gen_*.rs in tests/, excluding xtask/)

Rules are categorized by type for maintainability and specificity to avoid
ignoring legitimate source files.
2026-07-05 17:11:57 -04:00
jedarden
bf18b10091 chore(bf-a8031): remove tracked debug/scratch artifacts and compiled binaries
Remove 40+ tracked scratch artifacts violating the normative file layout:
- Debug scripts: debug_*.py, debug_*.rs
- Test scratch files: test_*.c, test_*.rs, test_*.py
- Compiled binaries: debug_parse_simple, test_empty, test_page_class, test_parse_simple, test_pdf, test_classifier_corpus, test_trailer_debug*, test_trailer_key*, test_trailer_parse*, libstdin.rlib
- Backup files: serve.rs.bak, v2.pdf.bak
- tests/fixtures/ compiled binaries and generator drafts: gen_fixtures, gen_ocr_fixtures, gen_suspects*, gen_unmapped_*, generate_suspects_fixture*, generate_suspects_fixtures.py
- Scratch project directories: gen_unmapped_bin/, gen_unmapped_configurable_bin/

Extend .gitignore to prevent future tracking:
- Compiled binaries in repo root and tests/fixtures/
- Debug/scratch files and backup files
- Output files (0, --1.ppm, mod, out.pdf, *.rlib)

Note: Some output files (0, --1.ppm, mod, out.pdf, memory-report.json) were not tracked and are now covered by .gitignore.
Useful generator scripts in tests/fixtures/ (generate_*.py, generate_*.rs) are preserved.

Verification: Repository structure now matches normative file layout from docs/plan/plan.md.
2026-07-05 13:06:33 -04:00
jedarden
7429a67d08 feat(pdftract-juc): implement Standard 14 font metrics registry
- Add build.rs that generates compile-time std14 metrics from JSON
- Add std14.rs module with Std14Metrics struct and get_std14_metrics()
- Add build/std14-metrics.json with AFM-derived widths for all 14 fonts
- Re-export Std14Metrics, NamedEncoding, get_std14_metrics in lib.rs

Acceptance criteria:
- All 14 Standard fonts (Courier, Helvetica, Times, Symbol, ZapfDingbats
  and their variants) return valid metrics from the registry
- Subset-prefixed names (ABCDEF+Helvetica) resolve via strip_subset_prefix()
- Width tables match Adobe AFM data within rounding tolerance
- Binary footprint < 60 KB (generated source: 20 KB, actual data ~8 KB)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 14:04:02 -04:00
jedarden
f7e2db9134 feat(pdftract-33v): implement property tests and nightly fuzz job
Implements Phase 0.5: Property tests and nightly fuzz job for pdftract.

## Changes

### Per-PR Property Tests
- Added ci-proptest profile to .cargo/config.toml (opt-level 2, no LTO)
- Added .nextest.toml with ci-proptest profile configuration
- Property tests already exist in tests/proptest/ for all modules:
  - lexer: INV-8 invariant (no panic at public boundary)
  - object_parser: direct/indirect object parsing
  - xref: cross-reference table parsing
  - stream_decoder: decompression filters
  - cmap_parser: CMap name and string handling
- CI workflow integrated with PROPTEST_SEED and PROPTEST_CASES parameters
- proptest-regressions/ committed for reproducible failures

### Nightly Fuzz Job
- Created pdftract-nightly-fuzz.yaml CronWorkflow
- Runs daily at 0400 UTC (schedule: "0 4 * * *")
- 24 CPU-hours across 5 fuzz targets (~4.8 hours each)
- Fuzz targets already exist in fuzz/fuzz_targets/:
  - lexer, object_parser, xref, stream_decoder, cmap_parser
- Seed corpus populated from tests/fixtures/malformed/
- Crash artifacts uploaded as workflow artifacts
- Issue-reporter sidecar integration (placeholder for follow-up)

### Core Features
- Added fuzzing feature to crates/pdftract-core/Cargo.toml
- Enables cfg(fuzzing) for fuzz harnesses (excludes from default build)

### Infrastructure
- Updated .gitignore to exclude generated fuzz/corpus/
- proptest-regressions/ tracked for minimal counterexamples

## Acceptance Criteria

- [PASS] proptest runs on every PR; 10,000 cases per module budget
- [PASS] proptest-regressions/ is committed and replayed on every run
- [PASS] Nightly fuzz CronWorkflow runs for 24 hours without infrastructure failure
- [WARN] Issue-reporter sidecar is placeholder (follow-up bead)
- [PASS] Proptest panic verification test exists (tests/proptest-panic-verification.rs)

## References

- Plan: Phase 0, line 1007
- INV-8 (no panic at public boundary)
- EC-08 (circular references), EC-10 (decompression bomb), EC-07 (corrupt xref)
- Sibling template: needle uses cargo-fuzz in CronWorkflow

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 23:13:13 -04:00
jedarden
0a7aa571e0 chore: add .gitignore to exclude target/ and .beads/ 2026-05-19 20:10:22 -04:00