Skip to content

fix(#2808): PR #2512 knife-edge +1 과분할 회귀 7건 — 판별자 2종 협소화 (10k 순개선 +17/−0) - #2810

Closed
planet6897 wants to merge 3 commits into
edwardkim:develfrom
planet6897:fix/2808-2512-regression
Closed

planet6897 wants to merge 3 commits into
edwardkim:develfrom
planet6897:fix/2808-2512-regression

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

요약

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_advance tail(host 줄 advance + 양수 offset 가산)이 일반 .hwp 4건에서 쪽 경계 한 줄을 +1로 밀었습니다. 판별자는 저장 vpos ladder입니다:

  • HWP 반복 표가 6페이지에서 겹쳐 렌더링됨 (LAYOUT_OVERFLOW) #2439 재현 문서(기계 반복 양식): next.vpos − host.vpos == host 줄 advance — 표 높이가 ladder에 접혀 있고 advance가 실제 흐름 증거 → 발화 유지
  • 회귀 문서(물리 ladder): next.vpos가 표 높이+offset을 이미 포함 → advance 가산은 이중 계상 → 억제 (r18 픽셀 92~96%: 한컴은 painted-bottom 미예약)

검증

게이트 결과
회귀 7건 (debug+release) 7/7 한글 쪽수 복귀
#2439 재현 문서(samples/issue2439/) 10쪽 유지 (한컴 오라클)
tests/issue_2439.rs + 단위 테스트 전량 통과 (합성 픽스처에 접힌 ladder 스탬프 + 물리 ladder 음성 케이스 추가)
cargo nextest 전체 3,570/3,570
92셋 렌더 게이트 92/92 (100%) 유지
10k 쪽수 recount (r19 오라클 스냅샷 대조) 변경 19건 = 개선 17 (정합 복귀 7 + 오라클 접근 10) / r18 상태 복원 2

10k recount의 "복원 2건"은 #2512가 물리 ladder 문서에서 우연히 옮겨놓았던 knife-edge(6470000: 쪽수만 일치·PI_MISMATCH, 3780000: Δ−6→−5)가 r18 상태로 되돌아간 것으로, 신규 결함이 아닙니다. 오히려 BETTER 10건은 tail 이중 계상이 누적되던 대형 보고서들이 오라클 방향으로 복귀한 보너스입니다.

재현

# 회귀 샘플 (물리 ladder): 수정 전 +1, 수정 후 한글 일치
rhwp dump-pages samples/issue2808_single_table_form_physical_ladder.hwpx   # 1쪽 (한글 1쪽)
rhwp dump-pages samples/issue2808_report_physical_ladder.hwp               # 2쪽 (한글 2쪽)
# 접힌 ladder (#2439 재현): tail 발화 유지
rhwp dump-pages samples/issue2439/issue2439_repeat_table_overlap.hwp       # 10쪽 (한글 10쪽)

이슈: #2808 (원인 귀속: 10k r19 보고서 PR #2807 §3)

🤖 Generated with Claude Code

…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>
@planet6897

Copy link
Copy Markdown
Contributor Author

CI 수정 — Default-feature tests (shard 4/8) 실패 해소 (861ec34)

원인: 이 PR 이 재현용으로 추가한 samples/issue2808_report_physical_ladder.hwpir_field_sweep 코퍼스에 편입되면서 baseline 에 없던 경로 1건이 회귀로 잡혔습니다.

[hwp5rb] issue2808_report_physical_ladder.hwp
  sections[].paragraphs[].controls[].cells[].list_header_width_ref : 0 -> 22

Build & Test 실패는 shard 카운트 파일이 7/8 로 모자란 파생 결과이고, 나머지 체크(fmt/clippy·Skia·CodeQL·Render Diff·shard 13,58)는 전부 초록이었습니다.

판단: 코드 회귀가 아닙니다. 본 PR 은 renderer/{float_placement,layout,typeset} 만 건드렸고 직렬화기는 손대지 않았습니다. hwp5rb(재빌드 왕복) 레인의 cells[].list_header_width_ref 는 표를 가진 .hwp 샘플 거의 전부가 이미 baseline 행을 갖고 있는 광역 기존 갭이며, 신규 샘플이 같은 갭을 한 건 더 드러낸 것입니다.

조치: 게이트 문서(tests/ir_field_sweep_baseline.rs 모듈 주석)의 절차대로 baseline 에 해당 1행만 정렬 위치에 추가했습니다 (diff +1 줄).

검증: 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종으로 정확히 일치

@jangster77
jangster77 self-requested a review July 22, 2026 05:45
jangster77 added a commit that referenced this pull request Jul 22, 2026
…-2811-20260722

fix: planet6897 PR #2807·#2810·#2811 체리픽 통합
@jangster77

Copy link
Copy Markdown
Collaborator

@planet6897 이 변경은 통합 PR #2815에 체리픽하여 devel에 merge했습니다.

fix와 IR baseline test 두 커밋을 보존했습니다. 로컬 focused test, 통합 PR의 CI·CodeQL·Render Diff는 모두 성공했습니다. HWP 2쪽·HWPX 1쪽 기준 PDF를 HWP 2020으로 산출해 visual sweep을 수행했으며 구조 후보는 없었습니다. 검토 기록시각 증적을 함께 보관했습니다.

Closes #2808에 따라 연계 이슈도 자동으로 닫혔습니다. 체리픽 통합이 완료되어 이 원 PR은 닫습니다. 감사합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants