# 감사 3-C 품질 갈래를 닫는다 — 유실 증거가 없다

감사 보고서 3-C 는 「`scene_detail` 산출의 절반이 이미지에 안 닿는다」로
적혀 있었다(`t2i_variations[].t2i_prompt` 50.4% · 입력
`render_prompt_card.*` 32%). 코드를 고치기 전에 **그 주장을 다시 쟀다.**

## 내가 처음 잰 방법이 틀렸다

「출력 14칸 중 몇 개가 DB 칸인가」로 셌다. 두 군데가 어긋난다.

★**DB 전용 칸이 없다고 유실이 아니다.**
 `checkpoint_sync/scene_still_normalizer.py:144,167` 이
 `json.dumps(shot_vars)` 로 **variation dict 을 통째로**
 `t2i_variations_json` 에 넣는다. `reference_phrase_kinds`·
 `owned_object_usage`·`applied_*` 는 이미 DB 에 있다.
 `representative_moment` 도 legacy 는 `:141`, per-shot 은
 `_user_edited` 일 때 `:156-157` 로 `still_frame_prompt` 에 간다.

★**칸 수를 다시 세면 원래 물음을 못 잰다.** 감사가 물은 것은 「그 산출의
 **의미**가 최종 이미지 프롬프트에 있는가」다.

## 다시 잰 방법 — 5축, 무료, 새 호출 0

골목 끝 판(`da049582`)의 records 에 **최종 프롬프트가 샷마다 통째로**
남아 있다(9,793~11,578자). 그것을 scene_detail CP 의
`t2i_variations[0].t2i_prompt`(832~1,160자)와 1:1 로 나란히 읽었다.

    표본 = 최종 산출이 있는 **6샷**
           S1sh1 · S1sh2 · S2sh1 · S2sh3 · S3sh1 · S3sh2
           (S3sh5 는 선택 안 돼 최종이 없다)

축은 다섯: 순간·행동 / 엔티티·아웃룩 / 공간 배치 / 카메라·조명 /
장소·사물. 글자나 칸이 아니라 **근거 있는 의미**만 본다.

## 결과 — 6/6 에서 유실 증거 0

    순간·행동     최종 `SHOT TEXT`(한국어 원문) + `CAMERA` 절
    공간 배치     `CAMERA` + `KEY BACKGROUND ELEMENTS` — **최종이 더 자세**
                  (요소마다 방향과 역할까지: 자전거 「chain side turns
                   toward the camera at an oblique angle」)
    카메라·조명   거의 문장 그대로 옮겨진다
    장소·사물     `LOCATION` lock + 사물별 항목

★**엔티티·아웃룩은 유실이 아니라 설계다.** detail 은
 `C01O01 in a navy worker uniform, Asian middle-aged man…` 이라 쓰지만
 최종은 이름과 복장만 문장에 두고 **신원은 참조 이미지가 공급**한다 —
 최종 프롬프트 자체가 그렇게 못박는다:
 「the reference images supply identity and place, never the framing」.

★**가장 유력했던 후보도 최종에 있었다.** S2sh1 의 「쓰러진 지팡이」는
 세 자리에 있다 — `SHOT TEXT`(「곁에는 지팡이가 떨어져 있다」) ·
 `LOCATION`(「the fallen man and his cane」) ·
 `IMMOBILE CHARACTER POSE — CANONICAL`(「A cane rests on the ground
 beside him」).

## 판정 — 범위를 좁혀 적는다

이 표본은 **전역 증명이 아니다.** 「골목 끝의 최종 산출이 있는 6샷,
5축 대조에서 6/6 유실 증거 0」이다. 다만 감사의 통짜 주장
(「절반 미도달 = 이미지 품질 결함」)을 반려하기에는 충분하다.

> **3-C 품질 갈래는 코드 변경 없이 닫는다.**

최종 프롬프트는 typed SOT(shot text · staging · frame spatial contract ·
location · continuity)에서 **다시 조립**되고, **이 표본에서는** detail 의
근거 있는 의미가 그 경로로 담겼다. (전역 주장이 아니다 — 위 6샷이다.) `applied_frame_spatial_constraint_ids` 도
projection 대상이 아니다 — 그건 echo/검증용 ID 이고, 실제 공간 제약은
`still_recipe.py:1473-1494` 가 `FRAME LAYOUT` 문장으로 이미 렌더한다.

## 살아 있는 별건 — v1 중복 저작 비용

같은 의미를 typed SOT 로 다시 조립하면서, **v1 이 안 쓸 t2i 산문을
저작하고 그 검수·보정에까지 돈을 쓴다.** **측정 구간 전체**
476호출·714만 자 중 `scene_detail` 이 **447만 자(63%)** 다
(그 스텝 호출당 52,010자). 476 이 전부 scene_detail 호출은 아니다.

★**그러나 `t2i_prompt` 는 한 줄로 못 지운다 — 활성 소비자가 있다.**

    shot_dependency_t2i_step.py:268-280,306,341
      scene_detail 의 **첫 `t2i_prompt` 를 실제 LLM 입력**에 넣는다
      (`f"  T2I: {s['t2i']}"`). 그 결과가 앞 스틸 참조 선택에 닿는다.
      빈칸으로 만들면 **이미지 경로가 바뀐다.**

    scene_still_normalizer.py:57-70  `_shot_ve`
      shot_director VE 가 없을 때 t2i prompt 의 ID 를 fallback 으로 읽는다.

그래서 다음 판의 첫 걸음은 구현이 아니라 **소비 계약 실측**이다.
