# task-1591.1 완료 보고서

## SCQA

**S**: InsuWiki에 카카오 단톡방 Q&A 데이터가 Phase 1에서 Firestore documents 컬렉션에 동기화되어, 기존 위키 문서와 함께 저장되고 있다.

**C**: 그러나 앱 UI에서 출처별 구분이 불가하여, 약관 원문과 커뮤니티 Q&A가 동일한 신뢰도로 표시되고 있다. 사용자가 정보의 권위 수준을 판단할 수 없는 상태이다.

**Q**: 출처/신뢰도 배지 시스템과 출처 필터를 도입하여 사용자가 정보의 권위 수준을 즉시 파악하고 출처별로 필터링할 수 있는가?

**A**: 3단계 신뢰도 배지(공식/검증/참고), 출처 필터 칩(전체/약관/전문가/커뮤니티), Q&A 전용 렌더러를 구현하여 출처 구분 UI를 완성했다. 테스트 36건 전체 통과, 기존 문서에 영향 없음 확인(optional 필드만 추가).

## 작업 내용

### 1. 타입 시스템 확장 (firestore.ts)
- `SourceType` (9개 값), `VerificationStatus` (3개 값), `SourceMeta`, `SourceRef` 인터페이스 추가
- `Document` 인터페이스에 8개 optional 필드 확장 (question, answer, subcategory, sourceType, verificationStatus, authorityTier, sourceMeta, sourceRef)
- 모든 필드 optional → 기존 documents 무영향

### 2. 출처 상수/유틸리티 (constants.ts)
- `SOURCE_CHIP_MAP`: 필터 칩 → sourceType 배열 매핑
- `getDefaultAuthorityTier()`: sourceType → authorityTier 기본 매핑
- `getAuthorityBadgeInfo()`: authorityTier → 배지 라벨/색상/아이콘
- `SOURCE_TYPE_LABEL`, `VERIFICATION_LABEL`: 한글 라벨 매핑

### 3. SourceBadge 컴포넌트 (신규)
- sm 모드: 카드/리스트에서 단일 배지 (공식🛡️/전문가✅/참고용💬)
- md 모드: 상세 페이지에서 신뢰등급 + 출처종류 + 검증상태 3단 배지
- sourceType 없는 기존 문서 → null 반환 (무영향)

### 4. QnaRenderer 컴포넌트 (신규)
- 질문 카드: 파란 배경 + Q 배지
- 답변 카드: 흰 배경 + A 배지
- 전문가명, 단톡방명, 수집일 표시
- question/answer 모두 없으면 null 반환

### 5. 메인 대시보드 출처 필터 (page.tsx)
- 카테고리 탭 아래에 출처 필터 칩 추가 (전체/약관/전문가/커뮤니티)
- `selectedSource` state + 클라이언트 사이드 sourceType 필터링
- 카드 뷰/리스트 뷰 모두 SourceBadge 배지 표시

### 6. 문서 상세 페이지 출처 정보 (DocumentClient.tsx)
- 문서 제목 아래 출처 메타 블록: SourceBadge(md) + sourceRef(채널명, 수집일)
- 카카오 Q&A 문서: QnaRenderer로 질문/답변 분리 표시 (ReactMarkdown 본문 위)

## 산출물 파일

- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/types/firestore.ts` (수정)
- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/lib/constants.ts` (수정)
- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/components/SourceBadge.tsx` (신규)
- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/components/QnaRenderer.tsx` (신규)
- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/app/page.tsx` (수정)
- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/app/docs/[id]/DocumentClient.tsx` (수정)
- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/__tests__/constants.test.ts` (수정)
- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/components/__tests__/SourceBadge.test.tsx` (신규)
- `/home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2/nextapp/src/components/__tests__/QnaRenderer.test.tsx` (신규)

## 테스트 결과

vitest 36건 전체 통과:
- `constants.test.ts`: getDefaultAuthorityTier (4건), getAuthorityBadgeInfo (6건), SOURCE_CHIP_MAP (4건), SOURCE_CHIP_KEYS (1건), SOURCE_TYPE_LABEL (1건), VERIFICATION_LABEL (2건) = 18건 (기존 포함 19건)
- `SourceBadge.test.tsx`: 6건 (null 렌더, sm/md 사이즈, 검증 배지 표시/숨김, 기본 사이즈)
- `QnaRenderer.test.tsx`: 7건 (null 렌더, 질문만/답변만/둘다, 전문가명, 채널명, 날짜 형식)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **QnaRenderer 날짜 렌더링 조건** — collectedAt는 (expertName || channelName) 조건 내부에서만 표시. 테스트에서 expertName prop 추가하여 정합성 확보.
2. **sourceType 없는 기존 문서 호환성** — SourceBadge에서 sourceType null이면 null 반환. 출처 필터에서 '전체' 선택 시 sourceType 없는 문서도 표시.
3. **getAuthorityBadgeInfo 이중 fallback** — authorityTier와 sourceType 모두 없는 경우 '일반' 배지 반환으로 처리.

## 머지 판단

- **머지 필요**: Yes
- **브랜치**: task/task-1591.1-dev2
- **워크트리 경로**: /home/jay/projects/insuwiki/.worktrees/task-1591.1-dev2
- **머지 의견**: 테스트 36건 전체 통과, 모든 신규 필드 optional이므로 기존 문서 무영향, 카드/리스트/상세 페이지 3곳에 배지 통합 완료. Phase 1 타입 정의가 아직 메인에 없으므로 이 브랜치에서 타입도 함께 추가함.

## 모델 사용 기록

- 프레이야-A / 타입+상수+SourceBadge / sonnet / -
- 프레이야-B / QnaRenderer / sonnet / -
- 프레이야-C / page.tsx 출처 필터 통합 / sonnet / -
- 프레이야-D / DocumentClient.tsx 출처 정보 / sonnet / -
- 헤임달 / 테스트 36건 작성 / sonnet / -
