# task-3001 — 인슈위키 유튜브 → wiki 자동 게시 + 요약 규격화 + 전사 첨부 권한

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

## 회장 요구 (원문)
> 유튜브 전사 → 요약 → 인슈위키 `wiki-my-daily` 메뉴 중 **wiki** 에 자동으로 업로드
> (**카드 내용에는 요약, 첨부파일은 전사**)

---

## ★ ANU 실측 — 왜 지금 안 되는가 (추측 아님, 전부 확인함)

```
현재 파이프라인이 쓰는 컬렉션 (firestore_writer.py):
  youtube_knowledge   ← 유튜브 지식
  insurance_chunks    ← 임베딩 청크
  youtube_channels    ← 채널 관리

그런데 youtube_knowledge 를 읽는 앱 코드 = 0건
  (docs/specs/firestore.rules/firestore.indexes.json 에만 등장. nextapp 소비 없음)

wiki 화면이 읽는 것:
  컬렉션 = documents
  구분   = docType: 'wiki' | 'daily'      ← where('docType','==','wiki')
  프론트 = nextapp/src
```

**즉 파이프라인 결과물이 wiki 메뉴에 나타날 경로 자체가 없다.**
`youtube_knowledge` 는 사실상 아무도 안 읽는 저장소다. 이것이 이 태스크의 핵심 작업이다.

★ 위 3줄은 ANU 가 `git grep` 으로 직접 확인한 사실이다. 그러나 **네가 다시 확인하라.**
실측과 다르면 임의 판단하지 말고 **ANU 에 보고**하라.

---

## 고칠 것

### ① wiki 카드 자동 생성 (핵심)
파이프라인이 `documents` 컬렉션에 **`docType: 'wiki'`** 문서를 생성하도록 배선한다.

```
content(카드 내용) = 요약   ← ②의 규격
첨부              = 전사 원문  ← ③의 권한
title             = 영상 제목 기반
category / authorId / createdAt = nextapp 이 실제로 요구하는 값에 맞춘다
```

★ **`nextapp/src` 의 wiki 목록·상세 화면이 실제로 읽는 필드를 먼저 확인**하고 그것에 맞춰라.
스키마를 추측해서 만들지 마라. 필드가 하나라도 어긋나면 카드가 목록에 안 뜨거나 빈 카드가 된다.

★ `youtube_knowledge` 쓰기는 **제거하지 마라.** 임베딩·검색 경로(`insurance_chunks`)가 물려 있다.
wiki 게시를 **추가**하는 것이지 이동이 아니다.

★ **중복 게시 방지**: 같은 영상이 재처리될 때 카드가 여러 개 생기면 안 된다.
영상 ID 기준 멱등 처리(있으면 갱신, 없으면 생성).

### ② 요약 = 「핵심 논지 재구성」 (규격 확정됨 · 재설계 금지)
현재 `YOUTUBE_SUMMARY_PROMPT` 의 실호출 결과가 **973자**로 "요약"에 그쳐 논지 재구성이 아니다.

```
분량: 1,500 ~ 2,000자
구조: 주제 한줄 → 핵심 주장 → 수치/조건/예외 → 실무 시사점
★ 숫자 · 보장한도 · 기간 · 면책사항 축약 금지
```

- `scripts/youtube-pipeline/youtube_pipeline/summarizer.py` 의 프롬프트를 위 규격으로 개정
- **분량 보증**: 결과가 1,500자 미만이면 재시도하거나 실패로 처리한다. 조용히 짧은 요약을 내보내지 마라
- **요약 가이드 문서**로 규격을 박제한다 (`docs/youtube-summary-guide.md`)
- 이 규격은 회장 확정 사항이다. **표현을 임의로 바꾸거나 분량을 조정하지 마라.**

### ③ 전사 첨부 = 인슈위키 로그인 사용자만
전사 원문 파일 접근을 **로그인 사용자로 제한**한다. **완전 공개 금지.**

- Drive 첨부가 계정경유 비공개면, 인슈위키가 인증된 사용자에게만 **프록시 또는 서명 URL** 을 제공하는 방식
- 기존 첨부 6건 모델과 정합을 맞춘다
- ★ `drive_uploader.py` 에 권한(permission) 설정 코드가 **현재 0건**이다. 업로드만 하고 공유 설정은 없다.
  실제 파일이 지금 어떤 권한 상태인지 **먼저 확인**하고, 공개 상태라면 그 사실을 보고하라

---

## 이 태스크가 하지 않는 것 (별도 분리)
- **Whisper large-v3 격상** — `services/whisper-gpu/server.py` 는 **workspace 리포(교차 repo)**라 분리한다.
  ★ ANU 가 적재 가능성은 이미 실측했다: `faster-whisper large-v3 int8` = VRAM **1,913 MiB**
  (GTX 1060 6GB 중 여유 4,231 MiB · 로드 11초 · 추론 정상). 하드웨어 제약 없음. 후속 태스크로 진행.
- 보험 용어 `initial_prompt` 주입 · 전사 후처리 교정 — 위와 같은 이유로 분리

---

## 검증 (전부 실측)
1. **변경 전 현재 동작 기록** — 파이프라인 1회 실행 결과가 어느 컬렉션에 무엇을 남기는지.
2. **wiki 카드 실제 노출** — 파이프라인 실행 후 **nextapp 의 wiki 메뉴를 실제로 열어**
   카드가 보이고, 내용이 요약이며, 전사 첨부가 열리는지 확인. **스크린샷 첨부.**
   ★ 픽스처가 아닌 **실제 렌더**임을 명시하라. Firestore 에 문서가 생긴 것만으로는 증명이 안 된다.
3. **요약 분량·구조 실측** — 실제 생성된 요약의 **글자 수**를 제시하고, 4단 구조가 지켜졌는지,
   원본 전사에 있던 **숫자·한도·기간·면책이 요약에 남아 있는지** 대조하라.
4. **중복 게시 방지** — 같은 영상을 **2회 처리**해 카드가 1개인지 확인.
5. **첨부 권한** — 비로그인 상태로 첨부 URL 에 접근해 **차단되는지** 확인. 로그인 시 열리는지 확인.
6. **기존 경로 무손상** — `youtube_knowledge` / `insurance_chunks` 쓰기가 그대로 동작하는지.
   벡터 검색(`find_nearest`)이 여전히 hits > 0 인지 확인 (task-2989 결과물 보호).
7. **봉인 증명** — 새 테스트를 **변이시켜** 실제로 FAIL 하는지 확인하고 복원하라.
   "N passed" 재현만으로는 이빨을 증명하지 못한다.
8. 기존 테스트 회귀 유지 (**base 재측정 기준선**. 명세 수치 아님).

## 범위 · 금지
**수정 허용**
- `scripts/youtube-pipeline/youtube_pipeline/**` (firestore_writer · summarizer · drive_uploader · main)
- `scripts/youtube-pipeline/tests/**`
- `docs/youtube-summary-guide.md` (신규)
- `firestore.rules` · `firestore.indexes.json` (wiki 카드 접근에 필요한 경우만)
- `nextapp/src/**` — **읽기 위주.** 수정이 꼭 필요하면 범위를 보고하고 최소로

**금지**
- `youtube_knowledge` · `insurance_chunks` 쓰기 경로 **제거·변경** (task-2989 결과물)
- 임베딩 차원·모델 변경 (768 고정)
- `services/whisper-gpu/**` (교차 repo · 별도 태스크)
- 요약 규격 임의 변경 (분량·구조·숫자 보존 원칙)
- 전사 파일 **완전 공개** 설정
- `functions/**` 전면 개편

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "scripts/youtube-pipeline/**"
    - "docs/youtube-summary-guide.md"
    - "firestore.rules"
    - "firestore.indexes.json"
    - "nextapp/src/**"
    - "memory/reports/task-3001.md"
  forbidden_paths:
    - "services/**"
    - "functions/lib/**"
    - "data/**"
    - ".github/**"
  commands:
    - "python3"
    - "npm run build"
    - "npx vitest run"
    - "pytest"
  merge_policy: "tiered"
  ttl_hours: 72
```

## 운영 계약
- 저장소 `/home/jay/workspace/projects/insuwiki`, `origin/master` 기준 `git pull --ff-only` 후 시작
  (★ 기본 브랜치가 `main` 이 아니라 **`master`** 다)
- ★ `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 에 보고하라.**

★ **InsuWiki CI 주의**: `PR Check` 워크플로가 2026-08-20 기준 **실패 상태**다.
네 변경 때문인지 **선재 실패인지 반드시 구분**해서 보고하라. "원래 실패였다"로 넘기지 말고
실패 원인을 확인해 보고에 적어라. (별개로 `Firestore Backup` 워크플로는 GCP 인증 문제로
3개월째 전건 실패 중이다. **이건 이 태스크 범위가 아니다.** 건드리지 마라.)

## 완료 조건
wiki 카드 자동 생성(실브라우저 확인) · 요약 1,500~2,000자 + 4단 구조 + 숫자/면책 보존 실측 ·
전사 첨부 로그인 한정 접근 실증 · 중복 게시 없음 · 기존 임베딩/검색 무손상 · 변이로 봉인 실증 · 회귀 유지

## 보고
**★★★ PR 생성까지가 범위다. 머지는 ANU 가 한다. 절대 직접 머지하지 마라.**
`memory/reports/task-3001.md` 작성 후 표준 완료 콜백 등록. 콜백 프롬프트 **UTF-8 3900 bytes 이하**.