# 에이전트 미팅: InsuWiki 자동 임시저장 기능 설계
- 일시: 2026-03-20
- 참석자: 헤르메스, 불칸, 이리스, 아테나, 아르고스, 로키
- task_id: task-745.1

## 핵심 설계 결정 요약

| 항목 | 결정 |
|---|---|
| 패턴 | MS Word 방식 (주기 저장 + 비정상 종료 복구 + 정상 저장 시 삭제) |
| localStorage 주기 | debounce 1초 |
| Firestore 주기 | debounce 3초 + 최대 30초 강제 |
| 저장소 | localStorage(보조) + Firestore(주) 병행 |
| 동시 편집 | 사용자별 독립 임시저장, 잠금 시스템과 분리 |
| 복구 UX | 해시 비교 후 다를 때만 모달, diff 미리보기 |
| 이탈 방지 | beforeunload + routeChangeStart + 3버튼 팝업 |
| TTL | Firestore 네이티브 TTL (expiresAt 필드) + 클라이언트 소프트 만료 |
| 다중 탭 | BroadcastChannel 마스터 탭 개념 |

## Firestore drafts 스키마

```
drafts/{userId}--{documentId}
  - documentId: string
  - userId: string
  - title: string
  - content: string
  - contentHash: string (SHA-256 앞 16자)
  - savedAt: Timestamp
  - expiresAt: Timestamp (savedAt + 24h)
  - schemaVersion: number (현재 1)
  - deviceInfo: { userAgent: string }
```

## localStorage 키: `insuwiki_draft_{documentId}_{userId}`

## 이탈 팝업 3버튼
1. "저장 후 나가기" (Primary)
2. "임시저장 삭제 후 나가기" (Danger, 이중 확인)
3. "계속 편집" (Secondary)

## 로키 잔존 리스크
- Firestore 보안 규칙 미적용 시 타 사용자 임시저장본 접근 가능 → Phase 1 필수 적용
- content 1MB 초과 → draftContent 서브컬렉션 분리 트리거 준비
- BroadcastChannel 미지원 브라우저 → polyfill 또는 localStorage polling fallback
