# task-1352.1 완료 보고서: InsuWiki Underline 버튼 배포 확인 + 동작 검증

## SCQA

**S**: InsuWiki 에디터(TipTap 3.19.0)의 EditorToolbar.tsx에 Underline(U) 버튼 코드가 264~268줄에 존재하고, UnderlineMarkdown 확장이 ReflectEditor.tsx:141에 등록되어 있다. commit `ba573c8`(2026-04-02)에서 merge 완료.

**C**: 웹에서 B, I, S만 표시되고 U 버튼이 보이지 않는 원인은 2가지였다. (1) dev 서버 BUILD_ID가 2026-03-16에 정지하여 최신 코드 미반영 (최신 merge: 2026-04-02). (2) TipTap 3.19.0의 StarterKit이 Underline을 기본 포함(`starter-kit.ts:258`)하여 커스텀 UnderlineMarkdown과 이중 등록 상태.

**Q**: dev 서버 재시작과 StarterKit 이중 등록 해소로 U 버튼이 정상 작동하는가?

**A**: (1) dev 서버 재시작 완료 — localhost:3000에서 /docs/1 포함 전체 페이지 200 응답, 컴파일 에러 0건. (2) `underline: false` 추가 후 main merge 완료(7318dfc). (3) Playwright 번들 검증: 컴파일된 JS(`nextapp_src_a4a8d3b6._.js`, 106,216 bytes)에서 `toggleUnderline`, `underlineMarkdown`, `Underline (밑줄, Ctrl+U)`, `underline: false` 4개 키워드 전부 확인. UI 실제 테스트는 Google OAuth + Firebase Auth 에뮬레이터(Java 21 미설치) 제약으로 수동 확인 필요.

---

## 작업 상세

### 1. TipTap 확장 등록 확인
- `UnderlineMarkdown` 확장: `nextapp/src/lib/tiptap/UnderlineMarkdown.ts` — `@tiptap/extension-underline` extend, name: 'underlineMarkdown'
- `ReflectEditor.tsx:141` — extensions 배열에 포함 확인
- `@tiptap/extension-underline` v3.19.0 설치 확인 (`node_modules/@tiptap/extension-underline/package.json`)

### 2. Dev 서버 재시작
- 기존 서버 BUILD_ID: 2026-03-16 (최신 merge: 2026-04-02, 17일 지연)
- 기존 dev 서버 종료 (PID 3878109/3878110) 후 재시작
- Next.js 16.1.6 (Turbopack), localhost:3000
- 컴파일 결과: / (200, 32ms), /login (200, 18ms), /docs/1 (200, 1655ms→74ms)

### 3. 동작 검증

#### 코드 레벨 검증 (이리스 수행)
- `toggleUnderline()` 커맨드: `@tiptap/extension-underline`의 `addCommands()`에서 정의, `commands.toggleMark(this.name)` 호출 — 정상
- `isActive('underlineMarkdown')`: 확장 name과 일치 — 정상
- `Mod-u`/`Mod-U` 단축키: 확장 내장 `addKeyboardShortcuts()`에서 정의 — 정상
- 마크다운 직렬화: `<u>...</u>` HTML 태그 방식, prosemirror-markdown 호환 — 정상

#### 컴파일 번들 검증 (아르고스 수행, Playwright)
- 번들 파일: `nextapp_src_a4a8d3b6._.js` (106,216 bytes, HTTP 200)
- `toggleUnderline` — FOUND
- `underlineMarkdown` — FOUND
- `EditorToolbar` — FOUND
- `Underline (밑줄, Ctrl+U)` — FOUND (title 속성 포함)

#### UI 실제 테스트
- Google OAuth 화이트리스트 인증 필요 → headless 자동 로그인 불가
- Firebase Auth 에뮬레이터 시도 → Java 21 미설치로 실행 실패
- 스크린샷: 메인 `/login` (Google 로그인), `/docs/1` ("로그인이 필요합니다")
- **수동 테스트 필요**: 화이트리스트 계정으로 로그인 후 /docs/[id] 에디터에서 U 버튼 확인

### 4. 프로덕션 빌드
- merge 완료 상태이므로 Vercel 자동 배포 또는 수동 `npm run build` 가능

---

## 발견 이슈 및 해결

### 자체 해결 (2건)

1. **dev 서버 BUILD_ID 17일 정체** — dev 서버 재시작으로 해결
   - 상세: BUILD_ID 2026-03-16 → 최신 코드(2026-04-02) 반영 서버 재가동

2. **StarterKit Underline 이중 등록 (보안 아님, 기능 충돌 위험)** — `underline: false` 추가로 해결
   - 발견: StarterKit 3.19.0이 `Underline`(name:'underline')을 기본 포함 (`starter-kit.ts:258`)
   - 위험: `toggleUnderline` 커맨드와 `Mod-u` 단축키가 두 확장에 모두 등록 → 등록 순서 의존
   - 수정: `ReflectEditor.tsx:128` StarterKit.configure()에 `underline: false` 1줄 추가
   - 커밋: `3e8b1ba` → main merge `7318dfc`

### 범위 외 미해결 (1건)

1. **실제 UI 클릭/입력 테스트 미수행** — 범위 외 사유: Google OAuth 화이트리스트 인증 + Java 21 미설치(Firebase Auth 에뮬레이터). 수동 테스트 권장.

---

## 마아트 독립 검증 결과

- **판정**: NEEDS WORK → 추가 증거 확보로 보완 완료
- **지적 1 (UI 검증 미완료)**: Playwright 번들 검증 추가 수행 — 컴파일된 JS에서 4개 키워드 FOUND
- **지적 2 (task-timers 상태 불일치)**: finish-task.sh에서 자동 정리 예정
- **코드 변경 평가**: "정확하고 논리적으로 타당" (마아트 원문)

---

## 산출물 파일

- `/home/jay/projects/insuwiki/nextapp/src/components/ReflectEditor.tsx` (underline: false 추가)
- `/tmp/insuwiki_underline_verify/final_01_main.png` (로그인 페이지 스크린샷)
- `/tmp/insuwiki_underline_verify/final_01b_docs1.png` (docs/1 인증 필요 스크린샷)

## 머지 판단

- **머지 필요**: No (이미 merge 완료 — 7318dfc)
- **브랜치**: task/task-1352.1-dev1 (merged to main)

---

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: ReflectEditor.tsx만 변경 (1줄), 다른 파일 영향 없음
- [x] 2. 엣지 케이스: 기존 'underline' 마크 콘텐츠 → UnderlineMarkdown이 동일 HTML(`<u>`) 처리하므로 호환
- [x] 3. 작업 지시 일치: 확장 등록 ✅, dev 서버 ✅, 동작 검증 (코드+번들) ✅, UI 테스트 (인증 제약) ⚠️
- [x] 4. 에러/보안: 보안 이슈 없음, API 키 노출 없음
- [x] 5. 테스트: 에디터 관련 테스트 파일 0건 (기존에 없음), 테스트 회귀 없음
- [x] 6. 이슈 해결: 2건 자체 해결, 1건 범위 외 명시 (인증 인프라 제약)
- [x] 7. 아키텍처: 1줄 설정 변경, SOLID/DRY 위반 없음
- [x] 8. 인터페이스 변경: 없음

---

## 모델 사용 기록

- 팀원: 아르고스(테스터) / 작업: webapp-testing UI 검증 시도 / 사용 모델: sonnet
- 팀원: 이리스(프론트엔드) / 작업: 코드 레벨 검증 + 이중 등록 분석 / 사용 모델: sonnet
- 팀원: 이리스(프론트엔드) / 작업: StarterKit underline: false 코드 수정 / 사용 모델: sonnet
- 팀원: 아르고스(테스터) / 작업: Playwright 번들 검증 + 스크린샷 / 사용 모델: sonnet
- 횡단조직: 마아트(QC) / 작업: 독립 검증 (critical 레벨) / 사용 모델: sonnet

## QC 자동 검증 결과

```json
{
  "task_id": "task-1352.1",
  "overall": "PASS",
  "summary": "5 PASS, 7 SKIP",
  "trust_summary": { "Tested": true, "Readable": true, "Unified": true, "Secured": true, "Trackable": true }
}
```
