Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions mydocs/plans/task_m100_853.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# 수행 계획서 — Task #853 (M100)

GitHub Issue: edwardkim/rhwp#853 · 브랜치: `local/task853` (← upstream/devel `2bd50a3a`)

## 1. 배경

`samples/basic/shortcut.hwp` ↔ 한컴 PDF `pdf/basic/shortcut-2022.pdf` 시각 비교에서 두 증상:

1. **모든 구분 칸 위·아래 줄 간격 압축** — 섹션 헤더 띠(1×1 TAC 표: 커서 이동·지우기·파일·편집·보기·입력·서식·쪽·도구·표·기타)와 `<…에서>` 부제목 줄(미리 보기·편집 화면 분할·그림 넣기·글상자·상용구·스타일·글자 속성·문단 속성·개요 번호·매크로·F5 셀 블록·그림 그리기) 주변 수직 여백이 한컴 대비 ~20px 부족.
2. **일부 페이지에서 본문영역(body_area) 하단 초과 렌더링** — 3쪽 SVG 콘텐츠 max y ≈ 766px > 본문영역 하단 758.4px. 단0~단18(19개 zone)이 쌓여 마지막 zone zone_y_offset=720.2px > 본문영역 높이 701.7px.

부수 결함(이미 관측): 3쪽 단3에서 `<편집 화면 분할에서>`(pi=94)와 "화면 이동"(pi=95)이 둘 다 vpos=0 으로 겹침 — 닫힌 #768(다단 zone 분할 행 밀림) 패턴.

본 사안은 Task #842 결함 #1(헤더 1×1 TAC 표 앞뒤 spacing 압축, 1쪽만 검토 후 보류)의 전면화 + 본문영역 초과 증상 추가.

## 2. 원인 가설 (Stage 1 진단 대상)

- 한컴은 다단 zone 전환(1단↔2단 `다단나누기`)과 TAC 표 anchor 문단 주변에 명시 spacing(before/after)에 없는 **암묵 수직 간격(~20~27px)** 을 넣음 → rhwp 미재현 → 띠가 짧음 → 시각 압축 + 페이지네이터 zone 과적재 → 본문영역 초과.
- 페이지네이터가 누적 offset의 body_bottom 초과 시 다음 페이지 break 검사가 TAC 표 띠 + 다단 zone 조합에서 작동 안 함(별개 가능성).
- 3쪽 pi=94/95 vpos=0 겹침(#768 패턴)이 3쪽 overflow 에 직접 기여.

→ Stage 1 에서 코드 경로 특정: `src/renderer/layout.rs`(zone 배치, `build_column_separators`, `start_new_column_band`, `layout_table_item` is_tac 분기, 페이지 break), `src/renderer/layout/paragraph_layout.rs`, `src/document_core/` LINE_SEG vpos 해석. 한컴 spacing 출처(zone 전환 / TAC 표 line-height / LINE_SEG vpos)를 PDF·IR 대조로 규명.

## 3. 위험 평가

- `feedback_essential_fix_regression_risk` 정합 — 다단 / 단일 단 / 표분할 상호작용으로 회귀 위험 큼. → 광역 회귀(전 fixture sweep) + `cargo test`(svg_snapshot 포함) + 한컴 2010/2020 정답지 비교 동반 필수.
- `feedback_rule_not_heuristic` 정합 — 한컴 암묵 spacing 규칙이 명세화 가능한 룰인지, 휴리스틱 보정인지 자문 후 적용.
- RFC #774("한컴 PDF paragraph spacing 알고리즘 정밀 분석") 영역 — 본 타스크에서 RFC 를 어디까지 흡수할지는 작업지시자 판단 요청(현 계획서는 shortcut.hwp 한정 정합 + RFC 는 별도 유지로 가정).

## 4. 산출물

- 구현 계획서 `mydocs/plans/task_m100_853_impl.md` (3~6단계)
- 단계별 완료보고서 `mydocs/working/task_m100_853_stage{N}.md`
- 최종 결과보고서 `mydocs/report/task_m100_853_report.md`
- (필요 시) 진단/기술 정리 `mydocs/tech/` 또는 `mydocs/troubleshootings/`

## 5. 검증 기준

- shortcut.hwp 7쪽 SVG ↔ `pdf/basic/shortcut-2022.pdf` 시각 정합: 구분 칸 위·아래 여백 PDF 대비 ±6px 수렴, 본문영역 초과(콘텐츠 y > body_bottom) 해소.
- `cargo test` 전건 통과(svg_snapshot 포함), 회귀 0.
- 광역 fixture sweep: shortcut.hwp 외 변경 영향 없음(byte-identical 또는 의도된 변경만).
- 3쪽 pi=94/95 vpos 겹침: 본 타스크 범위 포함 여부는 구현 계획서에서 확정(#768 재오픈 vs 본 타스크 흡수).

## 6. 승인 요청 사항

1. 본 수행 계획 진행 승인.
2. RFC #774 포함 범위 — (a) shortcut.hwp 한정 정합만 / (b) RFC #774 일부 분석 흡수 / (c) RFC #774 우선 별도 진행.
3. 3쪽 pi=94/95 vpos 겹침(#768) 처리 — (a) 본 타스크 흡수 / (b) #768 재오픈 후속 분리.
48 changes: 48 additions & 0 deletions mydocs/plans/task_m100_853_impl.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# 구현 계획서 — Task #853 (M100)

GitHub Issue: edwardkim/rhwp#853 · 브랜치: `local/task853` (← upstream/devel `2bd50a3a`)
수행 계획서: `mydocs/plans/task_m100_853.md`

## 전제 (작업지시자 승인 — 기본값 적용)

- RFC #774 범위: **(a) shortcut.hwp 한정 정합만** 수행. RFC #774 의 일반 알고리즘 분석은 별도 유지.
- 3쪽 pi=94/95(`<편집 화면 분할에서>` ↔ "화면 이동") vpos=0 겹침: **#768 영역으로 분리** 가정. 단 Stage 1 진단에서 본 타스크 수정과 동일 근원으로 밝혀지면 범위 흡수(Stage 1 보고서에서 확정).

## 단계 구성 (5단계)

### Stage 1 — 진단 (코드 미수정)
- `dump-pages` / `dump` / `ir-diff`(필요 시 hwpx 변환본) / `export-svg --debug-overlay` 로 shortcut.hwp 1·2·3쪽 zone 배치·LINE_SEG vpos·TAC 표 outer_margin·anchor 문단 PS 정밀 관측.
- `pdf/basic/shortcut-2022.pdf` 와 px 단위 대조: ① 구분 칸 띠 위 여백 ② 띠 아래 → 첫 본문행 여백 ③ 제목 위 여백 ④ zone 전환(1단↔2단 `다단나누기`) 시 삽입 간격.
- 한컴 암묵 수직 간격의 **출처 후보 판정**: (가) zone 전환 시 고정/비율 간격, (나) TAC 표 anchor 문단 line-height(`line=100%`) 기반, (다) LINE_SEG `vpos`/`lh`/`th` 해석 누락, (라) 표 outer_margin top/bottom 적용 누락.
- 영향 코드 경로 특정: `src/renderer/layout.rs`(zone 배치 누적 offset, `start_new_column_band`, `layout_table_item` is_tac 분기, 페이지 break 판정), `src/renderer/layout/paragraph_layout.rs`, `src/document_core/` LINE_SEG.
- 3쪽 본문영역 초과(콘텐츠 y > body_bottom 758.4) 가 (1) 띠 압축으로 zone 과적재의 결과인지 (2) 페이지 break 판정 자체의 버그인지 분리.
- 산출: `mydocs/working/task_m100_853_stage1.md` — 진단 결과 + 규명된 근원 + (필요 시) 구현 계획 v2 간소화 + #768 흡수 여부 결정.

### Stage 2 — 구분 칸 암묵 수직 간격 재현
- Stage 1 에서 규명된 근원에 한해 최소 수정. 후보 우선순위: (라) 표 outer_margin top/bottom → (가) zone 전환 간격 → (나) TAC anchor line-height.
- shortcut.hwp 의 TAC 표 띠(`size=...×1766` 6.2mm, outer_margin 1mm, anchor PS `line=100%`)와 `다단나누기` zone 전환 양쪽에 적용.
- 변경 후 shortcut.hwp 7쪽 `export-svg` → 구분 칸 위·아래 여백 PDF 대비 ±6px 수렴 확인.
- 산출: `mydocs/working/task_m100_853_stage2.md` + 소스 커밋.

### Stage 3 — 페이지 break 판정 보강 (필요 시)
- Stage 2 적용 후에도 본문영역 초과(콘텐츠 y > body_bottom)가 남으면, 누적 zone offset 이 body_bottom 초과 시 다음 페이지로 break 하도록 `src/renderer/layout.rs` 페이지 break 판정 보강.
- TAC 표 띠 + 다단 zone 조합에서 break 검사가 우회되는 경로 차단.
- Stage 2 만으로 초과가 해소되면 본 단계는 "수정 불요" 보고로 마감.
- 산출: `mydocs/working/task_m100_853_stage3.md` (+ 소스 커밋 또는 불요 사유).

### Stage 4 — 광역 회귀 검증
- `cargo test`(svg_snapshot 8/8 포함) 전건 통과 확인.
- `cargo clippy --lib -- -D warnings` (pre-existing 무관 오류는 명시).
- 광역 fixture sweep(전 샘플 SVG 내보내기) → shortcut.hwp 외 변경 영향 0(byte-identical) 또는 의도된 변경만임을 입증.
- shortcut.hwp 7쪽 SVG ↔ `pdf/basic/shortcut-2022.pdf` 시각 정합 최종 확인. (한컴 2010/2020 환경 차이는 `feedback_pdf_not_authoritative` 정합으로 함께 점검 — macOS 환경이라 `pdf/`(2022) 1차, 가능 시 `pdf-2020/` 보조.)
- 산출: `mydocs/working/task_m100_853_stage4.md` + 소스 커밋(있다면).

### Stage 5 — 최종 결과보고서
- 결과 요약(증상1/2 해소 여부), 변경 내역, 회귀 검증 결과, 잔여 사항(#768 등).
- 산출: `mydocs/report/task_m100_853_report.md` + 커밋. (mydocs/orders 는 수정하지 않음 — 작업지시자 거버넌스 영역.)

## 회귀 가드 요약

- 매 단계 `cargo test` 통과 필수, Stage 4 광역 sweep 필수.
- 본질 정정(zone 배치/페이지 break)이므로 다단·단일 단·표분할 상호작용 회귀를 sweep 으로 입증(`feedback_essential_fix_regression_risk`).
- 한컴 spacing 규칙은 룰/휴리스틱 구분 후 적용(`feedback_rule_not_heuristic`).
41 changes: 41 additions & 0 deletions mydocs/plans/task_m100_853_impl_v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# 구현 계획서 v2 (Stage 1 진단 반영) — Task #853 (M100)

GitHub Issue: edwardkim/rhwp#853 · 브랜치: `local/task853`
원본 구현 계획서: `mydocs/plans/task_m100_853_impl.md` · Stage 1 진단: `mydocs/working/task_m100_853_stage1.md`

## 확정 사항 (작업지시자 승인 — "진행"으로 기본값 채택)

- Stage 2 = **옵션 A 변형**: `is_column_top` 시 `spacing_before` 를 통째 드롭하지 않고 **해당 문단의 첫 LINE_SEG `vpos`(한글이 실제 렌더한 위치)로 클램프** — `applied_before = min(spacing_before, hwpunit_to_px(line_segs[0].vpos))`. `vpos=0` 인 문단(본문 첫 줄 등)은 종전과 동일(0). `vpos>0` 인 섹션-top/`다단나누기` band-top(제목 vpos=1984 등)은 그만큼 적용.
- 3쪽 본문영역 초과(#768 패턴 pi=94/95 vpos=0 겹침)는 **본 타스크 흡수** — Stage 3 에서 처리. 단 한글 PDF 페이지별 콘텐츠 대조로 "한글도 3쪽 초과인가" 먼저 확인 후 범위 확정.
- 제목 PUA 첫 글자(`\u{f53a}`) 폰트 폴백은 본 타스크 제외.

## 단계 (5단계 — 원본과 동일, Stage 2/3 구체화)

### Stage 2 — column-top 문단 `spacing_before` 의 LINE_SEG.vpos 클램프
- `src/renderer/layout/paragraph_layout.rs:745-748` (`layout_composed_paragraph` 내):
- 현행: `if start_line == 0 && spacing_before > 0.0 && !is_column_top { y += spacing_before; }`
- 변경: `is_column_top` 일 때도 `start_line == 0 && spacing_before > 0.0` 이면 `y += min(spacing_before, vpos0_px)` 적용 (`vpos0_px = para.and_then(|p| p.line_segs.first()).map(|ls| hwpunit_to_px(ls.vpos as i32, self.dpi)).unwrap_or(0.0)`). `!is_column_top` 분기는 종전대로 `y += spacing_before` 전량.
- `src/renderer/height_measurer.rs` — column-top 문단 높이 계산이 `spacing_before` 전량을 포함하면, 위 클램프와 정합되도록 동일 클램프 적용(페이지네이션↔배치 비대칭 해소). 단 height_measurer 가 column-top 컨텍스트를 모르면, 보수적으로 "전량 포함" 유지 시 발생하는 영향(예약 과다 → 페이지 break 빨라짐)을 Stage 4 sweep 으로 점검 후 필요 시 수정.
- 검증: shortcut.hwp 7쪽 `export-svg` → 제목 top ≈ 83px, "커서 이동" 띠 ≈ 127px, 구분 칸 위·아래 여백 PDF ±6px 수렴.
- 산출: `mydocs/working/task_m100_853_stage2.md` + 소스 커밋.

### Stage 3 — 3쪽 본문영역 초과 (#768 패턴)
- 한글 PDF 3쪽 콘텐츠 범위 대조 → 한글도 초과면 "정상"(수정 불요), rhwp 만 초과면 처리.
- pi=94(`<편집 화면 분할에서>`) / pi=95("화면 이동") 둘 다 vpos=0 겹침 원인 규명: `다단나누기` zone 분할 시 두 번째 문단의 vpos 가 0 으로 리셋되어 첫 문단 위에 겹침 → `src/renderer/layout.rs` zone 분할/`start_new_column_band` 부근에서 zone 내 문단 누적 y 가 vpos=0 을 잘못 해석하는 경로 수정.
- 누적 zone offset 이 body_bottom 초과 시 다음 페이지로 break 하는 가드 점검/보강.
- 산출: `mydocs/working/task_m100_853_stage3.md` (+ 소스 커밋 또는 불요 사유).

### Stage 4 — 광역 회귀 검증
- `cargo test`(svg_snapshot 8/8 포함) 전건 통과. `cargo clippy --lib -- -D warnings`(pre-existing 무관 오류 명시).
- 전 fixture SVG sweep → shortcut.hwp 외 byte-identical 또는 의도 변경만 입증. (`feedback_essential_fix_regression_risk` 정합 — 다단/단일 단/표분할 상호작용 회귀 점검.)
- shortcut.hwp 7쪽 SVG ↔ `pdf/basic/shortcut-2022.pdf`(+ 가능 시 `pdf-2020/`) 시각 정합 최종 확인.
- 산출: `mydocs/working/task_m100_853_stage4.md` + 커밋.

### Stage 5 — 최종 결과보고서
- `mydocs/report/task_m100_853_report.md` + 커밋. orders 미수정.

## 회귀 가드

- column-top 클램프는 `vpos` 기록값을 상한으로만 쓰므로 "vpos 무시" 현행 대비 항상 ≥ 0, ≤ spacing_before — 과도 적용 위험 없음.
- 매 단계 `cargo test` 통과 필수, Stage 4 sweep 필수.
- vpos 해석 변경은 `respect_vpos_reset` 류 전면 변경과 무관(여기서는 column-top 첫 줄 한정 상한 클램프).
30 changes: 30 additions & 0 deletions mydocs/plans/task_m100_853_impl_v3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 구현 계획서 v3 (범위 확대) — Task #853 (M100)

GitHub Issue: edwardkim/rhwp#853 · 브랜치: `local/task853`
선행: v1 `task_m100_853_impl.md`, v2 `task_m100_853_impl_v2.md` · Stage 1 진단 `task_m100_853_stage1.md`

## 범위 (작업지시자 지시: "제목 + band 간격 + overflow 전부")

shortcut.hwp 의 3개 결함을 모두 정정한다 — ① 섹션-top 제목 spacing_before 압축, ② `다단나누기` 구분 칸 band 위·아래 간격 압축, ③ 3쪽 본문영역 초과(#768 패턴). 본질 정정 영역(RFC #774) — 광역 회귀 + 한컴 정답지 검증 필수(`feedback_essential_fix_regression_risk`).

## Stage 2 — 섹션-top 제목 spacing_before 클램프 (재적용, 완료)
- `src/renderer/layout/paragraph_layout.rs`: `is_column_top && para_index == 0` 일 때 `y += spacing_before.min(hwpunit_to_px(line_segs[0].vertical_pos).max(0.0))`. 페이지 break 후 column-top(`para_index>0`)은 종전대로 0.
- 효과: shortcut.hwp 제목 baseline 79.4 → 105.8 (top ≈ 83.8px ≈ 한컴 PDF 83.6px). svg_snapshot 2건(KTX p1, exam_kor p5)의 섹션-시작 문단도 LINE_SEG.vertical_pos 기준으로 재배치 → `UPDATE_GOLDEN` (한컴이 파일에 기록한 실제 렌더 위치와 정합하므로 개선). `cargo test --release` 전건 통과.
- 잔존: shortcut.hwp 7쪽 → 8쪽 (Stage 3 의 band 정정 후 재확인 — band 가 커지면 한컴처럼 7쪽 가능 여부 미정).

## Stage 3 — `다단나누기` 구분 칸 band 위·아래 간격 + 3쪽 overflow
- **진단(Stage 1/2 에서 파악)**: 헤더 띠 문단(예: pi=36 "파일")의 LINE_SEG 는 line0=텍스트(lh=1200HU≈16px) + line1=표(lh=2332HU = 표 1766 + outer_margin 283×2 ≈ 31px) = 47px 인데, rhwp 는 표를 line0 에 놓고 텍스트 line0 을 흡수해 ≈27px → ~20px 부족(= stage5 "헤더↔본문 ~20px"). 또 zone 사이(제목 zone↔헤더 띠↔본문 zone)에 한컴이 두는 간격(~17px)이 rhwp 에는 0. 3쪽 단3 pi=94/95 vpos=0 겹침(#768 패턴).
- **방향(미확정 — 추가 진단 필요)**: (a) 헤더 띠 문단을 LINE_SEG 순서대로(text line0 → table line1) 렌더하도록 composer/`layout_table_item` 정정, (b) zone 전환 간격의 출처 규명(LINE_SEG.vertical_pos / `다단나누기` 후 첫 zone offset / 빈 continuation line) 후 정정, (c) 3쪽 overflow = (a)(b) 정정 후 자연 해소되는지 확인 + 안 되면 page break 가드 보강.
- 이 단계는 composer/table layout 변경으로 회귀 위험이 크므로, **Stage 3-1(추가 진단·설계 문서) → 승인 → Stage 3-2(구현)** 로 쪼갠다. 진단·설계는 `mydocs/tech/` 또는 본 working 문서에 정리.
- 산출: `task_m100_853_stage3.md` (+ 소스 커밋, 필요 시 RFC #774 일부 흡수).

## Stage 4 — 광역 회귀 검증
- `cargo test --release` 전건 + `cargo clippy --lib -- -D warnings`(pre-existing 무관 오류 명시). 전 fixture SVG sweep → shortcut.hwp/KTX/exam_kor 외 byte-identical 또는 의도 변경만. shortcut.hwp 7~8쪽 SVG ↔ `pdf/basic/shortcut-2022.pdf`(+ 가능 시 `pdf-2020/`) 시각 정합. 한컴 2010/2020 환경 차이 점검(`feedback_pdf_not_authoritative`).
- 산출: `task_m100_853_stage4.md` + 커밋.

## Stage 5 — 최종 결과보고서
- `mydocs/report/task_m100_853_report.md` 갱신(v2) + 커밋. orders 미수정.

## 회귀 가드
- Stage 2 클램프: `vertical_pos`(파일 기록값) 상한 → 항상 `0 ≤ applied ≤ spacing_before`. 과도 적용 불가.
- Stage 3: composer/table layout 변경 — 매 변경 후 `cargo test --release` 통과 필수, Stage 4 sweep 필수, 한컴 정답지 비교.
37 changes: 37 additions & 0 deletions mydocs/plans/task_m100_866.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# 수행 계획서 — Task #866 (M100)

GitHub Issue: edwardkim/rhwp#866 · 브랜치: `local/task866` (← `pr-task853` = upstream/devel `2bd50a3a` + PR #868 의 Task #853 정정)

## 배경

Task #853(PR #868)이 shortcut.hwp 의 구분 칸 spacing 압축을 대부분 정정했으나, **`쪽나누기`로 시작하는 페이지(2쪽 "파일" 등)의 헤더 TAC 1×1 표 띠와 그 아래 본문 첫 줄 사이 ~28px gap** 이 잔존. pi=36 의 `다단나누기` ColumnDef = `1단, 간격=0mm` 이라 Task #853 Stage 3-3 의 ColumnDef-간격 가설(1쪽은 `간격=10mm` 으로 정합)로는 0px. 출처 미규명.

측정(한컴 PDF `pdf/basic/shortcut-2022.pdf` 2쪽, `mutool draw -r 100` @96dpi): 헤더 띠 상단 +19.1px / 하단 +43.1px / 본문 첫 줄 ~+75px → 띠 하단↔본문 ~32px. rhwp(PR #868 적용): 헤더 띠 +19.8/+43.3px(정합), 본문 zone_y_offset = +47.1px → 띠 하단↔본문 ~4px. **~28px 부족.**

## 후보 (분석 문서 `mydocs/tech/hancom_zone_paragraph_spacing.md` §5)

1. TAC 표 `wrap=위아래(TopAndBottom)` 가 글자처럼 취급이면서도 위아래 어울림으로 표 아래 추가 예약
2. 표 `쪽나눔=RowBreak(attr=0x04000006)` 의 0x04000000 비트 의미
3. 1단 zone → 2단 배분(Distribute) zone 전환 시 한컴 고정 간격

## 위험 / 제약

- RFC #774 영역. 닫힌 PR #771/Issue #770(line0 흡수 ~16px 만 다룸 — Task #853 Stage 3-2 가 동일 효과), 닫힌 #773/#776 모두 이 ~28px 를 못 닫음. **macOS 환경 — 한컴 편집기 cross-check 불가**(`pdf/`(2022)·`pdf-2020/` PDF 측정으로 대체).
- composer/typeset 변경이라 광역 회귀 위험(`feedback_essential_fix_regression_risk`). 룰/휴리스틱 구분 필요(`feedback_rule_not_heuristic`).
- **#866 은 PR #868 에 의존** — 본 브랜치는 `pr-task853` 에서 분기(stacked). PR #868 머지 후 본 PR 은 갱신된 devel 로 rebase.

## 진행 절차

1. **Stage 1 — PDF 측정 (코드 미수정)**: shortcut.hwp 2·3·4·5쪽 등 모든 `쪽나누기` 시작 페이지 및 같은-페이지 `다단나누기` zone 의 헤더 띠↔본문 거리를 `mutool draw -r 100` 픽셀 측정 → IR(`dump` / `dump-pages`)과 대조. ~28px 가 일정한지 / `쪽나누기` 한정인지 / 표 size·outer_margin·`쪽나눔` 비트와의 상관관계 파악. 후보 1~3 중 특정 또는 "측정만으로 미특정 → 보류" 판정. → `task_m100_866_stage1.md`.
2. (특정 시) **Stage 2 — 구현**: 규명된 근원에 한해 최소 수정(`typeset.rs::place_table_with_text` 또는 `process_multicolumn_break`) → `cargo test --release` + shortcut.hwp 7~8쪽 SVG↔PDF.
3. **Stage 3 — 광역 회귀**: `cargo test` 전건 + 전 fixture sweep + `pdf-2020/` 등 대조.
4. **Stage 4 — 최종 보고서**. (#867 — 페이지 수 7≠8 + 잔존 overflow 2건 — #866 해결 후 재평가; 본 타스크 범위는 #866 한정.)

## 산출물

- `mydocs/working/task_m100_866_stage{N}.md`, `mydocs/report/task_m100_866_report.md`. 필요 시 `mydocs/tech/hancom_zone_paragraph_spacing.md` 갱신.

## 승인 요청

1. 본 수행 계획 진행 승인.
2. 브랜치 base — `pr-task853`(권장, stacked) vs `upstream/devel`(PR #868 미반영 → 측정이 부정확) 중 확인.
Loading
Loading