Repository navigation
Fixed
hwp mergeto.hwpkeeps genuine HWP5 paragraph shapes in either input order. Conversion
defaults now apply to each non-HWP5 input before header references are shifted, preserving
native zero border-fill values and old line spacing and resolving converted border fills
against their own palette. Converted inputs with zero or one border fill receive the missing
canonical no-border entries before grafting (#390).hwp mergeto.hwpassigns distinct nonzero paragraph instance IDs when inputs already share
IDs. The first occurrence keeps its ID; later duplicates and zeros receive unused IDs across
sections and nested record trees, including raw-backed text boxes. Unmerged HWP5 round trips
keep their original IDs (#393).- Part fills with hyperlinks or notes into
.hwpretain their control content and pass semantic
verification. Generated note list headers are now materialized independently of picture
synthesis (#391). - Cross-format part fills first convert the unedited template with strict preservation checks,
then verify edits against that target-format baseline. Conversion or editing failure leaves
the destination unchanged. The outer snapshot follows the source format's native container
limit. Nested private transactions use extended-length paths on Windows
(#392). hwp slots --formsno longer lists an inline label whose value text is only placeholder(s)
(목표: {{최종목표}}). The placeholder is already listed as its own field, and a fill defers
such a label to it, so a caller that sent a value for every scanned field always got those
labels back asunmatched(counts 0) with a warning. A label with text of its own next to a
slot (전략: 올해 {{추진전략}} 중심) is still listed, and so is a same-key sighting
(담당자: {{담당자}}), which merges into one field. Labels also stay available when
all slot names normalize to empty form keys (성명: {{()}})
(#385).
Verification
- Release-readiness run: https://github.com/STAIxBWLB/hwp-cli/actions/runs/36309366056
- The private PDF-parity profile excludes four gates. The public one-page gate declares none
(docs/design/21-pdf-parity.md section 4.3), so these exclusions describe the private profile
only. fonts: the document declares its dominant body face through asubstFont, and the oracle
host did not have that face either, so our substitutions resolve to the same faces the oracle
embedded. The gate'ssubstitution_freecriterion is unreachable for this case by
construction (section 4.5).text: 1/13 pages byte-equal; the differences are pagination, not characters. Page 4's only
diff is one line that crosses a page boundary (section 4.6).raster:bad_pixel_pct0.1418-0.2332, MAE 18.5-27.9, ink ratio 0.854-1.435, max abs dx/dy
40px (section 4.6).roi: 3 of 4 pass; only the page-2 diagram region fails (precision 0.848, recall 0.892)
(section 4.6).- Provenance: these distances were measured by the private composite run of 2026-08-16, not by
the public one-page gate.