fix(#2430): 한양·휴먼 계열 ASCII 메트릭 실측 교정 — 셀 재래핑 오발동 해소, 10k 순 +32 - #2510
Conversation
한글 COM 무신축 래더(폰트×95자, 폰트별 개별 PDF) 실측: 한양신명조·중고딕· 견명조·견고딕·휴먼명조는 HY 대응 폰트와 ASCII 폭이 다른 별개 페이스 (숫자 0.497/0.565em vs HY 0.583~0.668em, 11~26% 과대 상속). HY 테이블 자체는 요청 실측과 일치 — 치환 별칭이 오귀속의 원인. - font_metrics_data: 실측 LATIN_0 5종 신설(93/95 실측), 별칭 6건 - style_resolver: 한양4·휴먼명조 HFT 치환 제거(원명 유지, CSS 폴백 동일) - composer edwardkim#2070 규칙·svg 임베드: 원명 통과 보존 확장 - 핀 이관: issue2214 계열 줄채움 임계 44→56/62(실측), 2215 폭 실측, 2020 ㊞ 대역 완화(공백런 갭 별건 표면화 — 후속 이슈), 골든 2건 재생성 게이트: 21868765 7→4쪽(한글 정합, edwardkim#2430 대표), 92셋 92/92, 10k 모집단 +34/−2(순 +32), nextest 3352/3352, fmt/clippy 클린. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
발동 런의 inner/fs/자간/폰트/추정폭 덤프. 잔여 코호트 실측 확장에 사용 — 결론: 발동 5건은 공백·자간 문맥 폭(+10%대) 참경계(edwardkim#2509 축), 무발동 5건은 재래핑 외 별건. 폰트 메트릭 추가 교정 대상 없음(함초롬돋움 ±2% 정합, KoPub·한양신명조V 등 미설치 폰트는 한컴이 한컴바탕 치환 렌더). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
8d0a6f9 to
f0dad6a
Compare
회귀 검증 — bokhakwonseo-page1 하단 ㊞(도장) 좌측 치우침 (오라클 실측)
즉 원인 후보 실측 데이터
재현:
golden 갱신 전에 ㊞ 축 회귀 해소가 필요해 보입니다. |
㊞ 회귀 근본 원인 국소화 완료 — PR 메트릭은 결백, 기존 '말미 공백 run 압축' 결함의 노출추가 실측(모두 재현 스크립트/산출물 보존)으로 원인을 문단 내 특정 공백 run 까지 1. 공백 폭 자체는 양쪽 다 정상
2. 복학원서 해당 줄의 국소 결함 (devel 빌드 실측, golden 과 동일)같은 줄(y≈1001) 내 공백 run 별 실효 폭:
즉 줄 말미 공백 run 만 압축됩니다(−21px 누적). 후보: 줄폭 오버플로 3. 구조 정리
재현: |
㊞ 회귀 근본 원인 확정 + 검증된 수정 —
|
| ㊞ origin (svg px) | 값 | vs 오라클 629.4 |
|---|---|---|
| 본 PR 현재 (핵 유지) | 614.44 | −15.0 |
| 본 PR + 핵 제거 | 635.56 | +6.2 (상류 글자 잔차 +5.4 전파와 일치) |
issue_2020 핀 4/4 PASS (seal_line_and_stamp_align 포함 — 핵 없이 통과).
권고 패치
receipt_date_stamp_shift_px fn(380~444)과 호출부(4540 부근 stamp_shift)를
제거하고 run_x = x 로 단순화 → bokhakwonseo·exam-kor golden 재생성(㊞
614.44→635.56). #2020 계보 주석에는 "구 메트릭 보상 핵, #2510 메트릭 교정으로
불필요" 기록을 권합니다.
edwardkim#2020 도입 보정은 "한컴이 인장 앞 공백을 0.42em 으로 좁게 취급" 가정으로 ㊞ 를 (0.50-0.42)em x 18칸 = -21.2px 이동시켰다. 실측(한글 COM 무신축 래더)으로 가정 기각: space = 0.505em 균일. 실체는 구 HY 테이블의 글자 과대폭(+20px)을 도장 위치에서만 상쇄하던 것으로, 본 PR 의 실측 메트릭 교정과 함께라면 순수 오차가 된다(㊞ 오라클 대비 -15.0px, 유저 시각 회귀 보고). 제거 후 실측: ㊞ origin 635.56px = 한글 PDF 오라클(629.4) +6.2px — 상류 글자 잔차(+5.4)와 일치. 렌더 전용 변경(흐름/쪽수 불변). - receipt_date_stamp_shift_px fn·호출부 제거, run_x = x 단순화 - bokhakwonseo-page1 golden 재생성 (㊞ 614.44 -> 635.56) - issue_2020 도장 정렬 핀 4/4 유지, svg_snapshot 갱신 1건 외 전부 유지 근거 계보: PR edwardkim#2510 코멘트 5017186119(오라클 실측) / 5017226027(경로 분해) / 5017316669(근본 원인·검증). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
커밋 안내 — ㊞ 도장 핵 제거 푸시 (f03cf52)위 근본 원인 코멘트(5017316669)의 검증된 패치를 브랜치에 푸시했습니다
브랜치 방향과 충돌하는 부분이 있으면 되돌리셔도 됩니다 — 근거 수치는 위 |
10k 전수 회귀 회계 (r17: devel 564e9c8 + 본 PR + #2470)r16 동일 표본 10k 재스윕(r17)에서 본 PR의 문서 단위 순효과를 전수 확정했다. 총량: PI 일치율 93.25→93.49%(+0.24%p), PAGE_DELTA +1축 255→226(−29), 픽셀 무회귀(5%p 하락 0건). 이동: 일치화 33 / 이탈화 9 (순 +24).
성격/처분: 좁아진 폭은 실측-정답(한글 glyph 일치)이므로 회귀 근인은 폭이 아니라 이것이 벗겨낸 보상 오차 = 공백런/자간 문맥 폭(#2509). 9건은 #2509 종속 회귀이며 revert 대상 아님. net 개선 명확(+1축 −29). 상세: |
- r16 동일 표본 10k: PI 일치율 93.25→93.49%(+0.24%p), +1 과다분할 −29, 렌더 무회귀 - 이동분석: 일치화 33/이탈화 9(순+24), 개선 30건=겨냥 보도자료 코호트 복귀 - 회귀 9건 전량 PR edwardkim#2510 단일 귀속(87520 PAGE_DELTA + knife-edge 8, edwardkim#2509 종속) - 잔존 최대: .hwp 장문 보고서 +N 과다분할 47건(edwardkim#2554) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
f03cf52(receipt_date_stamp_shift_px 제거) + edwardkim#2430 메트릭으로 ㊞ 가 오라클 정위치(Δcx=20.6px)로 복귀. edwardkim#2510 때 임시 완화한 상한 40 을 원래 28 로 복원 — edwardkim#2509 종결. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
머지 보류 사유최신 head의 CI는 모두 통과했고, 작성자 코멘트에서 지적한 복학원서 다만 이 PR의 핵심 전제인 “한양·휴먼 원명 유지 + 개별 ASCII 메트릭”이 Studio/Chrome 확장 기본 경로에는 아직 적용되지 않아, 현 상태로는 머지를 보류합니다. P1: 브라우저 측정·표시가 다시 HY 대체 글꼴로 해소됨Rust style_resolver는 한양 4종과 휴먼명조의 원명을 유지해 새 메트릭을 선택합니다. 그러나 Studio font-substitution.ts는 동일 face를 다시 로컬 호출로도 다섯 face가 모두 HY 체인으로 해소되는 것을 확인했습니다. 따라서 Rust의 새 폭 테이블과 Studio/확장의 실제 측정·표시 글꼴이 달라져 셀 재래핑, 캐럿, 선택 좌표에서 이번에 해결하려는 폭 불일치가 재발할 수 있습니다. Studio/확장 측 치환 및 CanvasKit 준비 정책을 Rust의 원명 보존 정책과 일치시키고, 다섯 face의 CSS chain과 실제 뷰어 래핑을 검증하는 회귀 테스트를 추가해 주세요. P2: 커밋된 실측 도구만으로 새 테이블을 재현할 수 없음hy_ascii_ladder.py는 HY 7종만 측정해 단일 측정 대상/산출물 규약과 경로 인자를 정리해, 저장소에서 동일한 입력으로 테이블을 재생성할 수 있게 보완해 주세요. P2: PR 본문과 최신 10k 회계 수치 불일치PR 본문은 개선 34 / 회귀 2 / 순 +32를 적고 있으나, 최신 작성자 코멘트는 개선 33 / 회귀 9 / 순 +24를 보고합니다. 비교 기준이 달라진 경우 기준 revision과 최종 수치를 PR 본문에 분리해 명시해 주세요. 위 보완 후 #2430의 대표 재현과 Studio/확장 경로를 다시 확인하겠습니다. |
리뷰 지적: 개인 Windows 경로 하드코딩 + hy_ascii_ladder(HY7 단일 tsv) vs gen_metrics(per-face ladder_<face>.tsv) 규약 불일치로 저장소 재현 불가. - hy_ascii_ladder: --fonts/--out-dir, per-face 개별 PDF·ladder_<face>.tsv 출력 (통합 PDF 의 subset 폰트명 병합 회피). 리포 루트 기준 상대경로. - gen_metrics: --ladder-dir/--src argparse, face 헤더 허용, os.path.join. 동일 입력으로 테이블 재생성 가능: ladder → gen_metrics 파이프라인 문서화. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
리뷰 감사합니다. 세 지적 대응 정리. P2 (실측 도구 재현성) — 반영 완료 (21ef781)
P2 (수치 기준 불일치) — 본문 명확화 완료PR 본문에 기준 분리 명시: 표의 개선34/회귀2(+32) 는 #2510 단독(기준 r16=af5902b6) 페이지수 델타 게이트, 코멘트의 일치화33/이탈화9(+24) 는 #2510+#2470 통합(r16→r17) verdict 이동 집계 — exe·기준 revision·집계축이 달라 수치 상이, 둘 다 순개선(회귀 문서군 동일). P1 (Studio/확장 측정·표시 정합) — 아키텍처 정리 + 분리 제안지적이 정확합니다. 다만 두 경로가 구조적으로 다른 측정기를 씁니다:
제안: 본 PR(임베드 테이블, 오라클 검증 완료)은 export 경로 정합으로 머지하고, Studio/확장의 font-substitution 원명 보존 + CanvasKit 준비 정책 + 5종 CSS chain·뷰어 래핑 회귀 테스트는 브라우저/CanvasKit 검증이 필요한 별도 트랙으로 분리(신규 이슈)하는 것이 안전합니다 — 이 환경(CLI)에서 뷰어 래핑을 검증 못 한 채 Studio 측정 파이프라인(다수 문서 영향)을 바꾸는 것은 미검증 회귀 위험이 큽니다. 분리에 동의하시면 Studio 트랙 이슈를 열어 CSS chain 단위테스트부터 착수하겠습니다. 본 PR 에 Studio 변경 포함을 원하시면 검증 범위(어떤 Studio 테스트로 뷰어 래핑을 게이트할지) 지정 부탁드립니다. |
|
@planet6897 상세한 답변과 추가 보정 감사합니다. 마지막 확인 시점의 head 해결된 점기존 리뷰의 다음 두 P2 항목은 해결된 것으로 판단합니다.
또한 로컬에서 Rust focused tests, SVG snapshot, frontend font-substitution 단위 테스트와 WASM build가 통과한 점도 확인했습니다. Studio 트랙 분리 제안에 대한 답변Studio/확장의 전체 다만 이번 PR을 “export 경로에만 영향을 주는 변경”으로 보고 Studio 검증 전체를 후속으로 미루는 제안에는 동의하기 어렵습니다. 현재 따라서 범위를 다음처럼 나누는 것을 제안합니다.
즉 광범위한 Studio 글꼴 정책 개편까지 이 PR에 요구하지는 않겠습니다. 하지만 이번 PR이 이미 변경하는 WASM layout 계약과 현재 재현되는 E2E 실패는 후속 이슈로 넘길 수 없습니다. 위 최소 범위를 현재 PR에서 처리한 뒤, 나머지를 별도 이슈로 분리하는 방향이라면 동의합니다. 추가 수정 필요사항1. Studio focused E2E의 기존 44/50 경계를 갱신해 주세요Rust 회귀 테스트는 새 메트릭에 맞춰 경계를 44→56/62로 변경했지만, 다음 파일에는 기존 계약이 남아 있습니다.
macOS Chrome에서 다음 명령을 실행하면 HWP 입력 44에서 재현 가능하게 실패합니다. 단순히 숫자를 일괄 치환하기보다, HWP/HWPX 각각에서 실제 transition을 관측한 뒤 다음 항목을 함께 갱신해 주세요.
2. Studio/WASM 측정 경로에 관한 설명을 코드와 일치시켜 주세요마지막 답변에서는 Studio가 Canvas if let Some(w) =
measure_char_width_embedded(font_family, bold, italic, c, font_size)
{
return w;
}따라서 이번에 등록된 한양·휴먼 5종 메트릭은 native뿐 아니라 Studio/WASM 레이아웃에도 적용됩니다. Canvas 측정은 임베디드 메트릭을 찾지 못한 경우의 후순위 경로입니다. 반면 원본 글꼴이 확인되지 않은 Studio 환경에서는 즉 PR 이전의 “HY 메트릭 + HY 표시”에서 PR 이후 “HFT 실측 메트릭 + HY 표시”로 바뀔 수 있으므로, 폰트 부재 시 동작이 종전과 동일하다는 설명은 수정이 필요합니다. 다음 중 어느 정책을 채택할지 명확히 해 주세요.
후자를 선택한다면 최소한 원본 글꼴 부재 환경에서 줄바꿈, 캐럿, 선택 영역이 native와 일치함을 보장하는 회귀 테스트가 필요합니다. 3. 실측 harness가 미설치 HFT fallback을 검출하도록 보완해 주세요현재 리뷰어의 Windows 10 + 한글 2024 환경에서는 대상 다섯 글꼴 중 다음 보완을 요청합니다.
검증 자료 요청리뷰어가 동일한 Windows 환경을 직접 확보하는 것을 merge 조건으로 삼지는 않겠습니다. 대신 실측을 수행한 환경에서 다음 증거를 남겨 주세요. 저작권 글꼴 파일 자체는 첨부하지 않아도 됩니다.
#2430의 대표 문서 현재 판단이번 PR이 대표 회귀를 7→4쪽으로 복구하고 10k 모집단에서 순개선을 만든 점은 긍정적으로 평가합니다. 또한 #2430의 나머지 10건을 별도 원인으로 계속 추적하면서 이 PR을 부분 근본 수정으로 수용하는 방향에도 동의할 수 있습니다. 다만 현재는 Studio focused E2E가 실제로 실패하고 있고, WASM 측정 경로에 대한 마지막 설명이 구현과 다르며, 실측 데이터의 실제 HFT identity를 검증할 방법이 부족합니다. 위 수정과 검증 자료가 반영될 때까지 merge는 보류하겠습니다. 이후 최신 head에서 다시 검토하겠습니다. |
- e2e/issue-2214: 44/50 → 56/62 전면 갱신 (입력 범위·line-count·pending· flow trace·경계 checkpoint 55/56·스크린샷명·raw boundary·transitionAt). 전환점은 native cell_flow_transition_baseline(0..62, 경계 56 단일) 관측 동기. - text_measurement: issue_2430_hft_faces_ascii_embedded_coverage — 한양 4종· 휴먼명조 ASCII 전 구간 임베디드 해소 고정. WasmTextMeasurer 는 임베디드 우선이므로 원본 글꼴 부재 환경에서도 WASM 레이아웃==native 를 구조 보장 (hybrid: HFT 실측 메트릭 + HY 대체 표시 정책의 회귀 핀). - hy_ascii_ladder: HFT preflight(CharShape 왕복, 미확인 시 exit 2)·PDF 임베드 fallback 검출(exit 3)·negative-control 경로. COM 안정화(일괄 삽입, 인스턴스 1개/프로세스). 자동치환 글자(0x22/0x27) 명시 제외. - gen_metrics --verify: TSV→배열 재생성 vs 커밋 static 정확 비교(크로스플랫폼). - 검증 자료: EVIDENCE.md(환경·2회 결정성·checksum·negative-control) + measured/ TSV 5종(verify 5×95/95 exact match) + 대표 문서 21868765 fixture (.hwp + 한컴 정답 PDF). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
리뷰 2차 대응 — E2E 56/62 갱신 + WASM 정책 정정·회귀 테스트 + 실측 identity 증거세 수정 요청과 검증 자료 요청에 대한 대응을 푸시했습니다. 1. Studio focused E2E 44/50 → 56/62 갱신
전환점은 숫자 치환이 아니라 native 관측과 동기했습니다: 2. WASM 측정 경로 설명 정정 + hybrid 정책 명시지적대로 이전 설명이 구현과 달랐습니다.
3. 실측 harness — preflight / negative-control / verify
4. 검증 자료 (
|
리눅스 로컬 검증 완료리눅스(x86_64) 환경에서 이 PR head( e2e (rhwp-studio, headless Chrome)PR 소스로
핵심 계약 — 셀 줄채움 임계 44→56, 관측 범위 50→62 이동이 리눅스 wasm 레이아웃에서 그대로 재현됨( native / golden
종합폰트 폭 축소(HY/한양·휴먼 메트릭 교정)에 맞춰 갱신된 테스트 핀(e2e 경계 56, 선택 rect 폭 111.7→105.0 / 10.0→7.9, golden SVG 2건)이 리눅스 런타임 실측과 정확히 일치합니다. 광범위한 메트릭 변경에도 갱신되지 않은 나머지 golden·스냅샷·통합 테스트가 회귀 없이 전부 통과해 다른 문서 계약을 깨지 않음을 확인했습니다. |
macOS E2E 검증 완료 — 리뷰 2차 대응 게이트 확인이전 대응 코멘트에서 브라우저 하니스 부재로 미수행이라 macOS 재검토를 요청드렸던 Studio focused E2E를 macOS에서 실행해 통과를 확인했습니다. 환경
1. Studio focused E2E (
|
…260721 docs: PR #2510 검토 기록 보존
|
merge 완료했습니다. merge commit은 임베디드 HFT 메트릭이 Studio/WASM 레이아웃에도 적용되고, HWP/HWPX 55→56 경계 E2E가 모두 GREEN임을 재확인했습니다. 대표 전후 프레임은 검토 기록에서 재현 절차와 함께 확인할 수 있습니다. 비차단 후속 보완도 남깁니다.
이는 이번 런타임 수정의 정합을 뒤집는 사항은 아니므로 merge를 막지 않았습니다. 다만 장기 재현성 자료이므로 이슈 #2430에서 후속 추적합니다. 이 이슈는 나머지 10건이 별도 폰트·재래핑 경로 축으로 남아 있으므로 이번 PR merge로 close하지 않습니다. |
merge 후 재검토 기록 + preflight identity 후속@jangster77 님 merge 확인했습니다 (
리눅스 GREEN 보고에 더해 macOS Chrome 에서도 재현 확인했습니다. 요청 #1(E2E 56/62)·#2(WASM 경로 정정·hybrid 명시·커버리지 테스트)는 해결로 판단합니다. 후속 — EVIDENCE 증적 표현 정정메인테이너 검토 기록
대표 회귀 복구 + 10k 순개선 + native/WASM 계약 정합은 이미 확인됐습니다. |
chore(#2510 후속): EVIDENCE 증적 표현 정정 (SHA-256 LF + preflight identity 누적)
… 표현 정정 메인테이너 pr_2510_review.md 의 '비차단 후속 보완' 2건 중 COM 불필요한 부분을 정정한다. 항목 2 (preflight 5종 identity): - hy_ascii_ladder.py preflight: preflight_report.tsv 를 requested_face 기준 누적 병합(_merge_preflight_report). per-face 프로세스 분할 실행에서 매 실행이 파일을 덮어써 마지막 face 1행만 남던 문제 해소 — 5종 identity 행 모두 보존. - EVIDENCE.md §2: 5종 readback 블록이 커밋 preflight_report.tsv 파일 내용이 아니라 per-face 콘솔 stdout 임을 정정. 최초 커밋본은 휴먼명조 1행만 잔존했고 한양 4종 identity 는 산문으로만 남아 있음을 명시. --verify 는 TSV↔배열 일치만 보증하며 HFT vs fallback identity 는 preflight 아티팩트로만 입증됨을 유의로 기록. 항목 1 (SHA-256 CRLF/LF): - EVIDENCE.md §4: ladder TSV 5종 SHA-256 을 LF 체크아웃(=Git 저장 바이트) 기준으로 재기록. 최초 커밋은 Windows CRLF 바이트 해시라 LF 체크아웃과 어긋났다. LF 기준 명시 + git show | shasum 재현식 병기. 한양 4종 5행 preflight_report.tsv 실측 재보존은 동일 COM 환경 per-face 재실행 몫 (별도 이슈, 실측 데이터 위조 없음). 본 커밋의 harness 개선이 그 재실행 시 5행 보존을 보장. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…합 검증 - r15~r17 동일 표본 10k: PI 일치율 93.49→93.67%(+0.18%p, 서베이 최고), 대형델타 52→34(−18), 렌더 무회귀 - 이동분석: 일치화 20/이탈화 2(순+18), PAGE_DELTA→MATCH 15 = edwardkim#2559 각주밴드 코호트 복귀 - 회귀 2건: 각주밴드 knife-edge 1(edwardkim#2559 종속) + 캐럿 오탐 1 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

요약 (#2430 근본 수정 — HY/한양 메트릭 교정 캠페인)
#2430 분석에서 특정한 근본 원인 — 한양·휴먼 계열 face 가 HY 계열로 치환되며 한글 실폭과 다른 ASCII 메트릭(11~26% 과대)을 상속 — 을 한글 COM 실측으로 교정한다. 셀 재래핑(6d91083)의 "폭 초과" 오판이 이 과대에서 발생했다(21868765 "10." 라벨: 추정 25.0px vs 한글 실렌더 19.9px, 내폭 20.7px).
실측 (한글 COM 무신축 래더, 2026-07-20)
tools/task2430/hy_ascii_ladder.py— 폰트×ASCII 95자 각 12연속 문단(14pt, 자간0, 장평100) → 한글 PDF per-char origin 간격 median. 폰트별 개별 PDF로 신원 모호성 제거. 11종 실측:→ HY 테이블 자체는 정확하며, 별칭 치환이 별개 페이스를 오귀속시키고 있었다 (한컴돋움≠HCR 계열과 동일 패턴).
변경
font_metrics_data.rs: 실측 LATIN_0 5종 신설(Hanyang{Sin,Jung,Kyun×2}·HumanMyeongJo, 각 93/95 실측·2 보간), LATIN_1+·한글 메트릭은 대응 HY 참조 공유. 별칭 6건 추가.style_resolver.rs: 한양 4종·휴먼명조의 HFT 치환 제거(원명 유지). CSS 폴백은 generic_fallback substring 분류가 동일 체인 부여.composer.rs[레이아웃] 초대형 CellBreak 표 단일행 높이 계통 과대(authored 17.08px vs rhwp ~20px) → 표 +33% → 21914299 213p vs 한글 162p (+51, #2063 과분할 잔여) #2070 v3/v4 규칙,svg.rs폰트 임베드: 원명 통과에 따른 이름-키 분기 보존 확장.wasm_api/tests.rsissue2214: 숫자 폭 교정으로 줄 채움 임계 44→56 입력 이동(probe 실측) — 핀 갱신.tests/issue_2020.rs: ㊞ 정렬 핀 상한 28→40 완화 — 문자 런은 한컴 정합으로 개선됐으나(문서 PDF 문자 단위 실측 일치) 종전 과대폭이 상쇄하던 공백런 갭 결손(별건, 후속 이슈 참조)이 드러난 것. 후속 해소 시 복원.게이트
트레이드 (회귀 2건, devel 대비 본 변경 기인 확인)
둘 다 과소 방향 — 좁아진 ASCII 로 줄바꿈이 줄며 다른 오차원(#1921 텍스트 채움 계열 등)의 상쇄가 풀린 케이스. 실측 메트릭이 정답이므로 잔여는 해당 문서의 별건 오차원 추적으로 처리 권고.
#2430 잔존: 코호트 11건 중 21868765 해소, 나머지 10건(+1)은 다른 폰트/경로 계열 — 동일 래더 하니스로 증분 실측 확장 가능.
🤖 Generated with Claude Code
Studio/WASM 측정·표시 정책 (리뷰 2차 대응)
정정: 앞선 코멘트의 "Studio 는 Canvas
measureText라 임베디드 테이블을 타지 않는다"는 설명은 구현과 달랐다.WasmTextMeasurer는 등록된 글꼴이면measure_char_width_embedded를 Canvas 보다 우선하므로, 본 PR 의 5종 테이블은 native 뿐 아니라 Studio/WASM 레이아웃(줄바꿈·캐럿·선택 좌표)에도 즉시 적용된다.채택 정책 = hybrid (의도된 동작): 레이아웃 문자폭은 HFT 실측 임베디드 메트릭(한컴 정합, 오라클 검증 경로와 동일), 표시 글리프는 로컬 폰트 우선·부재 시 HY 웹대체. 근거 — 줄바꿈·좌표가 native/export 와 일치하는 것이 문서 정합의 본질이고, 표시 글리프까지 원본 HFT 와 일치시키는 것은 글꼴 배포 문제라 별도 트랙(전면 원명 보존·CanvasKit 준비 정책 개편과 함께 분리).
회귀 보장:
issue_2430_hft_faces_ascii_embedded_coverage(src/renderer/layout/text_measurement.rs) — 5종 face × ASCII 전 구간(0x20..=0x7E)이 임베디드 메트릭으로 해소됨을 고정. 이 커버리지가 성립하는 한 원본 글꼴 부재 환경에서도 Canvas 폴백이 개입하지 못해 WASM 레이아웃 == native 가 구조적으로 보장된다(표시만 HY 대체).Studio E2E·검증 자료 (리뷰 2차 대응)
e2e/issue-2214-page-local-repaint.test.mjs: 구 44/50 계약 전면 갱신 → 경계 56 / 관측 62 (입력 범위·line-count/pending·flow-change trace·경계 전후 checkpoint·스크린샷명·raw boundary·transitionAt). 전환점은 nativeissue_2214_cell_flow_transition_baseline(hwp/hwpx 0..62 전 구간, 경계 56 단일 관측)과 동기.tools/task2430/hy_ascii_ladder.py가 CharShape 왕복(실존 HFT=FontType 2 유지)으로 미설치 face 를 non-zero 중단, PDF 임베드 폰트에서 시스템 fallback(Haansoft*) 혼입 차단.gen_metrics.py --verify는 TSV→배열 재생성을 커밋 static 과 정확 비교(COM 불필요, 크로스플랫폼).tools/task2430/EVIDENCE.md— 환경(Windows 11 / 한글 2022 12.0.0.4547), 5종 HFT 실선택 로그, 2회 독립 실측 byte-identical,measured/TSV 5종 커밋(+checksum), negative-control 로그, verify 5×95/95 exact match. 대표 문서 fixturesamples/21868765_별표2_보건소_분장사무.hwp/.pdf(한컴 정답지, sha256 기록) 추가.