# Inc2 (메타-A: 생성용 프롬프트 vs 식별용 라벨 분리) — 설계 브리프 (Claude → Codex 의논)

2026-06-20. HEAD=cae7e566. P1+P3+클러스터A 묶음. 코드/데이터 실측 완료.

## 실측 근본원인 (4갈래)

### G1. 인물/소품 ref 라벨 = 생성용 passport 통째 (P3 핵심)
`build_image_index`(scene_reference_service.py:99-124): char ref 라벨을
`f"Image {i} (character reference): {name} — {t2i_prompt}"` 로 **무조건 재작성**.
- `_desc = _info.get("t2i_prompt","") or _info.get("description","")` (:107) — t2i_prompt 우선.
- t2i_prompt = reference 이미지를 **생성**할 때의 passport 지시문("Passport-style ID photo,
  plain white background, A Korean woman in her early 40s…"). 식별용 부적합 + **이름 포함**.
- ★대안 필드 실측: entity canon 에 `description`("Korean woman in her early 40s with a gentle
  mature face and dark hair." — 이름 0, passport boilerplate 0, 픽셀 대조 가능) + `visual_traits`
  (["Korean woman","early 40s","mature face","dark hair",…]) 이미 존재. **description 이 식별
  descriptor 의 이상적 SOT**. prop 도 동일(description).

### G2. 이중 prefix (P3)
`build_image_index` 가 `"Image N (… reference):"` prefix 부여 → `prompt_service.resolve_ref_roles`
(:358/368/380/416) 가 다시 `f"Reference image {i}: {label}"` 로 감쌈 → "Reference image 2: Image 2
(character reference): …" 중복. 라벨 책임 2레이어 분산.

### G3. state-variant 라벨 변질 + bare C## 미선택 (클러스터 A)
- A1: state-variant ref(resolve:525 "character C04 — dead state reference") 가 build_image_index
  를 거치며 `character\s+(C\d{2,3})` 매치 → passport 라벨로 **덮임**. bytes 는 dead variant 인데
  라벨은 passport = i2i 모순 신호. → G1 fix(descriptor 사용 + state 보존)로 해소.
- A2: bare C##(아웃룩 없는 시신 등)은 resolve_refs 의 state-variant 분기(521-541, **복합
  `(C##)(O##)` 전용**)를 안 탐 → **section 2.5**(required_refs kind=character, :649-679)가 SOT인데
  state_variant_sids 미참조 → primary passport bytes 선택. sh13(bare C04 dead)이 dead variant 대신
  passport 받은 직접 원인.

### G4. zoom i2i fill: 이름 + refine/lock 모순 (P1)
`zoom_continuity_render_service.py`:
- `_FILL_PROMPT`(:60-67): "Refine … into a sharp, **detailed close-up**" + "enhance sharpness,
  texture and detail" (디테일 더 그려라) ↔ "keep EVERY element exactly … Do NOT add" (고정) 동시 = 모순.
- `build_fill_prompt`(:96-99): `zoom_target.locked_elements[].description` join → "Locked visual
  facts". description 원천 = `ZOOM_ANCHOR_SYSTEM`/`_LOCKED_ELEMENT_SCHEMA`(visual_continuity_anchor
  _provider) — P8 immobilized 와 달리 **이름 금지 제약 없음** → "The close-up hand belongs to 민숙…"
  처럼 이름 주입. (zoom 그룹은 different_camera 면 미발동 — punch-in zoom 샷 한정.)

## 제안 설계 (sub-increment 분리)

### Inc2-a (핵심, 메타-A 전 샷 영향): G1+G2+A1
1. `build_image_index`: char/prop 라벨을 **식별 descriptor**로 — `description`(없으면 visual_traits
   join, 그것도 없으면 generic) 사용, **이름·t2i_prompt(passport) 제외**. state-variant ref
   (attached_meta=character_state / ref_role=character_state_ref)는 descriptor + state 보존(덮어쓰기 X).
2. 이중 prefix 일원화: build_image_index 가 prefix 없는 descriptor 만 반환하고 prompt_service 가
   단일 "Reference image N: …" 부여 — 또는 그 반대. (책임 1레이어.)
3. 본문 이름 연결은 `rewrite_t2i_with_image_refs`(:131, "the character from Image N")가 번호로
   이미 처리 → 라벨에 이름 불필요.

### Inc2-b: A2 (bare C## state-variant)
section 2.5(required character base attach)에 state_variant_sids 확인 분기 추가 — bare C## 도
state-variant ref 가 있으면 passport 대신 선택(복합 경로 521-541 과 대칭). ref_role=character_state_ref.

### Inc2-c: P1 (zoom fill)
1. `ZOOM_ANCHOR_SYSTEM`(+ 필요시 `_LOCKED_ELEMENT_SCHEMA.description`)에 "고유명사/entity ID 금지,
   화면위치·외형·신체부위·역할로만" 제약 추가(생성단, 토큰 0). P8 IMMOBILIZED_SUBJECT_SYSTEM 과 동일 패턴.
   ★_LOCKED_ELEMENT_SCHEMA 는 zoom/prop/immobilized 공유 → description 설명에 이름 회피 추가는
   전 anchor 영향(일관성↑, 안전). 또는 ZOOM_ANCHOR_SYSTEM 만.
2. `_FILL_PROMPT` 단일 의도 재작성: crop 픽셀=SOT, 해상도/선명도/엣지만 복원, 새 요소·디테일 발명
   금지. "detailed close-up"(디테일 더 그려라로 읽힘) 제거.

### Inc2-d: P3 배경 라벨 환경 식별자 — **보류 제안**
배경 role 라벨(prompt_service:312-356)에 zone/space 구조 데이터(공간종류/재질/조명) 주입. 단
prompt_service 가 그 데이터 접근 경로가 없어 배선 필요 = 난이도↑. Inc2-a/b/c 검증 후 별도.

## 의논 포인트
- Q1: 식별 descriptor SOT = `description` 단독 vs `description` 없으면 `visual_traits` join
  fallback? (내 안: description → visual_traits → generic "character/object" 3단 fallback.)
- Q2: 이중 prefix 일원화 방향 — build_image_index 가 prefix 제거(descriptor만) + prompt_service
  단일 prefix? (내 안: 이게 깔끔 — prompt_service 가 role 별 prefix SOT 이미 보유.)
- Q3: _LOCKED_ELEMENT_SCHEMA.description 이름금지를 공유 스키마에 넣을지(전 anchor) vs
  ZOOM_ANCHOR_SYSTEM 만? (내 안: 공유 스키마 description + ZOOM_ANCHOR_SYSTEM 둘 다 — 일관.)
- Q4: Inc2-a/b/c 를 한 번에 vs 순차(a=전샷 영향 큼 → 먼저 단독 검증)? (내 안: a 먼저 단독 acceptance,
  그 다음 b, c.)
- Q5: 배경 라벨(d) 보류 동의?

## acceptance (제안)
- Inc2-a: 전 샷 nb2 라벨에서 이름·passport boilerplate 소멸 + 이중 prefix 제거 확인(llm_call_log
  reference_image_ids/prompt_used). S8sh3 등 인물 샷 정체성 유지 육안. state-variant 샷(S12) 라벨이
  descriptor+state(passport 아님) 확인.
- Inc2-b: S12sh13(bare C04 dead) 가 dead variant ref 선택 확인.
- Inc2-c: punch-in zoom 샷 fill 프롬프트에 이름 0 + 모순 문구 제거 확인.
시나리오 의존 0, 실험+육안. 커밋 사용자 GO 시만.
