Skip to content

fix: 글상자 내부 inline equation duplicate emit 차단 — 시험지 page 2 <보기> textbox content scramble 해소 (closes #962)#964

Closed
jangster77 wants to merge 4 commits into
edwardkim:develfrom
jangster77:local/task962
Closed

Conversation

@jangster77

Copy link
Copy Markdown
Collaborator

요약

samples/3-11월_실전_통합_2022.hwp page 2 문14 <보기> textbox (InFrontOfText TAC 사각형 + 내부 글상자) 의 inline 수식이 각각 2번 emit → ㄱㄴㄷ prefix + 본문 + 수식 시각 overlap.

Root cause

SVG 분석 결과 보기 textbox 영역 (y 440-540, x 400-760) 에 equation 12 개 (예상 6 × 2 duplicates):

  • Set 1 (정상, gap 위치): paragraph_layout 의 inline TAC 처리 (paragraph_layout.rs:2078+)
  • Set 2 (duplicate, textbox 좌측 edge x=406): shape_layout 두번째 loop 의 Equation branch (shape_layout.rs:1609)

원래 두번째 loop 의 의도: paragraph_layout 미지원 이전의 legacy fallback. 현재 paragraph_layout 가 textbox 내부 inline TAC 를 정상 처리하므로 중복 emit 발생.

Fix

`src/renderer/layout/shape_layout.rs:1609-1675` — Equation branch 에서 emit 전 inline_shape_position 확인:

let equiv_cell_ctx = CellContext { /* parent_cell_path + textbox entry */ };
if tree.get_inline_shape_position(section_index, pi, ctrl_idx_in_para, Some(&equiv_cell_ctx)).is_some() {
    inline_x += eq_w;  // paragraph_layout 가 이미 emit
} else {
    // legacy fallback (기존 emit 분기 유지)
}

검증

  • cargo test --release --lib: 1288 passed, 0 failed
  • 시험지 page 2 보기 textbox equations: 12 → 6 ✓
  • 시각: ㄱ. h(1)=3 / ㄴ. 함수 h(x)는... / ㄷ. 함수 g(x)가... ✓ 한컴 PDF 정합
  • LAYOUT_OVERFLOW count: 325 → 325 (회귀 0)
  • exam_kor/math/eng, sample14, 시험지 4종: 시각 회귀 0

영향

영역 영향
textbox 내부 inline Equation (paragraph_layout 등록 case) duplicate 제거 (회귀 fix)
textbox 내부 inline Equation (legacy fallback) 영향 없음 (else 분기 유지)
textbox 내부 Shape/Picture/Table 본 fix 미대상
textbox 외부 standalone equation 영향 없음

관련

→ 원 #952 의 5 issue 모두 해결.

Note

samples/pdfs 는 이전 PR 에서 추가되므로 본 PR 에 포함 안 함 (중복 방지).
layout.rs 변경은 PR #958/#961 영역 — 본 PR 에 포함 안 함.

Test plan

  • cargo test --release --lib 통과
  • 시험지 page 2 보기 textbox 한컴 PDF 정합 (12→6 equations)
  • LAYOUT_OVERFLOW 회귀 0
  • 시각 회귀 0 (exam, sample10~14, 시험지 4종)

🤖 Generated with Claude Code

…ox content scramble 해소 (closes edwardkim#962)

## 본질

`samples/3-11월_실전_통합_2022.hwp` page 2 문14 <보기> textbox (pi=118 InFrontOfText TAC 사각형 + 내부 글상자) 의 inline 수식이 각각 2번 emit → ㄱㄴㄷ prefix + 본문 + 수식 시각 overlap.

## Root cause

`RHWP_DEBUG_PARA_TAC` + SVG 분석:
- 보기 textbox 영역 (y 440-540, x 400-760) 의 equation transforms: **12 개** (예상 6 × 2 duplicates)
- Set 1 (gap 위치, 정상): paragraph_layout 의 inline TAC 처리 (paragraph_layout.rs:2078+)
- Set 2 (textbox 좌측 edge x=406): shape_layout 두번째 loop 의 Equation branch (shape_layout.rs:1609)

원래 두번째 loop 의 의도: paragraph_layout 미지원 이전의 legacy fallback. 현재 paragraph_layout 가 textbox 내부 inline TAC 를 정상 처리하므로 중복 emit 발생.

## Fix

`src/renderer/layout/shape_layout.rs:1609-1675`:

```rust
Control::Equation(eq) => {
    let eq_w = hwpunit_to_px(eq.common.width as i32, self.dpi);
    let eq_h = hwpunit_to_px(eq.common.height as i32, self.dpi);
    // [Task edwardkim#962] 글상자 내부 paragraph 의 inline equation 은 paragraph_layout 가
    // 정확한 gap 위치 (text 사이) 에 emit. 본 두번째 loop 는 legacy fallback.
    let equiv_cell_ctx = CellContext {
        parent_para_index: para_index,
        path: { /* parent_cell_path + textbox entry */ },
    };
    if tree.get_inline_shape_position(
        section_index, pi, ctrl_idx_in_para, Some(&equiv_cell_ctx)
    ).is_some() {
        // paragraph_layout 가 이미 emit — inline_x 만 advance
        inline_x += eq_w;
    } else {
        // legacy fallback (기존 emit 분기 유지)
        ...
    }
}
```

## 검증

- cargo test --release --lib: 1288 passed, 0 failed
- 시험지 page 2 보기 textbox equations: 12 → 6 ✓ (duplicates 제거)
- 시각: ㄱ. h(1)=3 / ㄴ. 함수 h(x)는... / ㄷ. 함수 g(x)가... ✓ 한컴 PDF 정합
- LAYOUT_OVERFLOW count: 325 → 325 (회귀 0)
- exam_kor/math/eng, sample14, 시험지 4종: 시각 회귀 0

## 영향

| 영역 | 영향 |
|------|------|
| textbox 내부 inline Equation (paragraph_layout 등록 case) | duplicate 제거 (회귀 fix) |
| textbox 내부 inline Equation (legacy fallback) | 영향 없음 (else 분기 유지) |
| textbox 내부 Shape/Picture/Table | 본 fix 미대상 |
| textbox 외부 standalone equation | 영향 없음 |

## 관련

- 원 issue edwardkim#952 + PR edwardkim#956 (Issue 1 외곽선)
- PR edwardkim#958 (Issue 2 sample16 page 18)
- PR edwardkim#961 (Issue 3 시험지 page 1 문9 vertical)
- PR edwardkim#963 (Issue 4 cases formula off-by-one)
- 본 PR (Issue 5 보기 textbox duplicate equation)

원 edwardkim#952 의 5 issue 모두 해결 → close 가능.

## Note

samples/pdfs (시험지) 는 이전 PR (edwardkim#956/edwardkim#961) 에서 추가되므로 본 PR 에 포함 안 함 (중복 방지).
layout.rs 변경은 PR edwardkim#958/edwardkim#961 영역 — 본 PR 에 포함 안 함.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@edwardkim edwardkim self-requested a review May 17, 2026 14:07
@edwardkim edwardkim added the enhancement New feature or request label May 17, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone May 17, 2026
edwardkim added a commit that referenced this pull request May 17, 2026
@jangster77 — Issue #952 Issue 1: 페이지 외곽선 paper/body 잘못 분류 회귀.

회귀 source: 4bb1128 fix (#920) 의 paper_based = (attr & 0x01) == 0 비트 반전.
회귀 history: task877 (!= 0, sample16 정합/시험지 회귀) → #920 (== 0, 시험지 정합/sample16 회귀)
→ 본 PR (true, 모든 sample 한컴 정합).

진단: 5+ samples 한컴 viewer 실측 — attr 0/1, textBorder PAPER/CONTENT 양쪽 다
paper-based. bit 0 은 outline 위치 결정 비트 아님 (text wrap interaction 등 별 의미).

본질 (src/renderer/layout.rs +16/-2):
- paper_based = true 강제 (#920 회귀 코드 대체)
- RHWP_DEBUG_PAGE_BORDER 환경변수 진단 영구화
- 회귀 history 코멘트 영구 보존 (재회귀 방지)

추가: 시험지 fixture 8 (HWP/HWPX) + 한컴 2022 권위 PDF 4 (회귀 가드) + 문서 4.

본 PR 범위 외 (별도 task 분리, PR 본문 명시):
- Issue 2: sample16 page 18 본문 밀림 (typeset multi-TAC cursor over-advance)
- Issue 3: 시험지 문9 vertical 처짐 (HWP5 column)

자기 검증: cargo test --release --lib 1288 passed / clippy 통과 /
광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드
시각 판정: 작업지시자 시각 검증 통과 (sample16 + 시험지 page border paper-based,
한컴 2022 PDF 권위)
CI: ✅ Build & Test + CodeQL + Canvas visual diff

연속 5 PR 1번째 (#956#958#961#963#964, @jangster77 순차 처리)
edwardkim added a commit that referenced this pull request May 17, 2026
@jangster77 — Issue #957 (Issue #952 영역 영역 Issue 2 분리 task): sample16 page 18
"나. 주요 과업내용" 후 본문 (pi=395~401) 다음 페이지 밀림.

Root cause (RHWP_DEBUG_TAC_CURSOR 추적): pi=394 ci=1 picture 의 빈 caption
(dir=Bottom width=0 paras=1 text="") 영역 영역 phantom +430.6px 누적 →
pi=395 가 body 외 영역 emit → 다음 페이지 밀림.

본질 (src/renderer/layout.rs): caption_is_empty 가드 — caption 모든 paragraph
영역 영역 무의미 문자 (≤U+001F, U+FFFC) + controls.is_empty() 시 result_y
advance skip. RHWP_DEBUG_TAC_CURSOR 진단 영구화 (PR #956 RHWP_DEBUG_PAGE_BORDER
패턴 정합).

영역 좁힘: 빈 caption + Bottom 한정 — non-empty/None/Top 영향 없음.

본 환경 충돌 수동 해결:
- mydocs/orders/20260517.md — 본 환경 PR #956 처리 섹션 + PR #958 Task #957
  작업 일지 양측 보존 통합
- src/renderer/layout.rs — PR #956 (paper_based :770) + PR #958 (caption :3491)
  다른 영역 auto-merge (양립 확인)

자기 검증: cargo test --release --lib 1288 passed / clippy 통과 /
광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드
시각 판정: 작업지시자 시각 검증 통과 (sample16 page 18 본문 같은 페이지,
sample14/10/11/13 + PR #956 page border 회귀 부재)
CI: ✅ Build & Test + CodeQL + Canvas visual diff

연속 5 PR 2번째 (#956 ✅ → #958#961#963#964)
edwardkim added a commit that referenced this pull request May 17, 2026
… column 외부 emit advance skip

@jangster77 — Issue #959 (Issue #952 영역 영역 Issue 3 분리 task): 시험지 (3-11월)
page 1 우측 단 문9 ~250px 처짐.

Root cause (RHWP_DEBUG_TAC_CURSOR 추적): Shape pi=69 ci=0 picture
(horz_rel_to=Column, h_offset=79.5mm, Center) 영역 영역 pic_emit_x=767 >
col_area right=759.7 → picture 좌측 edge column 외부, 한컴 PDF 우측 단 미표시.
그럼에도 cursor 274px advance → 문9 처짐.

본질 (src/renderer/layout.rs:3537): saved_y_offset — horz_rel_to=Column
picture pic_emit_x 가 col_area 우측 초과 시 result_y = saved_y_offset
(advance skip, :3566).

영역 좁힘: horz_rel_to=Column + col 외부 한정 — col 내부/Paper/Page/Para/TAC
영향 없음.

본 환경 충돌 수동 해결:
- mydocs/orders/20260517.md — 본 환경 PR #956/#958 처리 표 + PR #961
  Task #959/#960 작업 일지 양측 보존 통합
- src/renderer/layout.rs — auto-merge: PR #956 paper_based=true :770 +
  PR #958 caption_is_empty :3491 + PR #961 saved_y_offset :3537 3 정정 양립
- 시험지 fixture 8 + PDF 4 — PR #956 머지 영역 영역 동일 content (devel 보존)

자기 검증: cargo test --release --lib 1288 passed / clippy 통과 /
광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드
시각 판정: 작업지시자 시각 검증 통과 (시험지 page 1 문9 y=805 한컴 PDF 정합,
시험지 4종 + exam_kor p18 + PR #956/#958 회귀 부재)
CI: ✅ Build & Test + CodeQL + Canvas visual diff

Issue #952 종결 — Issue 1 (#956) + Issue 2 (#958) + Issue 3 (#961) 모두 해결.
잔존: Issue #960 (page 2 multi-line equation off-by-one, pre-existing, 별도)
연속 5 PR 3번째 (#956 ✅ → #958 ✅ → #961#963#964)
edwardkim added a commit that referenced this pull request May 17, 2026
@jangster77 — Issue #960 (Issue #952 영역 영역 Issue 4, PR #961 page 2 검증 중 발견):
시험지 (3-11월) page 2 문14 (pi=117) cases formula 가 line 0 (y=329) 에 emit
→ header text 와 overlap.

Root cause (RHWP_DEBUG_PARA_TAC 추적): char_offsets gap 분석 영역 영역 cases (ci=3)
→ position 30 (= \n 위치). compose_lines line 1 chars [23,30) 에서 position 30
제외 → is_last_run && pos == end 만 허용 → line 1 (last line 아님) 누락 →
line 0 (header) emit → overlap.

본질 (src/renderer/layout/paragraph_layout.rs:1730):
allow_end_tac = is_last_run || (comp_line.has_line_break && is_last_run_of_line(run_idx))
— has_line_break line 의 마지막 run 도 end position TAC 포함.
RHWP_DEBUG_PARA_TAC 진단 영구화.

영역 좁힘: has_line_break + end-position 한정 — has_line_break 없는 line /
일반 TAC (line 안쪽) 영향 없음.

본 환경 충돌 수동 해결: mydocs/orders/20260517.md (--ours 본 환경 PR 처리 표
보존 + Task #960/#962 작업 일지 갱신). paragraph_layout.rs auto-merge
(devel 변경 부재, PR #956/#958/#961 은 layout.rs — 다른 파일, 4 정정 양립).

자기 검증: cargo test --release --lib 1288 passed / clippy 통과 /
광범위 sweep 7 fixture / 169 페이지 / 168 same / 1 diff (exam_math_017.svg).
exam_math page 18 inline equation line 매핑 변화 — 작업지시자 한컴 2020 에디터
직접 확인 영역 영역 **의도된 정정 확정** (이전 잘못된 line emit → 정정 후 올바른
line, 시험지 page 2 cases 와 동일 본질). WASM 4.4 MB 재빌드.

시각 판정: 작업지시자 시각 검증 통과 (시험지 page 2 cases y=352 한컴 PDF 정합
+ exam_math page 18 의도 확정 + 회귀 부재)
CI: Build & Test pending (devel merge commit 재트리거) — 본 환경 자기 검증 보완

잔존: Issue #962 (page 2 보기 textbox scramble, pre-existing, 별도 task)
연속 5 PR 4번째 (#956 ✅ → #958 ✅ → #961 ✅ → #963#964)
edwardkim added a commit that referenced this pull request May 17, 2026
- mydocs/pr/archives/pr_963_review.md (TAC line 매핑 off-by-one 분석)
- mydocs/pr/archives/pr_963_report.md (옵션 A + exam_math p18 sweep diff 의도 확정)
- mydocs/orders/20260517.md PR #963 행 추가

핵심:
- pi=117 cases formula position 30 (\n) off-by-one (RHWP_DEBUG_PARA_TAC)
- allow_end_tac (has_line_break line 마지막 run end-position TAC 포함)
- PR #956/#958/#961 (layout.rs) + #963 (paragraph_layout.rs) 4 정정 양립
- sweep 168/169 same + exam_math p18 diff 1건 → 작업지시자 한컴 2020 직접 확인 의도 확정
- Issue #960 close, Issue #962 잔존 (별도 task, 연속 PR #964 후속)
edwardkim added a commit that referenced this pull request May 17, 2026
@jangster77 — Issue #962 (Issue #952 영역 영역 Issue 5, PR #963 page 2 검증 중 발견):
시험지 (3-11월) page 2 문14 <보기> textbox inline 수식 각각 2번 emit → scramble.

Root cause (SVG 분석): 보기 textbox 영역 영역 equation 12개 (6×2 duplicates):
- Set 1 (정상, gap 위치): paragraph_layout inline TAC (paragraph_layout.rs:2078+)
- Set 2 (duplicate, textbox 좌측 edge): shape_layout 두번째 loop legacy fallback
paragraph_layout 가 현재 textbox 내부 inline TAC 정상 처리 → legacy fallback 중복.

본질 (src/renderer/layout/shape_layout.rs:1620): Equation branch emit 전
get_inline_shape_position (equiv_cell_ctx — parent_cell_path + textbox entry)
확인 → paragraph_layout 등록 시 inline_x += eq_w 만 (duplicate 차단),
미등록 시 legacy fallback 유지.

영역 좁힘: paragraph_layout 등록 case 한정 — legacy fallback /
Shape/Picture/Table / standalone 영향 없음.

본 환경 충돌 수동 해결: mydocs/orders/20260517.md (--ours 본 환경 PR 처리 표
보존 + Task #962 작업 일지 갱신). shape_layout.rs auto-merge (devel 변경 부재).
PR #956/#958/#961 (layout.rs) + #963 (paragraph_layout.rs) + 본 PR
(shape_layout.rs) — **5 정정 모두 다른 파일, 양립 확인**.
devel merge commit (93dfe0a/3d1cdf31) cherry-pick 제외 — 본질 682875f 만.

자기 검증: cargo test --release --lib 1288 passed / clippy 통과 /
광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드
시각 판정: 작업지시자 시각 검증 통과 (시험지 page 2 보기 textbox 12→6,
ㄱ/ㄴ/ㄷ 한컴 PDF 정합 + 회귀 부재)
CI: ✅ Build & Test + CodeQL + Canvas visual diff

원 Issue #952 의 5 분리 결함 완결:
#952 Issue 1 (#956) + Issue 2 (#958) + Issue 3 (#961) + #960 (#963) + #962 (본 PR)
연속 5 PR 완결 (@jangster77: #956#958#961#963#964)
@edwardkim

Copy link
Copy Markdown
Owner

@jangster77 머지 완료 (commit 808f419e).

SVG 분석 영역 영역 보기 textbox equation 12개 (Set 1 paragraph_layout 정상 + Set 2 shape_layout legacy fallback duplicate) 정확 진단. get_inline_shape_position (equiv_cell_ctx) 확인 영역 영역 paragraph_layout 등록 case duplicate 차단 + legacy fallback else 유지 — 케이스별 명시 정정.

PR #956/#958/#961 (layout.rs) + #963 (paragraph_layout.rs) + 본 PR (shape_layout.rs) 5 정정 모두 다른 파일 양립 확인.

본 환경 자기 검증:

  • cargo test --release --lib 1288 passed, 0 failed
  • cargo clippy --release -- -D warnings 통과
  • 광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff (회귀 부재)
  • WASM 4.4 MB 재빌드
  • 작업지시자 시각 판정 통과 — 시험지 page 2 보기 textbox equations 12→6, ㄱ/ㄴ/ㄷ 한컴 PDF 정합 (scramble 해소) + 회귀 부재

원 Issue #952 의 5 분리 결함 완결:

연속 5 PR (#956#958#961#963#964) 완결. 진단 방법론 (1 통합 issue → 5 분리 결함 → 부분 해결 + 명확한 분리) 영역 영역 archive/task936 "9회 시도 + 5회 revert" 대조 교훈 정합. 수고하셨습니다.

@edwardkim edwardkim closed this May 17, 2026
edwardkim added a commit that referenced this pull request May 17, 2026
- mydocs/pr/archives/pr_964_review.md (textbox inline equation duplicate 분석)
- mydocs/pr/archives/pr_964_report.md (옵션 A + Issue #952 5 분리 결함 완결)
- mydocs/orders/20260517.md PR #964 행 + 연속 5 PR 총평

핵심:
- 보기 textbox equation 12개 (Set 1 paragraph_layout + Set 2 shape_layout legacy duplicate)
- get_inline_shape_position (equiv_cell_ctx) 확인 영역 영역 duplicate 차단
- PR #956~#964 5 정정 다른 파일 양립 (layout.rs×3 + paragraph_layout.rs + shape_layout.rs)
- sweep 169/169 same + 작업지시자 시각 판정 통과
- 원 Issue #952 의 5 분리 결함 완결 (#956/#958/#961/#963/#964)
- @jangster77 연속 5 PR 완결
edwardkim added a commit that referenced this pull request May 17, 2026
…gn vertical bits 파싱 정정

@jangster77 — Issue #965: sample16 page 18 WMF 다이어그램 박스 내부 한글 텍스트
박스 외부 벗어남.

Root cause (src/wmf/converter/svg/mod.rs:2208 set_text_align): mode & VTA_TOP(=0x0000)
== 0x0000 항상 true → BASELINE/BOTTOM mode 도 VTA_TOP 오매핑 → +ascent shift →
baseline 박스 하단 걸침. WMF [MS-WMF] 2.1.2.18 spec 정합.

본질 (svg/mod.rs 3 영역 ~60 lines):
- set_text_align (:2208): v_bits = mode & 0x0018 마스킹 + 우선순위 BASELINE→BOTTOM→TOP
- ext_text_out (:811): baseline y shift 정합 (VTA_BASELINE=0, BOTTOM=-em*0.2, TOP=+ascent)
  — font.height < 0 잘못된 보정 제거
- text_out (:1545): META_TEXTOUT 동일 보정 (PR #918 미포함, 본 PR 추가)

PR #918 supersede: PR #918 (CLOSED 5/16, +5082/-74 거대 PR, 다양한 부작용
LibreOffice emfio/WASM RasterPlayer 등) → Stage 33-A root cause ~60 lines 만
단독 포팅. feedback_pr_supersede_chain (a) + feedback_small_batch_release_strategy
권위 사례.

본 환경 충돌 수동 해결: orders/20260517.md (--ours + Task #965 작업 일지 갱신).
svg/mod.rs auto-merge — devel PR #860/#864 (5/16, EMF/WMF image 렌더) 변경
보존 + PR #966 정정 양립 확인.

자기 검증: cargo test --release --lib 1288 passed / clippy 통과 /
광범위 sweep 7 fixture / 169 페이지 / 169 same / 0 diff / WASM 4.4 MB 재빌드
시각 판정: 작업지시자 시각 검증 통과 (sample16 p18 WMF 박스 한글 텍스트 정상
+ WMF sample14/4 + devel PR #860/#864 EMF/WMF 회귀 부재)
CI: ✅ Build & Test + CodeQL

@jangster77 연속 5 PR (#956~#964) 완결 후 추가 #966 (#968 후속)
edwardkim added a commit that referenced this pull request May 17, 2026
@jangster77 — Issue #967: HWP3 sample18 페이지 수 rhwp 69 vs 한컴 67 (+2 inflate).
빈 paragraph (pi=27/164) 직후 [쪽나누기] (pi=28/165) → 빈 paragraph 별도
page 분기 → 단독 빈 페이지.

Root cause (typeset.rs:555-584): next_force_break (쪽나누기) 시
next_will_vpos_reset 가드 미발동 (hwp-multi-001 회귀 차단 목적) → 빈 paragraph
단독 page 생성.

본질 (src/renderer/typeset.rs:585 별도 분기):
next_force_break && is_curr_empty && empty_h_px > avail (overflow) 시에만
continue (skip → 단독 page 차단). fit 가능 시 정상 emit.

v2 정밀화: v1 (조건 무관 skip) → aift.hwp snapshot 회귀 → v2 (overflow 한정)
→ aift.hwp 18 case 정상 emit + sample18 fix. feedback_hancom_compat_specific_over_general
권위 사례 (일반화 위험 발견 후 케이스별 정밀화).

영역 좁힘: 빈 paragraph + 쪽나누기 + overflow 한정 — fit 가능/비-빈/일반
paragraph/hwp-multi-001 영향 없음.

본 환경 cherry-pick 충돌 0건 — typeset.rs auto-merge (devel Task #836 Endnote
:1064/1091 보존 + PR #968 :585 분기 양립). orders/20260518.md 신규 (5/18).
devel merge commit 2개 cherry-pick 제외 — 본질 3c1ea87 만.

자기 검증: cargo test --release 전체 (lib 1288 + integration svg_snapshot 8) ALL GREEN
+ cargo clippy --release -D warnings 통과 + 광범위 sweep 7 fixture / 169 페이지 /
169 same / 0 diff (aift.hwp 74 same — v1 회귀 해소 입증) + WASM 4.4 MB 재빌드.

⚠️ samples/hwp3-sample18.hwp 영역 영역 PR 미포함 + 본 환경 부재 — 작업지시자 결정
영역 영역 sweep 169/169 same + cargo test 전체 통과 영역 영역 회귀 부재 입증 +
sample18 페이지 수 69→67 정합 영역 영역 컨트리뷰터 PR 본문 신뢰 (작업지시자 승인).

CI: ✅ Build & Test + CodeQL + Canvas visual diff

@jangster77 PR 시리즈 완결 (연속 5 PR #956~#964 + #966 + #968)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants