# task-1349.1 완료 보고서: InsuWiki 편집창 밑줄(Underline) 버그 수정

## S - Situation
InsuWiki 에디터(TipTap v3.19 기반)에서 밑줄(Underline) 기능이 Ctrl+U 단축키로만 사용 가능하며, 툴바에 버튼이 없다. 밑줄 적용 후 저장하면 `</u` 불완전 태그가 노출되고 이후 모든 텍스트에 밑줄이 전파되는 버그가 있다.

## C - Complication
`tiptap-markdown` 라이브러리는 마크 직렬화 설정을 `storage.markdown.serialize`에서 읽는데, `UnderlineMarkdown.ts`는 `storage.markdown.marks.underlineMarkdown`에 설정해 무시되고 있었다. 이로 인해 HTMLMark 폴백 직렬화가 사용되면서 특정 상황에서 `</u>` 닫힘 태그가 불완전하게(`</u`) 출력되었다. 또한 `expelEnclosedWhitespace`(오타)가 `expelEnclosingWhitespace`(정확한 속성명)와 불일치했다.

## Q - Question
밑줄 직렬화 버그를 수정하고, 툴바에 버튼을 추가하며, 기존 깨진 콘텐츠를 복구할 수 있는가?

## A - Answer
3개 파일 수정/생성으로 완료. (1) `UnderlineMarkdown.ts` 스토리지 구조를 `serialize` 패턴으로 수정하여 `tiptap-markdown`이 올바르게 `<u>`/`</u>` 태그를 직렬화하도록 함. (2) `EditorToolbar.tsx`에 밑줄(U) 버튼 추가. (3) Firestore 깨진 태그 복구 스크립트 작성.

## 산출물

- `/home/jay/projects/insuwiki/.worktrees/task-1349.1-dev3/nextapp/src/lib/tiptap/UnderlineMarkdown.ts`
- `/home/jay/projects/insuwiki/.worktrees/task-1349.1-dev3/nextapp/src/components/EditorToolbar.tsx`
- `/home/jay/projects/insuwiki/.worktrees/task-1349.1-dev3/scripts/fix-broken-underline-tags.ts`

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **스토리지 구조 불일치** — `storage.markdown.marks.underlineMarkdown` → `storage.markdown.serialize`로 수정 (tiptap-markdown 라이브러리 패턴 준수)
2. **속성명 오타** — `expelEnclosedWhitespace` → `expelEnclosingWhitespace`로 수정 (prosemirror-markdown 정확한 속성명)
3. **툴바 밑줄 버튼 누락** — `EditorToolbar.tsx`에 U 버튼 추가, `isActive('underlineMarkdown')`으로 활성 상태 감지

### 범위 외 미해결 (1건)
1. **기존 깨진 콘텐츠 실제 복구** — 스크립트는 작성했으나 Firestore 프로덕션 데이터에 대한 실행은 운영팀 판단 필요. 범위 외 사유: 프로덕션 DB 직접 실행은 승인 필요.

## 변경 상세

### UnderlineMarkdown.ts (수정)
- `storage.markdown.marks.underlineMarkdown` 중첩 구조 → `storage.markdown.serialize` 직접 설정
- `expelEnclosedWhitespace` (오타) → `expelEnclosingWhitespace` (정확한 속성명)
- `parse` 섹션 명시 추가

### EditorToolbar.tsx (수정)
- Strikethrough(S) 버튼 다음에 Underline(U) 버튼 추가
- `toggleUnderline()` 커맨드, `isActive('underlineMarkdown')` 활성 상태 감지
- Ctrl+U 단축키 연동 (TipTap base extension이 자동 처리)

### fix-broken-underline-tags.ts (신규)
- Firestore documents/dailyNotes/drafts 컬렉션 대상
- `</u` (닫힘 `>` 누락) 패턴 검색 및 `</u>`로 수정
- dry-run 기본값, 원본 `_content_backup` 백업, 배치 처리 500개 단위

## 머지 판단
- **머지 필요**: Yes
- **브랜치**: task/task-1349.1-dev3
- **워크트리 경로**: /home/jay/projects/insuwiki/.worktrees/task-1349.1-dev3
- **머지 의견**: 프론트엔드 코드 변경 2건은 기존 패턴(bold/italic/strike)과 동일한 구조를 따르며, 다른 기능에 영향 없음. 정리 스크립트는 독립 파일이므로 충돌 가능성 0. 에디터 유닛 테스트가 프로젝트에 존재하지 않아 수동 브라우저 테스트 권장.

## QC 자동 검증 결과

```json
{
  "task_id": "task-1349.1",
  "verified_at": "2026-04-02T16:42:02",
  "overall": "PASS",
  "summary": "5 PASS, 7 SKIP",
  "trust_summary": {
    "Tested": true,
    "Readable": true,
    "Unified": true,
    "Secured": true,
    "Trackable": true
  }
}
```

## 모델 사용 기록
- 브리짓(Brigid) / UnderlineMarkdown.ts + EditorToolbar.tsx 수정 / sonnet / -
- 루(Lugh) / fix-broken-underline-tags.ts 스크립트 작성 / sonnet / -
