# 좁은 실내(confined) 샷 — fp readback 구조(D2) 프로덕션 편입 설계 (2026-08-10)

## 0. 배경 — 실험이 확정한 것

실험 이력(SOT: `artifact/20260810_car_interior_ab/` 갤러리 +
`backend/car_interior_ab_experiment.py` + 메모리
project-car-interior-scene-restage-experiment):

1. **병목 3층이 데이터로 확정됐다**: ①현행 판정·계약은 "배경본 유지"가
   기준인데 배경본 자체가 실제 차 구조와 다름 ②브리프의 화면 배치
   문자("운전대는 오른쪽")가 핸들 소속 좌석의 결정론 없이 실려 전 경로
   (현행 포함)가 우핸들/조수석 오류로 수렴 ③fp 를 gemini 로 그리면 핸들
   위치를 반복해서 틀림.
2. **D2 구조가 3샷 실측 2.5/3 승**: 정밀 fp 작화 → VLM readback(검증+
   장면 설명+브리프 모순 보고) → 어긋남은 fp i2i 국소 수정 → fp 도면과
   장면 설명을 **함께 생성에 첨부**. 좌석·핸들·미러 광학·누움/결박까지
   전 산출이 못 맞추던 것을 구현(S13sh3·S15sh5 판정 4/4+육안,
   S18sh1 부분 — 잔여 결함은 수정 흐름이 잡을 부류).
3. **fp 모델 = gpt-image-2** (2026-08-10 사용자 확정): 같은 지시에서
   gemini fp 는 readback 어긋남 3건, gpt fp 는 1건 — gpt fp 는 좌석/핸들/
   미러/카메라 라벨과 방향 표기까지 정밀. 프로덕션 fp
   (`location_floor_plan`)도 이미 `call_gpt_image_bytes` 를 쓴다 — 관례
   정합.

## 1. 편입 대상과 범위

- 대상 샷 = `shot_ref_classify` 의 `confined_structure=True`
  (금월도 실측 19/256 — 자동차 6샷 중 5샷 포함).
- **S18sh5 분류 누락 수리 포함**: 분류 결과에 샷 항목 자체가 없던
  커버리지 구멍 — 원인 조사 후 같은 wave 에서 고친다(누락 샷이 있으면
  confined 경로가 원천 제외되므로 이 설계의 전제다).
- 적용 시점 = **신규 실행부터** (G+Q 와 같은 패턴): env 플래그
  `still_confined_fp_enabled`(기본 **False**). OFF = 기존 경로·지문
  byte-identical(완료 256샷 동결). ON 일 때만 confined 샷이 D2 경로를
  타고, 지문·config 에 관련 키가 추가된다.

## 2. 프로덕션 구조 (D2 확정판)

confined 샷의 still_recipe 생성 경로를 다음으로 바꾼다(비-confined 샷
무변경):

1. **fp 작화** — `call_gpt_image_bytes(mode="generate")`,
   model=`settings.openai_image_model`(gpt-image-2), size 1536x1024.
   지시 = 실험 `FP_PRECISE_HEAD`(좌석 배열·핸들이 붙은 좌석·룸미러
   위치와 반사면 방향·카메라 위치와 시선·SHOT TEXT 인물 좌석 마커 —
   나라별 핸들 측은 "LOCATION 텍스트의 언어가 나라를 말해준다"로만,
   방향 하드코딩 없음) + 브리프 발췌 절.
2. **readback 검증·설명** — gemini 구조화(`FP_READBACK_SYS` 계약):
   도면을 읽고(reads) → 브리프와 어긋남 나열(mismatches) → 카메라
   시점 장면 설명(scene_description_en, 화면 좌우·미러 반사 가능성
   명시). ★부수 가치: 브리프 내부 모순 검출기(실측 — LOCATION 문자
   vs 미러 반사 요구 모순을 보고함). mismatch 는 record 에 남긴다.
3. **fp i2i 국소 수정** — mismatch 가 있으면
   `call_gpt_image_bytes(mode="edit")` 로 지적 항목만 옮기고 재검증.
   1회(재시도 남발 금지 — 실측상 1회로 충분, 남은 보고는 대부분
   브리프 모순·과잉 요구).
4. **생성** — 기존 nb2 경로에 참조로 [fp 도면(잔류 금지 라벨), 기존
   엔티티]를 주고, 프롬프트 = D2 헤드(도면+설명이 물리 권위, 인원은
   SHOT TEXT 만) + 장면 설명 + **CAMERA & FRAME 절을 뺀** 브리프.
   브리프 저작 자체는 불변 — 제거는 confined 생성 호출에서만.
5. **이후 흐름 불변** — 선정(G+Q)·critique(Qwen 관찰→Gemini 취합)·
   재판정·JIT 지문 검증 전부 기존 그대로. S18sh1 류 잔여 결함(유령
   미러 반사)은 수정 흐름이 잡는 부류다.

### 기존 부품과의 관계

- confined 샷의 **bgfirst 2택1(체인 vs 무콘티)·geom_authority(팩 v15)
  경로를 D2 가 대체**한다(ON 시). 근거: 실측에서 2택1 의 두 후보 모두
  "틀린 배경본 위 유지"라 D2 에 전패했고, 두 경로 병행은 비용 2배.
  되돌림은 플래그 OFF 로 즉시.
- 실험 계약 문구(FP_PRECISE_HEAD·FP_READBACK_SYS·FP_FIX_HEAD·
  D_FROM_FP_HEAD)는 **새 프롬프트 팩**으로 승격(팩 버전 규칙 준수,
  기존 팩 덮어쓰기 없음). readback 스키마는 코드(신규 빌더).

## 3. 지문·config (G+Q 와 같은 규율)

- ON 일 때만: extra_fingerprint 에 `confined_fp_pack(+content)`·
  `confined_fp_model`(gpt 물리 모델)·`confined_fp_policy` 추가,
  config_hash payload 에 동명 키. OFF=무스탬프 byte-identical 을
  유닛으로 고정.
- ON 전환 뒤 완료 스텝 재진입은 #77 경로(ack·JIT·래치) 그대로.
  금월도는 ON 상태에서 resume 하지 않는다(운영 규칙 — .env 주석).

## 4. 결정점 (사용자 합의)

| # | 결정점 | 제안 |
|---|---|---|
| 1 | confined 샷에서 기존 2택1 을 **대체**할지, D2 를 후보로 추가해 2택1 을 유지할지 | **대체** (실측 전패 + 비용) |
| 2 | 브리프 CAMERA 절 제거를 confined 생성에만 둘지, 브리프 저작 단계에서 배치 문자 자체를 고칠지 | **생성에만** (저작 변경은 전 샷 파장 — 별도 과제) |
| 3 | S18sh5 분류 누락 수리를 이 wave 에 포함할지 | **포함** (경로 전제) |

## 5. 검증 계획

유닛(confined 분기·OFF byte-identical·fp 팩 로드) → Codex 리뷰(코드만)
→ 재기동 → 카나리아(confined 3샷 — 실험 산출과 대조, 생성비 소량) →
신규 실행부터 적용. 프레이밍 변동(뒷좌석 인물 가시성이 판마다 흔들림 —
S13sh3 gpt-fp 판 실측)은 카나리아에서 관찰하고, 필요시 fp 의 카메라
시야각 표기 강화로 후속.

## 6. 범위 밖

- 비-confined 샷 경로·브리프 저작 변경.
- C2(장면 실사 재연출) — 보조 구조로 기록만(시점 맞는 사진이 잡힐 때
  강함, 자동 시점 선택이 미해결).
- 금월도 256샷 소급.
