# E2E11 육안 추가 피드백 4건 — 분석·설계 (2026-07-22 밤)

> 근거: E2E11 갤러리 육안 (프로젝트 705ead84-e08d-44fd-a244-0a671a7a4f7e /
> 에피소드 8a0a9553-3523-4c59-b883-177c901cb630). E2E12 실행 중(6건 fix 검증)
> — 본 4건은 E2E12 미반영이 정상, 수정 후 E2E13 fresh 로 검증.

## ① 옥탑 규모 과소 — seed 규모 계약이 variants 경로에서 전면 소실 (본질)

### 근본 원인 (실측 완료)

- `derive_seed_inputs` 는 **정상**. E2E11 실측 CP(background_classify
  building_groups + entity_merge locations)로 재현 실행 → bg_rooftop_villa 의
  `interior_note_en` = "옥탑방 내부 주거 공간: 거실, 주방, 침실, 욕실이 연결된
  …" 정상 산출. 이전 세션의 "derive_seed_inputs 배선 결손" 추정은 **부정확** —
  결손 지점은 그 하류다.
- 진짜 결손 = **변형 저작(variants ON) 경로의 최종 프롬프트 조립**:
  1. `build_author_user_content` 는 interior_note 를 "INTERIOR NOTES (size
     evidence only)" 로 **저작자 입력에만** 전달. 저작 출력 계약
     (`build_author_schema`/`validate_variant_output`)은 규모 서술 유지를
     강제하지 않음 → Sol 이 "one compact rooftop room" 으로 축소 저작.
  2. `assemble_variant_roll_prompts`(v3+ 브랜치)는 scout_head + 저작본 +
     THE LOCATION + excluded + plate_rules 만 조립 — **scale_clause /
     INTERIOR / human_scale_clause 미부착**.
  3. `build_conformance_prompt`(judge·critique brief)에도 규모 절 없음 →
     판정 축도 부재.
  4. E2E11 fix① 의 human_scale_clause(structure_seed 팩 v5)는
     `build_structure_seed_prompt` 에만 배선 = **variants OFF 경로 전용 死코드**
     (E2E11/12 는 variants ON).
- 실측: E2E11 seed 롤 프롬프트 **30/30 에 SCALE/INTERIOR 절 0**. 렌더 결과
  옥탑방=원룸 오두막 크기 (L04B01/02 이미지에서도 동일 확인).

### 수정 설계 (하드코딩 0 — interior 증거=씬 파생 데이터)

- **팩**: `prompts/_base/seed_prompt_variants/6.<ts>/` = v5 전체 사본 +
  `human_scale_clause.md` + `scale_clause.md` (structure_seed v5 원문 사본 —
  계약 드리프트 방지, 팩 소유 원칙 유지: variants 경로는 structure_seed 팩
  의존을 재도입하지 않는다).
- `assemble_variant_roll_prompts(..., interior_note_en="")`:
  `_SCALE_VARIANT_PACKS = frozenset({"6"})` 일 때 코드 조립(불변 안전절 패턴,
  excluded 와 동일 — LLM 저작이 계약을 떨어뜨릴 수 없음):
  순서 = scout_head → 저작 prompt_en → THE LOCATION → **human_scale_clause
  (상시)** → **scale_clause + `INTERIOR: {interior_note_en}` (비어 있지 않을
  때만 — dangling 금지)** → excluded → plate_rules. v5 이하 = byte-identical.
- `build_conformance_prompt(..., interior_note_en="")`: v6+ 에서 동일 절 병기
  → judge/critique 가 규모 위반 후보를 감점·수정 지시 가능.
- step: `SEED_VARIANTS_PACK_VERSION = "6"` + interior_note_en 전달 2곳.
  `_config_hash` 는 variants 팩 버전을 이미 스탬프(변경 시 재실행 유도) — 확인.

## ② 플레이트 구조 오류 — 모순 concatenation + 구조 사실 계약 부재

### 근본 원인 (실측 완료)

- **L13B01 (계단 방향 반전)**: `effective_render_prompt` 안에서
  - CAMERA DECISION(shot_aware_bg_render_plan): camera=unit4(상부 계단),
    look_at=unit2(하부 계단), "slightly high-angle" = **내려다보는 기하**
  - 저작 t2i(background_prompt v14, 플랜 비인지 — plan 소비는 selector 12
    전용): "가파른 계단을 **올려다본** 구도 … 시선 끝에는 … 출입문"
  두 지시가 모순인 채 그대로 연결 → 렌더가 융합해 **"내려갔다 다시 올라가는"
  불가능 위상**을 생성(이미지 실측: 카메라가 옥상보다 높은 가상 지점).
- **L04B01/B02 (계단 누락)**: dossier(fp_l04)에 marker 9 "Stair access
  landing — southwest edge" 존재. 그러나 ⑴ 렌더 플랜 지시가 "openings …9 …
  only where the wide view permits" 로 **선택 집합 강등** ⑵ L04B01 저작
  프롬프트에는 계단 자체가 소실 ⑶ 판정(plate_multiroll)에 구조 사실 대조
  축이 없음 → 이미지 실측: 계단 위치(SW 모서리)가 화면 안인데 **진입 수단이
  전혀 없는 고립 옥상**으로 렌더.

### 수정 설계 (범용 — dossier 데이터 계약 기반, 시나리오 의존 0)

1. **STRUCTURE FACTS 블록** (`shot_aware_bg_render_adapter` 또는 render step
   소유 헬퍼): floor_plan_prompt CP 의 `numbered_elements`(dossier 파생 SOT)를
   그대로 나열("n. [category] label — position_hint", 의미 파싱·substring 판단
   없음) + 계약문: 나열 요소는 평면도 사실 — 뷰 안에 위치가 들어오는 요소는
   반드시 존재해야 하고, 수직(승강) 방향·상대 배치의 반전·미러 금지, RENDER
   GUIDANCE 가 뷰에서 배제한 요소는 생략 가능. `effective_render_prompt`
   prefix 에 주입 → 생성+judge+critique 모두 도달(공유 prompt).
2. **모순 우선순위 절**: CAMERA DECISION 존재 시 prefix 말미에 — 카메라
   위치·높이·시선 방향은 CAMERA DECISION/RENDER GUIDANCE 가 유일 권위,
   아래 산문이 다른 시점을 암시하면 산문 내용을 이 시점 안에서 재배치하라
   (시점을 바꾸지 말 것). 코드 소유 텍스트(adapter 관례).
3. hash/schema: background_render `_config_hash` 에 계약 버전
   (`STRUCTURE_FACTS_VERSION=1`) 스탬프 → 재렌더 유도.
4. (보류·Codex 의견 요청) 저작-기하 단일화의 근본 해법 = background_prompt
   저작 입력에 plan camera_decision 주입(selector 12 전용 로직의 일반화, bg 팩
   v16). 1차는 1·2 로 해소하고 E2E13 육안 잔존 시 후속.

## ③ S3sh3 groupbg 장소 정합 — 근거가 place_en 한 줄뿐

### 근본 원인 (실측 완료)

- `build_groupbg_prompt` 입력 = place_text + time_of_day + world_anchor 만.
  E2E11 "감식 현장" groupbg 프롬프트의 장소 근거 = "The police-controlled
  center of an outdoor crime scene, …" 1문장 + 콘티 스케치 → 폴리스라인·감식
  장비·도심 맥락 전부 미전달 → 허허벌판 시멘트 바닥.
- 미사용 가용 근거: entity_merge 해당 loc description/visual_traits("노란색
  폴리스 라인; 감식 장비들; …") + share_plan 그룹 evidence 인용("씬1, 2
  현장을 감식하는 경찰, 폴리스 라인을 치고 시신을 수거한다").

### 수정 설계

- `build_groupbg_prompt(..., location_detail_en="", scene_evidence=())`:
  - `LOCATION DETAIL` 절 = loc name + description + visual_traits (코드 조립)
  - `SCENE EVIDENCE` 절 = share 그룹 evidence quote 나열 (원문 인용 그대로)
  - 절 헤더 스템 = still_recipe 팩 v11(v10 전체 사본 + `groupbg_detail_head.md`
    + `groupbg_evidence_head.md`), v10 이하 = byte-identical.
- service `_run_groupbg` 호출부: share_plan CP 의 그룹 evidence lookup +
  entity_merge CP locations 로드, scene→primary location name(기존
  `location_by_scene`)과 name 매칭 — 실패 시 빈 문자열(기존 동작 degrade).
- 버전: `BGFIRST_FULL_PROMPT_VERSION = "11"`,
  `BGFIRST_FULL_CONTRACT_VERSION = "bgfirst_full_v3"` (groupbg 재생성 유도 —
  meta 계약 전환으로 sidecar 재사용 자동 무효화).

## ④ S10sh4 질문 — 답변 (수정 없음, record 실측)

- 질문: "무콘티(B 후보)는 구조물 seed 가 참조로 들어가지 않지????"
- **답: 들어간다.** S10sh4 record 실측 — B(무콘티) 브랜치 참조 =
  [LOCATION PHOTOGRAPH=L04B04.png, **STRUCTURE LOOK=seed_bg_rooftop_villa_sel.png**,
  CHARACTER REFERENCE]. A(콘티) 브랜치 = [SHOT BACKGROUND(재투영)+콘티+캐릭터]
  — A 는 seed 를 직접 받지 않지만 재투영 배경(Step1)이 상류에서 seed 를 소비.
  승자 = B(무콘티 승).
- 사용자 의도 확인 필요: ⑴ B 에 seed 를 넣지 말아야 한다는 지적인지
  ⑵ seed 가 들어가는데도 구조가 안 맞는 게 문제라는 것인지 → 답변 후 대응.

## Codex 리뷰 1차 (NEEDS_REVISION) 반영 — 2026-07-22

1. **BLOCKING-1 (STRUCTURE FACTS transient 승격)**: numbered_elements 에는
   base_*(영구)와 state_overlay_*(일시 — E2E11 실측 fp_l04 의 11~17=경찰·
   실루엣·조명 상태 등)가 혼재, 기존 코드는 전부 "MUST appear" 승격.
   → `select_structure_facts`: **base_* ∩ 해당 bg use_numbered_elements
   exact integer join** (use 소비 transient 도 FACTS 제외 — overlay
   소비부 관할 유지), cr 부재 시 base_* 전체 보수 포함. 회귀 테스트=
   base+used transient+ignored transient fixture (adapter 순수 함수+스텝
   E2E 경로 양쪽).
2. **HIGH-2 (v6 human_scale 'single window=one small room')**: 이번 결함
   조건(외부 개구부 적음+다실 인터리어)에서 INTERIOR 증거와 상충 —
   미발행 v6 스템 in-place 개정: 구조물 종류 예시 제거, "한 입면 개구부
   수로 수용 규모 추론 금지 + INTERIOR size evidence 가 외관 인상보다
   우선" 범용 계약. 중립성 테스트=VARIANTS_PACK_VERSION_MAP 전 selector
   순회(이후 팩 자동 잠금). scale_clause 는 structure_seed v5 byte 잠금
   유지. ※structure_seed v5 human_scale 의 동일 문구는 variants-OFF
   전용 死경로라 후속 과제로 기록.
3. **HIGH-3 (LOCATION DETAIL raw 상태 승격)**: entity_merge 서술에 일시
   상태·시간/조명·주관 혼재 — groupbg_detail_head 를 evidence 강등 계약
   으로 개정(영구 물리 특징만 승계, 조명/시간/순간 상태/주관 인상 고정
   사실 금지, TIME OF DAY lock 우선). 문자열 필터링 없음(규율 준수).
4. **NARROW-4 (partial resume stale)**: 근거를 **그룹 안정 파생**(멤버
   씬들의 loc 상세 합성+그룹 evidence)으로 교체 + meta 에 context_sig —
   origin 아닌 멤버도 drift 감지. 재사용 결정을 순수 함수
   `decide_groupbg_reuse` 로 추출, "origin 완료+후속 미완료+근거 변경→
   재생성" 회귀 테스트 추가.

## 검증 계획

- 유닛: ① 조립 v6 절 포함/치환·v5 byte-identical·dangling 금지 ② STRUCTURE
  FACTS 블록 조립·prefix 주입·hash 전환 ③ groupbg 절 조립·v10 불변·meta 전환
  → 기존 still_recipe/seed/render 테스트군 회귀.
- E2E13 fresh(E2E12 완주 후): seed 롤 프롬프트 SCALE 절 N/N, L13/L04 플레이트
  구조 육안, groupbg 장소 정합 육안.
