Skip to content

fix: Task #520 partial revert restore — exam_science p2 7번 글상자 ㉠ 사각형 y 회귀 정정 (closes #624)#627

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

fix: Task #520 partial revert restore — exam_science p2 7번 글상자 ㉠ 사각형 y 회귀 정정 (closes #624)#627
planet6897 wants to merge 5 commits into
edwardkim:develfrom
planet6897:pr-task624

Conversation

@planet6897

Copy link
Copy Markdown
Contributor

Summary

PR #561 cherry-pick (3de0505) 시 Task #520 의 일부 정정 누락 (3 라인) 회귀 복원.

증상: samples/exam_science.hwp page 2 의 7번 문제 글상자 (pi=33 ci=0, 1x1 Table) 안 p[1] 단락의 ㉠ 사각형 (Control::Shape, treat_as_char=true, ls[1] 위치) 이 Line 1 영역 (y=213.95) 에 잘못 그려져 본문 텍스트 "분자당 구성 …" 위에 겹침.

정정 효과: ㉠ 사각형 + ㉠ 텍스트 모두 Line 2 영역 (y=235.41 / 251.45) 으로 정확히 이동. Δ +21.47 px = ls[1].vpos − ls[0].vpos / 75 정확 일치.

회귀 출처 (git diff 9dc40dd 3de0505)

시점 커밋 Picture tac_img_y Shape tac_img_y shape_area.y layout_cell_shape para_y
Task #520 313e65d seg.vpos - first_vpos seg.vpos - first_vpos tac_img_y tac_img_y
Task #544 v2 Stage 3 (원저자) 9dc40dd seg.vpos - first_vpos seg.vpos - first_vpos tac_img_y tac_img_y
PR #561 cherry-pick 3de0505 seg.vpos ✗ (회귀) seg.vpos - first_vpos para_y_before_compose ✗ (회귀) para_y_before_compose ✗ (회귀)

원저자 9dc40dd 는 Task #520 fix 유지 + Task #548 추가, PR #561 cherry-pick 메인테이너 정리 단계에서 conflict resolution 누락 추정.

정정 내용

src/renderer/layout/table_layout.rs 3 라인 정정 (+9/-2):

  1. Picture 분기 tac_img_y 산식seg.vposseg.vpos - first_vpos (이중 합산 회귀 해소)
  2. Shape 분기 shape_area.ypara_y_before_composetac_img_y (target_line 기반 위치)
  3. Shape 분기 layout_cell_shape para_y 인자 — 동일

회귀 발생 4 조건 분석

Control::Shape(shape) if shape.common().treat_as_char 분기에서 다음 4 조건 모두 성립 시 회귀 가시화:

조건 exam_science p[1] 다른 5 multi-line + tac rect 케이스
(a) cell 안 paragraph
(b) multi-line ✓ (2) ✓ (2~10)
(c) target_line > 0 (rect on ls[1]+) varies
(d) first_vpos > 0 (paragraph[i>0]) ✓ (1610) ✗ (모두 0)
회귀 가시화 YES NO

→ exam_science p[1] 만이 (c) AND (d) 동시 성립 — 광범위 sweep 결과 (1/1496) 와 정확히 부합.

안전성 분석 (edge cases)

케이스 정정 후 동작 사유
first_vpos = 0 (cell 첫 paragraph) 동일 동작 보장 seg.vpos - 0 = seg.vpos, 산식 결과 동일
target_line = 0 (rect on ls[0]) 동일 동작 보장 target_line > current_tac_line 가드로 if 블록 미진입
line_segs.len() = 1 (single-line) 동일 동작 보장 target_line = 0 으로 위와 동일
wrap = Square / InFrontOfText / TopAndBottom 본 분기 영향 없음 treat_as_char=true 만 처리

검증

항목 결과
cargo test --lib test_624_textbox_inline_shape_y_on_line2_p2_q7 RED → GREEN
cargo test --lib (전체) 1135 passed / 0 failed / 2 ignored
cargo test --test svg_snapshot 6/6 passed
cargo clippy --lib -- -D warnings clean
cargo build --release success

광범위 fixture sweep (158 fixture / 1,496 페이지)

카테고리 페이지 수 비율
의도된 정정 1 0.067%
회귀 0 0%
byte-identical 1,495 99.933%

의도된 정정 1 건 (samples/exam_science.hwp page 2):

-<rect x="117.066" y="213.946" width="62.986" height="22.880" fill="#ffffff" stroke="#000000" stroke-width="0.5"/>
-<text x="141.56"  y="229.986" ...>㉠</text>
+<rect x="117.066" y="235.413" width="62.986" height="22.880" fill="#ffffff" stroke="#000000" stroke-width="0.5"/>
+<text x="141.56"  y="251.453" ...>㉠</text>

TDD 흐름

Stage 커밋 내용
0 b3408fe 수행 계획서 + 구현 계획서
1 e5811c9 TDD RED 통합 테스트 (test_624_textbox_inline_shape_y_on_line2_p2_q7) — y=213.95 회귀 재현
2 (분석) c30e886 영향 범위 분석 + edge case 검증 + 후속 권고
2 (정정) 242955b Task #520 부분 회귀 정정 (3 line)
3 9cf9fc5 광범위 sweep + 최종 보고서 + orders 갱신

Test plan

  • cargo test --lib 1135 passed (회귀 0)
  • cargo test --lib test_624_textbox_inline_shape_y_on_line2_p2_q7 GREEN
  • cargo test --test svg_snapshot 6/6 passed
  • cargo clippy --lib -- -D warnings clean
  • 시각 판정: output/svg/exam_science_002.svg ㉠ 사각형이 Line 2 영역 (y≈235) 에 위치, 본문 "분자당 구성" 위 겹침 해소

참조

후속 권고

  1. PR cherry-pick 시 base diff 자동 점검: 본 결함은 9dc40dd → 3de0505 비교만으로 즉시 식별 가능. 동일 함수 영역 산식 비교 자동화 권고.
  2. 회귀 테스트 가드: 본 PR 의 test_624_textbox_inline_shape_y_on_line2_p2_q7 가 RED → GREEN 가드 역할.

🤖 Generated with Claude Code

planet6897 and others added 5 commits May 6, 2026 10:08
exam_science p2 7번 글상자 ㉠ 사각형 y-위치 회귀 정정.

회귀 출처: PR edwardkim#561 cherry-pick (3de0505) 에서 Task edwardkim#520 부분 revert
- Picture 분기 tac_img_y 산식: seg.vpos - first_vpos → seg.vpos
- Shape 분기 shape_area.y: tac_img_y → para_y_before_compose
- Shape 분기 layout_cell_shape para_y: tac_img_y → para_y_before_compose

수정 범위: src/renderer/layout/table_layout.rs 3 라인 정정.

refs edwardkim#624

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
test_624_textbox_inline_shape_y_on_line2_p2_q7 추가.
exam_science.hwp p2 7번 글상자 ㉠ 사각형 y 좌표 [230, 240] 범위 검증.

RED 확인: 측정 y=213.95 (Line 1 영역, 회귀 정확히 재현).

refs edwardkim#624

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
작업지시자 지시 "분석만 계속 진행" — Stage 2 코드 정정 보류, 영향 범위·
edge case·후속 진단 분석으로 전환.

분석 결과:
- 광범위 sweep 102 페이지 (6 sample) 중 1 페이지만 정정 영향 — 0.98%
- 회귀 발생 조건 4 항 분석: first_vpos>0 AND target_line>0 동시 성립 시
  가시화. exam_science p[1] 만 유일 가시 회귀.
- 정정 안전성 — first_vpos=0 / target_line=0 / single-line / wrap 모드
  모두 무회귀 확정.
- Picture 산식 회귀: 가시 영향 0, defensive consistency 차원 복원 권고.
- 회귀 출처: PR edwardkim#561 cherry-pick 시 base diff 점검 누락. 후속 자동화
  권고.

분석 완료, 코드 정정은 후속 명시 승인 후 진행.

refs edwardkim#624

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PR edwardkim#561 cherry-pick (3de0505) 시 누락된 Task edwardkim#520 정정 3 라인 복원:

1. Picture 분기 tac_img_y 산식: seg.vpos → seg.vpos - first_vpos
   (이중 합산 회귀 해소; first_vpos=0 케이스 동일 동작 보장)
2. Shape 분기 shape_area.y: para_y_before_compose → tac_img_y
   (target_line 기반 위치 사용; target_line=0 케이스 동일 동작 보장)
3. Shape 분기 layout_cell_shape para_y 인자: 동일

증상 해소: exam_science p2 7번 글상자 ㉠ 사각형이 Line 1 (y=213.95)
에서 Line 2 (y=235.41) 으로 정확히 이동 (Δ +21.47 px = ls[1].vpos -
ls[0].vpos / 75).

검증:
- cargo test --lib test_624_textbox_inline_shape_y_on_line2_p2_q7 GREEN
- cargo test --lib 1135 passed (회귀 0)
- cargo test --test svg_snapshot 6/6 passed
- cargo clippy --lib -- -D warnings clean
- 광범위 sweep 6 fixture 102 페이지: 1 페이지 의도된 정정, 회귀 0

코드 변경 LOC: +9 / -2 (table_layout.rs).

refs edwardkim#624

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
158 fixture / 1,496 페이지 sweep — 1 페이지 의도된 정정 (0.067%),
회귀 0건 (1,495 페이지 byte-identical).

검증 완료:
- cargo test --lib test_624 RED → GREEN
- cargo test --lib 1135 passed (회귀 0)
- svg_snapshot 6/6 / clippy clean
- 158 fixture / 1,496 페이지 sweep / 회귀 0
- exam_science_002.svg 만 변경 (㉠ 사각형 + ㉠ 텍스트 y +21.47 px)

산출물:
- mydocs/report/task_m100_624_report.md (최종 보고서)
- mydocs/working/task_m100_624_stage3.md (Stage 3 보고서)
- mydocs/orders/20260506.md (오늘 할일 갱신)

closes edwardkim#624

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
edwardkim added a commit that referenced this pull request May 6, 2026
- @planet6897 (Jaeook Ryu) Task #618 회귀 정정 PR 검토
- Task #519 fix (transform: extract_shape_transform) 의 devel 누락 정합 직접 검증
  - 본 환경 git merge-base --is-ancestor 7ead89d devel: 부재
  - 본 환경 git merge-base --is-ancestor a7e43f9 devel: 부재
  - 회귀 origin: PR #527 (CLOSED) 묶음 머지가 본 환경 devel 도달 못 함
- 본 환경 검증: cargo test 1140 passed / clippy 0 / svg_snapshot 6/6
- 정량 측정: BEFORE 0 → AFTER 1 transform 래퍼 (page 4 Q28 박스), PR 본문 명시 100% 일치
- 광범위 sweep: 167 fixture / 1,687 페이지 / 차이 0
- WASM: 4,590,537 bytes (PR #611 baseline +230)
- 회귀 방지 후속 영역: Task #517/#518/#523 누락 가능성 + Task #520 (PR #627 별도 영역)
- 옵션 A (cherry-pick) 권장 + 옵션 B (후속 task 권유) 결합

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@edwardkim

Copy link
Copy Markdown
Owner

PR #627 처리 결과

cherry-pick 머지 완료 (fc8675c Stage 0 + dc94a55 Stage 1 + e042a15 Stage 2 분석 + f8085c8 Stage 2 정정 + c55ee3c Stage 3). PR #627 close + Issue #624 close 처리.

처리 옵션

옵션 A — 5 commits 단계별 cherry-pick (TDD 흐름 영역 보존, author Jaeook Ryu + Co-Authored-By Claude 모두 보존). mydocs/orders/20260506.md add/add 충돌 영역 → 본 환경 영역 보존 (ours) 정합.

본 환경 결정적 검증 (모두 통과)

항목 결과
cargo test --lib --release 1156 passed (1155 + test_624 신규 정합, 회귀 0)
cargo test --lib --release test_624 1/1 (RED → GREEN)
cargo test --test svg_snapshot --release 7/7
cargo test --test issue_546 / issue_554 / issue_418 / issue_501 1/1, 12/12, 1/1, 1/1
cargo clippy --lib -- -D warnings 0
Docker WASM 빌드 4,578,751 bytes (PR #626 baseline 4,578,641 +110 bytes)
rhwp-studio/public/{rhwp_bg.wasm, rhwp.js} 갱신 (vite dev server web 영역)

권위 영역 100% 일치 (본 환경 직접 측정)

항목 PR 본문 본 환경 측정
㉠ rect y="235.413" y="235.41333..."
㉠ text y="251.453" y="251.45333..."

메인테이너 web editor 시각 판정 ★ 통과

권위 영역 — samples/exam_science.hwp page 2 7번 문제 글상자 영역:

  • ㉠ 사각형 영역 — Line 2 (y=235.41) 정상 위치 (이전: Line 1 y=213.95 회귀)
  • ㉠ 텍스트 영역 — Line 2 (y=251.45) 정상 위치
  • 본문 "분자당 구성 …" 위 겹침 부재
  • Δ +21.47 px = ls[1].vpos − ls[0].vpos / 75 정확 일치

작업지시자 평가: "웹 에디터에서 7번 문제 시각 판정 통과입니다."

본질 정정의 가치

TDD 흐름 영역의 권위 패턴:

  • Stage 1 (dc94a55): test_624 RED — y=213.95 회귀 재현
  • Stage 2 (f8085c8): 3 라인 정정 → test_624 GREEN
  • Stage 3 (c55ee3c): 광범위 sweep 158 fixture / 1,496 페이지 / 회귀 0

feedback_close_issue_verify_merged 권위 사례 강화 누적:

회귀 차단 가드 영구 보존:

  • src/renderer/layout/integration_tests.rs::test_624_textbox_inline_shape_y_on_line2_p2_q7
  • y 좌표 [230, 240] 범위 검증 영역 — 향후 동일 결함 영역 발생 시 즉시 검출 영역

회귀 발생 4 조건 분석 (PR 본문)

exam_science p[1] 만이 (c) target_line > 0 AND (d) first_vpos > 0 동시 성립 — 광범위 sweep 결과 (1/1496) 와 정확히 부합.

거버넌스 영역 본 환경 명명 규약 정합

task_m100_624* 영역 — 본 환경 명명 규약 정합 영역 (PR #622 패턴) → 그대로 cherry-pick.

cherry-pick 결과

  • Stage 0 commit fc8675c — 수행 + 구현 계획서
  • Stage 1 commit dc94a55 — TDD RED 통합 테스트
  • Stage 2 분석 commit e042a15 — 영향 범위 + edge case 분석
  • Stage 2 정정 commit f8085c8 — 본질 정정 (3 line)
  • Stage 3 commit c55ee3c — 광범위 sweep + 최종 보고서

본 PR 의 정확한 회귀 진단 + TDD 흐름 영역 보존 + 회귀 차단 가드 영구 보존 + 메인테이너 web editor 시각 판정 ★ 통과 패턴 모두 정합.

@edwardkim edwardkim closed this May 7, 2026
@edwardkim edwardkim added this to the v1.0.0 milestone May 7, 2026
@edwardkim edwardkim added the bug Something isn't working label May 7, 2026
edwardkim added a commit that referenced this pull request May 7, 2026
PR #627 (Task #624 exam_science p2 7번 글상자 ㉠ 사각형 y 회귀 정정 — Task #520 부분 회귀 복원) 처리 완료 후속 영역:
- mydocs/pr/archives/pr_627_review.md (1차 검토 + 옵션 분석 + 본 환경 cherry-pick simulation + 권위 영역 직접 측정)
- mydocs/pr/archives/pr_627_report.md (처리 결과 + TDD 흐름 영역 + 결정적 검증 + 권위 영역 100% 일치 + 시각 판정 통과)
- mydocs/orders/20260507.md PR #627 entry 추가

처리 결과 요약:
- 옵션 A: 5 commits 단계별 cherry-pick (TDD 흐름 영역 보존)
- mydocs/orders/20260506.md add/add 충돌 → ours 영역 본 환경 보존 (PR #622 패턴 정합)
- devel commits: fc8675c (Stage 0) + dc94a55 (Stage 1 RED) + e042a15 (Stage 2 분석) + f8085c8 (Stage 2 정정) + c55ee3c (Stage 3) — author Jaeook Ryu + Co-Authored-By Claude 5 commits 모두 보존
- cargo test --lib 1156 (test_624 RED → GREEN 정합) / svg_snapshot 7/7 / issue_546/554/418/501 통과 / clippy 0
- WASM 4,578,751 bytes (PR #626 baseline +110)
- rhwp-studio/public/{rhwp_bg.wasm,rhwp.js} 갱신 (vite dev server web 영역)
- 권위 영역 100% 일치: ㉠ rect y=235.413 + ㉠ text y=251.453 (PR 본문 정확 일치)
- 메인테이너 web editor 시각 판정 ★ 통과
- PR #627 close + Issue #624 수동 close + 한글 댓글

본질 정정의 가치:
- TDD 흐름 영역의 권위 패턴 (Stage 1 RED → Stage 2 정정 → Stage 3 GREEN)
- feedback_close_issue_verify_merged 권위 사례 강화 누적 (PR #620 Task #519 누락 + 본 PR Task #520 누락 = PR #561 cherry-pick base diff 점검 누락 패턴)
- 회귀 차단 가드 영구 보존 (test_624_textbox_inline_shape_y_on_line2_p2_q7)

본 사이클 (5/7) PR 처리 누적: 12건
edwardkim added a commit that referenced this pull request May 7, 2026
PR #632 (Task #631 HWP 권위값 더블체크로 vpos-reset 인접 line 보존) 처리 완료 후속 영역:
- mydocs/pr/archives/pr_632_review.md (1차 검토 + 옵션 분석 + cherry-pick simulation + 권위 영역 직접 측정)
- mydocs/pr/archives/pr_632_report.md (처리 결과 + 결정적 검증 + 권위 영역 100% 일치 + Task #332 stage4b 종결)
- mydocs/orders/20260507.md PR #632 entry 추가

처리 결과 요약:
- 옵션 B: 5 commits cherry-pick (samples/aift.pdf 영역 제외, 본 환경 PR #670 pdf/aift-2022.pdf 영역 정합)
- mydocs/orders/20260506.md add/add 충돌 → ours 영역 본 환경 보존 (PR #622/#627 패턴)
- devel commits: 51c22a6 Stage 1 + 7127ded Stage 2 구현계획 + 5fdc096 Stage 2 정정 + e415f62 Stage 3 + e098562 Stage 4 (author Jaeook Ryu 보존)
- cargo test --lib 1156 passed / svg_snapshot 7/7 / issue_546/554/418/501 통과 / clippy 0
- WASM 4,577,370 bytes (PR #627 baseline -1,381)
- 권위 영역 100% 일치: page 18 pi=222 lines=0..2 + page 19 pi=222 lines=2..4 + [vpos-reset@line2] 마커
- 시각 판정 영역 스킵 (작업지시자 결정) — 결정적 검증 + 권위 영역 100% 일치 + 광범위 sweep 회귀 0 통과
- PR #632 close + Issue #631 수동 close + 한글 댓글

본질 정정의 가치:
- HWP 권위값 더블체크 (다음 줄 vertical_pos==0 + 현재 줄 vpos+lh ≤ body_h) — 구조적 가드 영역 (측정 의존 없음)
- feedback_hancom_compat_specific_over_general 권위 사례 강화 누적 (PR #621 다중 줄 가드 + PR #622 다단 vpos-reset + 본 PR vpos-reset 인접 line 보존 = 본 사이클의 vpos-reset 영역 권위 사례 누적)
- Task #332 stage4b 알려진 회귀 (aift pi=222) 종결

본 사이클 (5/7) PR 처리 누적: 13건
edwardkim added a commit that referenced this pull request May 11, 2026
- mydocs/pr/archives/pr_813_review.md (5 정책 위반 + 회귀 위험 분석)
- mydocs/pr/archives/pr_813_report.md (옵션 C 처리 결과 + 분리 PR 가이드)
- mydocs/orders/20260511.md PR #813 행 추가

핵심 문제점:
1. base=main 정책 위반 (devel 재제출 필수)
2. 폰트 라이선스 정책 어긋남 (Noto/Pretendard 미포함)
3. typeset.rs LINE_SEG 가드 회귀 위험 (PR #621/#622/#627/#632/#636 누적 정정 우회)
4. Issue 연결 부재
5. wasm_api.rs pub(crate) core 가시성 변경

분리 PR 3 가이드 (재제출 대기):
- 분리 PR 1: pdf.rs SVG BBox (안전, PR #798 close 후속, 우선)
- 분리 PR 2: 폰트 fallback (Noto/Pretendard 우선)
- 분리 PR 3: typeset.rs LINE_SEG + HWPX adapter (광범위 sweep 필수)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants