# Task-289.1 완료 보고서: V2 콘텐츠 구조 변경 Phase B

## 작업 요약
V2 렌더러의 card_list/detail 슬라이드 타입을 활용하도록 콘텐츠 생성기와 파이프라인을 전환.
Phase A(렌더러 수준 개선, task-287.1)에 이어 콘텐츠 구조 + 파이프라인 연결을 변경함.

## 수정 파일 목록

### 1. `content/prompts_v2.py` (B-1, B-2, B-3)
- **B-1**: `_OUTPUT_FORMAT_BLOCK` — body 타입 → card_list/detail/cta 기반 JSON 스키마로 전면 교체. cover에 keywords 필드 추가.
- **B-2**: 슬라이드 구성 규칙 추가 — card_list items 2개 필수(최대 3개), detail items 2~3개, "1슬라이드 1항목" 금지 명시.
- **B-3**: `_USER_PROMPT_BASE` — 7장 고정 → 5~7장 유연 범위. `_SLIDE_GUIDES` 5개 카테고리 모두 card_list/detail 혼합 가이드로 업데이트.

### 2. `content/content_generator_v2.py` (B-4)
- `_validate_structure()` 전면 재작성: slides 5~7장 허용, cover 첫 번째/cta 마지막 위치 강제, card_list/detail/body 타입별 필드 검증, 하위 호환(body/기존 cta 형식) 유지.
- `generate()` 에러 메시지 업데이트.
- 모듈 독스트링 업데이트.

### 3. `publisher/threads_publisher.py` (B-5)
- `publish_cardnews()`: `content: dict | None = None` 파라미터 추가.
- content에 "slides" 키 있으면 `render_from_slides()` 호출, 없으면 기존 `render_all()` (하위 호환).
- 캡션도 content에서 폴백 지원.

### 4. `tests/test_content_generator_v2.py` (테스트 업데이트)
- V2 형식 테스트 데이터(VALID_SLIDES_V2) + 레거시 데이터(VALID_SLIDES_LEGACY) 분리.
- TestValidateStructure: 기존 테스트 12개 수정 + 신규 12개 추가.
- TestGenerate: V2 slide count(5장) 반영.

### 5. `tests/test_publisher.py` (테스트 추가)
- TestPublishCardnewsV2 클래스 추가 (5개 테스트): render_from_slides 분기, 레거시 render_all 분기, 캡션 폴백, 캡션 우선순위, 토큰 에러.

## 테스트 결과
- 대상 테스트 **89개 전부 PASS** (0.30s)
- 전체 프로젝트 테스트 371 passed, 1 failed
- **실패 테스트**: `test_evergreen_topics.py::test_used_count_initial_zero` — 기존 버그(본 작업과 무관)

## 수정하지 않은 파일 (참조만)
- `renderer/cardnews.py` — 수정 금지 (Phase A 완료)
- `renderer/themes.py` — 수정 금지

## 하위 호환성
- body 타입 슬라이드: validate에서 통과 (title/description 필수)
- 기존 cta 형식(text/contact): validate에서 통과
- publish_cardnews() content 미전달 시: 기존 render_all() 경로 유지

## 주의사항
- cover의 "hook" 필드는 render_from_slides()에서 "subtitle"로 매핑됨 (cardnews.py:1221 참고)
- 프롬프트에서 hook으로 출력 → render_from_slides가 subtitle로 자동 매핑하여 문제 없음

## 버그/이슈
- 본 작업 관련 버그: 없음
- 기존 버그: test_evergreen_topics.py 테스트 1건 (별도 추적 필요)

## 셀프 QC 결과
- [x] 1. 영향 파일 목록 확인
- [x] 2. 엣지 케이스 확인 (빈 slides, 경계값 4장/8장, 위치 검증)
- [x] 3. 작업 지시 일치 확인 (B-1~B-5 모두 반영)
- [x] 4. 에러 처리/보안 확인
- [x] 5. 테스트 전경로 커버 확인

## 자동 검증 (qc_verify.py) 결과
- api_health: SKIP (서버 작업 아님)
- file_check: PASS (수정 파일 3개 + .done + 보고서 5/5)
- data_integrity: WARN (타이머 running 상태 — 종료 시 해소)
- test_runner: 대상 89개 PASS (기존 test_evergreen_topics.py 1건 실패는 본 작업과 무관)
- schema_contract: SKIP (workers 변경 없음)

## 마아트 독립 검증 결과: PASS
- B-1~B-5 모든 검증 포인트 충족 (코드 레벨 대조 완료)
- 수정 금지 파일(renderer/cardnews.py, renderer/themes.py) 변경 없음 확인
- 하위 호환성 검증 통과 (body 타입, 기존 cta, content=None)
- 테스트 89개 전부 통과
- 사소한 미비: get_system_prompt()/get_user_prompt() 직접 호출하는 독립 테스트 미작성 (기능 결함은 아님)
