fix(#2808): PR #2512 knife-edge +1 과분할 회귀 7건 — 판별자 2종 협소화 (10k 순개선 +17/−0) - #2810
planet6897 wants to merge 3 commits into
Conversation
…2종 협소화 10k r19 서베이에서 귀속된 edwardkim#2512(edwardkim#2439) 회귀 7건(전량 +1 과분할)을 원 수정의 의도 효과를 보존하며 복귀: 1. post-text(서명란) exclusion 소비를 다중 co-anchored float host 로 한정 — 단일 표 host 의 post-text 는 기존 앵커 유지(edwardkim#1549) 경로로 복원. layout(same_owner_table_precedes)과 typeset(post_height 소비) 동기. 2. 빈 host RowBreak 표의 줄 advance(tail) 가산에 저장 vpos ladder 증거 게이트 추가 — 접힌 ladder(next.vpos - host.vpos == host 줄 advance, edwardkim#2439 재현 문서의 저장 형상)에서만 발화. 물리 ladder(표 높이가 이미 vpos 에 반영) 문서는 tail 이 이중 계상되어 쪽 경계 한 줄이 +1 로 밀린다 (r18 픽셀 92~96%: 한컴은 painted-bottom 미예약). 검증: 회귀 7/7 한글 쪽수 복귀, edwardkim#2439 재현 문서 10쪽 유지, nextest 3570/3570, 92셋 게이트 92/92(100%), fmt/clippy 클린. 합성 픽스처(edwardkim#1549 재활용 hwpx·단위 테스트)에는 접힌 ladder 를 스탬프해 실계약 형상을 재현하고 물리 ladder 음성 케이스를 추가. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…d 4 실패 해소
본 PR 이 재현용으로 추가한 samples/issue2808_report_physical_ladder.hwp 가
ir_field_sweep 코퍼스에 편입되면서, baseline 에 없던 경로 1건이 회귀로 잡혀
Default-feature tests (shard 4/8) 가 실패했다. Build & Test 실패는 shard 카운트
파일이 7/8 로 모자란 파생 결과다.
[hwp5rb] issue2808_report_physical_ladder.hwp
sections[].paragraphs[].controls[].cells[].list_header_width_ref : 0 -> 22
이는 본 PR 의 코드 변경(renderer/layout/typeset)과 무관한 기존 직렬화 갭이다.
hwp5rb(재빌드 왕복) 레인에서 cells[].list_header_width_ref 는 표를 가진 .hwp
샘플 거의 전부가 이미 baseline 행을 갖고 있는 광역 항목이고, 본 PR 은
직렬화기를 건드리지 않았다. 즉 신규 샘플이 기존 갭을 한 건 더 드러낸 것뿐이라
게이트 문서의 절차대로 baseline 을 갱신하고 사유를 남긴다.
검증: cargo test --test ir_field_sweep_baseline (debug, 전체 모드)
샘플 797건(스킵 1) / 발산 경로 702종 / 총 110202건 — 회귀 0, 개선 0
ir_field_sweep_does_not_regress + baseline_samples_exist 2/2 통과.
baseline 데이터 행 702 = 현 스윕 경로 702종으로 정확히 일치한다.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CI 수정 —
|
|
@planet6897 이 변경은 통합 PR #2815에 체리픽하여 fix와 IR baseline test 두 커밋을 보존했습니다. 로컬 focused test, 통합 PR의 CI·CodeQL·Render Diff는 모두 성공했습니다. HWP 2쪽·HWPX 1쪽 기준 PDF를 HWP 2020으로 산출해 visual sweep을 수행했으며 구조 후보는 없었습니다. 검토 기록과 시각 증적을 함께 보관했습니다.
|
요약
10k r19 서베이(PR #2807)에서 전수 bisect로 귀속한 PR #2512(#2439) 회귀 7건(전량 +1 과분할, 이슈 #2808)을 원 수정의 의도 효과를 보존하면서 복귀시킵니다. 두 하위 메커니즘의 발화 조건을 실세계 판별자로 협소화했습니다.
1. post-text(서명란) exclusion 소비 — 다중 co-anchored host 한정
#2512는 같은 문단 표 뒤에 emit되는 post-text가 자기 exclusion을 소비하도록 했는데, 이것이 단일 표 host(별지/서식류)의 post-text까지 밀어내 +1 과분할을 만들었습니다(.hwpx 3건). #2439 형상(표 2개 co-anchored 스택 + 서명란)에서만 필요하므로
owner 문단의 co-anchored float ≥ 2로 한정 — layout(same_owner_table_precedes)·typeset(post_height 소비) 동기 유지. 단일 표 host는 기존 #1549 앵커 유지 경로로 복원됩니다.2. 빈 host RowBreak tail — 저장 vpos ladder 증거 게이트
#2512 후속 커밋(8e80671)의
native_empty_host_rowbreak_line_advancetail(host 줄 advance + 양수 offset 가산)이 일반 .hwp 4건에서 쪽 경계 한 줄을 +1로 밀었습니다. 판별자는 저장 vpos ladder입니다:next.vpos − host.vpos == host 줄 advance— 표 높이가 ladder에 접혀 있고 advance가 실제 흐름 증거 → 발화 유지next.vpos가 표 높이+offset을 이미 포함 → advance 가산은 이중 계상 → 억제 (r18 픽셀 92~96%: 한컴은 painted-bottom 미예약)검증
samples/issue2439/)tests/issue_2439.rs+ 단위 테스트10k recount의 "복원 2건"은 #2512가 물리 ladder 문서에서 우연히 옮겨놓았던 knife-edge(6470000: 쪽수만 일치·PI_MISMATCH, 3780000: Δ−6→−5)가 r18 상태로 되돌아간 것으로, 신규 결함이 아닙니다. 오히려 BETTER 10건은 tail 이중 계상이 누적되던 대형 보고서들이 오라클 방향으로 복귀한 보너스입니다.
재현
이슈: #2808 (원인 귀속: 10k r19 보고서 PR #2807 §3)
🤖 Generated with Claude Code