# task-700.1: Threads 업로드 자동 재시도 로직 추가

## 목표
`ThreadsPublisher.publish_cardnews()`에 업로드 실패 시 자동 재시도 로직을 추가한다.

## 배경
Threads API가 간헐적으로 `error_subcode: 2207052` (미디어 URI 다운로드 실패)를 반환함.
인프라(이미지 서버, Tailscale Funnel)는 정상이며, 재시도하면 성공함.

## 수정 대상
- `/home/jay/projects/ThreadAuto/publisher/threads_publisher.py`
  - `publish_cardnews()` 메서드
  - 또는 내부적으로 호출하는 carousel 업로드 로직

## 구현 사항
1. 업로드 실패(400/5xx 에러) 시 **최대 3회 재시도**
2. 재시도 간격: **30초** (Threads API 미디어 처리 대기)
3. 재시도 시 로그 출력: `[RETRY] 업로드 재시도 {n}/3 (30초 후)...`
4. 3회 모두 실패 시 기존처럼 에러 반환
5. 성공 시 즉시 반환 (남은 재시도 스킵)

## 구현 패턴 (예시)
```python
import time

MAX_RETRIES = 3
RETRY_DELAY = 30  # seconds

for attempt in range(1, MAX_RETRIES + 1):
    try:
        result = _do_upload(...)
        if result.get('success'):
            return result
    except Exception as e:
        if attempt < MAX_RETRIES:
            print(f"[RETRY] 업로드 재시도 {attempt}/{MAX_RETRIES} (30초 후)...")
            time.sleep(RETRY_DELAY)
        else:
            raise
```

## 제약사항
- 렌더러(cardnews.py) 건드리지 말 것
- 프롬프트(prompts_v2.py) 건드리지 말 것
- 기존 publish_cardnews 인터페이스(인자, 반환값) 변경 금지