# Task: ThreadAuto 콘텐츠 자동생성 — Phase 3: 스케줄러 + 전체 통합

## Task ID: task-274.3
## 프로젝트 경로: /home/jay/projects/ThreadAuto/

## 선행 Phase 산출물
- Phase 1: 소재 시스템 (에버그린풀, RSS, 유튜브, 선택엔진)
- Phase 2: LLM 생성 엔진 (content_generator_v2, compliance_filter, pipeline)
- 기존: 카드뉴스 렌더러 (renderer/cardnews.py, themes.py), Carousel API (api/client.py)

## 목표
전체 파이프라인을 통합하고, **골든타임 스케줄러**로 하루 10개 자동 발행을 완성한다.

## 작업 범위

### 1. 자동 발행 스케줄러
- 파일: `scheduler/auto_publisher.py`
- **옵션 3**: 골든타임 70% + 나머지 30% 랜덤
- 골든타임 정의:
  - 오전 7~9시: 3개 (출근 시간)
  - 점심 12~1시: 2개
  - 저녁 7~10시: 2개 (퇴근 후)
  - 소계: 7개 (70%)
- 비골든타임: 오전 10~11시, 오후 2~6시 중 랜덤 3개 (30%)
- 각 발행 간 최소 10분 간격
- 발행 시각에 ±5~15분 랜덤 지터 추가 (스팸 감지 방지)
- 매일 자정(00:05)에 다음 날 시간표 자동 생성: `scheduler/daily_schedule.json`

### 2. 전체 파이프라인 통합
- 파일: `scheduler/daily_runner.py`
- 매일 새벽 5시 자동 실행 흐름:
  1. RSS 크롤링 → 뉴스 캐시 갱신
  2. 유튜브 크롤링 → 최신 영상 자막 수집
  3. 소재 10개 선택 (topic_selector)
  4. LLM 콘텐츠 10개 생성 (content_generator_v2 + Claude CLI)
  5. 금감원 필터 통과/폐기 (compliance_filter)
  6. 부족분 → 에버그린 fallback으로 보충
  7. 카드뉴스 이미지 렌더링 (cardnews.py, 랜덤 테마)
  8. daily_queue에 저장 (텍스트 + 이미지 경로 + 발행 시간)
- CLI 실행: `python3 -m scheduler.daily_runner` 으로 독립 실행 가능

### 3. 발행 워커
- 파일: `scheduler/publish_worker.py`
- 상시 실행 (데몬 또는 cron 1분마다)
- daily_queue에서 현재 시각에 해당하는 포스트 확인
- 발행 시간이 되면:
  1. 이미지들을 이미지 서버에서 접근 가능 확인
  2. Carousel API로 발행 (publisher/threads_publisher.py의 publish_cardnews 사용)
  3. 발행 성공 시 큐에서 "published" 마킹
  4. 실패 시 3회 재시도 → 실패 기록
- 이미지 서빙: `https://aidevserver.tail2cdab6.ts.net/images/` (Tailscale Funnel)

### 4. cokacdir 스케줄 등록
- daily_runner를 매일 새벽 5시에 실행하는 cron 등록
- publish_worker를 매분 실행하는 cron 등록 (또는 상시 데몬)
- 실행 방식: cokacdir --cron 또는 시스템 crontab
  - 스크립트: `scripts/run_daily.sh` (source .env.keys + unset CLAUDECODE + python3 daily_runner)
  - 스크립트: `scripts/run_publisher.sh` (상시 루프 or cron)

### 5. 모니터링/알림
- 발행 성공/실패 카운트를 `scheduler/publish_log.json`에 기록
- 일 3건 이상 실패 시 → 텔레그램 알림 (cokacdir --sendfile 또는 직접 메시지)
- Rate limit 80% 도달 시 알림

### 6. 통합 테스트
- `tests/test_auto_publisher.py` — 스케줄 생성 테스트 (시간 분배, 지터, 최소간격)
- `tests/test_daily_runner.py` — 전체 파이프라인 mock 통합 테스트
- `tests/test_publish_worker.py` — 발행 워커 테스트 (mock API)
- 기존 테스트 전체 통과 확인

## 기술 참고
- ThreadAuto 서버: port 8200, Tailscale Funnel HTTPS
- 이미지 서빙: `/images/{filename}` → output/ 디렉토리
- 토큰: `.tokens/token.json` (60일 유효, 자동 갱신)
- Claude CLI: `unset CLAUDECODE` 필수
- 기존 스케줄러: `scheduler/cron_runner.py`, `scheduler/token_refresher.py`

## 산출물
- `scheduler/auto_publisher.py` — 골든타임 스케줄러
- `scheduler/daily_runner.py` — 전체 파이프라인 통합
- `scheduler/publish_worker.py` — 발행 워커
- `scripts/run_daily.sh` — 데일리 실행 스크립트
- `scripts/run_publisher.sh` — 발행 워커 실행 스크립트
- 테스트 파일들
- 완료 시 `memory/events/task-274.3.done` 생성
- 보고서 `memory/reports/task-274.3.md` 작성