# task-1500.1 완료 보고서: Meta 광고 크리에이티브 + 광고 생성 (블로커)

**팀**: dev5-team (마르둑)
**작업일**: 2026-04-06

---

## SCQA

**S**: task-1491.1에서 캠페인 2개, 광고세트 6개, 이미지 9장 업로드가 완료되었다. 이번 작업에서는 Facebook 페이지 ID(RECRUIT/SNU)가 `.env.keys`에 설정된 상태에서 크리에이티브 9개 + 광고 18개를 생성해야 한다.

**C**: Meta 앱이 **Development(개발) 모드**이기 때문에 크리에이티브 생성(object_story_spec 사용)이 불가하다. Meta API가 error code 100, subcode 1885183을 반환하며 "광고 크리에이티브 게시물이 개발 모드인 앱에서 만들어졌습니다. 이 광고를 만들려면 공개 모드여야 합니다"라고 명시한다. 크리에이티브 9/9 전부 실패, 광고 18/18 전부 스킵(크리에이티브 의존).

**Q**: Meta 앱을 Live 모드로 전환하면 기존 스크립트로 크리에이티브/광고 생성이 즉시 가능한가?

**A**: 가능하다. 스크립트(`meta_creative_ad_setup.py`)는 dry-run + 실제 실행에서 페이지 2개 유효(RECRUIT: valid, SNU: valid), 광고세트 6개 전체 유효(PAUSED 상태)를 확인했다. 앱 모드를 Live로 전환한 후 동일 스크립트를 재실행하면 크리에이티브 9개 + 광고 18개 PAUSED 상태로 생성된다.

---

## 실행 검증 결과 (정량적)

### 선행 리소스 유효성 (100% 통과)

- 페이지 ID 검증: 2/2 유효
  - `META_PAGE_ID_RECRUIT` (전국보험설계사채용) → Graph API 조회 성공
  - `META_PAGE_ID_SNU` (서울대보험쌤) → Graph API 조회 성공
- 광고세트 존재 확인: 6/6 유효 (모두 PAUSED)
  - 리드 캠페인: 인카금융서비스, GA, 서울대보험쌤
  - 잠재고객 캠페인: 인카금융서비스, GA, 서울대보험쌤
- 이미지 해시: 9/9 기존 업로드 완료 (task-1491.1에서 확인)

### 크리에이티브 생성 시도 (0/9 성공)

- 실패 원인: 동일 에러 9건 — Meta API Error 100 (subcode 1885183)
- 에러 메시지: "광고 크리에이티브 게시물이 개발 모드인 앱에서 만들어졌습니다"
- 두 페이지 모두 동일 에러 (RECRUIT 6건, SNU 3건)

### 광고 생성 시도 (0/18 성공)

- 크리에이티브 미생성으로 전부 SKIP (18건)

---

## 발견 이슈 및 해결

### 범위 외 미해결 (2건)

1. **Meta 앱 Development 모드** — 범위 외 사유: Meta for Developers 대시보드에서 수동으로 Live 모드 전환 필요 (API 자동화 불가)
   - 전환 경로: developers.facebook.com → 앱 선택 → App Mode → Live 전환
   - 전환 요구사항: Privacy Policy URL 설정, 비즈니스 인증(선택)
   - 전환 후: `python3 teams/dev5-team/scripts/meta_creative_ad_setup.py` 재실행

2. **결과 JSON에 토큰 노출** — 범위 외 사유: check_token 에러 메시지에 full access token이 URL 파라미터로 포함됨
   - 해당 파일: `/home/jay/workspace/teams/dev5-team/output/meta_creative_ad_result.json`
   - 권장: 에러 로깅에서 토큰 마스킹 처리 필요 (meta_ads_client.py 또는 스크립트 레벨)

### 자체 해결 (1건)

1. **debug_token 400 에러** — check_token API에서 400 에러 발생하나, 계정 정보 조회/광고세트 조회/페이지 검증은 정상 동작하여 토큰 자체는 유효함을 확인. 스크립트는 WARN 처리하고 계속 진행하도록 이미 구현되어 있음.

---

## 블로커 해결 절차 (제이회장님 액션 필요)

1. **Meta for Developers** (developers.facebook.com) 접속
2. 앱 선택 (App ID 확인)
3. **Settings > Basic** → Privacy Policy URL 입력 (필수)
4. **App Mode** → Development → **Live** 전환
5. 전환 완료 후 스크립트 재실행:
   ```bash
   cd /home/jay/workspace
   python3 teams/dev5-team/scripts/meta_creative_ad_setup.py
   ```
6. 결과 확인: 크리에이티브 9개 + 광고 18개 PAUSED 상태 생성

---

## 산출물 파일

- `/home/jay/workspace/teams/dev5-team/scripts/meta_creative_ad_setup.py`
- `/home/jay/workspace/teams/dev5-team/output/meta_creative_ad_result.json`

---

## 모델 사용 기록

- 마르둑(팀장): 블로커 진단 + dry-run 검증 + 스크립트 실행 / opus / 코딩 작업 없음 (기존 스크립트 실행), API 블로커 진단에 집중

---

## 셀프 QC

- [x] 1. 다른 파일 영향: 없음 (기존 파일 수정 안 함, 스크립트 실행만 수행)
- [x] 2. 엣지 케이스: 앱 Development 모드에서 크리에이티브 생성 불가 확인, 토큰 만료 아님 확인
- [x] 3. 작업 지시 일치: 크리에이티브 9개 + 광고 18개 생성이 목표이나 앱 모드 블로커로 0/9, 0/18
- [x] 4. 에러 처리: 토큰/키 보고서 노출 없음, 결과 JSON의 토큰 노출 이슈 발견 및 보고
- [x] 5. 테스트: dry-run 구조 검증 + 실제 API 호출 결과 확인 (선행 리소스 8/8 유효)
- [x] 6. 이슈 해결: 2건 범위 외 미해결 (사유 명시), 1건 자체 해결
- [x] 7. 코드 아키텍처: 코드 변경 없음 (기존 스크립트 활용)
- [x] 8. 인터페이스 변경: 없음
- [x] 9. 이미지/배너: 해당 없음

---

## QC 자동 검증

```
Overall: PASS (5 PASS, 7 SKIP)
- file_check: PASS (보고서 5250 bytes)
- data_integrity: PASS (task-1500.1 status=running)
- critical_gap: PASS (4 CRITICAL issues all resolved)
- spec_compliance: PASS
- duplicate_check: PASS (최대 유사도 19.5%)
- api_health: SKIP (서버 작업 아님)
- test_runner: SKIP (코드 변경 없음)
- tdd_check: SKIP (파일 변경 없음)
- schema_contract: SKIP
- pyright_check: SKIP
- style_check: SKIP
- scope_check: SKIP

TRUST 5: T✓ R✓ U✓ S✓ T✓
Gate PASS → .done 자동 생성 완료
```
