# task: 카드뉴스 렌더러 버그 3건 수정 + Threads 업로드

## 버그 목록

### 버그 1: _01, _02 슬라이드 제목 누락 (card_list 타입)
- **파일**: `/home/jay/projects/ThreadAuto/renderer/cardnews.py`
- **위치**: `render_card_list()` 함수 내부, line 982 부근
- **원인**: `item.get("title", "")` 사용 → 파이프라인은 `"label"` 키를 보냄
- **수정**: `item.get("title", item.get("label", ""))` fallback 추가
- **참고**: `render_detail()` (line 1434)에는 이미 `item.get("label", item.get("title", ""))` fallback이 있음. card_list만 누락.

### 버그 2: _05 CTA 슬라이드 레이아웃 깨짐
- **파일**: `/home/jay/projects/ThreadAuto/renderer/cardnews.py`
- **위치**: `render_summary_cta()` 함수 내부, line 1748-1825 부근
- **현상**: 제목이 맨 위에 붙고, 가운데 거대한 빈 공간, CTA 텍스트가 하단에 몰림
- **원인**: `items=[]`일 때 요약 카드 높이가 80px만 할당 → 제목과 CTA 사이 거대한 공백
- **수정 방향**: 
  - items가 비어있으면 요약 카드 영역을 아예 제거하고, 제목과 CTA 텍스트를 화면 중앙에 균형있게 배치
  - 제목: 화면 중앙 약간 위 (전체 높이의 35~40% 지점)
  - CTA 텍스트: 제목 아래 적절한 간격 (60~80px)
  - 전체적으로 가시성 좋게, 여백 균등 배분
  - "요약" 슬라이드인 만큼, 깔끔하고 임팩트 있는 마무리 느낌

### 버그 3: 필드명 통일성 확인
- `render_card_list`, `render_detail`, `render_summary_cta` 등 모든 렌더 함수에서
- `item.get("title")` / `item.get("label")` 둘 다 fallback으로 처리하도록 통일
- 파이프라인 출력 구조: `{"label": "...", "description": "..."}` 또는 `{"label": "...", "value": "..."}`

## Threads 업로드
- 버그 수정 완료 후 카드뉴스 1건 생성하여 Threads에 업로드
- 토픽: 자유 선택 (보험/연금 도메인)
- 5단계 파이프라인 → 카드뉴스 렌더링 → Threads carousel 게시
- 업로드 모듈: `/home/jay/projects/ThreadAuto/uploader/threads_uploader.py`

## 테스트
- card_list 타입 슬라이드에서 제목(label)이 정상 렌더링되는지 확인
- cta 타입 슬라이드에서 items=[]일 때 레이아웃이 균형 잡히는지 확인
- detail 타입도 label/title fallback 정상 작동 확인
- 전체 카드뉴스 6장 렌더링 후 시각적 확인

## 주의사항
- 기존 어투 규칙 유지 (합니다/습니다 체, 제목 서술형 금지)
- `_contrast_text_color()` 함수 유지 (밝은 테마 대비 자동 전환)
- 렌더링 결과물을 output/ 디렉토리에 저장하여 확인 가능하게 할 것