**task-1018.1 완료 보고** (dev1-team) **완료 보고서: One Source Multi Use — 카드뉴스 렌더링 중복 제거** (13분 33초) **핵심 결과** CrossPublisher에서 사전 렌더링 후 `image_paths` 파라미터로 양 publisher에 전달하는 "One Source Multi Use" 패턴을 구현. 렌더링 1회로 감소하여 이미지 생성량 50% 절감. 기존 단독 사용 호환 100% 유지. pytest 70건 전체 통과, pyright 에러 0건. ## 수정 파일 목록 - `/home/jay/projects/ThreadAuto/publisher/cross_publisher.py` — 렌더링 로직 상위 이동 (1회 렌더링 + 양 publisher에 image_paths 전달) - `/home/jay/projects/ThreadAuto/publisher/threads_publisher.py` — `image_paths: list[str] | None = None` 파라미터 추가, 조건부 렌더링 스킵 - `/home/jay/projects/ThreadAuto/publisher/instagram_publisher.py` — 동일하게 파라미터 추가, 조건부 렌더링 스킵 - `/home/jay/projects/ThreadAuto/tests/test_cross_publisher.py` — 신규 테스트 4건 추가 + 기존 테스트 2건 보정 - `/home/jay/projects/ThreadAuto/tests/test_publisher.py` — 신규 테스트 2건 추가 (TestPublishCardnewsV2 클래스) - `/home/jay/projects/ThreadAuto/tests/test_instagram_publisher.py` — 신규 테스트 테스트: pyright 0 errors **발견/해결 이슈 3건** 1. **기존 test_cross_publisher.py pyright 에러 80건** — `dict` 타입 추론 문제. `_CARDNEWS_KWARGS`와 kwargs 변수에 `dict[str, Any]` 타입 명시로 해결. 2. **기존 파라미터 전달 테스트(#6, #7) 실패** — CrossPublisher가 이제 `image_paths`도 전달하므로 `assert_called_once_with`가 정확히 매칭되지 않음. `image_paths=ANY` 추가로 해결. 3. **content=None 경로에서 렌더링 fallback** — CrossPublisher의 auto_generate=False + content=None 케이스에서 `render_all`이 호출되는데, mock의 return_value가 설정되지 않아 테스트 실패. `_RENDERED_PATHS` 상수로 일관된 mock 반환값 설정.