Repository navigation
Fullbleed 2.5.31 ? rich table content tagging
Rich table cells now preserve separate content ownership for paragraphs, styled spans, lists, figures and nested tables. Previously, these elements could create nested marked-content IDs inside a TH/TD—even when a PDF/UA validator returned a passing profile result. Plain cells keep their existing text owner, and table borders and backgrounds remain artifacts in tagged output.
No authoring API or runtime dependency is added. All 60 untagged regression PDFs retain their 2.5.30 bytes. This fixes the native engine defect in issue #97; the experimental component alpha still needs its separate qualified native update.
Validation retained with this release:
- 1,389 native tests, 11 doctests and 661 installed Python tests pass, with no Python skips. Package metadata, runtime-generated contracts, bundled Skill and all three goldens pass.
- The saved-PDF gate passes 180 cases over tagged PDF, PDF/UA-1 and PDF/UA-2, using direct, compiled, repeated and both reflow compression modes. It checks content ownership, header scope and spans, explicit header references, alternative text, row pagination, text retention and deterministic output. All 360 Windows/Linux CI PDFs equal the optimized local results.
- The public 2.5.30 negative control fails 135 cases; 45 controls pass. Text, paint, table relationships and all 15 independent preview pages remain unchanged after the fix.
- Across 24 direct fixtures, veraPDF 1.30.3 warnings fall from 116 to zero. All twelve PDF/UA-1 fixtures pass. Six original component-export reproductions also pass PDF/UA-1 with clean validator stderr and unchanged text and pixels.
- The independent corpus has no changes from 2.5.30: all 1,662 PDFs, 3,827 rasters, scores and verdicts match. Its existing 1,620 PASS, 24 FAIL and 18 REFERENCE-DISPUTED results, upstream fingerprint disagreements and failed workflow conclusion are retained. No reference or tolerance was changed.
Two separate limitations remain: eleven table fixtures retain their existing PDF/UA-2 caption containment failures (#98), and an oversized rich-cell probe times out on both the previous release and this candidate (#99). The passing pagination controls split ordinary rows. These focused checks do not establish general PDF/UA conformance or screen-reader usability.
See the release runbook and attached validation archive for the saved inputs, outputs, negative controls and reports.
Install with python -m pip install fullbleed==2.5.31 or fullbleed = "=2.5.31" in Cargo. All 15 public Python wheels and the source distribution were downloaded and matched against the release artifacts. The public Rust crate matches the tagged source and registry checksum.
Fresh public Python and Rust consumers reproduce all 180 qualified table PDFs byte for byte; the exact-tag Linux release gate matches the same outputs. The Rust consumer repeats every render and verifies determinism. The public Python wheel also reproduces all 60 untagged baseline PDFs and six original component-export PDFs byte for byte. The dedicated PDF/VT validator remains unconfigured.