11 KiB
PdfCraft integration candidate, 2026-10-30
Base: 1d1cbc4ec9
Validation: combined GitHub CI passed on bdf56209ce (Linux and Windows, run 41038860617). No fresh manual GUI pass has been performed. The subsequent architectural-guard additions require a fresh run.
All included source heads are preserved as merge parents, retaining original authorship. No upstream PR was merged. Conflicts were resolved after the user requested inclusion despite merge conflicts.
Review follow-up and withheld behavior
Review 5712795161 identified combined-behavior gaps after the green baseline at 673178b.
The follow-up is pending fresh hosted validation; earlier results below are historical evidence.
- Backdrop detection uses a shared strict 64 KiB decoding budget, including intermediate filter outputs, and caps content-stream entries. A fill stream executed more than once on the page is treated as ambiguous and is not replaced; source artwork stays untouched.
- Monochrome downsampling no longer guesses Indexed/custom color-space polarity. Those images may be recompressed losslessly but retain their resolution. A local 2-by-2 patch of mixed output samples conservatively retains the entire source image, even when white margins dominate it.
- Withheld from #4180: selected-row alignment of existing PDF paragraphs. The UI disables it for a text selection and the editing API explicitly refuses per-row alignment intent before mutation. Whole-paragraph alignment and the independently persisted alignments of added text remain available. Prior immediate-row tests are replaced by safe-refusal tests; no cross-session alignment guarantee is claimed for the withheld feature.
- The custom JBIG2 encoder still needs separate representative independent-decoder qualification. No codec corruption defect has been established by this review. No fresh native manual GUI acceptance pass is claimed.
Included
- #4304: M11: PDF Optimizer stores black-and-white images as CCITT Group 4 (optimize.mono-compression) (
1b7164cab1) - #4335: M11: black-and-white pictures stay one bit: Create PDF, the optimizer, and CCITT image export (
210ba20fe6) - #4384: M11: Monochrome Images ▸ Downsample: black-and-white images above 450 ppi are averaged down to 300, Group 4 scans included (
1ad951e25b) - #4404: M11: the optimizer stores Group 3 fax as Group 4, and packs black-and-white RGB and two-entry indexed images to one bit (
2d0a7b2241) - #4179: fix(ui): Ctrl+Z in an open paragraph undoes the document, not stale text (
296b930098) - #5300: fix(ui): a press on the page belongs to what its one hit test finds, until the button is up (
11bc8c5652) - #4719: fix(comments): delete or edit one reply from its own menu, keeping the thread (
adeb9c1cf2) - #4541: M5: a moved comment is drawn where it goes while it is dragged (
f0cd96e90b) - #2815: fix(edit): show backgrounds on pages that paint their own white backdrop (
9aaac56417) - #4620: feat(edit): Esc in an open paragraph selects its box, so Delete removes it (
64fba7d177) - #3789: Alt+Left / Alt+Right go back and forward through the view history (#3632) (
08f3991ab9) - #3779: Window title: mark unsaved changes, and set it on the web (#3640) (
3850c9f52e) - #2960: Keep lines with footnote references in paragraph reading order (#2929) (
2a7e5bda26) - #5208: M10: export a PDF to Markdown (#1595) (
20d396d180) - #4596: fix(organize,print): join /Contents array pieces with a space (#3502) (
d58d121170) - #3636: Content streams: step over a malformed token instead of ending the page (
43337c7fd5) - #4494: M2: page_render and render_preview report the render warnings next to the PNG (#4340) (
5ada1249e9) - #4013: fix(engine): generate Protect keys and salts with getrandom (#4000) (
c580b55055) - #5134: fix(ui): keep the All tools rows clear of the scrollbar (#5133) (
0c5119791d) - #2133: Fix Pages sidebar select-all keyboard shortcut (#2052) (
7227eb68ab) - #2635: Allow typed font sizes and Fill & Sign text colours (
4b319bb383)
Added after conflict resolution
- #4320: M11: lossless JBIG2 for black-and-white images (optimize.mono-compression) (
e18d1bfed3). - #4805: M11: JBIG2 symbol coding for black-and-white images (optimize.mono-compression) (
c7f39a4d9a). - #4325: M6: calculation checks: formulas reading missing fields, scripts building names, shown on the Calculation order page (
ebad7f849d). - #4180: M7: align the selected lines of a paragraph or text box on their own (
5a86f35210). - #1952: feat(forms): edit checkbox and radio export values (#231) (
e19f964690). - #2529: M7: keep a blank line as a paragraph break (#2517) (
55a933800b).
Additional previously reviewed parity fixes: #2133, #2635 and #1952. Excluded held PRs #4648, #2877 and #3762 were not included. Source reviews and individual hosted CI do not establish combined-build safety; the integration gate must pass.
Integration-specific changes: preserve hard/soft wrap metadata together with per-row alignment; share CCITT/JBIG2 export paths with the 32 MiB globals cap retained; keep downsampling and RGB ownership guards with JBIG2 encoding; retain all translation keys and both sets of regression tests.
Per-PR regression evidence
Evidence: Linux job 124006360624 on bdf56209ce: 5,627 passed, 15 skipped. The Windows leg of the same run also passed.
For each source-head diff above, the added #[test] function names were matched against PASS/SKIP entries in the combined Linux log. Every listed source regression was found passing, none skipped or missing. Counts overlap because stacked PRs carry their prerequisites; they must not be summed as distinct tests. This records source regression coverage, not manual feature acceptance.
- #4304: 11/11 added source regression names passed; 0 missing, 0 skipped.
- #4320: 21/21 added source regression names passed; 0 missing, 0 skipped.
- #4325: 18/18 added source regression names passed; 0 missing, 0 skipped.
- #4335: 19/19 added source regression names passed; 0 missing, 0 skipped.
- #4384: 39/39 added source regression names passed; 0 missing, 0 skipped.
- #4404: 50/50 added source regression names passed; 0 missing, 0 skipped.
- #4805: 36/36 added source regression names passed; 0 missing, 0 skipped.
- #5300: 18/18 added source regression names passed; 0 missing, 0 skipped.
- #4719: 6/6 added source regression names passed; 0 missing, 0 skipped.
- #4541: 5/5 added source regression names passed; 0 missing, 0 skipped.
- #2815: 35/35 added source regression names passed; 0 missing, 0 skipped.
- #4620: 1/1 added source regression names passed; 0 missing, 0 skipped.
- #2529: 35/35 added source regression names passed; 0 missing, 0 skipped.
- #3789: 5/5 added source regression names passed; 0 missing, 0 skipped.
- #3779: 4/4 added source regression names passed; 0 missing, 0 skipped.
- #2960: 1/1 added source regression names passed; 0 missing, 0 skipped.
- #5208: 2/2 added source regression names passed; 0 missing, 0 skipped.
- #4596: 1/1 added source regression names passed; 0 missing, 0 skipped.
- #3636: 3/3 added source regression names passed; 0 missing, 0 skipped.
- #4494: 4/4 added source regression names passed; 0 missing, 0 skipped.
- #4013: 4/4 added source regression names passed; 0 missing, 0 skipped.
- #4180: 54/54 added source regression names passed; 0 missing, 0 skipped.
- #4179: 20/20 added source regression names passed; 0 missing, 0 skipped.
- #5134: the source diff adds no test function. Combined gates passed; no new manual scrollbar acceptance is claimed.
- #2133: 1/1 added source regression names passed; 0 missing, 0 skipped.
- #2635: 6/6 added source regression names passed; 0 missing, 0 skipped.
- #1952: 6/6 added source regression names passed; 0 missing, 0 skipped.
The conflict-specific tests wrapped_rows_keep_alignment_separate_from_hard_break_markers and black_and_white_images_become_jbig2 (including the CCITT-to-JBIG2 conversion/render assertions) passed in that same run. Those counts describe that baseline. In the review follow-up, unsupported existing-row alignment success tests are replaced by safe-refusal tests; the corresponding feature is withheld. Paragraph-boundary, field-calculation and button-export coverage is retained.
Protect dependency check
The integration base main commit 1d1cbc4ec9 already locks registry getrandom 0.4.3 (checksum 300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099). #4013 makes it a direct engine dependency rather than introducing an unrecorded package. The combined dependency-policy and asset gates passed. The fail-closed randomness regression also passed.