# InsuWiki 검토+신뢰도 Phase 1 Week 2: 상태 머신 + 검토 제도

## 한정승인

## PRD 참조 (필수 읽기)
1. 통합 체크리스트: `/home/jay/workspace/memory/plans/insuwiki/review-trust-system/checklist.md` — Phase 1 Week 2 섹션
2. 계획서: `/home/jay/workspace/memory/plans/insuwiki/review-trust-system/plan.md`
3. 맥락노트: `/home/jay/workspace/memory/plans/insuwiki/review-trust-system/context-notes.md`
4. InsuWiki 앱: `/home/jay/projects/insuwiki/`
5. Firestore 타입: `/home/jay/projects/insuwiki/nextapp/src/types/firestore.ts`

## 선행 조건
- Week 1 (인증 + Custom Claims) 완료 필요
- 이 작업은 Week 1 완료 후 진행되어야 하므로, 먼저 Week 1 체크리스트 완료 여부를 확인하세요

## Week 2 작업 범위

### 상태 머신 (CF 서버 사이드)
- VALID_TRANSITIONS 테이블 정의 (TypeScript)
- CF: reviews onCreate 트리거 → 상태 전이 로직
- API Route: POST /api/wiki/entries/{id}/review (verifyReviewer)
- riskLevel 자동 판정 CF (sourceType/카테고리 기반)
- 고위험 → admin 최종 승인 필수 로직
- 승인 후 수정 → needs_re_review 자동 전환

### 경량 수정 면제 로직 (CF)
7조건 판정 로직:
1. 변경 문자 수 ≤ 20자
2. 숫자/금액/날짜/비율 변경 없음 (정규식)
3. 부정어 추가/삭제 없음 (키워드 목록)
4. 링크 URL 변경 없음
5. 법규/약관 인용 번호 변경 없음 (정규식)
6. 고위험 카테고리 아님
7. 7일 내 경량 수정 누적 < 3회

### 검토 제도
- reviews 서브컬렉션 스키마: documents/{docId}/reviews/{reviewId}
- 자기 검토 금지: contributorIds 배열 기반 검증 (CF)
- 검토자 배정 무작위화 로직 (라운드 로빈 + 연속 배정 제한)
- 리뷰어 풀 최소 3명 체크 + admin 경고
- 승인 인원 차등: 저위험=reviewer 1명, 고위험=reviewer+admin 2단계
- review.comment 필드: 반려/수정요청 시 사유 필수 입력 검증
- collectionGroup('reviews') 인덱스 추가

### 감사 로그
- documents/{docId}/auditLogs 서브컬렉션 스키마
- CF에서만 쓰기 (Security Rules deny all client writes)
- Cloud Logging 이중화 (structured log)

## 테스트
- 상태 전이 테스트 (12 케이스: 합법+불법 전이)
- 자기 검토 금지 테스트 (contributorIds)
- 경량 수정 7조건 경계값 테스트
- 감사 로그 무결성 테스트

## 보고서
`/home/jay/workspace/memory/reports/task-{TASK_ID}.md`
