# task-692.1 완료 보고서: ThreadAuto 카드뉴스 캐러셀 재업로드

## SCQA

**S**: task-691.1에서 카드뉴스 6장(커버+본문4장+CTA)을 생성하여 Threads에 업로드했으나, `post_image()`로 커버 1장만 단일 이미지로 게시되었다 (Post ID: 17995945022921625).

**C**: "Threads API가 캐러셀 미지원"이라고 범위 외 처리했으나, `api/client.py:73`에 `post_carousel()` 메서드가 이미 구현되어 있었다. 카드뉴스는 6장 캐러셀로 게시되어야 정상이다.

**Q**: 기존 6장 이미지를 재사용하여 `post_carousel()`로 캐러셀 업로드를 성공시킬 수 있는가?

**A**: 성공. ImageServer로 6장 공개 URL 생성 및 검증(6/6 통과), `ThreadsClient.post_carousel()`로 캐러셀 업로드 완료 (Post ID: 18075263858417259). 업로드 소요시간 약 104초 (컨테이너 6개 생성 + 캐러셀 컨테이너 + 30초 대기 + 발행).

## 작업 상세

### 1. 이미지 확인
- 6장 모두 존재 확인 (51KB~114KB)
- 경로: `/home/jay/projects/ThreadAuto/output/cardnews_20260318_164230_00~05.png`

### 2. 이미지 공개 URL 서빙
- `ImageServer.ensure_server()`: HTTP 서버(port 8080) + Tailscale Funnel 정상 동작 확인
- `get_public_urls()`: 6개 URL 생성
- `verify_urls()`: 6/6 전체 HEAD 200 응답 확인
- 기본 URL: `https://aidevserver.tail2cdab6.ts.net/images/`

### 3. 캐러셀 업로드
- 토큰: `get_valid_token()` 성공 (201자)
- API 호출 흐름 (로그 기준):
  - 16:53:27 — 프로필 조회 (user_id: 26715152761436412)
  - 16:53:33~16:54:28 — 개별 이미지 컨테이너 6개 생성 (5초 간격)
  - 16:54:37 — 캐러셀 컨테이너 생성
  - 16:55:10 — 발행 (30초 대기 후)
- **Post ID: 18075263858417259**

### 4. 캡션
```
AI 도구가 보험 영업의 판도를 바꾸고 있습니다. 상담 준비부터 SNS 마케팅, 행정 업무까지 자동화하여 고객 면담에 집중하세요.

서울대보험크루에서 제작한 AI프로그램이 자동으로 게시하였습니다.
```

### 5. 기존 단일 이미지 게시물
- Post ID: 17995945022921625 (task-691.1에서 생성)
- **삭제하지 않음** (제이회장님 확인 후 판단)

## 생성/수정 파일 목록
- `/home/jay/workspace/teams/dev2/task692_carousel_upload.py` (신규 — 캐러셀 업로드 실행 스크립트)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **task-691.1 post_carousel() 미사용 오판** — `api/client.py:73`에 `post_carousel()` 메서드가 존재했으나 "API 미지원"으로 잘못 판단. 코드 확인 후 정상 호출하여 해결.
2. **캡션 면책 문구 누락 가능성** — `post_carousel()`은 `_build_caption()`을 거치지 않으므로 `AUTO_POST_DISCLAIMER` 면책 문구가 자동 추가되지 않음. 스크립트 캡션에 면책 문구를 직접 포함하여 해결.
3. **URL 검증 단계 추가** — Threads API는 외부 접근 불가 URL 전달 시 400 에러 반환. `verify_urls()`로 사전 검증(HEAD 200 + Content-Type image/*) 단계를 추가하여 불필요한 API 호출 방지.

## QC 자동 검증 결과

```
overall: WARN (4 PASS, 5 SKIP, 1 WARN)
- file_check: PASS (4899 bytes)
- data_integrity: PASS
- test_runner: SKIP (관련 테스트 파일 0개 - 정당한 SKIP)
- tdd_check: SKIP (Lv.1 일회성 실행 스크립트, TDD 대상 아님)
- pyright_check: WARN (3건 — ThreadAuto 모듈 import resolve 불가, sys.path.insert 런타임 해결)
- style_check: PASS (black + isort OK)
```

### pyright WARN 3건 사유
모두 ThreadAuto 프로젝트 모듈(`publisher.image_server`, `auth.token_store`, `api.client`). 스크립트가 `sys.path.insert(0, "/home/jay/projects/ThreadAuto")`로 런타임 해결하므로 실행에 문제 없음. pyright가 외부 프로젝트 경로를 인식하지 못하는 구조적 한계.
