# forest_exp 관찰 기록 (육안, 2026-07-04)

## Stage R — 뿌리 조감 스케치

- **R1 (LLM 요소 선정, gpt)**: 요소 정확히 10개(A~J), 23/23 샷 커버리지, 실내 배제
  자발적 명시("no interior floor plan, furniture, blood ..."). 품질 우수.
- **root_A (순수 T2I)**: 스케치 스타일/수직 조감 정확, 범례 오탈자 0, 실내 미노출
  (readback interior_exposed=False). 단 **기하 자체 발명** — 철문/계단 위치가 실내
  fp·production 배치도와 다름. 뿌리=공간 SOT 용도에 결격.
- **root_B (production 배치도 I2I)**: production 배치도의 실내 노출(가구·핏자국)을
  **상속하지 않고 지붕면으로 자동 차폐**(프롬프트의 no-interior 지시가 "keep exactly"
  보다 우선함). 기하는 배치도=fp 정합 유지(철문 SW, 계단 SW 외부, 물탱크 NE, 빨랫줄,
  약초 건조대, 창 N/S). readback interior_exposed=True — 지붕면 위 희미한 칸막이
  seam+D(inner doorways) 마크 때문. 가구 노출은 아님. 경미.
- **판정: root_B 채택** (fp 정합 결정적). gpt-image-2 의 원기호+영어 범례 렌더
  신뢰성은 두 변형 모두 **기대 이상** (10항목, readback 글자 회수 10/10 × 2).
  → Codex 의 "텍스트 신뢰 못함" 우려는 이 규모(≤10, 짧은 단어)에서는 기각.

## Stage I1 — 실내 탑레이어

- 재질/무드 연속성: **체이닝 성공** (TL1↔TL2 같은 집으로 읽힘, fp3 재현).
- **발견: 구도 수렴** — TL2 가 TL1 구도를 거의 복사(카메라 각도 복사 금지 지시
  무시). 침실존 마스터(TL1 의도)가 거실 뷰로 나와 침실 전용 마스터 부재.
  → S14_Shot4(침실 wide)의 downstream 이 이를 어떻게 버티는지 관전.
- fp 기하 정합은 양호(주방 W, 침실 N, 욕실/현관 E-S — fp 방위와 일치).
- 분위기: 데이터의 '낡은' 대비 다소 깨끗/신축풍 — 관찰 항목.

## Stage I2 — fp 변형(카메라+엔티티 마킹)

- fp 원본 보존 완벽(벽/번호/가구 불변), 녹색 카메라 콘 명확, 인물=빨간 원 레터
  (기존 검정 번호와 구분 잘 됨). fp3 3/3 재현.
- S5_Shot3 의 (A) 인물 위치가 staging 의도와 일치하는지 미검증 — temp/최종에서 확인.

## Stage O1/O2 — 실외 마킹/plate

- O1 마킹: 스케치+범례 완전 보존, 카메라 콘 배치 타당(S4_Shot1: 골목에서 상향).
- **발견: O2 plate 시점 실패** — "eye level from marked camera" 지시에도 항공
  시점 유지(top-down ref 의 시점 prior 가 텍스트 지시를 지배). 재질/낡음/기하
  번역은 훌륭(물탱크/빨랫줄/약초 건조대/계단 전부 photoreal 정확).
  = production osl 이 line-art sketch 중간 단계를 둔 이유 재확인.
  → 체인의 임시샷(nb2)→윤곽→재생성이 시점을 복구하는지가 이 실험의 핵심 질문.
  실패 시 2라운드: sketch-hop(osl camview 패턴) 추가.

## 임시샷 조기 관찰 (첫 2장)

- **실내 S14_Shot4 temp: 성공** — CONTROL(fpvar)의 침실 문간 카메라를 정확히 채택
  (ENV 가 거실 plate 였음에도), eye-level, 인물 0 준수, ENV 재질 연속. 침실 마스터
  부재를 체인이 스스로 버텨냄 → "탑레이어=재질 SOT, fpvar=카메라 SOT" 역할 분리 작동.
- **실외 S4_Shot1 temp: 이중 실패** —
  1) 시점 미복구: nb2 도 ENV(항공 plate)+CONTROL(조감 마킹) 시점을 그대로 따라
     드론 뷰 유지. eye-level 텍스트 지시 무력 (O2 와 동일 원인 — 이미지 prior 지배).
  2) **군중 발명**: 무인물 샷(chars=[], 마킹에도 사람 서클 0)인데 ~14명 배치.
     temp 프롬프트에 명시적 인원 계약("정확히 N명, 0이면 무인")이 없어서 발생.
  3) topology drift: 옥탑방(지붕 있는 구조)이 지붕 없는 벽면 마당으로 변형.
- **→ 1.5라운드 수정안**: temp 프롬프트에 (a) PEOPLE COUNT 계약(캐릭터 수 명시,
  0=완전 무인) (b) "control 의 원문자=사이트 마커, 사람 아님" (c) 실외 eye-level
  강제 계약("카메라는 지면 위 사람 눈높이, 수평선 가시, 드론/오버헤드 금지") 추가.
  실패 전파 증거(B/C 경로)는 그대로 완주시켜 기록.

## 경로 v1 판정 (육안, 1차)

- **실내 레인 = 전 경로 성립.**
  - S14_Shot4(침실 wide, 무인물): temp/α/final_A 모두 fp 기하 정합(문에서 북향
    — 창 좌, 침대 우 = fp room 13/14 일치), 인물 0 준수. 침실 마스터 부재를
    체인이 버팀(ENV=재질 SOT, fpvar=카메라 SOT 역할 분리 작동).
  - S5_Shot3(주방 medium, 민숙): final_C 우수 — fp 배치(싱크/스토브 W, TV E,
    식탁, 안방 문) 존중 + 인물 자연 배치 + 황혼 무드.
  - S5_Shot10(현관 close, 수리영+민숙): 투샷 클로즈업, 정체성 교차샷 일관,
    마커 누출 0, 마네킹감 0.
- **실외 레인 v1**:
  - 시점: wide 무인물 샷(S4_Shot1)은 ENV(항공 plate) prior 가 지배 — temp 도
    항공 유지. **close+인물 샷(S11_Shot3)은 prior 완전 탈출**(eye-level 클로즈업,
    계단/콘크리트 정합, 인물 1 정확). 즉 시점 실패는 "wide 무인물 establishing"
    특이적.
  - C 경로 전파: S4_Shot1 final_C 에서 **군중은 완전 제거**(bg_regen 무인 계약
    작동) but **시점은 윤곽이 동결**(Codex 예측 실증 — contour 는 temp 오류를
    고정). 교정은 temp 이전에 이뤄져야 함 → v2 계약 검증으로.

## v2 계약 검증 (실외 1.5라운드)

- S4_Shot1 temp_v2: **3중 개선 확인** — ①군중→0(PEOPLE COUNT 계약 작동)
  ②시점 드론→테라스 인접 저고도(수평선·스카이라인 가시, eye-level 계약이 항공
  prior 를 실질 격파 — 완전 지면높이는 아니나 샷 사용 가능 수준) ③topology 복원
  (지붕 있는 옥탑방 구조, 물탱크/빨랫줄/건조대/철문/계단 보존).
- → **결론: 실외 체인의 결함은 구조가 아니라 계약 부재였음.** 명시적 인원/시점/
  마커 계약 3줄이면 동일 체인이 작동. (production 이식 시 이 계약들을 temp/plate
  프롬프트 표준부에 포함할 것.)

## v2 잔여 관찰

- S4_Shot1 final_C_v2: temp_v2(테라스 높이 근접)보다 다시 고도 상승한 elevated
  establishing 으로 회귀 — bg_regen 이 ENV(plate, 준항공)에 재정박. **계약은 temp
  단계에서 최대 효과, 최종 배경의 시점은 ENV plate 가 끌고 감** → wide 무인물
  establishing 은 plate 자체의 eye-level 화(예: production osl 의 line-art
  sketch-hop)가 여전히 필요. 그 외(topology/무인/재질)는 v2 로 전부 해소.
- S14_Shot4 final_C_m: 마네킹 경유 최종에 마네킹 누출 0. 단 무인물 샷이라
  마네킹 축 검증으로는 약함 — 2라운드에서 인물 샷(S5_Shot3 등)으로 재검.

## 종합 결론 (1라운드)

1. **뿌리(통합 조감 스케치+원기호+영어범례) 개념 성립** — LLM 요소선정 10개
   /23샷 커버, gpt-image-2 범례 신뢰(오탈자 0, readback 10/10×2), fp 정합은
   기존 배치도 I2I(R-B)로 확보. 뿌리 JSON(텍스트 계약)이 전 단계 공통 입력으로
   작동.
2. **실내 체인 = 즉시 유효.** fp변형(카메라 콘+레터)→temp→윤곽/VLM→재생성→최종
   전 경로 성립, fp 기하 정합+정체성 일관+마커 누출 0. 탑레이어 구도 수렴(2장이
   같은 뷰)만 보완 필요(체인 프롬프트에 "구도 복사 금지" 강화 or 뷰별 카메라 지정).
3. **실외 체인 = 계약 3줄(인원/시점/마커) 추가로 대부분 해소**(v2 실증). 잔여
   1건: wide 무인물 establishing 의 plate 시점 — sketch-hop 필요.
4. **경로 비교**: A(직행)도 상당히 강함(실내). B(VLM 텍스트)와 C(윤곽)는 온건한
   차이 — C 는 temp 오류를 동결하는 양날(군중 제거는 재생성 계약이 해냄, 시점
   동결은 C 의 한계). 임시샷의 가치는 "구도 발견"보다 "오류 조기 노출+계약 검증
   루프"에 있음.
5. **총괄 오케스트레이션(그룹 단위 계획 LLM + 뿌리 계약 공유)** 은 안정 작동 —
   단계별 독립 structured 호출 구조가 재현성/디버깅에 유리(Codex 의견과 일치).

## 2라운드 결과 (sketch-hop + 마네킹 재검)

- **sketch-hop (S4_Shot1/S10_Shot6)**: camview line-art 스케치가 top-down prior
  완전 탈출(눈높이 원근/수평선 정확, 계단·철문·물탱크·빨랫줄·건조대 정합) →
  plate_v3 가 그 구도를 photoreal 로 정확 번역(무인·낡음·재질). **plate 시점
  문제 해결 실증** (production osl camview 패턴의 유효성 재확인).
- **★풀체인 항공 회귀 + 원인 격리**: v3 temp/final 이 다시 항공으로 회귀 —
  ENV(plate_v3, 눈높이)가 아니라 **CONTROL(root_marked, top-down)이 prior 를
  재주입**함을 temp_v3 로 확인(topology 는 v1 대비 대폭 개선: 지붕 보존·무인).
  → 규칙: **hop 이후 downstream 의 구도 control 은 반드시 eye-level 스케치로
  교체**(top-down 은 요소 배치 참조로만). v3.1 마이크로 체인(CONTROL=sketch)으로
  검증 — 결과 아래.
- **마네킹 재검 (인물샷)**: 실내 S5_Shot3 final_C_m = 마네킹 누출 0, 정체성
  유지, 포즈/접촉 자연 — final_C 대비 개선/오염 모두 불명확 = **중립·무해**.
  실외 S11_Shot3 결과는 갤러리에서 판정.

## v3.1 최종 판정 + 실외 establishing 정답 조합

- final_B_v31(CONTROL=sketch): elevated establishing 으로 부분 개선(수직 드론
  아님, 인접 지붕 너머 시점) — 그러나 눈높이는 아님. **대비가 결정적**:
  plate_v3(스케치→photoreal 단일 hop)=눈높이 유지 성공 vs temp(nb2) 경유 즉시
  재상승. 콘텐츠 자체("~외부 전경")의 조망 prior 가 nb2 재해석마다 작동.
- **→ 실외 wide 무인물 establishing 의 정답 조합 = "sketch-hop + A(직행,
  임시샷 생략)"**: root_marked → camview line-art → photoreal plate = 그대로
  최종 배경(무인물이므로 final≈plate). 사용자 원설계의 "임시샷 생성 여부도
  실험" 질문에 대한 답 — 실외 wide 무인물=생략이 정답, 실내/인물/근거리
  샷=임시샷 유용(오류 조기 노출+구도 발견).
- S11_Shot3 final_C_m(실외 인물 close+마네킹): 정체성 유지·마네킹 누출 0·포즈
  자연 — 인물샷 마네킹 경로 무해(개선은 불명확: 중립).

## 비용/호출 (전체 최종)

- **LLM 15회 + 이미지 102회(gpt-image-2 56, nb2 46), 이미지 오류 0**,
  추정 비용 ~$20-25. runlog.jsonl 이 SOT. 갤러리 6섹션(v3 포함) 8897.

## 3라운드 — 사용자 육안 피드백("항공뷰 전부 이상, 외부 옥탑방 엉터리") 진단

- **원인 확정: 뿌리의 기하 앵커 부재.** 외부 fp(fp_l03)가 이미 정답 top-down
  배치를 갖고 있음 — 주거동(Private Zone)=지붕의 동측 ~40% 실질 주거동,
  물탱크 NW, 약초 평상 중서부, 현관+외부 계단 SE 모서리. 그런데:
  - production 통합 배치도: 넓은 마당 중앙의 작은 오두막 + 물탱크 NE + 계단
    SW = fp_l03 과 거의 전부 불일치/반전(+실내 노출). ★production 자체 결함.
  - root_A = 자체 발명 / root_B = 위 배치도 상속 → **어느 뿌리도 fp_l03 을
    쓰지 않음** → 실외 하류 전체가 '창고 오두막'으로 붕괴(사용자 판정 정확).
- **처방 = root_C**: 외부 fp 를 기하 SOT 로 직접 I2I 재스타일(존→실표면 번역:
  주거존→민지붕면·개방존→테라스·설비존→물탱크/빨랫줄·경계존→현관+계단 위치
  고정, 실내 fp 는 경계 개구부 확인용만) + 기존 요소기호/범례 유지. 앵커 fp
  선택도 데이터 규칙(실외 loc 중 샷 최다 loc 의 fp). → s7_root_fp.py, 체인
  재검증(마킹→camview→plate)까지. 결과는 갤러리 §1(R-C)/§4.4.
- production 이식 시사점: aerial(배치도) 생성이 mixed 그룹에서 실내 fp 만
  첨부하고 **외부 공간 fp(surface_role site/exterior 류)를 앵커로 쓰지 않는
  것**이 근본 결함 — fp_l03 급 자산이 있으면 그것이 기하 SOT 여야 함.

## 3라운드 결과 (root_C 검증 — 성공)

- **root_C**: fp_l03 배치 재현 성공 — 주거동 동측 ~40%(실질 주거동), 물탱크+
  세탁기 NW, 빨랫줄 북측, 약초 평상 중서부, 철문+현관 SE, 외부 계단 SE 하강,
  골목+차량, 실내 미노출, 범례 완벽(readback 10/10, interior=False).
  기존 root_A/B 의 '마당 중앙 오두막' 오류 전부 해소.
- **plate_C**: 실험 최초의 진짜 지면 눈높이 실외 plate — 계단→상층 철문→옥상
  레벨(물탱크/빨랫줄/건조대)의 수직 위계가 처음으로 올바르게 표현됨.
  잔여 흠: 라인아트 상속으로 재질 다소 일러스트풍(스타일 강화 여지).
- **결론: 실외 붕괴의 근본 원인=뿌리의 기하 앵커 부재였고, 외부 fp 직접 앵커
  (root_C) + camview sketch-hop + 직행 조합으로 해소.** 이식 후보 3(sketch-hop)
  의 전제 조건으로 "외부 fp 를 aerial 기하 SOT 로" 항목이 추가되어야 함.

## production 이식 후보 (사용자 결정 대기 — 실험 증거 기반)

1. **실내 fpvar control**(카메라 콘+엔티티 레터 → 임시샷/최종 ref): 즉시 유효.
2. **실외 3줄 계약**(PEOPLE COUNT/EYE_LEVEL/MARKER≠사람): temp/plate/final 표준부.
3. **wide 무인물 establishing 전용 sketch-hop**(osl camview 패턴 재사용) +
   임시샷 생략(직행): 게이트=구조 신호(무인물+wide)로 한정.
4. 탑레이어=zone/material master 재정의(카메라 다양성은 fpvar 가 담당).
5. C(윤곽)=temp 게이트 통과 시 refinement 로만. 마네킹=무해하나 효용 중립(보류).

## 블록 세트장 실험 (s12~s14, 2026-07-05 — 사용자 신규 지시 피벗)

- **개념**: LLM 이 관련 씬 11개 **원문 전체**+멤버+전 샷을 취합 → 요소/상대크기/배치
  구조화 JSON(모든 요소 evidence 인용 필수, 추정=inferred 뱃지) → **결정론 코드(PIL)**
  가 블록 세트장 도면 렌더(AI 이미지 아님). v1(s12, 이름 라벨)→사용자 피드백→
  v2(s13): 원문자 마커(구조=알파벳/개구부·설비=번호), 높이=색 레이어(LLM 이 4레이어
  정의+한국어 설명 — 갤러리에 원문 게시), 옥탑 창 개수 2개를 씬 인용으로 회수
  (S#5 거실 작은창/S#18 침실 커튼창), 건물 전면창=추정 표기. blockset.html.
- **블록도면→생성(s14)**: 캔버스 크롭+IMPORTANT LAYOUT FACTS(결정론 요약: 레이어
  높이·마커 의미·부착변·분산 계약) → gpt/nb2 × 평면도/실사.
  - v1: 평면도가 3D 매싱으로 출력(사용자 지적)+창 4개 한 줄 붙음 → v2: 실내 fp 를
    **드래프팅 스타일 레퍼런스**로 첨부(내용 복사 금지)+3D/축측 금지 → 두 엔진 모두
    **순수 2D fp 도면 성공**(문 스윙/계단 발판/창 틱), 창 분산 계약 작동.
  - **★엔진별 주석 계약 (3단 A/B 로 확정)**:
    - gpt-image-2: 마커 박힌 컨트롤+ID 포함 FACTS 로도 suppress 지시만으로 누출 0.
    - nb2: ①마커 캔버스→원형 배지/텍스트 라벨 그대로 렌더 ②클린 캔버스+ID 텍스트→
      **텍스트 ID "(A)/(1)" 를 라벨로 렌더**(누출원=텍스트 토큰) ③클린 캔버스+
      **ID-free 서술 FACTS**→누출 0 (잔여: 평면도 N 나침반 1개, 도면 관례).
  - production 시사점: 컨트롤 주석 정책은 엔진별 분기 — gpt=주석 유지+suppress,
    nb2=무마커 컨트롤+순수 서술 텍스트. nb2 실사 질감(녹색 방수 옥상/벽돌/판넬)은
    4장 중 최상 — 질감 SOT 후보, gpt=기하·계약 준수 SOT 후보.

## 6라운드 lane 표 (root_v3a 기준 — production router 설계용, Codex 제안)

| 샷 | staging 카메라 | 승자 lane | 근거 (육안) |
|---|---|---|---|
| S4_Shot1 (wide 무인) | 45m 부감 establishing | **direct ≈ hop 동률 → direct(1콜 절약)** | 두 lane 모두 부지 전체 부감을 fp 정합으로 번역, 1~3R '오두막 붕괴' 해소. eye-level 계약이 staging 을 침해하지 않음(staging 승) |
| S10_Shot6 (medium 무인) | 실내 창가(반사 특이) | **hop** | hop=실내 시점+창밖 옥상 기하 정합까지 추종, direct=root 실외 prior 에 갇혀 staging 무시 |
| S11_Shot4 (wide 무인) | 옥상 랜딩 눈높이 정면 | **hop** | hop=정면 직시 staging 정합, direct=3/4 측면 이탈(성립은 함) |
| S11_Shot3 (close 1인) | 계단 중간 face-height | 생성 완료·판정 보류 | 사용자 지시로 육안 중단 (temp/final_C 는 잠정 우수) |
| S13_Shot3 (medium 2인) | 지상 차량 옆 | 생성 완료·판정 보류 | 〃 (새 뿌리 지상부 커버리지 첫 소비 케이스) |

- 잠정 라우터: 부감/원거리 establishing=direct, 눈높이·특수 카메라=hop, 인물=temp 경유(+final_direct 대조 데이터 확보됨). 확정은 사용자 육안 후.
- **v3 상세화 (사용자 지적 "그대로 그리지 말고 상세화")**: 블록=골격만(위치/크기/개수),
  실도면 발전 계약(이중선 벽/파라펫 코핑/계단 발판·난간·랜딩/문짝+스윙/벽 속 창틀/
  탱크 받침/평상 살/빨랫줄 기둥/포장 줄눈/연석, 밀도 기준=실내 fp, 근거=장소 데이터,
  no compass) → **두 엔진 모두 실도면 품질 성공**. gpt=배치 충실도 최상(대문 SW 유지),
  nb2=지붕 상세 풍부하나 배치 drift 2건(대문 중앙 이동, 전면창 2열화 — 단 2열은 실제
  다층 건물과는 오히려 정합). nb2 나침반은 "no compass" 계약으로 소거 확인.
- **v5 프롬프트 중립화 (사용자 절대 규칙 위반 지적 → 수정)**: v3/v4 프롬프트 템플릿에
  이 장소 고유 요소(round tank/low platform/clothesline, "rooftop dwelling")가 하드코딩돼
  있던 위반을 전수 제거 — 상세 규칙을 **kind 스키마 키(KIND_DETAIL_RULES)** 로 일반화하고
  layout 실재 kind 만 데이터 주도 나열. s9/s10/s12/s13/s14+override 전부 중립화(grep 전수
  검증 0). **v5 재생성 결과 품질 동등 유지** = 구체성은 데이터(layout name_en/loc/override)
  가 공급함을 실증. 부수 효과: "no posted papers/notices" 중립 계약으로 nb2 전단지 누출도
  해소. 잔여 관찰: nb2 상부 유닛 재질 해석 편차(판넬풍 — 데이터 "낡은" 해석 범위).

## nb2 체인 (s16 — 블록 작도까지 nb2 에 위임, 2026-07-05)

- **A nb2 블록 다이어그램(텍스트만으로 작도)**: 형태 요구 충족 — 플랫 단색 블록,
  3D/그림성 0, 구조 관계 판독 양호. 단 ①no-text 계약 재무시(모든 블록에 이름+kind
  라벨 작성 — nb2 고질) ②배치 오류 2건(물탱크·평상을 이웃 매스 위에 배치).
- **B nb2 상세 fp**: "참조만(모사 금지)" 계약이 이미지 prior 에 짐 — A 구도를 거의
  트레이스, 라벨·배치 오류 상속. 상세도 자체는 양호(타일/문 스윙/스위치백 계단/h 라벨).
- **C 실사**: gpt=**라벨 미누출+3층 가정 반영+탱크 위치를 텍스트(FACTS/설명)로 자가
  교정** — 품질·정합 최상. nb2=라벨 미누출(의외, 자기 fp 의 텍스트는 photoreal 전환
  시 소거)+질감 우수하나 **A 오류 상속**(탱크=이웃 옥상 유지, 계단 2개 중복 렌더).
- **학습**: nb2 파이프라인은 이미지 prior > 텍스트(업스트림 오류가 하류 전파),
  gpt 는 텍스트가 이미지를 교정. nb2 를 다이어그램 작도자로 쓰려면 A 단계에
  **배치 readback 검증 게이트**(오류 시 재시도) 필요. nb2 라벨은 억제 불가지만
  하류 photoreal 단계에서 suppress 가 실제 작동하므로 치명적이지 않음.
- **C' 실사 v2 (도면=구조만+실물 재질, 사용자 지적 "회색 시멘트 건물" 해소)**:
  도면의 플랫 색을 재질로 복사하던 문제를 "STRUCTURE ONLY + 도면 색≠재질" 계약과
  photo_appearance override(실존 지역 전형 낡은 다세대+옥탑 재질 — 사용자 지시,
  데이터 주입)로 해소. gpt=적벽돌+몰딩+녹지붕 옥탑, nb2=외장 타일 정형(최고 전형성)
  +탱크 정위치(v1 오류 해소). 구조 관계는 유지. 관찰: 둘 다 몸체 2층 렌더(설명의
  '3층 가정'과 편차 — 가정 승격(고정 지시) 여부는 선택지).
- **C″ 생활감 3종 (사용자 "사람 사는 곳 같지 않다" — 물품 열거 하드코딩 금지 준수)**:
  계약을 "무인+가독 텍스트 금지+스토리 특정물 금지, 단 실주민의 일상 흔적을 모델이
  자유 창작(종류/양/배치 모델 선택)"으로 일반화. ①gpt=성공(3층 반영+옥상 화단/빨래
  /실외기, 마당 살림, 전신주, 주차 차량 — 라벨 0) ②nb2=소품 연출 최고(화분/바구니/
  신발/호스)나 자기 fp 의 라벨이 확률적 재누출(v2 에선 없던 것 — nb2 라벨 fp 는
  하류 누출이 확률적임을 확인, 무라벨 fp 필요) ③★gpt Responses(web_search+
  image_generation, 검색 실수행 확인)=**전 실험 최고**: 방범창살/실외기/신발 선반/
  계량기/분리수거/우편함 급 실물 디테일, 구조 유지, 라벨 0. 웹검색 그라운딩이
  리얼리즘을 결정적으로 올림 — production 후보(비용/지연 확인 필요).
- **A′ 블록 구조도 = LLM 프롬프트 저작 (사용자 정정: 내 FACTS 주입이 아니라 LLM 이
  씬을 보고 '코드풍 다이어그램'을 그리게 하는 프롬프트를 직접 저작)**: s17 —
  입력=씬 원문 전체+멤버+제작자 정정만, LLM 이 요소 선정·상대 배치·높이 톤 규칙까지
  서술한 이미지 프롬프트 저작(EN+KO, 근거 notes). 결과: **nb2 텍스트 라벨 0 최초 달성**
  (플랫 블록 구조도 성립, 철제 계단/탱크/빨랫줄/마당/골목/이웃 관계 정합) + gpt 대조도
  성립(더 크리스프). LLM 은 옥탑방 내부 구획(거실-주방/방2/욕실)도 구조 파악용으로
  포함하기로 판단. 잔여 미세: nb2 높이 톤 순서 일부 어긋남·유사 입체 잔재.
  → 구조도 생성의 확정 레시피 = "LLM 씬 직독 프롬프트 저작 → 이미지 모델 작도"
  (결정론 코드 렌더/FACTS 주입 방식 대체).
- **A″ 3단계 프롬프트 분리 계약 (사용자 강한 질책 반영 — 최종 확립)**: A′ 실패 원인=
  저작 시스템이 단계 경계를 안 그어 fp 관심사(선/음영 미학)+실내 구획이 블록 프롬프트에
  혼입(저작 LLM=gpt-5.5). 수정: 저작 계약에 "3단계 중 1단계 전용, 후속 단계 관심사 금지,
  건물=단일 솔리드 블록(내부 방/벽/설비 절대 금지), 미학 지시 0, 플랫 톤 규칙 1개,
  80-150단어" 명시 → **blocks3: nb2/gpt 모두 '코드가 그린 것 같은' 순수 플랫 블록
  다이어그램 달성**(내부 0·텍스트 0·3D 0, 철제 계단 경로/마당/골목/이웃 관계 정합).
  잔여 미세: 높이 톤 규칙 부분 준수(구조 판독 무지장). ★규칙: 블록용/fp용/실사용
  프롬프트는 완전 분리 — 각 단계는 자기 관심사만 담는다.
- **A‴ 최종형 (사용자 확정: 스타일=s16 A형 플랫 + 내용=추출 구조 lean 전달)**: s18 —
  layout JSON→lean 텍스트(이름·상대 위치·크기·부착/연결만, kind 괄호/마커/미학 0)
  +STYLE_FLAT(베벨/하이라이트/그라데이션 금지 명시)→blocks4: **3D끼 0 달성, 배치
  정확**(탱크 독립 원 정위치·스위치백 계단 SE→마당). nb2 는 "이름: 위치" 리스트를
  주면 라벨을 그림(확정 패턴)이나 A형 스타일 자체가 사용자 승인이고 구조 파악용
  중간 산물로 유용 — **fp 단계(B′ fp2)에서 라벨 전파 0 확인**(계약이 걸러냄).
  ★최종 파이프라인: LLM 추출→lean 텍스트→nb2 블록(A형)→fp(참조만+층수 설명+
  스타일 ref)→실사(구조만+실물 재질+생활감/웹검색). 단계별 프롬프트 완전 분리.
- **A⁗ containment 수정 (2026-07-05 저녁 — 사용자 발견 "물탱크·평상이 옥상에
  없다, 강제 주입 아니냐")**: 역추적 결과 주입 아님 — 시나리오 실재(S#10 원문
  "옥탑방 옥상. 물탱크. …평상에 놓인 말린 석창포", 장소 멤버 L03에도 존재)이고
  LLM 추출(gpt-5.5) 좌표도 terrace 내부로 정확(tank 31,30 / platform 25,55 ⊂
  terrace 20,20~77,70). **범인=결정론 lean/FACTS 변환의 containment 소실**:
  `_pos_words`가 캔버스 전역 위치 단어만 만들고(`"north-west area"`→모델이
  캔버스 좌상단=이웃 옆에 렌더), `_nearest_block_side`는 변 3.0 이내 개구부
  전용이라 블록 안 깊숙한 설비에 아무 소속 서술이 없었음(빨랫줄만 우연히
  rooftop room 변에 가까워 생존). **수정**: `_contains`/`_containment_phrase`
  (순수 rect 포함 기하, 최소 포함 블록 기준 상대 위치 "placed on the roof
  terrace, in its north-west part") — s18 lean+s14 summary_lines(fp/실사 FACTS)
  양쪽 적용, 시나리오 중립(이름/kind 무관). 부수 개선: room↔terrace↔villa 계층
  +entry gate 소속 명시. **재생성 결과: blocks4/fp2 4장 모두 tank/platform 옥상
  내 정위치**, fp 하류 전파 성공(철제 계단 override·층별 창 분산 유지, 라벨 0).
  구본은 `*_prev.png` 보존.
  - **정정**: 직전 기록 "blocks4 배치 정확(탱크 독립 원 정위치)"는 과대 판정
    — 실제로는 s16 A 의 배치 오류(탱크·평상=이웃 위)가 지속되고 있었음.
  - **운영 함정 (재발 방지)**: forest_lib `img_gpt/img_nb2` 는 **out_path 존재
    시 skip** 캐시 — 프롬프트/코드 수정 후 재실행해도 조용히 no-op 되어 구본이
    그대로 남는다(1차 재생성 시도가 통째로 skip 된 실증). 재생성은 기존 PNG 를
    `_prev` 로 치우고 실행 + runlog 에서 skip 아님/새 프롬프트 포함(dur_s 존재)
    을 검증할 것.

## s19 공간지각 재설계 (2026-07-05 저녁 — 사용자 재정의, 판정 대기)

- **사용자 재정의(강한 질책)**: A⁗ 의 containment 부착도 결국 "요소 나열+위치
  단어" — 정답이 아님. 이 다이어그램들은 실물 이해가 아니라 **구조만** 그리는
  것이므로, 필요한 것은 사람이 공간을 판단하는 **공간지각**: 물체들 간의 관계,
  크기/규모, 무엇이 무엇보다 높고, 얼마나 떨어져 있는지. **초기 LLM 부터 그것
  중심으로 생성**해야 하고(몇 층 정도, 옥상에서 옥탑방의 상대 위치/크기, 옥상에
  무엇이 있는지 — 상세 좌표 불필요, 계단 위치 등), T2I 에게 요소가 뭔지 설명할
  필요 없음(간단한 블록). **bd 를 거치지 않고 fp 도 같은 공간 정보로 직행** —
  프롬프트(산출별 스타일)는 다르되 **공간 배치 정보는 동일**해야 함.
- **구현 (s19_spatial.py)**: Stage1=gpt-5.5 가 씬 원문 전체+멤버+제작자 정정에서
  관계 중심 서술 12-22줄 생성(포함/상대 위치/상대 크기/층수·높이/이격/동선,
  좌표·치수·설명·재질 금지, 시점 1개 고정, 추정=inferred_notes 분리, evidence
  인용, EN+KO). Stage2=같은 줄들(bullet)을 공유, bd=STYLE_FLAT(s18 재사용)/
  fp=STYLE_2D+STYLE_REF_NOTE+실내 fp 스타일 ref(s15 재사용) 각각 T2I 직행.
  산출 spatial_{bd,fp}_{gpt,nb2}.png + spatial.html(KO/EN 대조+evidence 표+
  부분 게시). Stage1 산출: 16줄+추정 6+evidence 12, 철제 계단 정정 반영,
  "골목→문→마당→뒤쪽 계단→옥상→현관문" 동선 포함. 4장 실생성(runlog dur 검증).
- **판정 = 사용자 전담** (지시: "육안 판정은 내가 해 니가 하지마") — Claude 는
  이미지 판정 금지. 사용자 육안 대기.

## s24 공간 단서 사전 wave (2026-07-08 새벽 — graph/audit/chain/repair 완주, 육안 대기)

- **설계(Codex 3포인트 비판적 수용)**: 사전 md(plans/spatial_evidence_v1.md,
  SOT)를 "프롬프트에 넣는 긴 메모"가 아니라 **일반 스키마 evidence graph** 로
  구조화(코드=스키마 처리만, 구체 내용=데이터 주입) / 검증 4분류(supported /
  plausible_inference 보존 / unsupported_invention / contradiction) /
  repair=발명·모순만 / 실험 체인 먼저, 생성측 주입은 단서 요약+금지 모드
  목록까지만(과지정=또 다른 할루시네이션 경고 수용).
- **graph**: claims 34(확정 18=사전 그대로 / 허용 추정 9=치수·범위는 검증
  경계로만 / 금지 발명 7=사전 5+override 유래 도면색→재질 2) + 체인 9링크.
- **audit(LLM 의미 분류, 코드 substring 판단 0)**: 실외 8샷×(shot_description
  +staging+still prompt)+s22 관계 데이터 — findings 총 289, 수정대상 92.
  발명 5건 전부 포착: ★S11_3 concrete staircase=contradiction(사용자 철제
  정정 모순), 45m·안개·sickly amber·wet/damp·무드어(ominous 등)=
  unsupported_invention. 낡음/저층/전단지 등은 supported/plausible 로 보존.
- **chain(결정론)**: 사전 체인 링크→LLM 이 s22 요소 id 쌍 매핑→코드가 솔버
  좌표 접촉 간극 검증 — **8/9 PASS**. 잔여 L02 FAIL = 사전 v1 표기 모호성
  진단(문자적 화살표 "계단 하단→대문"은 실제 마당 경유 route — L03+L04 로
  위상 커버). 멀티 요소 공간은 "근거 claim 이 지목한 대표 요소 선택" 조항으로
  해소(L08/L09).
- **repair**: 스틸 프롬프트=최소 치환(before_quote 실재 assert, S4_1 2·
  S10_5 3·S11_4 4·S13_3 2·S17_1 4건) → nb2 수리 스틸 5장(전건 attempt=1,
  refs=remake 확정 구성 그대로) / staging·desc=정정 팩 65건(적용하지 않고
  provenance 보존 — override 패턴, ★S11_3 "narrow concrete staircase"→
  "later-added steel retrofit stair" 포함).
- **계약 명문화(goal 3)**: EVIDENCE_BOUND_CLAUSE — 모든 구체 주장은 (a)단서
  재진술(evidence_id 인용) 또는 (b)직접 파생 구체화(inferred 표시), 정정
  override 최우선, 단서가 침묵하면 침묵(모델 재량). production 이식은 실험
  완성 후 사용자 GO 별도.
- **중립성**: s24 계약 grep — 장소/작품 고유 토큰 0(히트는 "concrete claim"=
  구체적 주장, 일반 발명 모드 분류 예시 5종뿐). 구체 내용 전부 데이터 파일
  주입.
- **갤러리**: evidence.html(8897) — A graph 표 / B audit 4색 표 / C 체인
  접촉 검증 표 / D 샷별 3열(원본/현행 remake/수리본)+치환·정정 팩 표+수리
  프롬프트 전문. **육안 판정=사용자 대기.**

## s25 main v16 팩 canary (2026-07-08 새벽 — 사용자 "main 을 고쳐야" 지시, wave1)

- **main 반영(신규 팩, v15 불변)**: prompts/_base/shot_extract/16.202607080045
  + shot_staging/16.202607080045. 근원 확인: shot_extract v15 34행이 "배경
  시각 특징(안개,…) 포함"으로 안개를 예시 지시 / shot_staging v15 가 환경
  프레이밍 예시(웅덩이/빗물/안개)+lighting_mood 무근거 강제 저작. v16=세계
  사실 근거 경계(연출=재량, 세계 사실=원문 근거시만·무근거=침묵·증식 금지·
  수치 금지·정정>텍스트)+근거 위계(스타일 요약=톤 참고≠세계 사실 근거,
  플로우 어휘=카메라 계승만).
- **canary(s25, production 경로 직접 호출)**: staging 6샷(S4/S11×2/S13×2/
  S17) — 45m·앰버·안개·wet/damp·concrete·ominous 전부 소멸+연출 언어 유지.
  extract 재추출(S13/S17) — 안개·호박색 소멸. 체인 canary(v16 desc→v16
  staging) — S17 도 "bluish pre-dawn dimness"로 해소=세탁 차단 실증.
  갤러리 v16_canary.html(8897), plans/main_v16_canary.json(+_r1 백업).
- **★발명 최상류 발견(wave2 후보, 사용자 판단 지점)**: ①visual_world_rules
  t2i_context 가 "damp fog, muted blue-gray shadows, sickly amber practical
  lights"를 프로젝트 룩으로 선언(안개·앰버 증식의 진짜 SOT — 스타일 룩의
  창작 재량 vs 물리 사실 고정의 경계 문제) ②scene_camera_flow 가 "steep
  concrete stairwell"(S11)/"푸른 새벽 안개"(S17) 저작(→staging 플로우 계승
  으로 복사). 소비측(v16)은 방어 완료, 생산측 계약 수정은 별도 wave.
- Codex 코드 리뷰 요청 발송(%1). 커밋=사용자 GO 후.

## s26 wave2 canary (2026-07-08 새벽 — 사용자 "1,2 진행해": wave1 커밋 + wave2)

- **wave1 커밋**: df88668b (fix(prompts): 발명 경계 wave1 — v16 팩 2개,
  Codex APPROVED_TO_COMMIT).
- **★반전 발견**: 기획서 visual_concepts="안개가 자욱하고 피비린내 나는
  가상의 섬 금월도" — 안개는 순수 발명이 아니라 **섬의 기획 컨셉**. 진짜
  문제=visual_world_rules t2i_context 가 이를 "모든 씬 공통 사실"(damp
  fog+sickly amber practical lights)로 전역 고정 → 인천 변두리(옥탑 유닛)
  장면까지 무차별 주입. s24 의 인천 씬 안개 제거 판정과 정합(그 장면들엔
  근거 없음).
- **wave2 팩**: visual_world_rules/10.202607080130(전역 룩=색감 팔레트·
  질감·장르 톤만, 날씨·특정 광원의 전역 사실화 금지 — 장소 비주얼은 씬별
  배경 단계가 처리, 조명 무드=명도·대비 느낌 수준) +
  scene_camera_flow/2.202607080130(카메라 기하만, 요소 지칭=재질어 없는
  일반어, 원문 명시 세계 사실은 허용, 하류 전파 경고).
- **canary(s26)**: t2i_context old→new = "damp fog/sickly amber" 소멸,
  "muted colors, dense shadows, grounded textures, crimson-and-gold
  accents, K-occult thriller 톤" 유지 / camflow S11 concrete·S17
  concrete+안개+mist 소멸, 카메라 기하 서술 품질 유지. wave2_canary.html
  (8897).
- Codex wave2 리뷰 요청 발송. 커밋=리뷰 후(사용자 GO 는 "1,2 진행해"로 기수령).

## fresh E2E v16팩검증 — 텍스트 39스텝 완주 (2026-07-08, 프로젝트 ed02e5c1/ep 2ed8f997)

- 사용자 지시: "이미지 말고 프롬프트까지 텍스트만". run-all analysis 는
  cross-category 가드(fp_render 의존 13스텝: scene_detail/t2i_review/
  background_prompt/projection card/readback 등)로 거부 → 단일 스텝 순차
  러너(scratchpad/e2e_v16_seq_runner.py, order 필드 정렬)로 fp 비의존
  39스텝 완주(38 completed + shot_essence not_applicable, 실패 0).
- **발명 어휘 old(b0ad5c18)→new 대조 (원문 근거 체크 포함)**:
  · visual_world_rules t2i_context: "damp fog+sickly amber practical
    lights" 전역 선언 → 소멸+"without globally imposing any specific
    weather, atmosphere, or light source" 명시 (v10 PASS)
  · shot_extract: 안개7/호박색5/시멘트4/축축1 → 안개6(전부 원문 근거 씬:
    S#24 소나기·S#26 포구·S#30 바다)+젖은1(비 근거), 무근거 0 (v16 PASS)
  · scene_camera_flow: concrete6/cement2/fog21/mist7/damp/amber →
    안개·fog 10(전부 근거 씬), 무근거 0 (v2 PASS)
  · shot_staging: amber68/damp46/wet47/fog34/mist10/concrete8/45m →
    fog12(근거 씬만)+오탐 2("placement" substring)+ominous 1(연출 감정어,
    광원 미지정 명시 동반) — **세계 사실 발명 0** (v16 PASS)
- 팩 적용 증거: prompt_loader 파일 latest 해석(v16/v10/v2)+DB row 부재+
  산출 행동 증거. llm_call_log 는 이 텍스트 경로에 미기록(0행).
- **남은 경계(사용자 결정)**: scene_detail(최종 T2I 프롬프트)까지 가려면
  floor_plan_render(이미지, 소량) 선행 필요 — 지시 대기.

## wave3 — scene_detail 경계 + 제작자 정정 채널 (2026-07-08 오후, 사용자 GO)

- 동기: fresh E2E 최종 t2i 에서 무드 발명 전멸했으나 S13 "concrete stair"
  재발명 잔존 — scene_detail 계약 무경계 + 정정 주입 채널 부재.
- 구현: scene_detail v37 팩(세계 사실 근거 경계 절대 규칙+CREATOR
  CORRECTIONS 최우선) / app/core/creator_corrections.py(프로젝트 단위
  creator_corrections.json 로더·저장·블록 포매터 — 내용=데이터, 정정 0=
  빈 블록=byte-identical, malformed=fail-fast) / GET·PUT
  /projects/{pid}/creator-corrections / 주입 3사이트(scene_detail·
  shot_staging kwarg·shot_extract).
- 버전 핀 정리: SCENE_DETAIL_PROMPT_VERSION 37.x + version_registry 4모듈
  bump + 테스트 핀 9파일(★wave1/2 미갱신 부채 발견·정리 — 그때 관련 회귀
  미실행 실책. 교훈: 프롬프트 팩 추가 시 반드시 -k 핀 회귀 실행).
- 검증: 신규 결정론 11 passed + 관련 회귀 485 passed. 잔여 6 failed =
  HEAD worktree 격리 재현으로 pre-existing 증명(06-18 entity_extractor
  v14 팩·07-02 육안6결함 wave 팩의 미갱신 핀 — 별건 부채).
- live canary: uvicorn 재시작(38233 — 부팅 recover_stale_progress 가
  outdoor_site_layout 자동 재개 확인) → 정정 PUT(철제 계단) →
  redo-shot S13_3/4 → concrete 소멸, S13_3 정정 그대로 반영("external
  metal extension stairway with open steel treads…"), S13_4 재질 침묵.
- ★사고 기록: git stash 실수로 wave3 diff 일시 stash — pop 복원 완료.
  worktree 격리가 안전한 검증 수단(stash 검증 금지).
- Codex 리뷰 요청 발송. 커밋=리뷰 후.
