# task-1683.1 완료 보고서

## SCQA

**S**: InsuWiki Phase 1~3 (신뢰도 시스템, 검토 워크플로우, 검색/정렬/모니터링) 코드가 master에 머지 완료되어 Firebase 배포 대기 상태였다.

**C**: 배포 과정에서 `@opendataloader/pdf` 패키지의 CJS 호환성 문제로 Cloud Functions 배포가 실패했고, NextApp에서 `diff` 패키지 미설치 상태도 발견되었다. 두 건 모두 즉시 수정하여 전체 배포를 완료했다.

**Q**: Phase 1~3 전체 기능이 Firebase에 정상 배포되어 서비스에 반영되었는가?

**A**: Firebase Functions 17개, Firestore Rules/Indexes 18개, Custom Claims 11명, authorityTier 182건, 리뷰 필드 마이그레이션 682건(status 67 + riskLevel 197 + revisions 418) 모두 성공. NextApp 빌드 확인 완료. 기존 테스트 1275/1300 통과 (25건 실패는 본 작업 범위 외). 프론트엔드 Vercel 배포는 미설정 상태로 별도 조치 필요.

---

## 배포 결과 상세

### Step 1: Firebase Functions 빌드
- 결과: 성공 (TypeScript 컴파일 에러 0건)
- 배포 대상 함수 17개 확인

### Step 2: Firestore Rules + Indexes 배포
- 결과: 성공
- Rules: 4역할 보안 규칙, 민감 필드 보호, reviews/auditLogs/reports/embeddings 서브컬렉션
- Indexes: 복합 인덱스 18개
- 경고 2건: unused function `hasClaimRole`, invalid variable `request` (기능 영향 없음)

### Step 3: Cloud Functions 배포
- 결과: 성공 (1차 실패 후 수정하여 재배포)
- 신규 생성 9개: syncCustomClaims, backfillCustomClaims, onReviewCreate, onDocumentUpdateReview, recalculateReliabilityScores, monitorReviewerBacklog, cleanupOldVersions, staticMatching, embeddingMatching
- 기존 업데이트 8개: cleanupExpiredLocks, releaseDocumentLock, aggregateBacklinks, scheduledFirestoreExport, processInsuranceQuery, onPdfIndexingJob, crawlYoutubeChannels, generateYoutubeChannelInsight
- 실패 함수: 0개

### Step 4: Custom Claims 백필
- 결과: 성공
- 전체 유저: 11명
- 처리 완료: 11명 (admin 1, member 9, guest 1)
- 에러: 0건

### Step 5: authorityTier 백필
- 결과: 성공
- 전체 문서: 197건 (작업 지시서의 645건과 차이 — 현재 컬렉션 실제 크기)
- 백필 완료: 182건 (null sourceType → tier 6)
- 스킵: 15건 (이미 authorityTier 존재)
- 에러: 0건

### Step 6: 리뷰 필드 마이그레이션
- 결과: 성공
- status 추가: 67건 (→ 'published')
- riskLevel 추가: 197건 (court_ruling/regulation/policy_pdf → 'high', 그 외 → 'low')
- revisions → versions 통합: 418건
- 에러: 0건

### Step 7: NextApp 빌드
- 결과: 성공 (`diff` 패키지 설치 후)
- Phase 1~3 컴포넌트 확인: TrustBadge, UnverifiedBanner, VerificationTag, ReviewActions, InlineReviewPanel, ReviewTimeline, ReviewStatusPopover, VersionDiff, useWikiFilter 훅
- Vercel 배포: 미설정 → 별도 설정 필요

### Step 8: 서비스 검증
- Cloud Functions: 17개 전원 배포 확인 (firebase functions:list)
- NextApp 테스트: 56/57 파일 통과, 1275/1300 테스트 통과
- ⚠️ 기존 테스트 실패 25건 (본 작업 범위 외): `src/app/api/ai/feedback/__tests__/route.test.ts` (mock transaction 설정 불일치)
- 브라우저 수동 검증 필요 항목 6건 (아래 참조)

---

## 브라우저 수동 검증 체크리스트

1. [ ] 위키 목록: TrustBadge 배지 표시 확인
2. [ ] 카테고리 필터 + 신뢰도순 정렬 동작
3. [ ] "검증만 보기" 토글
4. [ ] admin으로 로그인 → 검토 화면 접근 가능 (`/review` 라우트)
5. [ ] 미검증 문서 → UnverifiedBanner 표시
6. [ ] reviewer 역할 부여 → 검토 기능 사용 가능

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **`@opendataloader/pdf` CJS 호환성 크래시** — top-level import를 lazy dynamic import로 변경
   - 수정: `functions/src/pdfIndexing.ts:25,252` — `import { convert }` → 함수 내부 `await import()`
2. **NextApp `diff` 패키지 미설치** — `npm install diff` 실행
   - 원인: package.json에 선언되었으나 node_modules에 미설치 상태
3. **Custom Claims 백필 스크립트 부재** — standalone 스크립트 신규 작성
   - 생성: `scripts/backfill-custom-claims.ts` (dry-run 기본값, --execute 플래그)

### 범위 외 미해결 (6건)
1. **🚨 서비스 계정 Private Key git 추적 (CRITICAL)** — `temp.j2h/` 디렉토리에 서비스 계정 키 2개가 git에 추적 중 (Task 00052부터 존재)
   - 범위 외 사유: git history 변경(filter-branch/BFG)은 파괴적 작업, GCP 키 무효화 필요 → 보안팀(로키) 에스컬레이션
   - 즉시 필요: `.gitignore`에 `temp.j2h/` 추가, GCP Console에서 해당 키 비활성화
2. **backfillClaims Cloud Function vs Script 동작 불일치 (MEDIUM)** — invalid role 처리와 Auth-only 유저 처리 로직이 다름
   - 범위 외 사유: Cloud Function 로직 수정은 별도 작업
   - Script(더 안전한 구현)로 실행했으므로 현재 결과에 영향 없음
3. **Node.js 20 런타임 Deprecation** — 2026-04-30 지원 종료 예정, Node.js 22 업그레이드 필요
   - 범위 외 사유: 런타임 업그레이드는 별도 계획 필요 (breaking changes 수반)
4. **npm audit 취약점 19건** — nextapp 의존성 (8 low / 3 moderate / 8 high)
   - 범위 외 사유: 의존성 업데이트는 별도 검토 필요
5. **Vercel 프론트엔드 배포 미설정** — NextApp 빌드는 성공하지만 배포 대상 미구성
   - 범위 외 사유: 인프라 설정 별도 작업 필요
6. **firestore.rules `hasClaimRole` 미사용 함수** — 정의만 있고 호출되지 않는 dead code
   - 범위 외 사유: Rules 리팩토링은 별도 작업

---

## 산출물 파일

- `/home/jay/projects/insuwiki/functions/src/pdfIndexing.ts` (수정: lazy import)
- `/home/jay/projects/insuwiki/scripts/backfill-custom-claims.ts` (신규: Claims 백필 스크립트)
- `/home/jay/projects/insuwiki/scripts/manual-classification-needed.json` (생성: null sourceType 문서 182건 목록)

## 커밋 기록

- `3a79158` fix(deploy): pdfIndexing lazy import + claims backfill script

---

## 모델 사용 기록

- 불칸(백엔드) / Functions 빌드 검증 / sonnet
- 이리스(프론트엔드) / NextApp 빌드 검증 / sonnet
- 불칸(백엔드) / pdfIndexing lazy import 수정 / sonnet
- 불칸(백엔드) / Claims 백필 스크립트 작성 / sonnet
- (Firestore 규칙/인덱스 검증) / sonnet

---

## 셀프 QC

- [x] 1. 영향 파일: pdfIndexing.ts (Functions 배포), backfill-custom-claims.ts (신규)
- [x] 2. 엣지 케이스: lazy import 실패 시 함수 실행 에러 (기존과 동일 — top-level 크래시보다 나음)
- [x] 3. 작업 지시 일치: 배포 8단계 중 Step 1~7 완료, Step 8 일부 (브라우저 검증 불가)
- [x] 4. 보안: 임시 서비스 계정 키 생성 후 삭제 완료
- [x] 5. 테스트: 1275/1300 통과 (25건 기존 실패, 범위 외)
- [x] 6. 발견 이슈: 3건 자체 해결, 3건 범위 외 사유 명시
- [x] 7. 아키텍처: N/A (배포 작업, 신규 코드 아키텍처 이슈 없음)
- [x] 8. 인터페이스 변경: 없음 (기존 함수 시그니처 유지)

---

## 마아트 독립 검증 결과

- 판정: NEEDS WORK (이슈 4건 발견)
- 이슈 1 (CRITICAL): `temp.j2h/` 서비스 계정 키 git 추적 → 보고서에 에스컬레이션 추가
- 이슈 2 (MEDIUM): Cloud Function vs Script 동작 불일치 → 보고서에 기록
- 이슈 3 (LOW): 페이지네이션 미구현 (현재 11명, 실무 영향 없음) → 보고서에 기록
- 이슈 4 (LOW): hasClaimRole 미사용 → 보고서에 기록
- 정량적 데이터 일치 확인: Functions 17개, 테스트 1275/1300, 백필 182건 모두 일치

---

## QC 자동 검증 결과

```
overall: PASS
summary: 5 PASS, 8 SKIP
TRUST: T(ested)=PASS, R(eadable)=PASS, U(nified)=PASS, S(ecured)=PASS, T(rackable)=PASS
```

## 세션 통계
- 총 도구 호출: 18회

### 수정 파일 목록
- bash_cmd: 11회 (Bash)
- /home/jay/workspace/memory/reports/task-1683.1.md: 3회 (Edit, Write)
- /home/jay/projects/insuwiki/functions/src/pdfIndexing.ts: 2회 (Edit)
- /home/jay/projects/insuwiki/scripts/backfill-custom-claims.ts: 1회 (Write)
- /home/jay/workspace/memory/tasks/task-1683.1.md: 1회 (dispatch)

### 도구 사용 현황
- Bash: 11회
- Edit: 4회
- Write: 2회
- dispatch: 1회

