# task-1018.1: One Source Multi Use — 카드뉴스 렌더링 중복 제거

## 목표
Threads와 Instagram에 동일 카드뉴스를 발행할 때, 이미지를 **1번만 렌더링**하고 양 플랫폼에서 동일 파일을 사용하도록 변경한다.

## 문제 현황
현재 `CrossPublisher.publish_cardnews()`가 Threads와 Instagram publisher를 순차 호출하는데, **각 publisher가 내부에서 독립적으로 `CardNewsRenderer()`를 생성하고 `render_from_slides()`를 호출**한다.

- `/home/jay/projects/ThreadAuto/publisher/threads_publisher.py` → line 150-164: `CardNewsRenderer()` 생성 + `render_from_slides()` 호출
- `/home/jay/projects/ThreadAuto/publisher/instagram_publisher.py` → line 104-114: 동일하게 `CardNewsRenderer()` 생성 + `render_from_slides()` 호출
- `/home/jay/projects/ThreadAuto/publisher/cross_publisher.py` → line 85-115: 양쪽을 순차 호출 (같은 content를 넘기지만 각자 렌더링)

**결과**: 같은 콘텐츠를 2번 렌더링 → 이미지 2세트 생성 → 토큰/시간/디스크 낭비

## 수정 방향: One Source Multi Use

### 핵심 원칙
1. **렌더링은 1번만** — CrossPublisher 레벨에서 먼저 렌더링
2. **publisher는 업로드만** — 이미 렌더링된 image_paths를 받아서 업로드만 수행
3. **기존 단독 사용 호환** — ThreadsPublisher/InstagramPublisher를 단독으로 쓸 때는 기존처럼 내부 렌더링도 동작해야 함

### 구현 방안

#### 1. CrossPublisher 수정 (`cross_publisher.py`)
```python
# 렌더링을 CrossPublisher에서 1번만 수행
renderer = CardNewsRenderer()
image_paths = renderer.render_from_slides(content["slides"], theme=theme)

# 양 publisher에 렌더링된 이미지 전달
threads_result = self._threads_publisher.publish_cardnews(
    ..., image_paths=image_paths  # 새 파라미터
)
ig_result = self._instagram_publisher.publish_cardnews(
    ..., image_paths=image_paths  # 동일 이미지 사용
)
```

#### 2. ThreadsPublisher/InstagramPublisher 수정
- `publish_cardnews()`에 `image_paths: list[str] | None = None` 파라미터 추가
- `image_paths`가 전달되면 렌더링 스킵, 바로 업로드
- `image_paths`가 None이면 기존처럼 내부 렌더링 (단독 사용 호환)

#### 3. run_card_post.py / orchestrator 확인
- `run_card_post.py`가 CrossPublisher를 쓰는지 직접 publisher를 쓰는지 확인
- 직접 publisher를 쓴다면 동일 원칙 적용

### 문서화
- `CLAUDE.md` 또는 프로젝트 내 적절한 위치에 "One Source Multi Use" 원칙 문서화
- 향후 새 플랫폼 추가 시에도 동일 이미지 재사용 원칙 명시

## 수정 대상 파일
- `/home/jay/projects/ThreadAuto/publisher/cross_publisher.py` — 렌더링 로직 상위 이동
- `/home/jay/projects/ThreadAuto/publisher/threads_publisher.py` — image_paths 파라미터 추가, 렌더링 조건부 스킵
- `/home/jay/projects/ThreadAuto/publisher/instagram_publisher.py` — 동일
- `/home/jay/projects/ThreadAuto/run_card_post.py` — 확인 후 필요 시 수정

## 주의사항
- ThreadsPublisher/InstagramPublisher 단독 사용 시 기존 동작 유지 (하위 호환)
- 이미지 경로를 공유하므로 한쪽이 파일을 삭제하지 않도록 주의
- 테스트: CrossPublisher 호출 시 output/ 디렉토리에 이미지가 1세트만 생성되는지 확인

## 한정승인 범위
- 전체 팀장 자율 진행
