Task #555: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신 (closes #555)#562
Conversation
… 산식 정정) paragraph_layout.rs: 1. inner_pad 분기 제거 (line 693~717 → 693~700, -22 LOC) - has_visible_stroke / bs_left_px / bs_right_px / inner_pad_left/right 변수 모두 제거 - margin_left = box_margin_left (단일 룰, 텍스트 inset 한 번만) 2. box_x/w 산식 정정 (line 2687~2691) - override 케이스: (ox, ow) — margin 미적용 - 일반 케이스: (col_area.x, col_area.width) — margin 미적용 - paragraph border outline = col_area 전체 (PDF 한컴 2010 정합) integration_tests.rs: - test_544_passage_box_coords_match_pdf_p4 의 #[ignore] 제거 → GREEN - test_547_passage_text_inset_match_pdf_p4 의 #[ignore] 제거 → GREEN 검증: - cargo test --lib: 1121 passed / 3 ignored (baseline 1119/5 → +2 GREEN, -2 ignored) - 회귀 0건 - test_552_passage_box_top_gap_p2_4_6 (--ignored) GREEN 유지 → Task edwardkim#552 가 Task edwardkim#544 (2) 효과 흡수 (Stage 1 finding 확정) 측정값: - test_544: box_left_x 128.51 → 117.0 (PDF 117.0 ±2), box_width 425.1 - test_547: min_x 139.89 → 128.5 (PDF 128.5 ±2) 작업지시자 보고 증상 (글상자 우측 시프트) 직접 fix. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…y-pick @planet6897 1 commit) 옵션 A2 채택 — `05beb208` (Task edwardkim#544 v2 Stage 2) 단독 cherry-pick. B1 진단 결과 본 devel 의 Task edwardkim#479 미적용 trailing-ls 모델 확인 → 당초 옵션 A3 (edwardkim#552 + v2 + v3) 의 모델 전환 위험 회피 → 최소 fix 채택. - mydocs/pr/pr_551_review_v3_544_a2.md (검토 문서) - mydocs/pr/pr_551_v3_544_a2_report.md (처리 보고서) - mydocs/orders/20260504.md (오늘할일 신규) closes edwardkim#544 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… (옵션 A2 — passage 글상자 우측 시프트 정정 — @planet6897 1 commit) 작업지시자 보고: "21_언어_기출_편집가능본.hwp 1/2/4/5/7/8/11/13/14 페이지 글상자가 오른쪽으로 밀려있음". 이슈 edwardkim#544 (closed) 재오픈 후 PR edwardkim#551 잔존 cherry-pick. 당초 옵션 A3 (edwardkim#552 + v2 + v3) 검토했으나 B1 진단 결과 본 devel 의 Task edwardkim#479 미적용 (pre-edwardkim#479 trailing-ls 항상 가산 모델) 확인 → edwardkim#552/v3 cherry-pick 시 모델 전환 위험. 옵션 A2 (`05beb208` 단독, edwardkim#547+edwardkim#544(1) 통합) 채택. 본질 정정 (paragraph_layout.rs): 1. box_x = col_area.x / box_w = col_area.width (margin 미적용, paragraph border outline = col_area 전체). 2. inner_pad 분기 제거 (visible-stroke + bs=0 인 경우 margin_left = box_margin_left + inner_pad_left 이중 적용 → 단일 적용). 측정 (페이지 4 [7~9]): - 박스 left x: 128.51 → 117.17 (PDF 117.0) - 박스 width: 402.5 → 425.17 (PDF 425.1) - 본문 첫 글자 '평' x: 153.12 → 128.51 (PDF 128.5) - 9 박스 (col 0/1) 모두 정합 검증: - cargo test --lib 1120 / test_544+test_547 +2 GREEN / 회귀 0건 - clippy 0 신규 (pre-existing 2건 동일 baseline) - 5 샘플 58 페이지 광범위 sweep: 38 differ (의도된 paragraph border 정합 변경, visible-stroke paragraph text -11.33 px 좌측 시프트 의도) - 회귀 검출 가능 영역 (비-border paragraph text) 0 변경 - 작업지시자 시각 판정 통과 cherry-pick 1 commit: - 457d5f3 Task edwardkim#544 v2 Stage 2 (`05beb208` from @planet6897) 처리 보고서: mydocs/pr/pr_551_v3_544_a2_report.md 검토 문서: mydocs/pr/pr_551_review_v3_544_a2.md closes edwardkim#544 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/pr/pr_551_review_v3_544_a2.md → archives/ - mydocs/pr/pr_551_v3_544_a2_report.md → archives/ - mydocs/orders/20260504.md: 처리 상태 갱신 (devel merge f6039f3 push + 이슈 edwardkim#544 close) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/plans/task_m100_555.md (수행 계획서) - mydocs/plans/task_m100_555_impl.md (구현 계획서, 5 단계) - mydocs/working/task_m100_555_stage1.md (진단 보고서) 작업지시자 승인 게이트: - 수행 계획 승인 (옵션 A — display_text 우선 사용) - 구현 계획 승인 (5 단계) - Stage 1 진단 승인 본질: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 (estimate_text_width 등) 계산이 PUA 1글자 기준 (run.text) 으로 유지 → 자모 시퀀스 (3-4 char) 와 정합 안 됨. 옵션 A: 호출처 ~10건에 effective_text_for_metrics 헬퍼 적용 (display_text.as_deref().unwrap_or(&run.text)). 인덱싱 불변성 유지. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
본질 정정: - composer.rs: effective_text_for_metrics 헬퍼 추가 (display_text.as_deref().unwrap_or(&run.text)) - composer.rs:920 estimate_composed_line_width 헬퍼 적용 - layout.rs:3444 Square wrap host est_x: PUA char per-char 변환 - layout.rs:3510/3522 compute_tac_leading_width run-level 헬퍼 - layout.rs:3516 partial run: PUA → jamo 변환 - table_layout.rs:860/1825/1851 셀 분할/max width 헬퍼 - table_layout.rs:1659/1935 셀 inline shape text_before: PUA → jamo 변환 단위 테스트 (composer/tests.rs +69 LOC, 3 신규): - test_555_effective_text_for_metrics_uses_display_text_when_present - test_555_effective_text_for_metrics_multi_jamo_cluster - test_555_effective_text_for_metrics_no_display_text_falls_back_to_text 검증: - cargo test --lib --release: 1123 passed (baseline 1120 + 3 신규 GREEN) - cargo clippy: 0 신규 결함 (pre-existing 2건 동일 baseline) - 광범위 SVG sweep (13 fixture, 481 페이지, PUA char 334개): 481/481 byte-identical — 회귀 0 - Task edwardkim#544/edwardkim#547/edwardkim#548 회귀 가드 GREEN 유지 본 fix 는 conservative — 비-PUA fallback + PUA 영역 매트릭스 정확도 향상 (잠재적 결함 차단). 현 fixture 의 visual 출력 변화 없음 (IR 기반 char positioning 영역과 무관). 작업지시자 시각 판정 통과 (byte-identical auto-pass). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- mydocs/report/task_m100_555_report.md (최종 보고서) - mydocs/orders/20260504.md: Task edwardkim#555 추가 + 메모리 정합 갱신 closes edwardkim#555 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…v2 + Task #555) cherry-pick (작업지시자 옵션 A — 7 commits 모두): - a30dca7 (457d5f3): Task #544 v2 Stage 2 paragraph border 좌표/inset - f30b352 (b146b83): PR #551 Task #544 핀셋 처리 보고서 + 검토 문서 - (skip) (f6039f3): merge commit — 이미 적용된 영역 - f45f6a0 (f807378): PR #551 Task #544 처리 후속 archives 이동 - af556a5 (096b573): Task #555 수행/구현 + Stage 1 진단 - f44a721 (beade38): Task #555 Stage 2-4 옛한글 PUA 폰트 매트릭스 정정 (옵션 A) - 4af03b7 (eac36f2): Task #555 최종 보고서 검증: - cargo test --lib 1123 passed (Task #555 단위 테스트 +3 GREEN) - cargo test --test issue_546/530/505/418/501 회귀 0 - cargo test --test svg_snapshot 6/6 passed - cargo clippy --lib 0 건 - WASM 4,585,998 bytes (+42,568 from Task #528, Task #544 v2 + #555 반영) + studio 동기화 작업지시자 시각 판정 (web Canvas): - "웹 에디터에서 옛한글 매트릭스 개선이 시각적으로 확인되었습니다. 아직 미진한 점이 있지만 분할 정복 전략에 맞는 접근법입니다." 본 PR 의 본질: - Task #555 (closes #555): 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신 · effective_text_for_metrics 헬퍼 + 호출처 10건 패치 · 13 fixture 481 페이지 481/481 byte-identical (PR 본문) · Conservative fix (현재 visual 영향 없음, 잠재적 결함 차단) - Task #544 v2: paragraph border 좌표/inset 산식 (PR #560 사이클 영역, 본 환경 처음 적용) 컨트리뷰터 메모리 룰 적용 정합: - feedback_no_pr_accumulation, feedback_per_task_pr_branch - feedback_essential_fix_regression_risk, feedback_rule_not_heuristic 산출물: - mydocs/pr/pr_562_report.md (처리 결과) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…PUA 폰트 매트릭스 — @planet6897 6 commits) — closes #555 본 PR 은 외부 컨트리뷰터 @planet6897 (Jaeuk Ryu) 의 PR. Task #528 후속 결함 (이슈 #555: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신) 정정. 작업지시자 결정으로 옵션 A (7 commits 모두 cherry-pick) 진행 — Task #555 의 본질 외에 PR #551 Task #544 v2 처리 영역 (PR #560 사이클 영역) 도 함께 본 환경에 적용. cherry-pick (6 commits + merge commit 1건 skip): - Task #544 v2 Stage 2: paragraph border 좌표/inset 산식 정정 · paragraph_layout.rs box_x/w 산식 + inner_pad 분기 제거 - PR #551 Task #544 핀셋 처리 보고서 + 검토 + archives - Task #555: 옛한글 PUA → 자모 변환 후 폰트 매트릭스 갱신 (3 commits) · effective_text_for_metrics 헬퍼 (composer.rs) · 호출처 10건 패치 (composer / layout / table_layout) · Task #555 단위 테스트 +3 GREEN 본질 (Task #555): - Task #528 의 Option A (렌더러 시점 변환) 의 인덱싱 불변성 trade-off 로 run.text 가 PUA char 1글자 보존 → 폰트 매트릭스가 자모 시퀀스와 정합 안 됨 - effective_text_for_metrics(run) = run.display_text.as_deref().unwrap_or(&run.text) fallback 패턴 + 호출처 10건 패치 - Conservative fix: 13 fixture 481 페이지 481/481 byte-identical (PR 본문) 검증: - cargo test --lib 1123 passed (Task #555 단위 테스트 +3 GREEN) - cargo test --test issue_546/530/505/418/501 회귀 0 - cargo test --test svg_snapshot 6/6 passed - cargo clippy --lib 0 건 - WASM 4,585,998 bytes + rhwp-studio 동기화 시각 판정 (작업지시자): - "웹 에디터에서 옛한글 매트릭스 개선이 시각적으로 확인되었습니다. 아직 미진한 점이 있지만 분할 정복 전략에 맞는 접근법입니다." 미진한 영역은 향후 별도 task 로 분할 정복 정합. 컨트리뷰터의 메모리 룰 적용 정합: - feedback_no_pr_accumulation: 새 PR 로 등록 (PR #551 잔존 누적 회피) - feedback_per_task_pr_branch: 별도 fork branch (pr-task555) - feedback_essential_fix_regression_risk: 481 페이지 광범위 sweep - feedback_rule_not_heuristic: 단일 fallback 패턴
|
@planet6897 님의 PR 을 cherry-pick 머지로 devel 에 반영했습니다 (devel `19119c2`). 작업지시자 결정으로 옵션 A (7 commits 모두 cherry-pick) 진행 — Task #555 본질 외에 PR #551 Task #544 v2 처리 영역도 함께 적용. 머지된 commits (6 + 1 skip)
author 는 @planet6897 으로 보존되었습니다. 검증
시각 판정 (작업지시자, web Canvas)✅ 통과 — 작업지시자 인용:
컨트리뷰터께 감사 + 정합한 영역 인정본 PR 의 정합한 영역이 매우 인상적이었습니다:
미진한 영역 (향후 분할 정복)작업지시자 평가에서 "아직 미진한 점이 있지만" 명시 — 본 사이클 외 후속 task 로 분할 정복 진행 예정. Task #528 → Task #555 → 향후 task 의 단계적 정정 패턴 정합. 이슈 #555 close본 PR closes #555 명시 + 정정 적용으로 자동 close 처리 (수동 close 도 진행). base 차이 영역 (메인테이너 작업)본 PR base (`b84c5e9`) 와 본 환경 devel (`d1dbd85`) 사이에 메인테이너의 PR #553 rollback 처리 (1 commit) 가 있어 fork 가 미동기화 상태였으나, 컨트리뷰터의 잘못 아닌 메인테이너 작업으로 인한 차이 — cherry-pick 으로 정합하게 처리되었습니다. 처리 보고서: `mydocs/pr/archives/pr_562_report.md` 다음 PR 도 본 사이클 패턴 (별도 fork branch + 새 PR + 광범위 회귀 sweep) 으로 부탁드립니다. 매우 모범 사례입니다. |
- mydocs/pr/pr_562_report.md → archives/ Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cherry-pick: - 773ac95 (391dd6d): fix: 수식 위첨자 baseline 배치 개선 — 분수/괄호 base (#532) 본질: - src/renderer/equation/layout.rs +44/-7 (단일 파일) - sup_shift 부호 기반 분기 정합: · 양수 (일반): sup 상단, base 하단 · 음수 (tall sup, 분수형): sup 상단, base 를 |sup_shift| 만큼 하단으로 - 위첨자가 항상 base 위에 위치 (수학 조판 규칙) 검증: - cargo test --lib 1124 passed (신규 test_superscript_fraction_baseline GREEN) - cargo test --test issue_505/530/546/418/501 회귀 0 - cargo test --test svg_snapshot 6/6 passed - cargo clippy --lib 0 건 - WASM 4,588,360 bytes (+2,362 from PR #562) + studio 동기화 작업지시자 시각 판정: - "svg 와 웹 에디터 모두에서 지수 처리가 개선되었음을 메인테이너가 확인" 작성자: @oksure (Hyunwoo Park) — 두 번째 PR closes #532 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 처리 보고서 추가: mydocs/pr/archives/pr_600_report.md PR #600 (closes #513, @oksure) commit 단위 cherry-pick 2 commits + 결정적 검증 + 광범위 sweep (164 fixture / 1,614 페이지 / 회귀 0) + SVG 정량 (pua-test 0→9 / mel-001 +14 / kps-ai +2 / KTX 변경 없음) + 시각 판정 ★ 통과 - 검토 보고서 archives 이동: mydocs/pr/pr_600_review.md → mydocs/pr/archives/pr_600_review.md - 5/5 orders 갱신: PR #600 + Issue #615 항목 추가 별개 영역 발견 + 후속 이슈: - Issue #615: pua-test U+F53A 가 pua_oldhangul.rs:5022 에서 자모 시퀀스 (ᄒᆞᆫ) 로 임의 변환되지만 한컴 PDF 정답지는 "Basic-out, 매핑 표 외" 빈 공백 처리 — pua_oldhangul.rs 매핑 한컴 정합 안 함 PUA 회귀 패턴 인식 — 작업지시자 안내 "PUA 가 계속 회귀되는 현상": PR #587/#562/#592/#600 + Issue #615 누적의 두더지 잡기 패턴. PUA 매핑 표 통합 재검증 별도 광범위 task 후보.
Summary
run.text(PUA 1글자) 가 폰트 매트릭스 측정 (estimate_text_width등 10건 호출처) 에 사용되어 실제 출력되는 자모 시퀀스 (3-4 char) 와 정합 안 됨effective_text_for_metrics헬퍼 (run.display_text.as_deref().unwrap_or(&run.text)) + 호출처 10건 패치. 인덱싱 불변성 (Task 옛한글 PUA → KS X 1026-1:2007 자모 변환 (HncPUAConverter 정합) — exam_kor 17p 고어 미렌더 #528 의 trade-off) 유지본질
Task #528 의 정정 (Option A — 렌더러 draw_text 시점 변환):
run.text는 IR 와 동일하게 PUA char 1글자 보존run.display_text에 자모 시퀀스 (3-4 char) 저장display_text사용 → visual OK ✅폰트 매트릭스 측정이
run.text(PUA) 기준이라 자모 시퀀스 와 불일치:composer.rs:920layout.rs:3444layout.rs:3510/3522layout.rs:3516table_layout.rs:860/1825/1851table_layout.rs:1659/19355 단계 진행
mydocs/working/task_m100_555_stage1.mdmydocs/working/task_m100_555_stage2.mdmydocs/working/task_m100_555_stage4.mdmydocs/report/task_m100_555_report.mdTest plan
cargo test --lib --release: 1123 passed / 0 failed / 3 ignored — baseline +3 GREEN (Task 옛한글 PUA → 자모 변환 후 폰트 매트릭스 (글자폭/줄간격) 계산 갱신 필요 (Task #528 후속) #555 신규)cargo clippy --release --lib: 신규 결함 0건 (pre-existing 2건 동일 baseline)결과 해석
본 fix 는 conservative:
estimate_text_width영향 없음잠재적 효과 (현재 비활성, 미래 fixture 에서 자동 정합):
메모리 룰 적용
feedback_no_pr_accumulation— 새 PR 로 등록 (PR Layout Phase 0~2 + 옛한글 PUA + 누적 task fix (Task #435~#528, #549/#550) #551 잔존 누적 회피)feedback_per_task_pr_branch—planet6897:pr-task555별도 fork branchfeedback_essential_fix_regression_risk— 13 fixture 481 페이지 광범위 검증feedback_rule_not_heuristic— 단일 룰 (분기/허용오차 없음, fallback 패턴)feedback_visual_regression_grows— byte-identical 이므로 시각 판정 auto-pass처리 보고서
mydocs/report/task_m100_555_report.mdmydocs/plans/task_m100_555.md/task_m100_555_impl.mdmydocs/working/task_m100_555_stage1.md/_stage2.md/_stage4.md🤖 Generated with Claude Code