# Task 273.1 완료 보고서 — 카드뉴스 멀티슬라이드 렌더러 + Carousel API + 디자인 업그레이드

## 작업 요약
ThreadAuto 프로젝트에 **7장 멀티슬라이드 카드뉴스** 렌더러, **테마/컬러 시스템**, **Threads Carousel API** 연동, **Publisher 업데이트**를 구현하였다.

## 생성/수정 파일 목록

### 신규 생성
- `renderer/cardnews.py` — 멀티슬라이드 카드뉴스 렌더러 (CardNewsRenderer)
  - 1080x1080 정사각형 슬라이드
  - 그라데이션 배경, 소프트 쉐도우 카드, 넘버링 배지
  - 3가지 레이아웃 패턴 (A/B/C)
  - render_cover, render_body, render_cta, render_all
- `renderer/themes.py` — 테마/컬러 시스템
  - 5가지 테마: NavyGold, BlackRed, GreenWhite, PurplePink, OrangeCream
  - LayoutPattern Enum (PATTERN_A/B/C)
  - 테마 선택 함수 (get_theme, get_random_theme, get_next_theme)
  - BrandingBar 데이터 클래스
- `tests/test_cardnews_renderer.py` — 렌더러 단위 테스트 (23개)
- `tests/test_carousel_api.py` — Carousel API mock 테스트 (8개)

### 수정
- `api/client.py` — 버그 수정 3건 + post_carousel() 추가
  - `_create_container`: json=payload → data=payload (form data)
  - `_publish`: json=payload → data=payload (form data)
  - `_request`: timeout 60초 설정
  - `post_carousel()`: 캐러셀 발행 메서드 신규
- `api/models.py` — MediaType.CAROUSEL 추가
- `publisher/threads_publisher.py` — publish_cardnews() 추가 + image_base_url 기본값 변경
  - 기본값: `https://aidevserver.tail2cdab6.ts.net/images`
- `renderer/__init__.py` — CardNewsRenderer, themes 모듈 export 추가

## 테스트 결과
- 신규 테스트: **31개 전부 통과** (test_cardnews_renderer 23개 + test_carousel_api 8개)
- 기존 테스트: **모두 통과** (기존 396개 + 신규 31개 = 전체 427개 통과)
- 하위호환: 기존 TypeA~E 템플릿, API 클라이언트, Publisher 모두 정상 동작

## 버그 유무
- 기존 버그 수정 완료: api/client.py의 form data 전송 및 timeout 문제
- 신규 버그: 발견되지 않음

## QC 자동 검증 결과
```json
{
  "task_id": "task-273.1",
  "overall": "PASS",
  "checks": {
    "api_health": "SKIP (서버 작업 아님)",
    "file_check": "PASS (8/8 파일 확인)",
    "data_integrity": "PASS",
    "test_runner": "PASS (427 passed)",
    "schema_contract": "SKIP (workers 변경 없음)"
  }
}
```

## 비고
- 슬라이드 수는 가변 처리됨 (items 수에 따라 최소 2장 ~ 최대 10장)
- 파일명 형식: `cardnews_{YYYYMMDD_HHMMSS}_{index:02d}.png`
- 출력 디렉토리: `/home/jay/projects/ThreadAuto/output/`
- Carousel API는 Threads Graph API v1.0 기반
