Skip to content

Task #1363: 미주 높이 모델 SSOT 리팩터 — 다단 미주 col0 본문 초과(#1357) 해소#1368

Closed
planet6897 wants to merge 6 commits into
edwardkim:develfrom
planet6897:local/task1363
Closed

Task #1363: 미주 높이 모델 SSOT 리팩터 — 다단 미주 col0 본문 초과(#1357) 해소#1368
planet6897 wants to merge 6 commits into
edwardkim:develfrom
planet6897:local/task1363

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

개요

미주 para 높이를 typeset 누적(saved-vpos delta)과 layout 렌더(순차 format)가 따로 계산해 단 하단 본문을 초과하던 문제(#1357/#1336)를, layout 렌더를 ground truth 로 삼는 SSOT 점진 마이그레이션으로 해소합니다.

근본 원인 (대상 sep20/20 p22 col0 overflow 50.1px)

TAC(treat_as_char) 그림 미주(pi=1131, 309px)를 typeset 이 "앞 제목 옆 배치(겹침)"로 보고 max(rewind_start+adv) 누적했으나, 렌더러는 문단 흐름에 inline 순차 적층 → 단 +58px 과충전 → 본문 50px 초과.

변경

  • RHWP_EN_SSOT 단계 플래그(EnSsotLevel) + RHWP_EN_SSOT_DEBUG 계측
  • Divergence A: 내부 vpos rewind para acc = line_advances_sum (모델 정합)
  • Divergence C: TAC 그림 미주 순차 적층(+= adv) — 겹침 가정 제거 → overflow 50.1→0
  • 기본 레벨 B(A+C) 승격. legacy/A/on 플래그로 롤백·비교
  • issue_1082 대상 가드 REG_LIMIT 60 → TIGHT 5.0px (회귀 가드)
  • 골든 비교 하니스 scripts/task1363_ssot_diff.py

검토 결과 (보류)

divergence 안전 정합 overflow 이득 상태
A 내부 vpos rewind 0 (모델 정합) 기본 적용
C TAC 그림 겹침→적층 −50.1 기본 적용
B trailing-ls ❌ 질문흐름 회귀 10건 0 보류
전면 SSOT ❌ 2022 overflow +166px 0 보류

→ 안전·유익 영역 = A+C(기본 B) 확정. 잔여는 overflow 무이득 + 회귀로 보류(현 caps + layout 조건부 bridge 가 실 렌더 최선 근사).

검증

  • 전체 cargo test 2137 pass / 0 fail
  • task1274_visual_sweep.py flagged 불변(베이스라인)
  • issue_1082 비대상 0.0 유지 / 대상 50.1→0

🤖 Generated with Claude Code

) 해소

미주 para 높이를 typeset 누적(saved-vpos delta)과 layout 렌더(순차 format)가
따로 계산해 단 하단 본문을 초과하던 문제(edwardkim#1357/edwardkim#1336)를, layout 렌더를 ground
truth 로 삼는 SSOT 점진 마이그레이션으로 해소한다.

근본 원인 (대상 sep20/20 p22 col0 overflow 50.1px):
- TAC(treat_as_char) 그림 미주(pi=1131, 309px)를 typeset 이 "앞 제목 옆 배치(겹침)"
  로 보고 max(rewind_start+adv) 누적했으나, 렌더러는 문단 흐름에 inline 순차 적층.
  → 단 +58px 과충전 → 본문 50px 초과.

변경:
- RHWP_EN_SSOT 단계 플래그(EnSsotLevel) + RHWP_EN_SSOT_DEBUG 계측
- Divergence A: 내부 vpos rewind para acc = line_advances_sum (모델 정합)
- Divergence C: TAC 그림 미주 순차 적층(+= adv) — 겹침 가정 제거 → overflow 50.1→0
- 기본 레벨 B(A+C) 승격. legacy/A/on 플래그로 롤백·비교
- issue_1082 대상 가드 REG_LIMIT 60 → TIGHT 5.0px (회귀 가드)
- 골든 비교 하니스 scripts/task1363_ssot_diff.py

검토 결과 (보류):
- 전면 SSOT(전 para acc=line_advances_sum): capped/overlap para 를 렌더가 겹쳐
  그려 2022 overflow +166px 회귀
- 잔여 Divergence B(trailing-ls): 미주 질문흐름 회귀 10건(issue_1139/1261/1284)
  → overflow 무이득 + 회귀로 보류. 안전·유익 영역 = A+C(기본 B) 확정.

검증: 전체 cargo test 2126 pass / 0 fail, visual_sweep flagged 불변,
issue_1082 비대상 0.0 유지 / 대상 50.1→0.
@planet6897

Copy link
Copy Markdown
Contributor Author

⚠️ 범위 정정 (작업지시자 시각 검토 반영)

본 PR 은 p22 단0 TAC 그림(pi=1131) overflow 50.1px → 0 과 SSOT 누적 정합(Divergence A/C)을 다룬다. 그러나 #1357콘텐츠 단/페이지 배치미해결임을 확인:

  • p17: pi=894 "C×C" 줄이 좌측 단 하단에 남음 — 한컴은 우측 단 상단. (우리 단0 과소 누적 → 한 줄 더 들어감)
  • p21→p22: pi=1127 "(ⅰ)~(ⅲ)에서" 가 p22 단0 상단에 위치 — 한컴은 p21 우측 단 하단. (우리 단1 64px 과대 누적: 수식 para saved-delta 가 렌더의 vpos 압축 간격을 과다 계상 → pi=1127 오분리)

두 케이스는 반대 방향 교정을 요구(p17=더, p21=덜)하여 일괄 보정 불가(Stage 5 실증). 근본 해결은 typeset 누적을 렌더러 vpos 배치(HeightCursor)와 공유하는 공유 높이 함수 리팩터(수행계획 후보 A) 필요. 본 PR 은 그 전 단계(A/C 안전 정합 + 그림 overflow)로 한정.

- v1(A/C+그림 overflow, PR edwardkim#1368)로 닫히지 않은 콘텐츠 배치(p17/p21) 근본 해결 계획
- 진단: 두 케이스 반대 방향, 블랭킷 acc 보정 3종 모두 회귀 실증
- 해법: typeset 누적 per-para = 렌더러 vpos_adjust 예측(공유 함수), caps 단계 제거+재튜닝
- 최고난도 코어 리팩터, v1 merge 후 별도 이슈/브랜치 착수 권장
- vpos_adjust(735줄) 입력을 페이지네이션 가용성으로 분류:
  IR파생(가용)/단기하(조건부)/렌더러닝상태(불가)
- 핵심: cap 분기 전량이 y_offset(러닝 렌더 위치) 의존 → IR 예측 불가
- 결론: vpos_adjust 예측 불가 → 페이지네이션이 렌더 y 시뮬레이션 필요
  → build_single_column 미주 루프를 height-only 공유 시뮬로 추출, typeset 배선
- caps 는 vpos_adjust 중복이므로 단계 제거+재튜닝 대상
@edwardkim edwardkim self-requested a review June 11, 2026 00:36
@edwardkim edwardkim added the enhancement New feature or request label Jun 11, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone Jun 11, 2026
- EnSsotLevel::A2 + RHWP_EN_SSOT=A2 (기본 B 불변, opt-in)
- simulate_endnote_column_bottom_y: current_items 를 렌더러 build_single_column
  동일 경로(HeightCursor::vpos_adjust)로 재생해 단 bottom y 산출 → current_height 스냅
- 측정: 누적 정합 성공(p17 pi=894 C×C 우단 이동, p21 단1 1022.9→994) 그러나
  fit/split 미정합으로 p17 단1 overflow·pi=1127 미이동
- DEFAULT(B) 2137 pass 유지, A2 회귀 3건(전부 issue_1082 overflow=fit/split lag)
- Stage 3: fit/split 결정도 시뮬 기반 전환 필요
- 시도: 시뮬 기반 fit 게이트 + 단일줄 fit-or-advance
- 결과: p17/p21 미개선 + p22 신규 overflow 121.2 (악화) → 전량 revert
- 근본: break 루프는 ~10 휴리스틱 게이트 상호작용 → 일부만 sim 전환 시 충돌
- 결론: break 루프 홀리스틱 재작성 필요(별도 대형). 누적 절반(Stage2 A2)은 유지
- 기본 B 무회귀, A2 누적 인프라 토대 보존
@planet6897

Copy link
Copy Markdown
Contributor Author

정리 — v2 후보 A 조사 결과 (커밋 추가)

#1357 콘텐츠 배치(p17 C×C·p21 pi=1127) 근본 해결을 위한 후보 A(누적기↔렌더러 vpos 공유) 조사를 단계별로 수행, 본 브랜치에 문서/실험 인프라 커밋.

Stage 1: vpos_adjust(735줄)는 러닝 렌더 y·실측 콘텐츠 하단에 의존 → IR 예측 불가, 렌더 y 시뮬레이션 필요로 확정.

Stage 2 (✅): simulate_endnote_column_bottom_ycurrent_items를 렌더러 build_single_column 동일 경로(HeightCursor)로 재생해 누적을 스냅(RHWP_EN_SSOT=A2, opt-in). A2에서 p17 pi=894가 우측 단으로 이동(C×C 우단) 입증. 기본 B 무회귀(2137 pass), 회귀 3건이 issue_1082 overflow 가드에 격리.

Stage 3 (❌ 음성): fit/split을 점진적으로 시뮬 전환 시도 → 악화(p22 신규 overflow). 미주 단-break은 ~10개 휴리스틱 게이트 상호작용이라 일부만 sim 전환하면 충돌. break 루프 홀리스틱 재작성(전 게이트 동시 치환 + 전 exam 재튜닝)이 필요 — 별도 대형 작업.

결론: 누적 절반(Stage 2)은 성립·안전(토대 보존). break 절반은 대형 잔여. 본 PR의 기본 B(그림 overflow + A/C 정합)는 #1357 부분 개선으로 그대로 유효. p17/p21 두 배치는 break-루프 재작성 후속 과제로 추적.

typeset.rs SSOT 리팩터 코드의 rustfmt 미정합으로 CI Build & Test의
Format check(`cargo fmt --all -- --check`)가 실패했다. 변경 파일
typeset.rs만 포맷 적용 — 로직 변경 없음(공백/줄바꿈만).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
edwardkim pushed a commit that referenced this pull request Jun 11, 2026
- v1(A/C+그림 overflow, PR #1368)로 닫히지 않은 콘텐츠 배치(p17/p21) 근본 해결 계획
- 진단: 두 케이스 반대 방향, 블랭킷 acc 보정 3종 모두 회귀 실증
- 해법: typeset 누적 per-para = 렌더러 vpos_adjust 예측(공유 함수), caps 단계 제거+재튜닝
- 최고난도 코어 리팩터, v1 merge 후 별도 이슈/브랜치 착수 권장
edwardkim pushed a commit that referenced this pull request Jun 11, 2026
typeset.rs SSOT 리팩터 코드의 rustfmt 미정합으로 CI Build & Test의
Format check(`cargo fmt --all -- --check`)가 실패했다. 변경 파일
typeset.rs만 포맷 적용 — 로직 변경 없음(공백/줄바꿈만).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@edwardkim

Copy link
Copy Markdown
Owner

PR #1368은 devel 기준으로 검토 및 로컬 검증을 완료했고, v1 부분 개선 범위로 수용했습니다. 기여 감사합니다.

처리 내용:

  • PR 커밋 6개를 현재 devel 흐름에 cherry-pick했습니다.
  • EnSsotLevel 주석의 기본값 설명을 실제 기본 동작인 B 기준으로 maintainer fix 했습니다.
  • contributor 작업 문서와 산출물은 archive로 정리했습니다.
  • 최종 검증을 완료했습니다.
    • cargo fmt --check
    • git diff --check origin/devel..HEAD
    • CARGO_INCREMENTAL=0 cargo test --test issue_1082_endnote_multicolumn_drift -- --nocapture
    • python3 scripts/task1363_ssot_diff.py --level B --baseline legacy
    • CARGO_INCREMENTAL=0 cargo test --test issue_1139_inline_picture_duplicate -- --nocapture
    • CARGO_INCREMENTAL=0 cargo test --lib
    • CARGO_INCREMENTAL=0 cargo clippy --lib -- -D warnings
    • CARGO_INCREMENTAL=0 cargo check --lib --target wasm32-unknown-unknown -j 2
    • docker compose --env-file .env.docker run --rm wasm

이번 PR은 대상 샘플의 page-height overflow 지표를 개선하는 v1 범위로 수용합니다. 다만 pi=1156/1157 주변의 body bottom 기준 단 전환 잔여가 확인되어 #1363 전체 종결은 보류합니다. 해당 범위는 후속 PR #1371에서 이어서 검토하겠습니다.

반영된 devel merge commit: 5c79fde9

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