# task-1353.1 완료 보고서

## S - Situation
InsuWiki "AI시대 영업의 품격 (260402)" 페이지(문서 ID: `80ivTX4TSdnbPtC6X5ut`)에 밑줄이 전체 적용된 상태로 편집해도 제거가 안 되는 고착 버그가 보고되었다. task-1351.1에서 `</u` 불완전 닫힘 패턴을 스캔했으나 0건이었다.

## C - Complication
진단 결과, Firestore content 필드에 `<u>` 46개, `</u>` 46개가 **균형 상태**로 존재하여 기존 fix 스크립트(불완전 닫힘 탐지)로는 문제를 감지할 수 없었다. 콘텐츠의 70% 이상이 `<u>` 태그로 감싸져 있어 페이지 전체가 밑줄로 보였다. 근본 원인은 `UnderlineMarkdown.ts`의 `expelEnclosingWhitespace: true` 옵션이 tiptap-markdown의 `trimInline` 함수를 통해 `</u>` 태그를 `</u<u>>`로 손상시키는 직렬화 버그였다.

## Q - Question
고착된 밑줄 46쌍을 제거하고, 향후 동일 버그 재발을 방지할 수 있는가?

## A - Answer
2가지 수정을 적용하여 해결했다:
1. **Firestore 데이터 수정**: `strip-underline-tags.ts` 스크립트로 `<u>` 태그 46쌍 전부 제거 (content 4060자 → 3759자, 원본 `_content_backup`에 백업)
2. **에디터 버그 수정**: `UnderlineMarkdown.ts`에서 `expelEnclosingWhitespace: true` 제거 (HTML 태그 손상 근본 원인 차단)

교차 검증: `verify-underline-tags.ts`로 전체 컬렉션 스캔 시 깨진 밑줄 태그 0건 확인.

---

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **`<u>` 태그 46쌍이 균형 상태여서 기존 스크립트로 감지 불가** — 새 진단 스크립트(`diagnose-underline-issue.ts`)를 작성하여 균형/불균형, 중첩, 전체 감싸기 등 6가지 패턴을 분석
   - 결과: 균형은 맞지만 콘텐츠 70%가 `<u>` 태그로 감싸진 과도한 밑줄 상태 확인

2. **`expelEnclosingWhitespace: true`가 `</u>` 태그 손상 유발** — `UnderlineMarkdown.ts`에서 해당 옵션 제거
   - 원인: `trimInline` 함수가 마크다운 delimiter(`**`, `_`)용으로 설계되어 HTML 태그에 적용 시 `</u>` → `</u<u>>`로 변환
   - 수정: `nextapp/src/lib/tiptap/UnderlineMarkdown.ts:16` - `expelEnclosingWhitespace` 제거 + 사유 주석 추가

3. **Worktree 생성 실패** — `worktree_manager.py create` 성공 메시지 후 실제 디렉토리가 비어있어 직접 브랜치 생성으로 전환
   - 범위 외 사유: worktree_manager.py 자체 이슈는 시스템 팀 소관

---

## 산출물 파일 목록

- `/home/jay/projects/insuwiki/nextapp/src/lib/tiptap/UnderlineMarkdown.ts` (수정)
- `/home/jay/projects/insuwiki/scripts/strip-underline-tags.ts` (신규)

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-1353.1-dev2
- **머지 의견**: `expelEnclosingWhitespace` 제거는 안전한 변경 (HTML 태그에 trimInline 미적용). Firestore 데이터는 이미 수정 완료. verify 스크립트로 전체 컬렉션 0건 확인. 충돌 가능성 낮음 (단일 파일 1줄 변경).

## 모델 사용 기록

- 토르(백엔드) / 진단 스크립트 작성 + strip 스크립트 작성 및 실행 / sonnet / -
- 프레이야(프론트엔드) / TipTap 밑줄 직렬화 근본 원인 분석 + UnderlineMarkdown.ts 수정 / sonnet / -

## QC 검증 결과

(아래에 qc_verify.py 결과 첨부)
