Task #574: HY견명조 heavy display 오분류 정정 (closes #574)#584
Conversation
본질 미확정 상태 - Stage 0 진단 후 가설 A/B/C/D 중 확정. 이슈: edwardkim#574 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
본질 식별: is_heavy_display_face (style_resolver.rs:601) 의 hardcoded list 에 HY견명조 가 포함되어 CharShape.bold=false 무시 → SVG 강제 font-weight="bold". 쪽번호 "1" 의 진짜 출처는 바탕쪽이 아닌 본문 [6] 표 셀 p[0] Shape (사각형, InFrontOfText) TextBox 내부 literal text. CharShape cs_id=0 (size=3300, bold=false, color=#000000, ratio=90%, font_id[0]=8 → HY견명조). SVG 정합: size/ratio/color 모두 일치, bold 만 강제 적용된 것이 결함. 산출물: - examples/inspect_574.rs: 머리말/바탕쪽/Shape TextBox 내 paragraph 의 char_shapes + CharShape 풀 덤프 - mydocs/working/task_m100_574_stage0.md: 본질 확정 보고서 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
단계 분할: - Stage 2: TDD 통합 테스트 + 단위 테스트 갱신 - Stage 3: is_heavy_display_face 에서 HY견명조 제거 (HY견명조B 보존) - Stage 4: 7개 샘플 광범위 sweep + cargo test/clippy - Stage 5: 한컴 PDF 시각 검증 + 최종 보고서 위험 완화: HY견명조B 명시 Bold variant 보존, text-align.hwp (Task edwardkim#146 v4 base) HY헤드라인M 만 사용 → 회귀 없음 확인. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- src/renderer/layout/tests.rs:938 단위 테스트 갱신 HY견명조: heavy 단언 → NOT heavy 단언 이동 HY견명조B: heavy 단언 유지 (명시 Bold variant) - src/renderer/layout/integration_tests.rs:797 통합 테스트 신규 test_574_page_number_not_force_bold_for_hy_kyun_myeongjo exam_science 페이지 1 우상단 쪽번호 "1" (font-size=44, HY견명조, x≈924 y≈115) 의 font-weight="bold" 미포함 단언 RED 상태 확인 완료. Stage 3 fix 후 GREEN 전환 예정. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
src/renderer/style_resolver.rs:610 단일 줄 수정. "HY견명조" 제거 (한컴 일반 두께 명조 — heavy 가 아님). "HY견명조B" 보존 (명시 Bold variant). 테스트: - test_is_heavy_display_face_matches_known_heavy_faces: GREEN - test_is_heavy_display_face_with_family_chain: GREEN - test_574_page_number_not_force_bold_for_hy_kyun_myeongjo: GREEN Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
7개 샘플 sweep (5개 변경, 2개 무변경): - exam_science/kor/eng/math/복학원서: HY견명조 텍스트의 font-weight="bold" 제거만 - synam-001: HY견명조 미사용 → 변경 없음 - text-align.hwp: HY헤드라인M 보존 → Task edwardkim#146 v4 회귀 없음 ✓ 변경 본질: 좌표/크기/색상/font-family 변경 0건. font-weight 제거만. HY견명조外 폰트 회귀 0건. 테스트: - cargo test --release --lib: 1120 passed (Task edwardkim#574 통합 테스트 포함) - clippy: Task edwardkim#574 변경 파일 신규 경고 0건 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업지시자 한컴 PDF 시각 판정 + merge/close 승인 대기. 본질: is_heavy_display_face (style_resolver.rs:601) 의 hardcoded list 에서 HY견명조 가 잘못 분류되어 CharShape.bold=false 무시 → SVG 강제 font-weight="bold". 이슈 본문 가설 정정: (1) 출처는 바탕쪽이 아닌 본문 [6] 표 셀 Shape TextBox / (2) 색상은 IR/PDF 모두 검정 — 본질은 굵기만. Fix: style_resolver.rs:610 단일 줄 - "HY견명조" 제거 (HY견명조B 보존). 회귀 검증: - 7개 샘플 sweep: 5개 변경 (HY견명조 사용), 2개 무변경 (synam-001, text-align) - text-align.hwp (Task edwardkim#146 v4 base) HY헤드라인M 보존 → 회귀 없음 - 모든 변경 라인의 100% HY견명조 한정, font-weight 제거만 - HY견명조外 폰트 회귀 0건 - cargo test --release --lib 1120 passed - clippy Task edwardkim#574 변경 파일 신규 0건 산출물: - examples/inspect_574.rs (Stage 0 진단 도구, 보존) - src/renderer/style_resolver.rs:610 fix - src/renderer/layout/tests.rs 단위 테스트 갱신 - src/renderer/layout/integration_tests.rs 통합 테스트 신규 - mydocs/plans/task_m100_574{,_impl}.md - mydocs/working/task_m100_574_stage{0,2,3,4}.md - mydocs/report/task_m100_574_report.md - mydocs/orders/20260504.md 갱신 (devel base 에 edwardkim#574 추가) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PR #584 (Task #574, @planet6897 PR / Jaeook Ryu commit author) 1차 검토: - 본질 결함: is_heavy_display_face hardcoded list 에 'HY견명조' 잘못 포함 → CharShape.bold=false 무시되고 SVG 에 font-weight='bold' 강제 적용 - Stage 0 정밀 진단으로 이슈 본문 가설 정정: "쪽번호 1" 출처는 바탕쪽이 아닌 본문 [6] 표 셀 paragraph[0] Shape TextBox 내부 literal text + IR 색상 #000000 ("회색" 가설 잘못, 본질은 굵기만) - 본질 정정: hardcoded list 에서 'HY견명조' 단일 줄 제거 ('HY견명조B' 명시 Bold variant 보존) - TDD 흐름: Stage 2 RED + Stage 3 GREEN 분리 - PR mergeable=CONFLICTING (PR base 시점 차이 + integration_tests.rs 위치 충돌), 본질 cherry-pick (3 commits) 옵션 C 통합으로 해결 가능 - 본 환경 임시 검증: cargo test --lib --release Stage 2 RED → Stage 3 fix 적용 후 1132 passed (baseline +1) / clippy 0건 권장 처리: 옵션 A — 핀셋 cherry-pick (3 commits) + 옵션 C 충돌 통합 + 결정적 검증 + 광범위 sweep + WASM + 작업지시자 시각 판정.
…ixture 1,614 페이지 회귀 0 + SVG 정량 측정 (-1,241 bold 제거) + 페이지 1 쪽번호 권위 케이스
… 오분류 정정 — @planet6897 / Jaeook Ryu 3 commits + 시각 판정 ★ 통과) PR #584 (Task #574, @planet6897 PR / Jaeook Ryu commit author): - 본질 결함: is_heavy_display_face hardcoded list 에 'HY견명조' 잘못 포함 → CharShape.bold=false 무시되고 SVG 에 font-weight='bold' 강제 적용 - Stage 0 정밀 진단으로 이슈 본문 가설 정정: 쪽번호 '1' 출처는 본문 표 셀 Shape TextBox 내부 literal text + IR 색상 #000000 ('회색' 가설 잘못, 본질은 굵기만) - 본질 정정 (단일 줄): hardcoded list 에서 'HY견명조' 제거 ('HY견명조B' 명시 Bold variant 보존) - TDD 흐름: Stage 2 RED + Stage 3 GREEN 분리 cherry-pick 3 commits: - 6d193ec Stage 0: 정밀 진단 + 진단 스크립트 (examples/inspect_574.rs) - ef6583c Stage 2: TDD 통합 테스트 + 단위 테스트 갱신 (RED) - 0002b49 Stage 3: fix 적용 (RED → GREEN) 옵션 C 충돌 통합: integration_tests.rs 의 test_521/test_552 (HEAD) 보존 + test_574 (ef6583c) 추가. 검증: - cargo test --lib --release 1132 passed (test_574 RED → GREEN, baseline +1) - svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release - WASM 4,581,498 bytes (PR #580 baseline +9,855 bytes) - 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) / 1,614 페이지 / 페이지 수 회귀 0 - SVG 정량 측정: font-weight='bold' 출현 횟수 -1,241건 제거 (exam_science -82 / exam_kor -759 / exam_eng -156 / exam_math -244) - 페이지 1 쪽번호 '1' 권위 케이스 검증 (HY견명조 font-size=44 우상단) 시각 판정 ★ 통과 — Canvas + SVG 양쪽 통과 (HY견고딕 의 굵음 영역은 본 PR 의 의도된 보존 영역으로 별도 task). closes #574.
|
본 PR 의 본질 3 commits ( 처리 결과본질 cherry-pick (3 commits)
결정적 검증
광범위 페이지네이션 회귀 sweep (본 환경 자동)
→ font-weight 변경 (HY견명조 사용 텍스트의 bold 제거) 이 페이지네이션에 영향 없음. SVG 정량 측정 (
|
| Fixture | before | after | 제거 |
|---|---|---|---|
| exam_science | 116 | 34 | -82 |
| exam_kor | 878 | 119 | -759 |
| exam_eng | 276 | 120 | -156 |
| exam_math | 394 | 150 | -244 |
| 합계 | 1,664 | 423 | -1,241 |
페이지 1 쪽번호 "1" 권위 케이스 (PR 본문 명시 영역)
exam_science_001.svg 우상단 (x≈924, y≈115, font-size=44, HY견명조):
| 상태 | SVG element |
|---|---|
| Before | <text ... font-family="HY견명조,..." font-size="44" font-weight="bold" fill="#000000">1</text> |
| After | <text ... font-family="HY견명조,..." font-size="44" fill="#000000">1</text> |
→ font-weight="bold" 제거 (CharShape.bold=false 권위 회복).
시각 판정 (★ 게이트)
작업지시자 시각 검증 결과:
- Canvas: ★ 통과 (HY견명조 일반 두께 정상)
- SVG: ★ 통과 (HY견명조 단독 정정 영역)
추가 발견 — Canvas 와 SVG 의 코드 경로 차이:
- SVG (
svg.rs):is_visually_bold()사용 →is_heavy_display_face호출 → 본 PR 의 hardcoded list 에 영향 - Canvas (
web_canvas.rs):style.bold만 사용 →is_heavy_display_face미호출 → hardcoded list 영향 없음 (애초에 강제 bold 없음)
따라서 본 PR 의 fix 효과는 SVG 경로에만 적용 (Canvas 는 처음부터 정상). 메모리 룰 feedback_image_renderer_paths_separate (renderer 별 별도 image 함수) 의 자연스러운 발현 — 두 경로의 메커니즘 차이가 의도된 보존 (Canvas 는 hardcoded list 메커니즘 자체를 사용 안 함).
본 PR 의 본질 — 단일 줄 정정의 깊이
- | "HY견고딕" | "HY견명조" | "HY견명조B"
+ | "HY견고딕" | "HY견명조B"feedback_hancom_compat_specific_over_general (케이스별 명시 가드) + feedback_rule_not_heuristic (hardcoded list 의 명시 face 룰) + Stage 0 정밀 진단의 통찰 (이슈 본문 "회색" 가설 → 실제 본질 "굵기만" 추적, feedback_v076_regression_origin) 모두 정합한 우수 사례. HY견고딕 / HY견명조B / HY헤드라인M / HY그래픽 보존 (Task #146 v4 본질 + 다른 진짜 heavy display face 보존).
별도 후속 task 영역 (작업지시자 안내)
작업지시자 SVG 시각 검증 중 발견 — HY견고딕 의 "홀수형" 등 텍스트도 font-weight="bold" 강제 적용. 이는 본 PR 이 의도적으로 보존한 영역 (Task #146 v4 본질) 이지만, 한컴 PDF 와의 비교 결과에 따라 별도 task 후보로 검토 가능. 본 PR 은 Task #574 (HY견명조 단독) 영역 정정으로 한정.
처리 보고서: mydocs/pr/archives/pr_584_report.md (작성 후 push 됩니다).
본 PR 의 7-stage 하이퍼-워터폴 + TDD Stage 2/3 분리 흐름은 본 사이클 가장 세분화된 흐름이었습니다. Stage 0 정밀 진단으로 이슈 본문 가설을 정정하고, TDD RED → GREEN 으로 fix 효과를 명시 검증한 패턴이 메인테이너 cherry-pick 의 본질만 깨끗하게 추출 + 충돌 옵션 C 통합 가능하게 했습니다. 감사합니다.
- 처리 보고서 추가: mydocs/pr/archives/pr_584_report.md PR #584 (Task #574, @planet6897 / @jangster77) 핀셋 cherry-pick 3 commits + 옵션 C 충돌 통합 + 결정적 검증 + WASM 4,581,498 bytes + 광범위 페이지네이션 sweep (164 fixture / 1,614 페이지 / 회귀 0) + SVG font-weight='bold' -1,241건 제거 + 시각 판정 ★ 통과 (Canvas + SVG) - 검토 보고서 archives 이동: mydocs/pr/pr_584_review.md → mydocs/pr/archives/pr_584_review.md - 5/5 orders 갱신: PR #584 항목 추가
…추가 — @planet6897 / Jaeook Ryu 1 commit + 시각 판정 ★ 통과) PR #592 (Task #588, @planet6897 PR / Jaeook Ryu commit author): - 본질 결함: exam_eng.hwp p7 #40 요약형 문항 글상자 사이 ↓ 화살표가 SPUA-A 저영역 (U+F003B) 미매핑으로 두부(□) 표시 - Stage 1 PDF 글리프 외곽 분석: 한컴 PDF 임베드 폰트 AAAAAL+HCRBatang 의 uF003B 1 contour 7 pts → ↓ 형태 확정 (정밀 진단) - 본질 정정: map_pua_bullet_char 에 SPUA-A 저영역 (0xF0000..=0xF00CF) 분기 신설 + U+F003B → U+2193 매핑 - 디스조인트 설계: 기존 Task #528/#509/Wingdings 영역과 완전 무중첩 - 단위 테스트 +2 (down_arrow + low_range unmapped) - 단일 파일 본질 (paragraph_layout.rs +32) 검증: - cargo test --lib --release 1134 passed (baseline 1132 + 단위 테스트 +2) - svg_snapshot 6/6 / issue_546 1 / issue_554 12 / clippy 0 / build --release - WASM 4,581,527 bytes (PR #584 baseline +29 bytes — paragraph_layout.rs +32 정합) - 광범위 페이지네이션 회귀 sweep: 164 fixture (158 hwp + 6 hwpx) / 1,614 페이지 / 페이지 수 회귀 0 - exam_eng p7 권위 영역 정확 1건 변환 (U+F003B → U+2193 ↓) - 다른 fixture 무영향 (exam_kor / exam_math / exam_science U+F003B 0건) 시각 판정 ★ 통과 — 메인테이너 exam_eng 7 페이지 40번 화살표 출력 확인. closes #588.
v0.7.9 후속 patch 사이클 (5/4 ~ 5/6). ## 신규 기능 - **CLI 바이너리 릴리즈** (Issue #608/#612, @almet 의 요청) - 4 플랫폼 GitHub Release 자산 첨부 (Linux x86_64 / macOS x86_64+aarch64 / Windows x86_64) + SHA-256 체크섬 - **PNG raster backend** (PR #599, @seo-rii) — render P4 단계 - native Skia 기반 PageLayerTree → PNG export, native-skia feature gate - **AI 파이프라인 + VLM 연동 도입** (메인테이너 후속 정정): - --vlm-target claude (1568 longest edge / 1.15 MP, Claude Vision 정합) - --scale / --max-dimension (자동 scale 계산) - export-png CLI 명령 + 매뉴얼 (한글 + 영문 dual) - 한글 폰트 fallback chain + char 단위 fallback (공백 두부 정정) + --font-path 동적 로딩 ## 외부 PR cherry-pick (13 PR / 7 컨트리뷰터) - @planet6897 / Jaeook Ryu (협업): PR #587/#589/#561/#564/#570/#575/ #580/#584/#592/#593/#567 - @oksure (Hyunwoo Park): PR #600 (closes #513) - @seo-rii: PR #599 (refs #536) - @cskwork / @johndoekim / @nameofSEOKWONHONG / @jangster77 — 사이클 누적 ## 메인테이너 정정 Skia 폰트 영역 5개 정정 (한글 fallback / font-path / char-fallback / VLM 옵션 / export-png CLI). ## 인프라 - CI 빌드 안정성 (Cargo.toml [[example]] required-features) - 광범위 페이지네이션 회귀 sweep 도구 (164 fixture / 1,614 페이지 자동) ## 후속 이슈 - #613 (VLM 프리셋 확장) - #614 (DPI 메타데이터) - #615 (pua_oldhangul.rs U+F53A 한컴 정합) - #598 (rhwp-studio 각주 삭제, 외부 컨트리뷰터 공개) ## 잔여 PR (v0.7.11 후속 patch) PR #601, #602 (@oksure) / PR #607 (@dicebattle) / PR #609 (@jangster77, Task #604) / PR #611 (@kihyunnn). 상세: CHANGELOG.md (한글) / CHANGELOG_EN.md (영문).
본질
is_heavy_display_face(src/renderer/style_resolver.rs:601) 의 hardcoded list 에 `"HY견명조"` 가 잘못 포함되어 CharShape.bold=false 가 무시되고 SVG 에font-weight=\"bold\"강제 적용됨.이슈 본문 가설 일부 정정:
핵심 변경 (단일 줄)
`src/renderer/style_resolver.rs:608-612`:
```diff
matches!(primary,
"HY헤드라인M" | "HYHeadLine M" | "HYHeadLine Medium"
| "HY그래픽" | "HY그래픽M"
)
```
보존: HY헤드라인M (Task #146 v4 본질 케이스), HY견고딕, HY견명조B (명시 Bold variant), HY그래픽
제거: HY견명조 (한컴 일반 두께 명조 — heavy 아님)
회귀 검증
7개 샘플 SVG sweep
변경 본질: 모든 변경 라인의 100% 가 HY견명조 사용 텍스트, font-weight="bold" 제거만. 좌표/크기/색상/font-family 변경 0건. HY견명조外 폰트 회귀 0건.
테스트
커밋 단위 (7 stages)
산출물
코드
문서
closes #574