# task-3009 — InsuWiki Firestore 백업 복구 (3개월간 성공 이력 0)

**레벨**: Lv.2 · **팀**: dev2-team (오딘) · **회장 승인 완료** (2026-08-25)
**저장소**: `Jeon-Jonghyuk/InsuWiki` (`/home/jay/workspace/projects/insuwiki`)

## 배경 — 지식 데이터에 복구 수단이 없다

**ANU 실측 (2026-08-25, GitHub Actions API 전수 조회)**
```
Firestore Backup 워크플로
  총 실행 98건 · 성공 0건 · 실패 98건
  최초 2026-05-18  →  최근 2026-08-23
  ★ 한 번도 성공한 적이 없다
실패 지점 : google-github-actions/auth@v2   (job=backup, conclusion=failure)
```

즉 **인슈위키 지식 데이터(임베딩 303건 · 유튜브 전사 · 크롤링 축적분 · `documents` 489건)에
백업이 존재하지 않는다.** Firestore가 소실되거나 잘못 삭제되면 복구 수단이 없다.

★ 2026-08-25 task-3001 머지로 유튜브 파이프라인이 `documents` 에 wiki 카드를 쓰기 시작했다.
**앞으로 쌓일 데이터도 마찬가지로 보호되지 않는다.**

★ ANU 1차 보고(2026-08-23)는 "3일 연속 실패"였다. **최근 3건만 보고 낸 과소보고**였고
전수 확인 결과 3개월·98회였다. **최근 N건만으로 결론 내지 마라.**

---

## 할 일

### ① 실패 원인 규명 (먼저)
`google-github-actions/auth@v2` 가 왜 실패하는지 **로그로 확정**하라. 추정하지 마라.
흔한 원인:
- Workload Identity Federation 설정 불일치(provider/service account 매핑)
- GitHub Secrets 미설정 또는 만료 (`GCP_*` 계열)
- 서비스 계정 권한 부족 (Datastore/Firestore export 권한)
- GCS 대상 버킷 부재/권한

★ **자격증명 값이 필요한 경우 직접 만들거나 추측하지 말고 ANU 에 보고하라.**
회장 계정 권한이 필요할 수 있다. 그 경우 **무엇이 왜 필요한지** 명확히 적어라.

### ② 복구
원인에 맞춰 고친다. 워크플로 파일 · Secrets 참조 · 권한 설정 중 **코드로 고칠 수 있는 부분**을 고친다.
★ **Secrets 값을 저장소에 커밋하지 마라.** 참조 이름만 둔다.

### ③ 실제 백업 1회 성공 실증 (핵심 완료 조건)
- 워크플로를 **실제로 실행**해 `conclusion=success` 를 만들어라
- **백업 산출물이 실제로 생성됐는지 확인**하라 (GCS 객체 존재·크기·타임스탬프)
- ★ "워크플로가 초록색이 됐다"만으로 완료 판정하지 마라. **산출물이 있어야 백업이다**

### ④ 복원 가능성 확인 (가능한 범위에서)
백업이 **복원 가능한 형식**인지 확인하라. 전체 복원을 실행할 필요는 없으나,
산출물 구조가 Firestore import 규격에 맞는지는 확인 가능하다. 불가하면 그 사실을 명시하라.

### ⑤ 다음 실패를 알 수 있게
백업이 또 실패하면 **아무도 모르는 상태로 돌아가지 않도록** 알림 경로를 확인하라.
- InsuRo 쪽은 task-3008 로 `alert_notify` 배선이 끝났다
  (`/home/jay/insuro-releases/shared/insuro-alerts.env`, 키 파일 경로만 담는 방식)
- InsuWiki 는 GitHub Actions 이므로 **워크플로 실패 알림**이 별도로 필요하다.
  가능한 수단(Actions 실패 알림 설정 등)을 조사해 **제안하고 ANU 판단을 받아라.**
  ★ 이 태스크에서 알림 구현까지 하라는 뜻이 아니다. **경로를 확인하고 제안**하라.

---

## 범위 · 금지
**수정 허용**: `.github/workflows/**`(백업 워크플로) · 백업 관련 스크립트 · `memory/reports/task-3009.md`

**금지**:
- **Secrets/자격증명 값을 저장소에 커밋** (참조 이름·경로만)
- `scripts/youtube-pipeline/**` — task-3001 결과물, 방금 머지됨
- `nextapp/**` · `functions/**` 기능 코드
- **프로덕션 Firestore 데이터 삭제·변경** — 백업은 읽기 작업이다. 쓰기 금지
- 다른 워크플로(`PR Check` 등) 수정 — 선재 실패 상태이나 이 태스크 범위 밖

## allowed_resources

```yaml
allowed_resources:
  paths:
    - ".github/workflows/**"
    - "scripts/backup/**"
    - "docs/**"
    - "memory/reports/task-3009.md"
  forbidden_paths:
    - "scripts/youtube-pipeline/**"
    - "nextapp/**"
    - "functions/**"
    - "firestore.rules"
  commands:
    - "gh"
    - "gcloud"
    - "python3"
    - "bash"
  merge_policy: "tiered"
  ttl_hours: 72
```

## 검증
1. **실패 원인 확정** — 로그 인용으로 제시. 추정과 확인을 구분해 적어라
2. **실제 실행 성공** — `conclusion=success` 인 run id 제시
3. **산출물 존재 확인** — 백업 파일/객체의 경로·크기·시각
4. **원인 재발 방지** — 같은 원인으로 다시 실패하지 않음을 어떻게 보장하는지 설명
5. 기존 워크플로 무영향 — 다른 워크플로 상태가 이 변경으로 나빠지지 않았는지 확인

## 운영 계약
- 저장소 `/home/jay/workspace/projects/insuwiki`, **기본 브랜치는 `master`**(main 아님)
- `origin/master`(=`4911a99`) 기준 `git pull --ff-only` 후 시작
- ★ `gh` 호출 시 `GH_TOKEN="$BOT_GITHUB_TOKEN"` 주입 필수 (회장 개인 PAT 금지 — 감사기록 오염)
- 워크플로우 `/home/jay/workspace/prompts/DIRECT-WORKFLOW.md` · QC `/home/jay/workspace/teams/shared/QC-RULES.md`
- `WORKSPACE_ROOT=/home/jay/workspace` · `CHAT_ID=6937032012` · 수집자 key `ANU_KEY=c119085addb0f8b7`
- 완료 경로는 `finish-task.sh` 실행이 유일하다. 수동 `.done` 금지.
- **명세와 실측이 다르면 임의 판단하지 말고 ANU 에 보고하라.**

## 완료 조건
실패 원인 로그로 확정 · **백업 1회 실제 성공 + 산출물 존재 확인** · 재발 방지 설명 ·
실패 알림 경로 제안 · Secrets 미커밋

## 보고
**★★★ PR 생성까지가 범위다. 머지는 ANU 가 한다. 절대 직접 머지하지 마라.**
★ CI 워처가 `MERGE_READY` 를 내더라도 **자동 머지하지 마라.** 2026-08-25 task-3008 에서
워처 경로 자동 머지가 발생했고 현재 그 통제를 복구하는 중이다(별도 태스크).
`memory/reports/task-3009.md` 작성 후 표준 완료 콜백 등록. 콜백 프롬프트 **UTF-8 3900 bytes 이하**.
★ 봉투 첫 줄에 **"백업 실제 성공 여부 + 산출물 확인 여부"** 를 담아라.