# task-1429.1 완료 보��서: ThreadAuto 내부 모듈화

**팀**: dev4-team (비슈누)
**일시**: 2026-04-04

---

## SCQA

**S**: ThreadAuto 프로젝트의 47개 Python 파일에 `/home/jay/projects/ThreadAuto/` 절대 경로가 100+ 위치에 하드코딩되어 있어, 프로젝트 경로 변경 시 전수 수정이 필요한 상태였다.

**C**: 하드코딩이 config.py, renderer, video, audio, pipeline, publisher, content, scripts, tests 등 전 모듈에 분산되어 "하나 바꾸면 전부 바뀌는가?" 기준을 충족하지 못했다. 경로 유형: BASE_DIR(30+곳), FFMPEG/FFPROBE(12곳), FONT(6곳), OUTPUT_DIR(15+곳).

**Q**: config.py를 단일 소스로 하여 모든 하드코딩을 중앙 참조로 전환할 수 있는가?

**A**: config.py에 BASE_DIR, OUTPUT_DIR, VIDEO_OUTPUT_DIR, FFMPEG_BIN, FFPROBE_BIN, FONT_BOLD, FONT_REGULAR, FACT_DB_PATH 등 9개 설정 상수를 추가하고, 47개 파일에서 config 참조로 전환 완료. pytest 1776 passed (37 pre-existing failures, 회귀 0건). 톱레벨 `grep -rn "/home/jay" *.py` 검증 시 config.py만 해당.

---

## 수정 내역

### config.py 신규 상수 (9개)
- `BASE_DIR`, `OUTPUT_DIR`, `VIDEO_OUTPUT_DIR`, `STATIC_DIR` (Path 기반)
- `FFMPEG_BIN`, `FFPROBE_BIN` (환경변수 fallback)
- `FONT_BOLD`, `FONT_REGULAR` (환경변수 fallback)
- `FACT_DB_PATH` (Path 기반)

### 수정 파일 목록 (47개)

**핵심 프로덕션 모듈 (16개)**:
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/config.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/content/compliance_filter.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/content/fact_guard.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/publisher/image_server.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/renderer/cardnews.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/renderer/shortform_renderer.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/audio/edge_tts_dialogue.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/pipeline/video_composer.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/video/config.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/video/animations.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/video/evan_dynamic.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/video/tts_sync.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/video/pipeline_orchestrator.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/cli.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/scripts/text_posting.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/scripts/prepare_logo.py`

**실행 스크립트 (8개)**:
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/run_full_pipeline.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/run_text_post.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/run_cardnews_pipeline.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/run_card_post.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/run_pipeline_report.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/run_task706_2.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/generate_benchmark.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/scripts/run_video_pipeline.py`

**톱레벨 테스트 (7개)**:
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/test_font_scale.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/test_full_pipeline.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/test_phaseA.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/test_pipeline_319.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/test_self_review.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/test_task327.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/test_weakness_improve.py`

**tests/ 디렉토리 테스트 (16개)**:
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_fact_guard.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_task523_1.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_task324_infobox.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_e2e_video.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_task668.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/pipeline_test_full.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_task_751_1_fact_guard.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_logo_overlay.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_e2e_still.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_short_text_visual.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_padding_consistency.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_cli_carousel.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_image_server.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/tests/test_shortform_renderer.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/pipeline/tests/test_video_composer.py`
- `/home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4/video/tests/test_tts_sync.py`

---

## 검증 결과

### 1. 하드코딩 grep 검증
- `grep -rn "/home/jay" *.py` (톱레벨): **config.py만 해당** (PASS)
- 전체 프로젝트 잔여 4건: docstring 2건, 마크다운 문자열 1건, 테스트 바이너리 검색 1건 (모두 비기능 코드)

### 2. pytest 결과
- **1776 passed, 37 failed** (메인 브랜치와 동일)
- 회귀 테스트: **0건** (diff로 메인 vs 워크트리 실패 목록 비교 = IDENTICAL)
- 37건 기존 실패: instagram_client(10), instagram_oauth(8), threads_video_gen(7), crawler(4), evergreen_topics(4), padding_consistency(2), text_generator(1), cta_linebreak(1)

### 3. AUTO_POST_DISCLAIMER 확인
- config.py에만 정의 (line 90)
- 다른 파일은 모두 `from config import AUTO_POST_DISCLAIMER` 패턴으로 참조 (PASS)

### 4. API 설정 확인
- access_token, user_id 등 환경변수 기반으로 config.py에서 관리 (PASS)

---

## 발견 이슈 및 해결

### 자체 해결 (4건)
1. **워크트리 로고 파일 크기 불일치** — `git checkout HEAD -- static/logo_snu_insurance_*.png`으로 복원
   - 워크트리 로고(551x453) vs 메인(752x303) 차이로 test_logo_top_greater_than_half_margin 실패 발생
2. **video/evan_dynamic.py 함수 기본값 하드코딩** — default=None + 함수 내부 resolve 패턴 적용
   - 함수 파라미터 기본값에 config 참조 불가 → None 패턴으로 해결
3. **video/config.py 이름 충돌** — `import config as _root_config`로 루트 config와 구분
   - video/config.py와 루트 config.py 이름 충돌 방지
4. **scripts/prepare_logo.py 폴백 경로** — config.STATIC_DIR 참조로 통일
   - 기존 하드코딩 폴백 경로를 config 참조로 전환

### 범위 외 미해결 (1건)
1. **output/ 디렉토리 내 일회성 스크립트** — 범위 외 사유: output/은 생성된 결과물 디렉토리로, 프로덕션 코드가 아닌 일회성 테스트/디버그 스크립트

---

## 머지 판단
- **머지 필요**: Yes
- **브랜치**: task/task-1429.1-dev4
- **워크트리 경로**: /home/jay/projects/ThreadAuto/.worktrees/task-1429.1-dev4
- **머지 의견**: pytest 회귀 0건. 47개 파�� 수정이지만 ��두 경로 참조 전환으로 로직 변경 없음. config.py가 단일 소스 역할 충족. 충돌 가능성 낮음 (대부분 import 추가 + 경로 문자열 교체).

---

## 셀프 QC 체크리스트

- [x] 1. 다른 파일 영향: 47개 파일 수정, 모두 경로 참조 전환 (로직 변경 없음)
- [x] 2. 엣지 케이스: 빈 경로, config import 실패 시 → 환경변수 fallback 설정
- [x] 3. 작업 지시 일치: 4개 수정 항목 모두 완료 (경로, API, 렌더러, 면책문구)
- [x] 4. 에러 처리/보안: 하드코딩된 키/토큰 없음, 환경변수 기반
- [x] 5. 테스트 커버리지: pytest 1776 passed, 회귀 0건
- [x] 6. 이슈 자체 해결: 4건 해결, 1건 범위 외
- [x] 7. 코드 아키텍처: DRY 원칙 강화 (하드코딩 → 중앙 config)
- [x] 8. 인터페이스 변경: config.py에 상수 추가 (기존 인터페이스 변경 없음)
- [x] 9. 이미지/배너: 해당 없음

---

## 모델 사용 기록

- 팀원: 카르티케야(백엔드) / 작업 내용: config.py + content + publisher + cli + scripts 수정 / 사용 모델: sonnet
- 팀원: 카르티케야(백엔드) / 작업 내용: renderer + audio + video + pipeline 수정 / 사용 모델: sonnet
- 팀원: 하누만(테스터) / 작업 내용: run_*.py + test_*.py + tests/ 하위 경로 수정 / 사용 모델: sonnet
- 팀원: 하누만(테스터) / 작업 내용: tests/ 디렉토리 잔여 하드코딩 제거 / 사용 모델: sonnet
- 사라스바티(프론트엔드) / 미사용 사유: 순수 백엔드 Python 리팩토링으로 프론트엔드 작업 없음
- 락슈미(UX/UI) / 미사용 사유: UI 변경 없음
