# 프롬프트 판올림을 재는 도구 넷

프롬프트를 고친 뒤 「좋아졌다/나빠졌다」를 말하려면 이 넷이 필요하다.
전부 **Opik 에 남은 실제 발송·응답**을 읽는다 — 저장소의 프롬프트 파일이
아니라 **나간 것**이 진실이다.

셋(`edition_hash` · `id_axes` · `find_origin`)은 **이미 쌓인 기록을 다시
읽을 뿐이라 돈이 안 든다.** `measure_scene_detail --run N` 만 유료다.

★모두 `scratchpad/_opik_env.py` 의 `opik_target()` 을 쓴다. `config.py` 의
`env_file=".env"` 가 상대 경로라 cwd 가 `backend` 가 아니면 설정이 통째로
비고 `localhost` 로 조용히 떨어진다(그 탓에 Opik 이 죽은 줄 안 적 있다).

## edition_hash.py — 판을 가르는 자

```
python tools/prompt_measure/edition_hash.py
```

나간 system 메시지를 **sha 로 묶어** 판을 가른다.

★**시각으로 판을 가르지 마라.** 디렉토리 이름의 시각과 실제 발송 시각이
안 맞을 수 있다. 실측 사고: v44 를 「3회 돌았다」고 적어 뒀는데 해시로 보니
**바이트 동일한 36컷(6회)** 이었다. 그 잘린 기준선에 새 판을 대면 없는
퇴행이 두 건 나온다.

## measure_scene_detail.py — 산출 품질

```
python tools/prompt_measure/measure_scene_detail.py            # 무료
python tools/prompt_measure/measure_scene_detail.py --run 3    # 유료
```

★**입력 근거를 대조한 뒤에 위반으로 센다.** 옛 도구(`repeat_scene_detail.py`)
는 regex 적중을 곧바로 위반으로 세어, 입력 shot description 이 이미
「꺼져」라고 말한 것을 scene_detail 의 조명 왜곡으로 셌다. 근거를 대조하면
그 축은 **전 판 0건**이고 남는 것은 R1(촬영 용어 누출)뿐이다.

- primary = **R1** 촬영 용어(`wide view`·`close-up` 등)가 `t2i_prompt` 로 샌 것
- R3 실수치 — 카드 `camera_reference` 유래인지 함께 볼 것
- R4 조명 / R5 시간 연결어 — 입력이 그 말을 했으면 위반 아님
- 길이(중앙·p90·최대·900 미만 비율)와 **문장 수·최장 문장·쉼표 수**
  (한 문장에 쉼표로 밀어 넣는 run-on 을 보려면 길이만으로는 안 된다)

## id_axes.py — ID 계약 준수

```
python tools/prompt_measure/id_axes.py
```

R1~R5 는 **ID 결함을 못 잡는다.** v38→v39·v41 의 실패는 validator 반려
(`base_id_missing`)와 육안 판정으로 나타났지 저 정규식엔 한 건도 안 걸렸다.
ID 규칙을 건드리는 판올림에는 이것을 함께 본다.

- A 회차당 고유 샷 수 — 6 초과면 재시도(=반려) 발생
- B 복합 ID 누락 / C 목록 밖 ID / D 미허용 아웃룩 짝
- E 컷당 복합 ID·bare ID 평균

## find_origin.py — 왜곡이 어디서 생겼나

```
python tools/prompt_measure/find_origin.py     # NEEDLES 를 고쳐 쓴다
```

어떤 문구를 **출력에 처음 쓴** span 을 찾는다. 입력에 없는데 출력에 있으면
그 스텝이 만든 것이다.

실측: 원문 「형광등이 한 번 깜빡인다」 → `shot_extract` 「깜빡이며 일순간
어두워지는」(충실) → **`shot_validator` 「꺼져 일순간 어두워진」(왜곡 발생)**
→ `background_prompt` 「정전된 밤」 → `scene_detail`(물려받음). 하류에서
아무리 고쳐도 안 되는 이유가 여기서 보인다.

## 판정할 때 지킬 것

1. **1회로는 못 잰다.** 같은 프롬프트로도 답이 흔들린다(v44 6회에 R1 이
   0~2 를 오갔다).
2. **기준선을 덜 잡지 마라.** 옛 기록을 기준선으로 쓸 때는 그것이 전수인지
   표본인지 먼저 확인한다.
3. **개수 뒤에 「어디에」를 붙인다.** 같은 1건이라도 같은 샷의 같은 낱말이면
   변화가 없는 것이다.
4. **0/36 은 「없다」가 아니다.** 독립표본으로도 Wilson 95% 상한이 약 9.6%
   이고, 실제로는 6샷 cluster 라 불확실성이 더 크다.
