Skip to content

Task #637: 한컴 호환 — cover-style 페이지 쪽번호 미표시 메커니즘 분석 (closes #637)#640

Closed
planet6897 wants to merge 5 commits into
edwardkim:develfrom
planet6897:pr-task637
Closed

Task #637: 한컴 호환 — cover-style 페이지 쪽번호 미표시 메커니즘 분석 (closes #637)#640
planet6897 wants to merge 5 commits into
edwardkim:develfrom
planet6897:pr-task637

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

배경

Task #634 (한컴 호환 — 첫 NewNumber Page 게이팅) 종료 시점에 미해결로 남은 samples/aift.pdf 페이지 2 (사업계획서 표지, 35×27 표) 와 페이지 3 (요약문, 14×17 표) 의 한컴 미표시 메커니즘.

페이지 2, 3 두 페이지 모두 PageHide page_num=true 컨트롤 없음에도 한컴은 미표시. 별도 메커니즘 존재.

결과

결정적 룰 확정

페이지가 items=1 인 단일 완전한 Table (PartialTable 아님) 을 포함하고
그 Table 의 treat_as_char=false 일 때 한컴은 쪽번호 표시 안 함.

5가지 가설 판정

가설 판정 결정적 근거
H1 cover-style 휴리스틱 → 결정적 룰 채택 174 샘플 중 aift p2, p3 만 매칭 (0.06%)
H2 셀 내부 PageHide 기각 문서 전체 PageHide 정확히 2개 (페이지 4, 5 만)
H3 paragraph header 비트 기각 페이지 2 host = 페이지 6 host byte-for-byte 동일 (ps_id 외)
H4 표 attr 비트 기각 페이지 6 (표시) 표 attr = 페이지 2 (미표시) attr 동일 (0x0600000e)
H5 한컴 자체 휴리스틱 H1 등가 H1 의 정확형

H3 결정적 byte-level 검증

페이지 char_count control_mask break_raw raw_header_extra (12B)
2 (0.1) 미표시 9 0x00000800 0x04 01 00 00 00 01 00 00 00 00 00 00 00
6 (2.57) 표시 9 0x00000800 0x04 01 00 00 00 01 00 00 00 00 00 00 00

페이지 2 host (미표시) 와 페이지 6 host (표시) 의 paragraph header 가 ps_id (시각 모양 ID) 외 byte-for-byte 동일 → H3 즉시 기각.

174 샘플 전수 조사

=== aift.hwp (2 cover-pages) ===
  page 2 (sec=0 page_num=2 pi=1): 35x27 635.6x946.3px
  page 3 (sec=1 page_num=3 pi=0): 14x17 631.3x861.1px

다른 173 샘플 모두 0건 매칭. 회귀 위험 매우 낮음.

tac=true 케이스 검증 (룰 보정)

aift.hwp 페이지 74 (pi=910), 75 (pi=911) 가 items=1 + Table + tac=true 패턴 매칭. 한컴 PDF 측정 결과 표시 ("- 67 -", "- 68 -"). tac=false 가 결정적 분리자임을 검증.

권고안 — 시나리오 (a) 채택

본 issue 는 분석 완료로 close. 결정적 룰 구현은 별도 fix issue 로 분리.

산출물

파일 설명
mydocs/plans/task_m100_637.md 수행 계획서 (4단계 stage 0~3)
mydocs/working/task_m100_637_stage0.md Stage 0 — 사전 데이터 수집 + 가설 사전 판정
mydocs/working/task_m100_637_stage1.md Stage 1 — 가설 체계적 검증 + 결정적 룰 확정
mydocs/report/task_m100_637_report.md 최종 보고서
examples/inspect_637.rs paragraph header raw + cover-candidate 분석 도구
mydocs/orders/20260506.md 오늘 할일 (#637 완료 + #639 등록 entry)

메모리 룰 준수

Test plan

  • cargo build --release 통과
  • cargo build --release --example inspect_637 통과
  • 174 샘플 전수 조사 (회귀 위험 평가)
  • aift.hwp 페이지 2, 3 (target) + 페이지 1, 6, 7+ (대조) + 페이지 74, 75 (tac=true) 한컴 PDF 측정 확정
  • paragraph header byte-level 비교 (H3 결정적 기각)
  • 표 attr 비트 매트릭스 (H4 결정적 기각)
  • 코드 변경 없음 → 회귀 검증 불필요

🤖 Generated with Claude Code

planet6897 added 5 commits May 6, 2026 15:19
aift.hwp 페이지 2, 3 (큰 표만 있는 cover-style) 쪽번호 미표시 메커니즘 분석.
Task edwardkim#634 종료 후 분리된 후속 issue.

5가지 가설 (cover-style 휴리스틱 / 셀 내부 PageHide / paragraph header 비트 /
표 attr 비트 / 한컴 자체 휴리스틱) 데이터 기반 검증 + 권고안 결정.

본 task 는 read-only 분석. 결정적 룰 발견 시에만 별도 fix issue 분리.
aift.hwp 페이지 2, 3 (큰 표만 있는 cover-style) 미표시 메커니즘 분석
사전 단계.

데이터 수집:
- dump-pages 페이지 1~6 구조 (items, body 사용량, 표 비율)
- dump 페이지 1/2/3/6 host paragraph (cc, ps_id, controls)
- 문서 전체 PageHide 컨트롤 (정확히 2개: 페이지 4 para 2.34, 페이지 5 para 2.54)
- 한컴 PDF 측정 (pypdf): 페이지 1, 6, 7 표시 / 페이지 2, 3, 4, 5 미표시 확정
- 표 attr 매트릭스 (페이지 1: 0x04000006, 2: 0x0600000e, 3: 0x0400000e, 6: 0x0600000e)

Stage 0 사전 판정:
- H1 (cover-style 휴리스틱): 유력 — 페이지 2/3 만 items=1 + 표 89~98%
- H2 (셀 내부 PageHide): 기각 — 문서 전체 PageHide 가 정확히 2개
- H3 (paragraph header 비트): 기각 — 페이지 2 (미표시) host 와 페이지 6 (표시) host 거의 동일
- H4 (표 attr 비트): 기각 — 페이지 6 표 attr = 페이지 2 표 attr (0x0600000e)
- H5 (한컴 휴리스틱): H1 변형, Stage 2 교차 검증 후 결정

본 단계는 read-only 분석. 코드 변경 없음.
도구: examples/inspect_637.rs (paragraph header raw + cover-candidate enumeration).

검증 결과:
- H1 cover-style 휴리스틱 → 결정적 룰로 정형화: 페이지가 items=1 인 단일
  완전한 Table (PartialTable 아님) 을 포함하고 tac=false 일 때 한컴은
  쪽번호 미표시.
- 174 샘플 전수 조사: aift.hwp p2, p3 만 매칭 (전체의 0.06%, 한컴 미표시 일치)
- aift.hwp 의 tac=true items=1 페이지 (p74, p75) 는 한컴 표시 — tac=false
  가 결정적 분리자임을 검증
- H2, H3, H4 최종 기각:
  * H2: 문서 전체 PageHide 정확히 2개 (페이지 4 para 2.34, 페이지 5 para 2.54)
  * H3: 페이지 2 host (미표시) 와 페이지 6 host (표시) 의 raw paragraph
        header 가 ps_id 외 byte-for-byte 동일 (cc=9, mask=0x00000800,
        break_raw=0x04, raw_header_extra 12B 완전 동일)
  * H4: 페이지 6 (표시) 표 attr = 0x0600000e (페이지 2 attr 와 동일)
- H5 (한컴 휴리스틱): H1 의 정확형 등가

회귀 위험: 매우 낮음 (174 샘플 중 2 페이지만 영향, 모두 정합성 개선).

Stage 3 사전 권고: 시나리오 (a) 별도 fix issue 분리 후 본 issue close-as-analysis.

본 단계는 read-only 분석. 코드 변경 없음 (example 추가만).
분석 완료 (Stage 0 → Stage 1 → Stage 3, Stage 2 α 결정으로 생략).

결과:
- H1 cover-style 휴리스틱이 결정적 룰로 확정:
  페이지 items=1 + 완전한 Table (PartialTable 아님) + tac=false
  → 한컴 미표시
- 174 샘플 전수 조사: aift p2, p3 만 매칭 (전체의 0.06%)
- H2/H3/H4 최종 기각
- 회귀 위험 매우 낮음 (영향 페이지 2건, 모두 정합성 개선)

권고: 시나리오 (a) — 별도 fix issue 분리 후 본 issue
close-as-analysis-complete.

코드 변경 0 (examples/inspect_637.rs 분석 도구 추가만).

orders/20260506.md 갱신 (edwardkim#637 완료 상태 반영).
GitHub Issue 처리:
- edwardkim#637 close-as-analysis-complete (분석 완료 코멘트 포함)
- edwardkim#639 등록 (fix issue: cover-style 페이지 자동 쪽번호 미표시)

orders 갱신:
- edwardkim#637 상태: "완료 (분석 close, fix issue edwardkim#639 분리)"
- edwardkim#639 신규 등록 entry 추가 (등록만, 진행 대기)

milestone v1.0.0 설정은 planet6897 권한 부족으로 실패 — 메인테이너 수동 설정 필요.
@planet6897

Copy link
Copy Markdown
Contributor Author

(α) 결정으로 본 PR close — PR #641 로 통합

작업지시자 결정에 따라 본 분석 PR (#640) 을 close 하고 PR #641 (Task #639 fix) 로 분석 + fix 를
통합 머지합니다.

PR #641 은 본 PR 의 5 커밋 (Task #637 분석) + Task #639 fix 5 커밋 = 10 커밋을 포함하며,
한컴 호환 cover-style 페이지 자동 쪽번호 미표시 fix 를 함께 제공합니다.

상세: #641

@planet6897 planet6897 closed this May 6, 2026
planet6897 added a commit to planet6897/rhwp that referenced this pull request May 9, 2026
- inspect_705.rs / scan_cell_pagehide.rs 분석 도구 추가
- aift.hwp 셀[167]/p[3] PageHide 6필드 모두 true 확인 (메인테이너 권위 측정 일치)
- 198 샘플 sweep: 셀 안 PageHide 13건 / 6 샘플 (3%) — PR edwardkim#640 H2 측정 누락 영역
- 중첩 표 (depth 2+) 실측 0건 — Stage 2 재귀 1 depth 충분
- 신규 회귀 테스트 후보 6건 도출 (aift x4 + 국립국어원/KTX x2)

Refs edwardkim#705
edwardkim pushed a commit that referenced this pull request May 9, 2026
- inspect_705.rs / scan_cell_pagehide.rs 분석 도구 추가
- aift.hwp 셀[167]/p[3] PageHide 6필드 모두 true 확인 (메인테이너 권위 측정 일치)
- 198 샘플 sweep: 셀 안 PageHide 13건 / 6 샘플 (3%) — PR #640 H2 측정 누락 영역
- 중첩 표 (depth 2+) 실측 0건 — Stage 2 재귀 1 depth 충분
- 신규 회귀 테스트 후보 6건 도출 (aift x4 + 국립국어원/KTX x2)

Refs #705
edwardkim added a commit that referenced this pull request May 9, 2026
PR #638/#641 close 시 작업지시자 (메인테이너) 가 발견한 본 환경 결함
3건의 본질 정정. PR #641 (cover-style 휴리스틱 우회) 폐기 후 작업지시자
권고 영역의 본질 정정 supersede.

본질 결함 3건:
1. pagination/engine.rs:519-544 + typeset.rs:2120 — page_hides 수집이
   본문 paragraph 만 → 셀 안 PageHide 무시 (두 페이지네이션 경로 양분 정합)
2. layout.rs:411-422 — build_page_background()/build_page_borders() 호출에
   hide_fill/hide_border 가드 부재
3. main.rs:1665-1670 — dump 셀 안 controls 매칭에서 PageHide 분기 부재

정정:
- collect_pagehide_in_table 재귀 함수 (engine.rs + typeset.rs 두 경로 동기)
- layout.rs 의 hide_fill/hide_border 가드 추가 — 6 필드 모두 가드 정합화
- main.rs dump 셀 안 PageHide 분기 추가

Stage 0 198 sample sweep 측정:
- 셀 안 PageHide 13건 / 6 샘플 (PR #640 H2 측정 누락 영역의 정량 확인)
- 영향 샘플: aift, 2022 국립국어원, KTX, kps-ai, tac-img-02 hwp+hwpx

회귀 가드 (test_705_*) 6건:
- aift p2 셀[167] 6 필드 모두 true 검증
- aift p3 셀[31] page_num 검증
- 국립국어원/KTX 셀 안 PageHide 매핑 검증
- 본문 + 셀 안 합산 카운트 검증

작업지시자 시각 판정 ★ 통과 (2026-05-09):
- 한컴 PDF 권위본 (pdf/2022년 국립국어원 업무계획-2022.pdf page 3
  마지막 줄 "- 1 -") 정합
- 한컴 편집기 [감추기] 다이얼로그 6 필드 영역 정합
- aift.hwp page 2 + 국립국어원 page 3 등 셀 안 PageHide 영역 모두 정합

메인테이너 가드 갱신 commit (3253f7d):
- test_634_gukrip_page3_shows_page_number: count == 3 → count == 0
  (rhwp 의 한컴 부정합 행위 보존 → 한컴 권위 정합으로 의도 변경)

검증:
- cargo test --release: lib 1173 (+6 test_705 신규) + 통합 ALL GREEN, failed 0
- cargo clippy --release: 신규 경고 0
- 광범위 sweep 7 fixture / 170 페이지 / diff 2 (aift p2/p3 의도된 변경, 다른
  fixture 회귀 0)
- WASM 빌드 4,606,179 bytes

PR supersede 영역:
- PR #638 (Task #634) close → src 무변경 회귀 가드만 머지
- PR #640 (Task #637) close → 분석 docs (H2 측정 누락 영역의 정량 확인)
- PR #641 (Task #639) close → cover-style 휴리스틱 폐기 (작업지시자 권고)
- PR #711 (Task #705) — 본질 정정 supersede

Closes #705

Co-Authored-By: Jaeook Ryu <jaeook.ryu@gmail.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 9, 2026
- mydocs/pr/archives/pr_711_review.md (검토 문서, 시각 판정 결과 반영)
- mydocs/pr/archives/pr_711_report.md (처리 보고서, 가드 갱신 명시)
- mydocs/plans/archives/task_m100_705{,_impl}.md
- mydocs/orders/20260509.md: PR #711 행 + 본 사이클 패턴 라인 추가

처리 결과:
- 옵션 A — 7 commits cherry-pick + 메인테이너 가드 갱신 + no-ff merge (2bc982c)
- 작업지시자 시각 판정 ★ 통과 — 한컴 정답지 정합 확정
- test_634_gukrip_page3 가드 갱신 (count=3 → 0, 메인테이너 commit 3253f7d)
- PR #638/#640/#641 close → PR #711 본질 정정 supersede
- Issue #705 close 자동 정합

부수 사실:
- PR #706 form-002 패턴 정합 영역 의 두 번째 사례
- `feedback_visual_judgment_authority` + `feedback_visual_regression_grows` 권위 사례 강화

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.

1 participant