배경
HWPX/HWP5 동일포맷 roundtrip(불러오기→저장하기→재불러오기) 무손실 4단계 검증(IR·텍스트·한글 재열림·한글 PDF) 결과, IR 뼈대 diff=0이 무손실을 보장하지 않음이 실증됨. (보고서: output/poc/fidelity/report.md)
발견된 손실:
- F1(심각):
serialize_document(HWP5)가 일부 BinData 그림 스트림을 통째 드롭. 표본 25건 중 4건/19스트림(KTX 3/3, Worldcup 13/47, interview 383KB jpg). IR diff=0·텍스트 동일이라 자동검사 전건 false PASS. 유지 이미지의 크기변동은 무손실 재압축으로 확인.
- F2(심각): KTX(437문단·다중 표) 저장본이 한글에서 27쪽→1쪽 붕괴. rhwp는 2-round r2=0으로 자가검출 불가(자기일관). 외부 한글 오라클만 검출.
- F3(경미): HWPX 컨트롤 슬롯 8유닛 시프트 — samples엔 없고 hwpdocs 실문서 9/25에만 노출.
문제: HWP5 roundtrip 게이트 부재
hwpx-roundtrip에 대응하는 HWP5 게이트가 없음(convert+ir-diff 수동 체인).
- IR diff·hwpx-roundtrip 모두 BinData 스트림을 비교하지 않음 → F1 미감지.
serialize_hwp_with_verify(페이지수 복원 검증)는 코드에 있으나 CLI/배치 미노출 → F2 미감지.
제안: hwp5-roundtrip CLI 신설
hwpx-roundtrip 미러 + HWP5 고유 검사 추가:
- parse → export_hwp_native → 재parse + IR diff(기존 diff_documents)
- BinData 스트림 보존 검사(count + decompressed 내용 멀티셋) — F1 게이트화
- 페이지수 복원 검사(
serialize_hwp_with_verify 활용) — F2 게이트화
- CFB/OLE 구조 검사(필수 스트림: FileHeader/DocInfo/BodyText/Section*)
- 2-round 안정성 + 배치 모드 + inventory.tsv + 종료 코드(CI)
부수: 본 게이트가 잡아낼 실제 결함(F1·F2)·HWPX F3는 별도 후속 이슈로 분리.
산출물(본 조사)
- 보고서/harness:
output/poc/fidelity/ (fidelity_t1t2.py/t3_reopen.py/t4_visual.py, pyhwpx+olefile+pymupdf)
배경
HWPX/HWP5 동일포맷 roundtrip(불러오기→저장하기→재불러오기) 무손실 4단계 검증(IR·텍스트·한글 재열림·한글 PDF) 결과, IR 뼈대 diff=0이 무손실을 보장하지 않음이 실증됨. (보고서:
output/poc/fidelity/report.md)발견된 손실:
serialize_document(HWP5)가 일부 BinData 그림 스트림을 통째 드롭. 표본 25건 중 4건/19스트림(KTX 3/3, Worldcup 13/47, interview 383KB jpg). IR diff=0·텍스트 동일이라 자동검사 전건 false PASS. 유지 이미지의 크기변동은 무손실 재압축으로 확인.문제: HWP5 roundtrip 게이트 부재
hwpx-roundtrip에 대응하는 HWP5 게이트가 없음(convert+ir-diff수동 체인).serialize_hwp_with_verify(페이지수 복원 검증)는 코드에 있으나 CLI/배치 미노출 → F2 미감지.제안:
hwp5-roundtripCLI 신설hwpx-roundtrip미러 + HWP5 고유 검사 추가:serialize_hwp_with_verify활용) — F2 게이트화부수: 본 게이트가 잡아낼 실제 결함(F1·F2)·HWPX F3는 별도 후속 이슈로 분리.
산출물(본 조사)
output/poc/fidelity/(fidelity_t1t2.py/t3_reopen.py/t4_visual.py, pyhwpx+olefile+pymupdf)