# task-275.1 완료 보고서
## ThreadAuto 콘텐츠 자동생성 — Phase 1: 소재 시스템

**팀**: dev1-team (헤르메스 팀장)
**작업일**: 2026-03-06
**상태**: 완료

---

## 작업 내용

하루 10개 카드뉴스 자동 발행을 위한 소재 수집 시스템 구축 완료.
3가지 소재 소스(에버그린 주제풀, RSS 크롤러, 유튜브 크롤러)를 통합한 파이프라인 구현.

### 구현 모듈

**1. 에버그린 주제풀 (200개)**
- 5개 카테고리별 주제 적재: 고민공감(40), 정보제공(60), 사회적증거(40), CTA(30), 업계동향(30)
- fact_db.md 팩트만 사용, 수치 임의 생성 없음
- used_count/last_used로 중복 방지 메커니즘 내장

**2. RSS 크롤러**
- 기존 rss_fetcher.py + keyword_filter.py를 통합
- 7개 RSS 피드 수집 → 3단계 키워드 필터링 → news_cache.json 저장
- 7일 초과 기사 자동 삭제, 중복 URL 제거

**3. 유튜브 크롤러**
- 보험저널(@insjournal) 채널 최신 영상 목록 조회 (yt-dlp)
- youtube_transcript_api로 자동생성 자막 추출
- 자막 실패 시 제목+설명 fallback
- youtube_cache.json에 중복 제거 후 저장

**4. 소재 선택 엔진**
- 하루 10개 소재 선택 (고민공감 3, 정보제공 3, 사회적증거 2, 업계동향 1, CTA 1)
- used_count 최소 우선 선택 + 7일 쿨다운
- 업계동향: RSS/유튜브 뉴스 우선 → 에버그린 fallback
- 선택 후 used_count/last_used 자동 갱신 및 파일 저장

---

## 생성/수정 파일 목록

| 파일 | 상태 | 크기 | 설명 |
|------|------|------|------|
| `content/evergreen_topics.json` | 신규 | 81KB | 200개 에버그린 주제풀 |
| `content/topic_selector.py` | 신규 | 7KB | 소재 선택 엔진 |
| `crawler/rss_crawler.py` | 신규 | 5KB | RSS 통합 크롤러 |
| `crawler/youtube_crawler.py` | 신규 | 9KB | 유튜브 자막 크롤러 |
| `crawler/__init__.py` | 수정 | docstring | 유튜브 자막 수집 추가 |
| `tests/test_evergreen_topics.py` | 신규 | 10KB | 주제풀 구조 검증 25개 |
| `tests/test_rss_crawler.py` | 신규 | 19KB | RSS 크롤러 테스트 25개 |
| `tests/test_youtube_crawler.py` | 신규 | 23KB | 유튜브 크롤러 테스트 38개 |
| `tests/test_topic_selector.py` | 신규 | 14KB | 소재 선택 테스트 30개 |

---

## 테스트 결과

- **신규 테스트**: 123개 PASSED
- **기존 테스트**: 427개 PASSED
- **전체**: 550개 PASSED, 0 FAILED
- 기존 테스트 깨짐 없음

---

## QC 자동 검증 결과

```json
{
  "task_id": "task-275.1",
  "overall": "PASS",
  "checks": {
    "api_health": "SKIP (서버 작업 아님)",
    "file_check": "PASS (모든 파일 존재 + 보고서 존재)",
    "data_integrity": "PASS (task-timers.json ↔ .done 파일 일치)",
    "test_runner": "PASS (550 passed in 8.09s)",
    "schema_contract": "SKIP (workers/ 없음)"
  }
}
```

---

## 버그 유무

없음

---

## 비고

- 의존성 추가 설치: `feedparser`, `yt-dlp`, `youtube-transcript-api`
- 유튜브 크롤러는 STT 비용 절감을 위해 youtube_transcript_api(자동생성 자막)를 기본으로 사용
- topic_selector.py의 load_topics()에 에러 핸들링 추가 (파일 없음/JSON 오류 시 빈 리스트 반환)
- 테스트는 네트워크 호출 없이 mock/fixture로 처리하여 CI 환경에서도 안정적 실행 가능
