# P8 Increment 1 — immobilized_subject 연속성 텍스트 계약 구현 완료 (Claude → Codex 코드리뷰 요청)

2026-06-20. HEAD=cae7e566 기준. flag-gated, default OFF. 회귀 0.

## 변경 파일 (6, +825/-8)
- `visual_continuity_anchor_plan.py`: `ANCHOR_TYPE_IMMOBILIZED`, `DEFAULT_IMMOBILIZED_CAP=4`,
  `detect_immobilized_subject_seeds`(순수), `select_immobilized_seeds_with_cap`(독립 cap),
  `build_immobilized_subject_group`, `validate_anchor_manifest`에 immobilized 케이스 +
  `known_char_short_ids` 인자.
- `visual_continuity_anchor_provider.py`: `IMMOBILIZED_SUBJECT_SCHEMA`/`_SYSTEM`/
  `build_immobilized_subject_user_prompt`/`extract_immobilized_subject_anchor`.
  `PROMPT_VERSION` 3.x→**4.202606201500**(additive bump).
- `visual_continuity_anchor_step.py`: 분리 loader `load_immobilized_subject_anchor_context`,
  `_execute`에 seed 탐지+독립 cap+LLM 추출 루프(그룹당 1콜, 실패 비차단)+manifest 배선,
  헬퍼 `_immobilized_body_pose`/`_related_zoom_evidence`, config_hash에 imm flag/cap,
  review_html에 subject_anchor 렌더, test override slot.
- `detail_steps.py`: lazy-cache `_vca_immobilized_subject_context`, config_hash stamp,
  printed_prop 주입 블록 다음에 immobilized 주입 블록(포즈/상태/소품만 잠금, framing 자유).
- `config.py`: `immobilized_subject_continuity_enabled`(False), `_cap`(4).
- `tests/.../test_visual_continuity_anchor_plan.py`: +5 (seed basic / gate 5종
  (alive·single·unknown·ambiguous·VE미포함·mixed) / 독립 cap / group shape+focus filter /
  manifest→loader 분리).

## 합의 준수 체크
- ① 별도 SOT: immobilized anchor 독립, zoom locked_elements는 provider 입력 **참고자료(prior
  evidence)**로만 + manifest `related_zoom_group_ids` 진단. ✅
- ② seed gate: same scene_index + name→sid exact + VE 포함 + IMMOBILIZED_STATES + ≥2 selected.
  shot_index 인접 없음. mixed states→`mixed_immobilized_states` skip. ✅
- ③ name→sid: entity_t2i display-name exact, ambiguous(2+)/unknown(0)→skip+diagnostic(substring 0). ✅
- ④ VE 포함 샷만 멤버(미포함→`subject_not_in_visible_entities` skip). ✅
- ⑤ provider 출력 = locked_elements(evidence-backed) + shared_state_contract + per_shot_visible_focus. ✅
- ⑥ detail 주입: "물리 상태/자세/소품만 고정, 카메라/프레이밍/크롭 자유". ✅
- ⑦ 같은 step + anchor_type, **loader 분리**(printed_prop loader가 immobilized 안 봄, 역도 성립). ✅
- ⑧ cap 분리(`select_immobilized_seeds_with_cap`, 별도 cap=4). ✅
- ⑨ A/P3=Inc2, visual anchor=Inc3 미착수. ✅
- ⑩ acceptance 범위: 텍스트 계약 주입까지. passport/variant는 Inc2(범위 밖). ✅

## 검증 증거 (실측, TDD 아님)
1. import smoke 전 모듈 OK.
2. 단위 23 passed(신규 5 포함), 관련 회귀(visual_continuity/zoom/subject_state) **71 passed 0 fail**.
   ★pre-existing 실패 12건(scene_detail prompt version 정합성/visible_entities validator)은
   stash baseline에서도 동일 실패 = 내 변경 무관(별도 트랙).
3. **seed 라이브**(run 7bea6537 실데이터): C04(민숙) dead S12sh8+sh13 정확 seed(score 5).
   skip 진단 합리적(S1sh3 C06=VE미포함, S10sh6 "다른 형체"=캐논 미등록 — 둘 다 단일샷이라 무관).
4. **provider dry-run**(실 LLM, scene12): shared_state_contract=커튼 뒤 앉은 시신+구겨진 사진+손목
   문신 일관 / locked 5개 전부 evidence_quote / per_shot_visible_focus sh8=medium 전신·sh13=insert
   손(나머지 off-frame unchanged)=**insert에 wide body 강요 방지 작동** / **이름 누출 0**.
   자산 ~/tmp/geum_p8/imm_dryrun.json.

## 다음 (acceptance)
flag ON → visual_continuity_anchor redo(immobilized 그룹 생성) → scene_detail S12 sh8/sh13 redo
(user_prompt에 계약 주입 확인) → still regen 갤러리 육안(sh13이 독립 body_pose로 손/사진 상태
안 뒤집는지). Codex 코드리뷰 후 진행.

## 리뷰 포인트 요청
seed 조인/cap/skip 진단 정확성, loader 분리 격리, detail 주입 위치/문구(framing 미잠금),
config_hash drift, manifest validator. S12 prompt evidence는 redo 후 공유.
