# task-3070 — 벤치마킹 생성: 이미지 프롬프트 출력 보장 + 타임아웃 상향

레벨: Lv.2 (버그 수정) · 대상 repo: InsuRo · 담당: dev4 (dev3 중복실행 → ANU 종료, dev4 단독 진행)
승인: 제이회장님 2026-08-30 (B·C 승인 / D 철회 / E 제외)

## 배경 — 라이브 장애

회장님이 벤치마킹 글 생성에서 두 증상을 겪으셨다.
1. `AI 콘텐츠 생성 타임아웃 (180초)` 로 생성 실패
2. 재시도해서 생성은 됐으나 **"이미지 프롬프트 구획을 찾지 못했습니다"** 경고.
   화면 "목표 대비 반영 결과": 이미지 프롬프트 **목표 6개 → 실제 0개**

## ANU 실측 (승계하지 말고 직접 재현할 것)

- job1 `20:39:20` → `20:42:20` 정확히 **180초 kill, 실패**
- job2 `20:43:36` → `20:47:21` **225초 성공** (5,491자 저장)
- 동일 프롬프트 직접 호출: sonnet **58.2초/2,698자/마커 O** · haiku **16.8초/444자/마커 X**
- 저장된 실제 결과물에 `## 이미지 프롬프트` 마커 **부재** (DB 직접 조회)

## 작업 B — 이미지 프롬프트 출력 보장 (★ 회장 지시: "꼭 잡아내야 함")

### B-1. 최종 지시에 이미지 구획 요구를 넣어라

`server/main.py` `build_content_prompt()` §7 이 프롬프트의 **마지막**이다:

```
콘텐츠 유형: {channel}
주제: {topic}

위 주제에 맞는 보험 마케팅 콘텐츠를 작성해 주세요.
```

이미지 구획 요구가 **한 글자도 없다**. 모델은 맨 끝 지시를 가장 강하게 받는다.
벤치마킹 + `imageCount > 0` 인 경우 최종 지시에 이미지 구획 요구를 포함시켜라.

### B-2. `_BENCHMARK_OUTPUT_SCOPE_RULE` 자기모순 제거

현재 첫 줄:
> 출력은 제목과 본문뿐이다(위 [이미지 프롬프트 출력 규칙]이 적용되는 경우 그 구획만 예외로 허용된다).

"제목과 본문뿐"을 단정하고 예외를 괄호에 넣었다. 긴 프롬프트에서 앞 단정이 이긴다.
게다가 이 문장이 이미지 규칙 **바로 다음**에 와서 방금 준 지시를 즉시 덮는다.

→ 이미지 구획이 있는 경우와 없는 경우를 **분기해서 긍정문으로** 쓸 것.
   있는 경우: "출력은 제목·본문·이미지 프롬프트 구획 3가지다" (괄호 예외 금지)

### B-3. ★ 실호출로 검증하라 — 단위테스트로는 안 잡힌다

t3068 에서 단위테스트는 통과했는데 라이브에서 마커가 안 나왔다. 같은 실수 반복 금지.
`claude -p --model <model>` 을 **실제로 호출**해서 마커 출력을 확인하라.
sonnet · haiku 양쪽 모두 측정하고 결과를 보고서에 기록하라.

## 작업 C — 타임아웃 180 → 420초

`server/main.py:1371` `CONTENT_CLI_TIMEOUT_SECONDS = 180` → **420**

근거: 실측 225초 × 1.87 여유. t3007 선례(실측 248초 → 420초 설정, 이후 초과 0건)와 동일.
프론트 `Generate.tsx` 폴링은 2초 간격 **무한**이고 `completed`/`failed` 에서만 멈추므로
상한이 없다. 서버 상수만 올리면 된다(t3007 과 다른 점 — 확인하고 진행).

## 하지 말 것

- **D(haiku 차단) 하지 마라.** 회장 지시로 **철회**됐다.
  "하위 플랜 사용자들은 그만큼 quality 떨어지게 이용하는 것" — 모델 제한을 추가하지 마라.
- **E(본문 키워드 목표 재측정) 하지 마라.** 이번 범위 제외.
  회장 확인: 1위 글의 정확일치 키워드가 실제로 1회가 맞다. 카운팅은 틀리지 않았다.
- **분량/글자수 관련 수정을 하지 마라.** 별도 agent meeting 으로 우선순위 확정 중이다.
  `settings.charCount` 미결선 건은 이번 태스크 범위가 **아니다**.

## 검증

- [ ] 실호출로 sonnet·haiku 양쪽 마커 출력 확인 (수치 기록)
- [ ] 타임아웃 상수 변경이 codex 경로(`_run_codex_cli_async`)에도 일관 적용되는지 확인
- [ ] 기존 생성 회귀 0건 (base sha 에서 기준선 재측정 후 대조)
- [ ] 벤치마킹 아닌 일반 생성에 영향 없음 (`imageCount` 미지정 경로)
- [ ] 변이 테스트: B-1/B-2 를 되돌리면 테스트가 죽는가
      (변이 주입 전 `assert 원문 in 소스` 로 no-op 아님을 입증할 것)

## 종결

- **PR 까지만. 머지하지 마라** (t2986·t2993 위반 전례 2건).
- `CI_WATCH_HANDOFF` 12필드 생성.
- 콜백 prompt UTF-8 **≤3900 bytes** (`printf '%s' "$P" | wc -c` — `wc -m` 아님).
- 봉투에 "머지 불필요·미해결 없음" 을 근거 없이 쓰지 마라 (허위 5연속 전례).
- `gh` 호출 시 `GH_TOKEN="$BOT_GITHUB_TOKEN"` 주입 (회장 개인 PAT 금지).
