# 손 절이 프레이밍 권위를 빼앗는다 (1-C)

## 결함

`handled_object_clause` 의 마지막이 **프레이밍을 못박는다.**

    v15  … Nothing else of them needs to be in shot;
         the framing stays on the object.
    v17  … The framing stays on the object.

같은 프롬프트의 `CAMERA & FRAME` 절은 스스로를 이렇게 선언한다:

    CAMERA & FRAME (framing authority; references give identity and
                    place, not framing):

「구도 권위는 나」라고 한 절과 「프레이밍은 물체에 머문다」가 한 글에
나간다. 모델은 둘 중 하나를 고른다.

**`handled_by` 는 「누가 쥐고 있는가」이지 인서트 샷의 근거가 아니다.**
코드 주석이 그 절을 만든 이유를 적어 두었다 — bg_only 샷은 캐릭터 참조도
자세 계약도 떼어내므로 **그 손이 누구 손인지**를 말할 자리가 없었다.
그 목적에 프레이밍 문장은 필요 없다.

## 실측 (2026-08-27) — 그림은 한 장도 안 샀다

`backend/tools/prompt_measure/audit_handled_vs_camera.py`

    손 절이 나간 프롬프트          571건 / 7판
      framing 문장 동반            564건 (99%)
      "Nothing else…"(v15)         431건 (75%)
      CAMERA & FRAME 동반          559건 (98%)
      인물 샷                      570건 (100%)
    ★맞서는 자리                  **558건 (98%)**

그때 CAMERA 가 요구한 것:

    ×208  medium shot
    ×158  close-up
    × 30  insert close-up on a detail   ← 이건 물체 중심이 맞다
    × 18  wide shot

즉 **거의 전부**가 인물·공간 프레이밍인데 손 절이 물체 중심을 요구한다.

## ★두 번 잘못 쟀다 — 「0」이 「없다」가 아니었다

이 판에서 같은 부류의 실수를 **두 번** 했다. 둘 다 정규식이 꺼져 있었다.

**첫 번째** — `^CAMERA[^\n]*:(.+)$` 로 CAMERA 절을 찾았다. 실제 머리말은
`CAMERA & FRAME (…):` 이고 **그 뒤가 바로 개행**이라 `(.+)$` 가 매치에
실패했다. → CAMERA 동반 **0건**. 그대로 보고했다면 「맞서는 자리가 없다」는
정반대 결론이었다.

**두 번째** — `The framing stays on the object\.` 로 찾았다. v17 은
대문자 `The` 지만 **v15 는 소문자** `…; the framing…` 이다. 현재 기본이
v15 라 그 판들이 통째로 빠졌다. → 23%. 실제는 **98%**.

    잘못 잰 값   23%  (framing 문장 133건)
    실제         98%  (framing 문장 564건)

★**대조를 넣었는데도 두 번째를 놓쳤다.** 대조 문자열이 v17 모양 하나
뿐이었기 때문이다. 대조는 **실제로 도는 갈래를 다** 넣어야 한다 —
도구가 잡아야 할 모양이 둘이면 대조도 둘이다. 지금은 v15·v17 문안을
둘 다 넣고 하나라도 안 잡히면 측정을 멈춘다.

## ★두 실패가 반대편에 있다 — 통째로 걷으면 안 된다

처음에 그 문장을 통째로 걷었다가 **기존 시험에 걸렸다.**

    test_handled_object_clause_names_the_hand_owner
      p = _hand_prompt(handled_by="정인우")      # bg_only=True
      # 프레이밍은 물건에 머문다 — 전신을 끌어들이지 않는다
      assert "the framing stays on the object" in p

그 문장은 **의도된 것**이었다. `bg_only` 샷은 CAMERA 절도 캐릭터 참조도
자세 계약도 없어서, 프레이밍을 물체에 못박지 않으면 전신이 끌려 들어온다.

    막던 실패        무인 샷에서 전신이 끌려 들어온다
    막으려는 실패    인물 샷에서 CAMERA 를 무시하고 물체 인서트가 된다

어느 쪽도 버리지 않는다.

## 고치는 방향 — 프레이밍을 말할 **다른 재료가 없을 때만**

    공통 절   handled_object_clause     손의 신원 (언제나)
    전용 절   handled_object_framing    프레이밍 문장 (아래 셋이 다 없을 때)

★**`bg_only` 하나로는 못 가른다** (2026-08-27 Codex BLOCK). 처음에
그렇게 짰다가 지적받았다.

    ㉠ bg_only 가 아니다              인물 샷 — CAMERA 가 권위를 갖는다
    ㉡ `camera_frame_en` 이 있다      호출자는 bg_only 와 무관하게 만든다
    ㉢ `char_names` 가 있다           인물 배정이 **bg_only 를 뒤집는다**
                                     (2026-08-06 계약) — 무인 조항 대신
                                     인물 절이 나가고 사람이 그려진다

셋 중 하나라도 있으면 프레이밍을 말하는 다른 재료가 있다. 셋 다 없을
때만 이 문장이 **유일한 재료**다.

실측이 이 갈래를 뒷받침한다 — 손 절 571건 중 **인물 샷이 570건**이다.
표적은 그쪽이고, 재료가 없는 갈래는 옛 목적 그대로 남는다.

★**금지를 쌓지 않는다.** 인물 샷에 「CAMERA 를 따르라」를 새로 넣지
않는다 — CAMERA 절이 이미 권위를 선언한다. 맞서는 문장을 그 갈래에서
빼면 그것으로 끝이다.

공통 절에 남는 것:

    {handler} 의 손 — 손목·팔뚝은 **프레이밍이 닿는 만큼**
    그 손의 크기·체격·피부·나이·소매가 {handler} 의 것

`as much of the wrist and forearm as the framing reaches` 는 이미
프레이밍에 **종속돼 있다.** 그 문안이 옳고, 마지막 문장이 그것을 뒤집고
있었다.

★**v15 를 바탕으로 만든다.** 처음에 v17 문안으로 새로 썼다가 위 시험이
잡았다 — v17 은 `belong to {handler} and no one else` 로 문구가 다르다.
지금 기본이 v15 이므로, **v15 에서 마지막 문장만 빼는 것**이 이 판의
범위다. 문안을 새로 쓰면 재지 않은 변경이 섞인다.

## 물체 중심이 정말 맞는 샷은

CAMERA 가 `insert close-up on a detail` 이라 말한 30건이 그렇다. 그 샷은
**CAMERA 절이 이미 그렇게 말하므로** 손 절이 거들 필요가 없다.

## ★grok 갈래 — 처음에 이 판이 통째로 no-op 이었다

**앞서 「팩 22 에 스템이 없다」고 적었는데 틀렸다.** `guidance_version` 은
팩 22 가 아니라 `STILL_COMPACT_PROMPT_VERSION` = **17** 이고,
`prompts/_base/still_recipe/17.*/handled_object_clause.md` 는 **있다** —
그리고 그 판에는 프레이밍 문장이 그대로 있다.

    _hand_sel = guidance_version or HANDLED_OBJECT_PROMPT_VERSION

이렇게 두면 `STILL_IMAGE_BACKEND=grok2` 일 때 팩 29 를 안 읽고 17 을 읽어
**인물 샷에 프레이밍 문장이 전과 똑같이 나간다.** 시험은 초록이다 —
`guidance_version` 을 넘기는 시험이 없었으니까.

같은 파일이 `CINEMATIC_FINISH_PROMPT_VERSION` 에서 이미 겪고 갈라 둔
자리다("한쪽을 올릴 때 다른 쪽이 딸려 가지 않게 갈라 둔다"). 손 절도
같게 갈랐다 — `_hand_sel = HANDLED_OBJECT_PROMPT_VERSION`.

시험 둘을 넣었다: grok 갈래에서 인물 샷이 깨끗한지, 무인 샷에서 전신
방지 재료가 남는지.

## ★지문 — 스템 둘을 다 접는다

프레이밍 문장을 따로 떼어 놓고 **한 장만** 접었다. 그러면 그 문장을
고쳐도 스텝 신원이 안 움직여 완주 판이 새 문안을 못 본다 — 바로 그
구멍을 막겠다고 적어 놓은 주석 밑에서.
