# E2E8 육안 재설계 — aerial 제거·seed 배경·전체 지휘·맵 축소·아웃룩 보편화

> 2026-07-19 사용자 확정 지시(E2E8 갤러리 v3 육안). 진행=Codex 최소 관여
> (중대 결정만), 자율 설계→구현→수정. 실측 근거는 메모리 SOT 블록 참조.

**Goal:** E2E8 육안에서 확인된 구(舊) 경로 잔존·계약 공백 5건을 교정 —
야외 배경을 seed 기반으로 재편하고, 배경 공유를 에피소드 전체 지휘로
바꾸고, 맵 스케치를 구도 중심 개활지로 한정하고, 아웃룩 합성을 보편
상태로 계약화한다.

## 실측 확정 원인 (2026-07-19)

| 항목 | 원인 실측 |
|---|---|
| A. 야외 플레이트가 위성 배치도 참조 | `.env OUTDOOR_AERIAL_REFERENCE_ENABLED=true`(2026-07-03 W-L canary 방치) → `background_render` 프리패스가 그룹당 aerial 생성·refs 최우선 첨부(`background_render_step.py:1779,1835,1909` / `location_aerial.py:327`). structure_seed→배경 렌더 배선은 **부재**(seed 소비=스틸·콘티 전용 `shot_conti_light_step.py:665`) |
| D. 수리영 헬멧 박제 | outlook phase1 저작 계약에 '보편/기본 외형' 문구 전무 + rule 8(착용 기계장치=아웃룩 포함)이 헬멧 포함 유도(`prompts/_base/outlook_extractor/13.202605201337/phase1.md`) → phase2 연속성 규칙으로 전 씬 전파 → 합성(`character_outlook_ref.md` "headgear…head to toe" 명시 렌더)이 충실 계승. 샷별 아웃룩 선택 구조 자체는 정상 |
| C·E. 맵 과적용(S2sh3 골목·S13sh1 옥탑 인접·S1sh4 숲) | outdoor_lane_plan 판별이 '개활지=맵' 기본 — 구도 필요성 축 부재. S2sh3 정면 응시=맵 geometry 스케치가 배치 고정 |
| B. 샷별 개별 프롬프팅 | 배경 공유·prev 체인이 샷 단위 local 판정(shot_ref_classify)뿐 — 에피소드 전체 지휘 계획 부재 |

## 확정 설계

### Stage 1 — 계약 팩 2건 (독립·소규모, 즉시)

**D. outlook_extractor 팩 v14** (`prompts/_base/outlook_extractor/14.<ts>/`):
- phase1에 신규 계약: 아웃룩 description=캐릭터의 **보편·기본 외형**.
  특정 활동/장면에서만 착용하는 일시적 보호구·작업구·활동 장비는
  description에서 배제(그 요소는 스틸 생성/i2i가 샷 텍스트로 처리).
- rule 8(신체 일부화된 착용 기계장치)와의 경계 명시: 캐릭터의 상시
  실루엣을 결정하는 착용물만 포함, 활동 특정 장비는 제외. generic 계약 —
  '헬멧' 등 사례 명사 하드코딩 금지.
- phase2/3=v13 그대로 복사(관례: 새 버전 디렉토리 전체 세트).
- selector: `OUTLOOK_PROMPT_VERSION` env 확인 후 opt-in(기존 프로젝트
  byte-identical 보존). 소비처 버전 해석 방식 실측 후 배선.

**C. outdoor_lane_plan 판별 팩 신버전**:
- 레인 판별에 '맵 필요성' 축 추가: 맵 스케치=**샷의 핵심이 배치·거리·
  이동 방향인 개활지**(정류장류 — 인물 간 공간 관계가 서사의 요점)만.
  다음은 맵 불요→일반 파이프: 좁은 골목·단일 지점 클로즈업·수풀 등
  구분 어려운 균질 공간·인물 감정 중심 샷. 판별=LLM(하드코딩 금지),
  근거 인용 의무 유지.
- E(S2sh3)는 이 축소로 해소 — 골목 샷이 일반 파이프로 가면 변형 저작이
  극적 구도를 주도.

### Stage 2 — A. aerial 차단 + seed 기반 야외 배경 배선

1. `.env OUTDOOR_AERIAL_REFERENCE_ENABLED=false` (aerial 생성·첨부 즉시
   차단 — OFF=기존 fp fail-safe 경로).
2. 야외 그룹 플레이트의 공간·룩 참조=**장소 seed**(정면 실사 앵커):
   background_render에 seed 참조 배선(신규 flag
   `outdoor_seed_plate_reference_enabled`, default OFF). 야외 그룹이고
   해당 그룹 seed가 있으면 refs=[seed(STRUCTURE/PLACE LOOK)]+체인,
   fp/aerial 미첨부. seed 부재 그룹=기존 경로(fail-safe, 로그).
3. FP는 실내 전용 유지(야외 첨부 금지 가드).

### Stage 3 — B. 배경 공유 에피소드 전체 지휘 (최대 규모, 세부 확정)

1. **seed 일반화**: outdoor_structure_seed 의 대상 선정을 '복잡 구조물
   (structure_plate lane) 그룹'에서 **spec 있는 야외 전 그룹**으로 확장
   (flag `outdoor_seed_all_groups_enabled`, default OFF). 기존 seed 변형
   저작·멀티롤·검증 계약 그대로 재사용 — 프롬프트의 '구조물' 축은
   장소 중심 서술로 일반화 팩 필요 여부 구현 시 판단.
2. **신규 계획 스텝 `background_share_plan`** (shot_ref_classify 뒤,
   스틸 앞. flag `background_share_plan_enabled`, default OFF):
   - 입력=에피소드 전체(씬 요약·선택 샷 목록·샷 서술·장소·시간대 —
     원문 무절단), 출력(fail-closed 스키마):
     `share_groups: [{group_key, evidence(인용), shot_tags(스토리 순),
     bg_authority: "seed"|"plate"|"interior"}]` +
     `shot_plans: {tag: {ref_plan: "background"|"prev",
     prev_anchor_tag?}}`
   - 검증: 전 선택 샷 커버(중복 0), 그룹 첫 샷=background, prev_anchor=
     같은 그룹의 앞 샷(스토리 순), 인용 실재(whitespace 정규화) —
     위반=재시도→fail-closed.
   - 계약: 장소 동일성 판단=LLM(씬 경계 무관 재방문 포함), '배경만
     비슷'과 '같은 장소 재방문' 구분 근거 요구.
3. **스틸 소비**: 계획 CP 존재 시 prev/배경 결정=계획이 상위 권위
   (classify prev_tag=계획 부재 시 fail-safe). prev 앵커 asset 결손=
   mark_failed(조용한 강등 금지). bgonly 판정(classify)은 유지 —
   계획은 '무엇을 참조할지', classify 는 '인물 유무'.
4. 맵 스케치(레인1)는 Stage 1 축소 판별(lane none) 통과 샷에만 유지.

구현 순서: B-1(seed 일반화) → B-2(계획 스텝+검증 TDD) → B-3(스틸
소비 배선) → 검증 재생성. 각각 커밋 단위.

## 진행 순서

- [x] 실측·원인 확정(aerial flag·outlook 계약 공백·lane 과적용)
- [ ] Stage 1-D: outlook 팩 v14 + selector 배선 + 결정론 테스트 → 커밋
- [ ] Stage 1-C: lane_plan 판별 팩 신버전 + 테스트 → 커밋
- [ ] Stage 2-A: aerial OFF + seed 플레이트 배선(flag) + 테스트 → 커밋
- [ ] Stage 3-B: 계획 스텝 설계·구현(별도 세부 플랜) → 커밋
- [ ] 검증 재생성(아웃룩 재저작→합성 재생성→야외 배경 재생성→표적 스틸)
  → 갤러리 → 사용자 육안
