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
1 change: 1 addition & 0 deletions mydocs/orders/20260512.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
|------|--------|------|------|
| **PR #818 (closes #790)** | perf — release 빌드 LTO + codegen-units=1 + strip 활성화 | **완료 (옵션 A — 2 commits cherry-pick + Cargo.toml 충돌 수동 해결 + 정량 측정 + no-ff merge `f5abcf8d`, 시각 판정 면제 + sweep byte-identical 입증)** | 컨트리뷰터 @oksure (Hyunwoo Park) — **20+ 사이클** 핵심 컨트리뷰터 (5/11 사이클 15번째 시도, PR #815/#817 close 후 다른 본질, 5/12 사이클 본질적으로 첫 머지). 본질: Issue #790 (외부 제안, ripgrep profile 패턴 정합) 영역 Cargo.toml [profile.release] 영역 LTO + codegen-units=1 + strip 활성화 — 바이너리 크기 축소 + 런타임 성능 개선. 정정 (`Cargo.toml` +5/-0, 1 file): `[profile.release]` 영역 영역 `lto = true` (Fat LTO 크로스 크레이트 인라이닝) + `codegen-units = 1` (전역 최적화 극대화) + `strip = "debuginfo"` (디버그 정보 제거, panic backtrace symbol table 보존). **리뷰 반영 commit** (`9ccb0c38`): 초기 `strip = true` → `strip = "debuginfo"` 정정 영역 panic backtrace 보존 정합. **본 환경 충돌 수동 해결** (Cargo.toml): devel 측 PR #599 example pr599_png_gateway (native-skia required) + PR 측 [profile.release] 양측 모두 보존 정합. **본 환경 정량 측정 ★ 핵심 결과**: (1) rhwp CLI 크기 **14 MB → 10 MB (-4 MB, -28%)** (2) WASM 크기 **4.6 MB → 4.3 MB (-0.3 MB, -6.5%)** (3) cargo build --release (clean) ~58s → 2m 53s (+1m 55s, ~3배) (4) WASM 빌드 (Docker) ~1m 30s → 2m 23s (+53s, +59%) (5) cargo test --release ALL GREEN + cargo clippy --release --lib -D warnings 통과 (6) **광범위 sweep 7 fixture / 170 페이지 / 170 same / 0 diff (byte-identical)** ✅ — SVG 출력 무영향 입증. 본 환경 cherry-pick 2 commits 영역 영역 1 충돌 수동 해결. **효과 분석**: 이득 — rhwp CLI -28% + WASM -6.5% 크기 감소 (사용자 다운로드 시간 + 메모리 사용량 개선) / 비용 — release 빌드 시간 ~3배 증가 (개발 빌드 영향 부재) / 회귀 부재 — sweep byte-identical + cargo test/clippy 통과. CI 결과 부재 (DIRTY 영역, 본 환경 자기 검증 + 정량 측정 + sweep 영역 보완). 검토 보고서: `mydocs/pr/archives/pr_818_review.md`. 처리 보고서: `mydocs/pr/archives/pr_818_report.md`. **`feedback_contributor_cycle_check` 정합** — @oksure 20+ 사이클 (5/11 15번째 시도, 5/12 본질적으로 첫 머지). **`feedback_image_renderer_paths_separate` 정합** — Cargo.toml 빌드 설정 영역 영역 렌더링 경로 무관. **`feedback_process_must_follow` 권위 사례 강화** — 본 환경 영역 영역 WASM 빌드 측정 필수 — 컨트리뷰터 PR 영역 영역 native 측정만, 본 환경 영역 영역 WASM 4.3 MB 추가 측정 (4.6 → 4.3, -6.5%) + sweep 결정적 검증 표준 영역 영역 회귀 부재 입증. **`feedback_small_batch_release_strategy` 권위 사례 강화** — 작은 변경 (+5/-0) + opt-in (release 한정, 개발 빌드 영향 부재) + 명확 효과 (-28%/-6.5%) — PATCH cycle 머지 정합. **`feedback_hancom_compat_specific_over_general` 정합** — strip = "debuginfo" (panic backtrace 보존) 영역 회귀 부재 가드 + sweep byte-identical. **`feedback_visual_judgment_authority` 정합** — 빌드 설정 영역 영역 시각 판정 면제, sweep 결정적 검증 통과. **`feedback_pr_supersede_chain` 정합** — Issue #790 (외부 제안, OPEN) → **PR #818** (LTO + CU1 + strip 적용) 본질 정합. |
| **PR #817 (close, Refs #726)** | fix — 1×1 래퍼 표 shortcut 다수 중첩 표 누락 수정 | **close 완료 (옵션 C — Task #688 이미 해결 + byte-identical SVG + 컨트리뷰터 분리 PR 가이드)** | 컨트리뷰터 @oksure (Hyunwoo Park) — **20+ 사이클** 핵심 컨트리뷰터 (5/11 사이클 14번째 시도, PR #815 close 후 다른 본질). PR 본문 본질: table-vpos-01.hwpx 5쪽 nested 11×3 그리드 SVG 완전 누락 정정 — `find_map` 영역 영역 첫 nested table 만 반환 결함 영역 영역 `nested_table_count == 1` 가드 영역 영역 다수 table 시 일반 경로 (`src/renderer/layout/table_layout.rs` +6/-1). **⚠️ devel HEAD 영역 영역 이미 해결됨 (Task #688, PR #694, commit `40ecbe26`)**: `cell.paragraphs.len() == 1` 가드 — paragraphs 수 가드 + 외곽 박스 border 렌더링 추가 정합 (exam_social.hwp pi=15 자료 박스 등 padding + border_fill 영역 외곽 4 라인 추가). table-vpos-01.hwpx p.5 영역 영역 셀[0] paras=2 → Task #688 가드 false → shortcut 우회 → 일반 경로 영역 모든 nested table 렌더링. **PR base 분석**: PR #817 base = `30351cdf` (5/9, Task #688 머지 전) — 본 PR 작성 후 Task #688 영역 영역 같은 본질 영역 다른 방식 영역 먼저 머지 → 본 PR 영역 중복 정정 + 외곽 박스 border 회귀 위험. **작업지시자 시각 비교 요청** — 본 환경 cherry-pick + 5쪽 SVG 내보내기 (output/svg/pr817/before vs after): text=343/polygon=0/image=0/path=2/lines=474 양측 동일 + **diff exit code 0 byte-identical** 입증 → PR 영역 영역 본 환경 효과 부재. **Issue #726 영역 영역 진짜 본질**: 4대 그룹 사이 구분 도형 (화살표) 2개 SVG 미출력 — 본 PR 본문 (nested 11×3 그리드 누락) 영역 영역 다른 본질. devel HEAD = PR 적용 후 동일 — `<polygon>` 0개 + `<image>` 0개 + IR 영역 영역 1개 다각형 (셀[18] tac=true wrap=TopAndBottom) 존재 → 셀 안 다각형/도형 SVG 렌더링 경로 누락 영역 영역 본 PR 무관. 두 결함 후보 (Issue #726 본문): (a) SVG renderer 다각형 미출력 (`src/renderer/` 도형 분기 svg.rs/web_canvas.rs/paint/json.rs 4 backend) / (b) HWPX 파서 다각형 1개 누락 (`src/parser/hwpx/` table cell GenShape 파싱, 셀[6]/셀[13] ctrls=0). **본 환경 reset**: cherry-pick + 시각 비교 → byte-identical 확인 → `git reset --hard origin/devel` 영역 영역 devel 무영향. **컨트리뷰터 안내 [#817#issuecomment-4425741327](https://github.com/edwardkim/rhwp/pull/817#issuecomment-4425741327)** (정중 톤): byte-identical SVG 결과 명시 + Task #688 이미 해결됨 + 외곽 박스 border 정교한 정합 안내 + Issue #726 진짜 본질 (화살표 도형) 분리 PR 가이드 + 두 결함 후보 (a/b) 진단 권장. Issue #726 OPEN 유지. 검토 보고서: `mydocs/pr/archives/pr_817_review.md`. 처리 보고서: `mydocs/pr/archives/pr_817_report.md`. **`feedback_contributor_cycle_check` 정합** — @oksure 20+ 사이클. **`feedback_image_renderer_paths_separate` 권위 사례 강화 후보** — Issue #726 진짜 본질 영역 영역 셀 안 다각형 SVG/Canvas/paint json 4 backend 동기 정정 후속. **`feedback_process_must_follow` 정합** — PR base 5/9 영역 작성 → Task #688 먼저 머지 → 중복 정정 영역 영역 base 갱신 점검 필요 사례. **`feedback_hancom_compat_specific_over_general` 정합** — Task #688 영역 영역 외곽 박스 border 영역 영역 추가 정합 (exam_social.hwp pi=15 정정 포함) — 본 PR 영역 영역 단순 가드만, 정교한 정합 부재. **`feedback_diagnosis_layer_attribution` 권위 사례 강화** — 본 PR 본질 (nested 11×3 그리드 누락, Task #688 이미 해결) vs Issue #726 진짜 본질 (셀 안 화살표 도형 미출력) 두 본질 분리 진단 + PR 영역 영역 잘못 연결 (`closes #726`) 명확화. **`feedback_visual_judgment_authority` 권위 사례 강화** — 작업지시자 영역 영역 5쪽 SVG 시각 비교 요청 → byte-identical 결과 입증 — 결정적 검증 영역 영역 PR 효과 없음 명확화 패턴. **`feedback_pr_supersede_chain` 정합** — PR #694 (Task #688) → Issue #726 (잔존 본질) → **PR #817** (close, 중복 정정) → 분리 PR (Issue #726 진짜 본질) (a) 패턴. |
| #850 | rhwp-studio 성명 칸 입력 회귀 수정 | 완료 | WASM 재빌드 + 브라우저 입력 검증 + `cargo test` 통과, 완료: 18:29 |

## 작업 메모

Expand Down
5 changes: 5 additions & 0 deletions mydocs/orders/20260513.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# 오늘 할일 - 2026년 5월 13일

## M100 — v1.0.0 편집 기반

| Issue | 타스크 | 상태 | 비고 |
|------|--------|------|------|
| #850 | rhwp-studio 성명 칸 입력 성능 후속 정리 | 완료 | nested path 입력 루프 compact overlay/cached cursor 적용, 완료: 09:37 |
## M100 — v1.0.0 조판 엔진 (PR 처리 — 5/13 사이클)

| Issue | 타스크 | 상태 | 비고 |
Expand Down
124 changes: 124 additions & 0 deletions mydocs/plans/task_m100_850.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
# Task #850 수행 계획서

## 이슈

- 이슈 번호: #850
- 제목: `[rhwp-studio] v0.7.11 회귀: exam_social/exam_science 성명 칸 입력 시 컨트롤 인덱스 0 범위 초과`
- URL: https://github.com/edwardkim/rhwp/issues/850
- 마일스톤: v1.0.0 (M100)

## 결함 요약

`rhwp-studio`에서 수능형 샘플 문서 1쪽 상단 답안지 영역의 `성명` 입력칸에 이름을 입력하면 콘솔에 다음 오류가 발생하고 입력이 반영되지 않는다.

```text
Uncaught 렌더링 오류: 컨트롤 인덱스 0 범위 초과
```

확인 대상 문서:

- `samples/exam_social.hwp`
- `samples/exam_science.hwp`

사용자 확인 기준으로 `v0.7.10`에서는 같은 입력이 정상 동작했으나 `v0.7.11`부터 실패하므로 신규 기능 미구현이 아니라 회귀로 판단한다.

## 회귀 진원지

의심 커밋:

- `ef67efa1` — `Task #717: Fix table cell whitespace hit test`
- 머지 커밋: `bbf01424` — `Merge PR #725 (Task #717): rhwp-studio 표 셀 빈 영역 hitTest 컨텍스트 이탈 정정`
- 주요 파일: `src/document_core/queries/cursor_rect.rs`

Task #717 변경은 표 셀 빈 영역 hit-test의 컨텍스트 이탈을 보정했지만, 상단 답안지처럼 첫 문단의 큰 표 내부에 중첩 표가 들어 있는 경우에는 외곽 표 경로가 보존되지 않는 것으로 보인다.

현재 최신 `upstream/devel` 기준으로 `exam_science.hwp` 성명 칸 근처 hit-test는 다음처럼 내부 중첩 표의 로컬 컨텍스트만 반환한다.

```json
{
"sectionIndex": 0,
"paragraphIndex": 0,
"parentParaIndex": 3,
"controlIndex": 0,
"cellIndex": 1,
"cellParaIndex": 0,
"cellPath": [
{ "controlIndex": 0, "cellIndex": 1, "cellParaIndex": 0 }
]
}
```

이 결과가 `insertTextInCell(0, 3, 0, 1, 0, 0, text)` 경로로 전달되면서, 실제 루트 문단 3에는 해당 표 컨트롤이 없어 `컨트롤 인덱스 0 범위 초과`가 발생한다.

## 실제 문서 구조

상단 답안지의 `성명` 입력칸은 문서 루트 문단 3의 표가 아니라, 첫 문단의 상단 표 안에 들어 있는 중첩 표이다.

`exam_social.hwp`:

- 바깥 상단 표: `section 0 / paragraph 0 / control 4`
- 성명 입력칸: 바깥 표의 `cellParaIndex=3` 내부 1x2 중첩 표의 두 번째 셀
- 기대 경로: `controlIndex=4`를 루트로 하는 2단계 `cellPath`

`exam_science.hwp`:

- 바깥 상단 표: `section 0 / paragraph 0 / control 6`
- 성명 입력칸: 바깥 표의 `cellParaIndex=3` 내부 1x2 중첩 표의 두 번째 셀
- 기대 경로: `controlIndex=6`을 루트로 하는 2단계 `cellPath`

## 수정 목표

1. `hit_test_native()`가 중첩 표 내부 빈 입력칸을 hit-test할 때도 루트 문서 기준 `parentParaIndex/controlIndex`와 전체 `cellPath`를 반환한다.
2. `rhwp-studio` 입력 경로가 내부 표 로컬 컨텍스트를 문서 루트 컨텍스트로 오인하지 않는다.
3. `exam_social.hwp`, `exam_science.hwp`의 상단 `성명` 칸 입력이 `v0.7.10`처럼 정상 동작한다.
4. Task #717의 기존 목적이었던 일반 표 셀 빈 영역 hit-test 회귀 테스트는 계속 통과한다.

## 의심 영역

`src/document_core/queries/cursor_rect.rs`:

- `hit_test_native()`
- `collect_runs()`
- `CellContext` 및 `cellPath` 구성 로직
- `cell_bboxes` 보정 로직
- `format_hit()` 반환 필드 구성

특히 `RenderNodeType::Table`이 자체 `section_index/para_index/control_index` 메타를 갖지 않을 때 `current_table_meta` 또는 기존 `CellContext` 경로를 끊는 분기를 점검한다.

## 수용 기준

1. `exam_social.hwp` 상단 `성명` 칸 hit-test 결과가 다음 조건을 만족한다.
- `parentParaIndex == 0`
- `controlIndex == 4`
- `cellPath.length == 2`
- 첫 `cellPath` 요소가 외곽 상단 표를 가리킨다.
2. `exam_science.hwp` 상단 `성명` 칸 hit-test 결과가 다음 조건을 만족한다.
- `parentParaIndex == 0`
- `controlIndex == 6`
- `cellPath.length == 2`
- 첫 `cellPath` 요소가 외곽 상단 표를 가리킨다.
3. 두 문서 모두 `insert_text_in_cell_by_path()` 경로로 이름 텍스트 삽입이 성공한다.
4. `tests/issue_717_table_cell_hit_test.rs` 기존 테스트가 모두 통과한다.
5. 새 회귀 테스트가 RED → GREEN으로 전환된다.
6. 관련 단위/통합 테스트와 `cargo test` 범위 검증을 통과한다.

## 회귀 위험

- Task #717에서 고친 일반 표 셀 빈 영역 hit-test가 다시 깨질 수 있다.
- 중첩 표 hit-test 반환 필드 변경이 Studio의 기존 입력 분기와 충돌할 수 있다.
- 외곽 표 기준 `controlIndex`와 내부 표 기준 `cellPath`를 동시에 보존해야 하므로, 반환 필드와 path 필드의 의미가 섞이면 다른 표 편집 기능에 부작용이 생길 수 있다.

## 진행 절차

1. 본 수행계획서 승인 요청
2. 구현 계획서 (`mydocs/plans/task_m100_850_impl.md`) 작성 → 승인 요청
3. Stage 1: RED 회귀 테스트 작성 및 실패 확인
4. Stage 2: `cursor_rect.rs` hit-test 경로 보존 로직 정정
5. Stage 3: Studio 입력 경로 기준 삽입 성공 검증
6. Stage 4: 기존 Task #717 테스트 및 관련 회귀 검증
7. Stage 5: 단계별 완료보고서와 최종 결과보고서 작성

## 브랜치

- `local/task850` (`upstream/devel` 최신 기준 분기)

Loading
Loading