# Task: V2 렌더러 개선 Phase A (task-286.1)

## 프로젝트 경로
`/home/jay/projects/ThreadAuto/`

## 배경
에이전트 미팅(비너스/아테나/이리스/미미르)에서 V2 렌더러를 vibe.tip 벤치마크와 비교 평가한 결과,
렌더러 수준에서 5개 개선 항목이 도출됨. 이 작업은 **렌더러 코드만 수정** (콘텐츠 생성기는 Phase B에서 별도 처리).

## 수정 대상 파일
- `renderer/cardnews.py` — 주요 수정
- `renderer/themes.py` — A-2, A-5

## 개선 항목 (5건)

### A-1: render_body() 제목 중복 제거 [P1]
**파일**: `cardnews.py` 937~1030줄
**문제**: 슬라이드 상단 title(줄977~980)과 카드 내부 item_title(줄1003~1013)이 동일한 텍스트를 2번 표시
**수정**: 슬라이드 상단에는 title을 표시하고, 카드 내부에는 title을 생략하거나 "요점 {index}" 같은 짧은 레이블로 대체.
description만 카드 안에 표시.

### A-2: GreenWhite card_bg 투명도 보정 [P1]
**파일**: `themes.py` 111줄
**문제**: `card_bg="#FFFFFF"` — 완전 불투명. 글래스모피즘 효과 없음.
다른 테마는 `#FFFFFF28`, `#FFFFFF22`, `#FFFFFF25`, `#FFFFFFCC` 등 반투명 사용 중.
**수정**: `card_bg="#FFFFFFCC"` (불투명도 80%)로 변경. 밝은 배경이므로 CC(80%) 정도면 적절.
참고: OrangeCream도 같은 값(`#FFFFFFCC`) 사용 중이므로 일관성 유지됨.

### A-3: 카드 높이 동적 조정 [P0 — 최우선]
**파일**: `cardnews.py` render_body() 983~990줄
**문제**: 카드 높이 = `HEIGHT - card_top - margin - watermark_space` ≈ 1050px인데, 실제 콘텐츠(title 1~2줄 + description 3~4줄)는 150px 정도만 차지 → 85% 빈 공간.
**수정**:
1. description 텍스트를 먼저 wrap하여 실제 필요 높이를 계산
2. `card_h = 실제_콘텐츠_높이 + 패딩(상하 각 24px)` 로 동적 계산
3. min_h=200, max_h는 기존대로 유지 (슬라이드 높이 초과 방지)
4. 카드를 슬라이드 수직 중앙에 배치 (위 아래 균등 여백)
5. render_card_list()의 card_h 계산 로직(줄589~592)을 참고할 것

### A-4: 커버 하단 시각 요소 추가 [P1]
**파일**: `cardnews.py` render_cover() 458~526줄
**문제**: 부제(subtitle) 아래부터 워터마크까지 넓은 빈 공간.
**수정**: 부제 아래에 다음 중 1~2개 추가:
1. **구분선**: theme.accent 색상으로 가로선 (120px 너비, 3px 높이) — 제목 영역과 하단 분리
2. **키워드 pill badges**: 관련 키워드를 pill badge 3~4개 가로 배치 (cover에 keywords 파라미터 추가)
   - render_cover()에 `keywords: list[str] = []` 파라미터 추가
   - keywords가 비어있으면 기존처럼 아무것도 표시 안 함
   - keywords가 있으면 부제 아래 32px 지점에 pill badge 가로 배치
   - `_draw_pill_badge()` 메서드 재활용
3. **브랜드 이름 강조**: 워터마크 위 120px 지점에 BRAND_NAME_SECONDARY를 accent 색으로 크게 표시 (폰트 28px bold)
- 3번은 반드시 포함. 1,2번은 선택.

### A-5: 다크 테마 출현 빈도 상향 [P2]
**파일**: `themes.py` get_random_theme() 함수 (192~194줄)
**문제**: 5개 테마 동일 확률(20%). Threads 피드에서 다크 테마가 시선 집중 효과 더 높음.
**수정**: 가중치 랜덤 적용.
- 다크 테마 (NavyGold, BlackRed, PurplePink): 각 25% = 75%
- 밝은 테마 (GreenWhite, OrangeCream): 각 12.5% = 25%
- `random.choices(THEMES, weights=[25, 25, 12.5, 25, 12.5], k=1)[0]` 사용

## 테스트 요구사항
1. 각 개선 항목별 렌더링 결과물 생성하여 `output/phaseA_test/` 에 저장
2. 모든 5개 테마 × render_body() 테스트 (총 5장)
3. render_cover() keywords 전후 비교 (2장)
4. 기존 render_card_list(), render_detail(), render_summary_cta()가 깨지지 않는지 확인
5. render_from_slides()가 정상 동작하는지 확인

## 주의사항
- render_all()도 A-1, A-3 반영 영향받으므로 같이 확인
- render_from_slides()의 cover 분기(줄1165~1171)에 keywords 전달 지원 추가
- 기존 테스트가 있다면 깨뜨리지 말 것
- A-3이 P0 최우선 — 이것만 해도 체감 품질 크게 향상