# task-278.1 완료 보고서
## ThreadAuto Phase 3: 스케줄러 + 전체 통합

**작업일**: 2026-03-06
**팀**: dev1-team (헤르메스, 불칸, 이리스, 아르고스)
**상태**: 완료

---

## 작업 내용

ThreadAuto 프로젝트에 골든타임 스케줄러, 전체 파이프라인 통합, 발행 워커를 구현하여 하루 10건 자동 발행 시스템을 완성했다.

### 구현 항목

1. **골든타임 스케줄러** (`scheduler/auto_publisher.py`)
   - 골든타임 70% (7개): 출근 7~9시(3개), 점심 12~1시(2개), 저녁 7~10시(2개)
   - 비골든타임 30% (3개): 10~11시, 14~18시 랜덤 배치
   - ±5~15분 랜덤 지터 적용 (스팸 감지 방지)
   - 최소 10분 간격 보장 (충돌 시 뒤로 밀기)
   - daily_schedule.json 자동 생성

2. **전체 파이프라인 통합** (`scheduler/daily_runner.py`)
   - RSS/YouTube 크롤링 → 캐시 갱신
   - 소재 10개 선택 (topic_selector)
   - LLM 콘텐츠 생성 (ContentGeneratorV2 + Claude CLI)
   - 금감원 컴플라이언스 필터 (3단계)
   - 에버그린 fallback 자동 보충
   - 카드뉴스 이미지 렌더링 (랜덤 테마)
   - daily_queue JSON 저장 (스케줄 슬롯별 매핑)

3. **발행 워커** (`scheduler/publish_worker.py`)
   - cron 단일실행/데몬 모드 지원
   - 현재시각 기준 pending 포스트 자동 발행
   - Carousel/단일이미지/텍스트 자동 분기
   - 실패 시 3회 재시도 → failed 마킹
   - publish_log.json 로그 기록 (append 방식)
   - 일 3건 이상 실패 시 알림
   - Rate limit 80% 도달 시 알림

4. **실행 스크립트**
   - `scripts/run_daily.sh`: 새벽 5시 데일리 러너 (스케줄 생성 + 파이프라인)
   - `scripts/run_publisher.sh`: 발행 워커 (단일실행/데몬 모드)

---

## 생성/수정 파일 목록

### 신규 생성
- `scheduler/auto_publisher.py` (9,107 bytes) — 골든타임 스케줄러
- `scheduler/daily_runner.py` (21,582 bytes) — 전체 파이프라인 통합
- `scheduler/publish_worker.py` (20,177 bytes) — 발행 워커
- `scripts/run_daily.sh` (1,192 bytes) — 데일리 실행 스크립트
- `scripts/run_publisher.sh` (1,061 bytes) — 발행 워커 실행 스크립트
- `tests/test_auto_publisher.py` — 스케줄 생성 테스트 (55개)
- `tests/test_daily_runner.py` — 파이프라인 통합 테스트 (52개)
- `tests/test_publish_worker.py` — 발행 워커 테스트 (49개)
- `logs/` 디렉토리 생성

### 수정
- `scheduler/__init__.py` — Phase 3 모듈 12개 심볼 export 추가
- `.gitignore` — `logs/` 디렉토리 추가

---

## 테스트 결과

- **전체 테스트**: 838개 통과 / 0개 실패 / 37개 경고(Starlette deprecation)
- **Phase 3 신규 테스트**: 156개 통과
  - test_auto_publisher.py: 55개 (스케줄 생성, 지터, 간격, 왕복)
  - test_daily_runner.py: 52개 (파이프라인 각 단계 mock 통합)
  - test_publish_worker.py: 49개 (발행, 재시도, 알림, 비동기)
- **기존 테스트 회귀**: 없음 (682개 모두 통과)

---

## 버그 유무

발견된 버그 없음.

---

## QC 자동 검증 결과

```json
{
  "task_id": "task-278.1",
  "overall": "PASS",
  "checks": {
    "api_health": "SKIP (서버 작업 아님)",
    "file_check": "PASS (7/7)",
    "data_integrity": "PASS",
    "test_runner": "PASS (838 passed)",
    "schema_contract": "SKIP (workers 변경 없음)"
  }
}
```

---

## 비고

- cokacdir 스케줄 등록은 별도 운영 작업으로 진행 필요
  - daily_runner: `0 5 * * *` (매일 새벽 5시)
  - publish_worker: `* * * * *` (매분) 또는 데몬 모드
- 이미지 서빙은 기존 Tailscale Funnel (`https://aidevserver.tail2cdab6.ts.net/images/`) 활용
- Phase 1/2의 V2 파이프라인(content_generator_v2 + CardNewsRenderer)을 스케줄러와 통합 완료
- 기존 레거시 파이프라인(CronRunner + PipelineOrchestrator)과 독립적으로 동작
