Skip to content

Task #574: HY견명조 heavy display 오분류 정정 (closes #574)#584

Closed
planet6897 wants to merge 7 commits into
edwardkim:develfrom
planet6897:pr-task574-stream
Closed

Task #574: HY견명조 heavy display 오분류 정정 (closes #574)#584
planet6897 wants to merge 7 commits into
edwardkim:develfrom
planet6897:pr-task574-stream

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

본질

is_heavy_display_face (src/renderer/style_resolver.rs:601) 의 hardcoded list 에 `"HY견명조"` 가 잘못 포함되어 CharShape.bold=false 가 무시되고 SVG 에 font-weight=\"bold\" 강제 적용됨.

이슈 본문 가설 일부 정정:

  • 쪽번호 "1" 출처는 바탕쪽이 아닌 본문 [6] 표 셀 paragraph[0] Shape (사각형, InFrontOfText) TextBox 내부 literal text "1"
  • IR 색상 #000000 (검정), 한컴 PDF 도 검정 — "회색" 가설 잘못. 본질은 굵기만

핵심 변경 (단일 줄)

`src/renderer/style_resolver.rs:608-612`:

```diff
matches!(primary,
"HY헤드라인M" | "HYHeadLine M" | "HYHeadLine Medium"

  • | "HY견고딕" | "HY견명조" | "HY견명조B"
  • | "HY견고딕" | "HY견명조B"
    | "HY그래픽" | "HY그래픽M"
    )
    ```

보존: HY헤드라인M (Task #146 v4 본질 케이스), HY견고딕, HY견명조B (명시 Bold variant), HY그래픽
제거: HY견명조 (한컴 일반 두께 명조 — heavy 아님)

회귀 검증

7개 샘플 SVG sweep

샘플 변경 페이지 비고
exam_science.hwp 4/4 본 이슈 샘플
exam_kor / eng / math 전체 HY견명조 사용
복학원서.hwp 1/1 HY견명조 사용
synam-001.hwp 0/35 HY견명조 미사용
text-align.hwp 0/1 Task #146 v4 base — HY헤드라인M 보존, 회귀 없음

변경 본질: 모든 변경 라인의 100% 가 HY견명조 사용 텍스트, font-weight="bold" 제거만. 좌표/크기/색상/font-family 변경 0건. HY견명조外 폰트 회귀 0건.

테스트

커밋 단위 (7 stages)

  1. Stage 0 수행 계획서
  2. Stage 0 정밀 진단 + 본질 확정 보고서 (코드 무수정 + 진단 스크립트 `examples/inspect_574.rs`)
  3. Stage 1 구현 계획서
  4. Stage 2 TDD 통합 테스트 + 단위 테스트 갱신 (RED)
  5. Stage 3 fix 적용 (RED → GREEN)
  6. Stage 4 광범위 회귀 sweep + 전체 테스트 + clippy
  7. Stage 5 최종 결과 보고서

산출물

코드

  • `src/renderer/style_resolver.rs` — fix
  • `src/renderer/layout/tests.rs` — 단위 테스트 갱신
  • `src/renderer/layout/integration_tests.rs` — 통합 테스트 신규
  • `examples/inspect_574.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`

closes #574

planet6897 and others added 7 commits May 4, 2026 16:55
본질 미확정 상태 - 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>
edwardkim added a commit that referenced this pull request May 5, 2026
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 + 작업지시자 시각 판정.
edwardkim added a commit that referenced this pull request May 5, 2026
…ixture 1,614 페이지 회귀 0 + SVG 정량 측정 (-1,241 bold 제거) + 페이지 1 쪽번호 권위 케이스
edwardkim added a commit that referenced this pull request May 5, 2026
… 오분류 정정 — @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.
@edwardkim

Copy link
Copy Markdown
Owner

@planet6897 @jangster77 님,

본 PR 의 본질 3 commits (6d193ec9 + ef6583ce + 0002b496) 핀셋 cherry-pick 후 devel merge 완료되었습니다 (4c44a27).

처리 결과

본질 cherry-pick (3 commits)

  • 6d193ec9 Stage 0 정밀 진단 + 진단 스크립트 (examples/inspect_574.rs — 향후 재사용 가치)
  • ef6583ce Stage 2 TDD 통합 테스트 + 단위 테스트 갱신 (RED)
  • 0002b496 Stage 3 fix (RED → GREEN, style_resolver.rs 단일 줄 정정)
  • author Jaeook Ryu (@jangster77) 보존
  • 옵션 C 충돌 통합: integration_tests.rs 의 HEAD 영역 (test_521/test_552) 보존 + ef6583c 의 test_574 추가

결정적 검증

광범위 페이지네이션 회귀 sweep (본 환경 자동)

통계 결과
총 fixture 164 (158 hwp + 6 hwpx)
총 페이지 (devel baseline) 1,614
총 페이지 (cherry-pick 후) 1,614
fixture 별 페이지 수 차이 0

→ font-weight 변경 (HY견명조 사용 텍스트의 bold 제거) 이 페이지네이션에 영향 없음.

SVG 정량 측정 (font-weight="bold" 출현 횟수 제거)

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 통합 가능하게 했습니다. 감사합니다.

@edwardkim edwardkim closed this May 5, 2026
edwardkim added a commit that referenced this pull request May 5, 2026
- 처리 보고서 추가: 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 항목 추가
edwardkim added a commit that referenced this pull request May 5, 2026
…추가 — @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.
edwardkim added a commit that referenced this pull request May 5, 2026
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 (영문).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants