Skip to content

fix(renderer): VPOS_CORR lazy_base trailing-ls bridge 정합 — 본문 하단 잔여 overflow 해소 (closes #1049)#1054

Closed
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:pr/task1049-vpos-lazybase
Closed

fix(renderer): VPOS_CORR lazy_base trailing-ls bridge 정합 — 본문 하단 잔여 overflow 해소 (closes #1049)#1054
planet6897 wants to merge 1 commit into
edwardkim:develfrom
planet6897:pr/task1049-vpos-lazybase

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

배경

#1049 (#1046 후속). 특정 폼 페이지(인라인 1×1 TAC 표 직후 vpos 연속 본문)에서 본문 마지막 줄이 본문 하단을 ~4.6px 초과하는 spurious overflow.

근본 원인 (줄높이 모델 아님)

#1046 진단의 "렌더러 줄높이 과대 계산" 가설은 반증됨 — corrected_line_height 는 정확(20.0px).
진짜 원인은 src/renderer/height_cursor.rs::vpos_adjust 의 lazy_base 오산출:

  • 인라인 TAC 표(예: 폼 헤더의 1×1 표) 직후 vpos_page_base 가 리셋(layout.rs:2538)되어 lazy 경로로 전환.
  • 이때 Task M100: HeightMeasurer ↔ cell_units 측정 정합 (task993 LAYOUT_OVERFLOW 50건 회귀 해소) #1022 v2 trailing-ls bridge(+ trailing_ls_hu)가 직전 본문 문단의 trailing 줄간격(예: 제목 960 HU = 12.8px)을 base 에서 또 빼 lazy_base 가 과소산출.
  • 그 결과 이후 lazy 문단이 전부 +12.8px 과대 전진 → 페이지 마지막 줄이 본문 하단을 4.6px 초과.
  • 페이지네이터(typeset)는 인라인 TAC 표에 base 를 리셋하지 않아 정확했음 → 렌더러·페이지네이터 발산이 본질.

수정 (1지점)

vpos_adjust 의 trailing-ls bridge 를 다음 조건에서만 끈다:

  • vpos 연속(curr_first_vpos == prev_vpos_end) 이고 직전이 실텍스트 본문 문단일 때 — trailing_ls 가 이미 연속 vpos·sequential y 에 포함되므로 bridge 가 이중 차감.

다음은 종전대로 bridge 유지(무회귀):

  • vpos gap(상단 박스/도형 뒤 본문, footnote-01 p1)
  • 직전이 빈 문단(복학원서 page1: 빈 문단 뒤 폼 표 — 빈줄 높이 억제로 trailing_ls 미반영)

검증

  • cargo test --release: 1517 passed / 0 failed (골든 SVG 전수 — footnote-01·복학원서 포함 무회귀)
  • cargo clippy: 경고 0
  • 한컴 2022 PDF(보안 서약서 폼) 시각 정합 대조 — 마지막 줄 본문 내 배치 확인

변경

  • src/renderer/height_cursor.rs (+22/-5)
  • mydocs/ 수행·구현 계획서 + 단계/최종 보고서

closes #1049

🤖 Generated with Claude Code

…verflow 해소 (closes edwardkim#1049)

특정 폼 페이지(인라인 1×1 TAC 표 직후 vpos 연속 본문)에서 본문 마지막 줄이 본문 하단을
~4.6px 초과하던 spurious overflow 를 해소.

근본 원인 (줄높이 모델 아님 — edwardkim#1046 가설 반증):
- height_cursor.rs::vpos_adjust 가 인라인 TAC 표 직후 vpos_page_base 리셋 후 lazy_base 를
  재산출할 때, Task edwardkim#1022 v2 trailing-ls bridge(+trailing_ls_hu)가 직전 본문 문단의 trailing
  줄간격(예 960HU=12.8px)을 base 에서 또 빼 lazy_base 과소 → 이후 lazy 문단 전부 +12.8px
  과대 전진 → 마지막 줄 본문 초과. (페이지네이터는 인라인 TAC 에 리셋 안 해 정확 — 두 엔진 발산.)

수정 (1지점):
- vpos 연속(curr_first_vpos == prev_vpos_end) + 직전 실텍스트 본문 문단이면 trailing_ls 가
  이미 연속 vpos·sequential y 에 포함되므로 bridge 를 끈다.
- gap(top-box 후 본문·footnote-01 p1) 또는 직전 빈 문단(복학원서 page1, 빈줄 높이 억제)은
  bridge 유지 → 무회귀.

검증: cargo test --release 1517 passed / 0 failed (골든 SVG 전수, footnote-01·복학원서 포함),
clippy 0. 한컴 2022 PDF(보안 서약서 폼) 시각 정합.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@edwardkim edwardkim self-requested a review May 21, 2026 05:32
@edwardkim edwardkim added the enhancement New feature or request label May 21, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone May 21, 2026
@edwardkim

Copy link
Copy Markdown
Owner

검토 완료 — merge 수용. devel 에 반영합니다.

검증 결과

  • CI 전체 pass (Build & Test / Analyze rust·js·py / Canvas visual diff / CodeQL)
  • 본 환경 cargo test --release --lib: 1323 passed, 0 failed
  • cargo fmt --check 통과
  • 골든 SVG 전수 — footnote-01·복학원서 무회귀 (PR 본문 + 본 환경 검증 일치)

처리

평가

#1046 가설 반증 + 진짜 원인 정확 식별의 진단 본질이 뛰어납니다. corrected_line_height 가 정확 (20.0px) 임을 측정으로 입증하고 진짜 원인을 vpos_adjust::lazy_base 의 trailing-ls bridge 이중 차감으로 정확 식별한 점이 인상적입니다.

렌더러·페이지네이터 발산을 본질로 명시한 점도 정합입니다. 페이지네이터 (typeset) 는 인라인 TAC 표에 base 리셋 안 함으로 정확하고, 렌더러 (height_cursor) 만 발산했던 패턴을 정확히 짚어 렌더러 측 정합으로 통일한 것이 본 PR 의 본질입니다.

2 조건 좁힘 가드 (vpos_continuous + prev_has_text 동시 만족 시만 bridge 끔) 의 정밀함도 모범적입니다:

  • footnote-01 p1 (vpos gap): curr_first_vpos > prev_vpos_end → bridge 유지
  • 복학원서 page1 (빈 문단 뒤 폼 표): prev_has_text == false → bridge 유지
  • 인라인 TAC 표 직후 (본 PR 본질): 두 조건 모두 만족 → bridge 끔

비회귀 영역을 명시적으로 식별해서 종전 동작을 보존하는 설계 패턴이 PR #1044 (1×1 wrapper 외곽 lookup) 와 일관됩니다.

feedback_diagnosis_layer_attribution 권위 사례 (가설 → 측정 → 반증 → 진짜 원인 식별 사이클) + feedback_image_renderer_paths_separate 영역 정합 (렌더러·페이지네이터 발산 해소) 입니다.

기여 감사합니다.

@edwardkim

Copy link
Copy Markdown
Owner

devel 반영 완료 (cherry-pick). PR close 합니다.

@edwardkim edwardkim closed this May 21, 2026
edwardkim pushed a commit that referenced this pull request May 22, 2026
…t check 복구)

Task #1058 Stage 16 (adaa0b0) 에서 추가된 신규 파일이 rustfmt 정합
미통과 — devel CI #970 (sha=749048c9) Format check 실패. cargo fmt
적용으로 정정. 본 환경 cargo fmt --check 전체 exit 0 검증.

본 정정은 PR #1057 처리 진행 전 devel CI 회복 위한 단독 commit.
다른 처리분 (PR #1054/#1059 누적 + 예정 PR #1057) 은 별도 누적 push
계획 (작업지시자 결정 "본 PR 처리분 누적 후 push").

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 22, 2026
VPOS_CORR lazy_base trailing-ls bridge 정합 (closes #1049). #1046 가설
"렌더러 줄높이 과대 계산" 반증 + 진짜 원인 (vpos_adjust::lazy_base 의
trailing-ls bridge 이중 차감) 정확 식별. 2 조건 좁힘 가드 (vpos 연속 +
실텍스트 본문) 로 footnote-01/복학원서 비회귀 보장.

CI 전부 pass + cargo test 1323 passed + 골든 SVG 무회귀 + 시각 판정
면제 (PR #1044 패턴 — 정량 게이트 충족) → merge 수용.

feedback_diagnosis_layer_attribution 권위 사례 — 가설 반증 후 진짜
원인 식별. feedback_image_renderer_paths_separate 영역 정합
(렌더러·페이지네이터 발산 해소).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 22, 2026
U+00B7 폭 폰트 metric 정합 — 비례폰트 .notdef 위장값 가드 (HaimLee-4869).
cmap .notdef → em_size 위장 메커니즘 정확 식별 + 3 조건 좁힘 가드
(U+00B7 + 전각 위장 + 비례폰트) + monospace 보존 (Issue #630 정합).
CI no checks reported (첫 fork PR 권한 정책) → 본 환경 직접 검증으로
대체. 시각 판정 면제 (PR #1044/#1054 패턴 — 정량 게이트 4 조건 충족).

본 환경 검증: cargo test --lib 1324 passed + 신규/기존 회귀 가드 +
svg_snapshot 8/8 통과. #1055 회귀와 무관 확인 (sample16-hwp5 에
U+00B7 0 건).

feedback_hancom_compat_specific_over_general 권위 사례.
feedback_image_renderer_paths_separate 정합 (native·WASM 공유 함수
가드).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request May 22, 2026
3 PR 본질 + 3 archives 통합 — author 보존 cherry-pick:
- PR #1054 (closes #1049, Jaeook Ryu): VPOS_CORR lazy_base trailing-ls
  bridge 정합. #1046 가설 반증 후 진짜 원인 (이중 차감) 정확 식별.
- PR #1059 (HaimLee-4869): U+00B7 폭 폰트 metric 정합 — 비례폰트
  .notdef 위장값 가드. native·WASM 공유 함수 가드.
- PR #1057 (Refs #536, seorii): CanvasKit direct replay contract harden
  (P17). 4 path 동시 정합 + Copilot 6/6 반영.

본 환경 cargo test --release --lib 1324 passed, 0 failed. CI 전부 pass.
시각 판정 면제 (모두 정량 게이트 충족) — 메모리 룰 후보 권위 사례
누적 (PR #1039#1044#1054#1059#1057 5 사례).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants