# forest_exp — '전체 숲' 총괄 파이프라인 실험 설계 (2026-07-04)

실험 전용(scratchpad, production 미접촉/미커밋). 실제 코드 차용 + 실데이터
(E2E b0ad5c18 / ep 0d30302a). 판정 = 육안 갤러리(8897). 비용 제한 없음(사용자 명시).

## 절대 제약

- 시나리오 의존 코드/프롬프트 금지(비슷한 것도): 장소/인물 고유명사 0.
  모든 구체 내용은 cp 데이터 문자열(label/summary/description/staging)로만 주입.
- 그룹 선택도 데이터 기준: building_groups 중 실내+실외 멤버 공존(mixed) 그룹,
  총 shot_count 최대 → 자동 선택 (CLI --group-id override 허용).
- LLM 전달 데이터 원문 전체(자르기 금지).
- DB/체크포인트 write 0 — capture scope 미개방(이미지 asset 미기록), 읽기 전용.

## 테스트베드 (데이터로 선택된 결과)

bg_rooftop_unit: L03 옥상/현관 외부(6샷) + L04 실내(15샷) + L10 골목/계단(2샷) = 23샷.
fp 4장(l03_entry/l04_room/l10_alley/l10_stairs), production 통합 배치도
aerial_bg_rooftop_unit.png(A/B 기준), 캐릭터 passport(primary reference) DB 확보.

## 파이프라인 구조

### Stage R — 뿌리(root): 통합 조감 스케치 1장 (전체 샷 포괄)

- R1 (LLM, gpt): 그룹 멤버(label/summary/is_indoor) + 전체 23샷 내용(description,
  key_bg_elements, framing)을 입력 → 조감 스케치에 그릴 요소 선정.
  출력(strict schema): elements[{id:A.., name_en(짧은 영어), category
  (structure|opening|fixture|approach|surround), placement(상대 공간 구),
  grounding(shot키+인용)}], coverage(shot→element ids, 전 샷 ≥1),
  sketch_notes(전체 매싱/방위), legend(순서). 제약: 실내 도면 금지 — 창/문/
  게이트/계단/외부 가시 요소만. 산출 JSON = '뿌리 텍스트'로 전 단계 참조.
- R2 (이미지): 동그라미 기호(원 안에 대문자 ID) + 우측 영어 범례 패널.
  - R-A: gpt-image-2 순수 T2I (스케치 스타일 top-down).
  - R-B: production 통합 배치도에서 I2I edit (기하 유지 + 기호/범례 추가).
  - 자기검증: VLM readback으로 범례/기호 회수 → coverage 대조(관찰용 기록).

### Stage I — 실내 체인 (L04 샷, 대표 3샷: framing 다양성 기준 자동 선발)

- I0 (LLM, gpt): 뿌리 텍스트+실내 샷 내용 → 샷별 필요 배경 리스팅 → 탑레이어
  배경 1~2장으로 병합 + 생성 순서 + 각 장의 fp 첨부 여부 판단(LLM) + 2장째의
  체이닝(1장째 ref) 계획 + 샷→탑레이어 배정.
- I1: 탑레이어 배경 생성 (gpt-image-2; fp 첨부 = LLM 판단 + 강제 on/off A/B 1쌍).
  2장째는 1장째 ref 체이닝(fp3 검증 패턴).
- I2: 샷별 fp 변형1 (gpt-image-2 edit, ref=fp): 카메라 콘 + 엔티티 레터 서클
  마킹(fp3 BLOCKING 패턴, staging camera_direction/frame_spatial_contract 주입).
- I3: 1차 임시샷 (nb2): A/B-α ref=[임시배경(탑레이어에서 샷 맞춤 생성), fp변형1]
  vs A/B-β ref=[탑레이어 배경, fp변형1] (임시배경 생성 자체가 실험 변수).
  프롬프트 = 샷 내용+staging. 구도/표현 발견이 목적(정체성 무관, passport 미첨부).
- I4: 임시샷 → i2i 윤곽(라인아트 컨투어, 구도 보존) (gpt-image-2 edit).
- I5: 윤곽+탑레이어 ref → 최종 배경 재생성(빈 배경). 마네킹 A/B: (m+) 중립
  마네킹 포함 / (m0) 빈 배경.
- I6: 최종샷 (nb2): ref=[I5 배경(±마네킹), passports] + 샷 프롬프트
  (scene_detail 카드 or 조립).

### Stage O — 실외 체인 (L03/L10 대표 2샷, fp 미사용)

- O1: 뿌리 스케치 위 샷별 카메라 콘+엔티티 서클 마킹 (I2I on root).
- O2: 마킹 루트 → eye-level 빈 배경 plate.
- O3: 임시샷 (nb2, ref=[O2, O1]).
- O4: i2i 윤곽 분석(컨투어).
- O5: 윤곽 기반 실제 배경 재생성 (마네킹 A/B).
- O6: 최종샷 (nb2, ref=[O5, passports]).

## A/B 매트릭스 (1라운드)

| 축 | 변형 |
|---|---|
| 뿌리 | R-A 순수 T2I vs R-B 배치도 I2I |
| 탑레이어 fp 첨부 | LLM 판단(주경로) + 강제 on/off 1쌍 |
| 임시배경 | α 생성 vs β 미생성(탑레이어 직참조) |
| 마네킹 | m+ vs m0 |
| (베이스라인) | 동일 샷의 production 최종 스틸과 육안 비교 |

## 모델 배정 (production 미러)

- 계획/구조화: call_structured, model 강제 "gpt"(GPT-5.5) — A/B로 gemini-pro 여지.
- 도해/스케치/배경 plate: gpt-image-2 (size 1536x864, quality high).
- 임시샷/최종샷 (photoreal, 멀티 ref+passport): nb2 (gemini-3.1-flash-image-preview,
  _gemini_generate_content, 16:9 2K, 라벨드 ref).

## 산출/기록

- scratchpad/forest_exp/out/<stage>/... PNG + runlog.jsonl(호출 단위: stage/tag/
  model/refs/prompt/duration/bytes) + plans/*.json(LLM 산출).
- gallery.py → gallery.html (단계 트리 + A/B 나란히 + 프롬프트 접기) → 8897
  (python -m http.server --bind 0.0.0.0).
