# LLM-Side Heuristic Audit

Date: 2026-05-14 (audit 시작) / 2026-05-15 (작성)
Scope: `prompts/_base/<latest dir>/system.md` 안 LLM-facing classifier instruction — LLM 에게 "이 패턴 / 이 동사 / 이 phrase list 로 분류하라" 가르치는 closed list 형 instruction.

## 1. Audit Boundary

LLM-side heuristic 은 prompt contamination (단순 leak — `02-` 영역) 도 아니고 code regex (`01-` 영역) 도 아닌 **dual-sync 위험층** — code 와 prompt 가 같은 keyword list 를 가져 양쪽 sync 안 되면 LLM emit ≠ code detect.

Included:
- LLM-facing closed phrase enum (gaze pattern / framing keyword / verb whitelist / issue type phrase)
- code dual-sync site 매핑 (`shot_visibility.py` / `t2i_review.py` / `render_prompt_card.py` LLM list inject)
- 추가 의심 site (`scene_detail` 안 framing/face/perception/body-light)

Excluded:
- closed enum 정의가 LLM-produced structured SOT (예: `directionality_class` 5-enum, `keep_elements.kind` 2-enum) → gate 3 모범, **P2 keep** boundary 외.
- prompt 시나리오 leak (한국인명 / 프로젝트 코드) → `02-`.
- code regex / substring → `01-`.
- DB row override → `04-`.

## 2. Verification Passes Performed

### 2.1 사용자 인벤토리 3 site 각 read

- `prompts/_base/shot_director/5.202605131800/system.md:29-49` (사용자 메모 :29-45, 실제 본문 :29-49 — 4 패턴 bundle)
- `prompts/_base/scene_detail_owned_judge/3.202605051746/system.md:18-61` (verb whitelist + anchor wins)
- `prompts/_base/t2i_review/3.202605121200/scene_system.md:31-91` (5+1 issue type + target/suggestion mutation)

### 2.2 추가 의심 grep

`prompts/_base/*/[0-9v]*/*.md` 에 `다음 패턴|다음 동사|whitelist|중 하나|forbidden|recommended|classify|enum` 검색 → **4 신규 site 발견** (L-4 ~ L-7, 모두 `scene_detail/23.202605141758/system.md`).

### 2.3 Code dual-sync 매핑

- `backend/app/modules/pipeline/shot_visibility.py:36-94` (gaze/framing/offscreen 한·영 lexicon + regex)
- `backend/app/modules/pipeline/shot_director.py:184-190` (`detect_gaze_pattern_exclusions` 호출 → visible 변조)
- `backend/app/modules/pipeline/t2i_review.py:383-454` (entity + scene `target.replace()` 두 site)
- `backend/app/core/steps/render_prompt_card.py:127-146` (close-framing face forbidden/recommended 6+4)
- `backend/app/core/steps/render_prompt_card.py:410-426` (`_SPATIAL_FRAMING_CLOSE_KEYWORDS` 9-entry — canary)
- `backend/app/core/steps/render_prompt_card.py:749-772` (LLM-facing `framing_scale_keywords` 11+5 entry inject)
- `backend/app/core/steps/render_prompt_card.py:1292-1296` (perception_mode 4-token lower-in 비교)

## 3. Severity Schema (4-tuple)

각 row 적용:
- **Priority**: `P0` (production routing 직접 영향, hard gate) / `P1` (diagnostic / LLM hint / soft) / `P2` (LLM-produced structured SOT, keep) / `Excluded`
- **Evidence**: `confirmed` / `plausible` / `unverified`
- **Fix Cost**: `small` / `medium` / `large` (Codex 결론: LLM-side fix 는 v1 외 — schema/code 동시 필요 시 large)
- **Dependency**: prerequisite [#N] / blocked-by [#N] / independent

## 4. Inventory (3 + 4 신규 = 7)

### L-1. `shot_director/system.md:29-49` — gaze/framing/offscreen/blocking 4 pattern bundle

- **classifier instruction 요약**: 4 closed pattern bundles
  1. gaze-target close-up regex (9 동사 stem + 10 framing noun + close-up enum)
  2. explicit off-camera phrase (영 5 + 한 3)
  3. blocking pattern (`(차단|막다|가리다|block|obstruct)`)
  4. reaction-only pattern
- **code dual-sync**: `shot_visibility.py:36-94` lexicon + `shot_director.py:184-190` mutator (#3 in `01-`)
- **4-tuple**: P0 / confirmed / large / prerequisite: framing_scale & offscreen structured SOT
- **Codex 매핑**: debt map §4 P0-3 + hygiene spec §7.1 / **사용자 메모**: LLM-side #1
- **Dual-sync gap 발견**: prompt instruct blocking 패턴 (`차단/막다/가리다/block/obstruct`) 이 code lexicon 에 **regex 부재** → LLM emit 안 해도 code 가 detect X (silent miss). 새 시나리오 silent miss.

### L-2. `scene_detail_owned_judge/system.md:18-61` — redraw verb whitelist 16 + 5-step priority

- **classifier instruction 요약**: redraw 동사 화이트리스트 16개 (`create / render / draw / generate / paint / build / furnish / add / place / put / insert / hang / mount / install / set up`) + 7 anchor phrase + 4 spatial preposition + 3 형용사 예시. "ambiguous → anchor_reference" 기본값 + 5-step priority.
- **code dual-sync**: 없음 (post-process 없는 pure LLM verdict — verdict enum 만 consumer)
- **4-tuple**: P0 / confirmed / large / prerequisite: scene_detail `owned_object_usage[]` structured echo schema
- **Codex 매핑**: debt map §4 P0-5 + hygiene spec §7.2 / **사용자 메모**: LLM-side #2
- **No-dual-sync risk**: verdict 가 `redraw_violation` 시 hard fail. closed verb 외 새 verb → silent miss (false negative).
- **Status: closed by C2 (owned_object_usage[] echo v1, 2026-05-20+)** — W1-W4 atomic: scene_detail v30 `t2i_variations[].owned_object_usage[]` echo schema 신설 + owned sentinel v2 + scene_detail_owned_judge v4 echo-verify-only (verb whitelist + redraw 예시 + 5-step priority 폐기). 상세 = 본 audit §10. C2 Closure.

### L-3. `t2i_review/scene_system.md:31-91` — 6 issue type + target/suggestion mutation

- **classifier instruction 요약**: 6 issue type (`missing_ethnicity / proper_noun_translated / awkward_translation / close_framing_existing_ref / physical_inconsistency / unshared_fg_bg_actors`) 각 closed phrase pattern list + target/suggestion mutation 명시 ("the existing X", "the reference X" 등 5 phrase enum).
- **code dual-sync**: `t2i_review.py:383-403` (entity replace) + `t2i_review.py:407-454` (scene replace by item_id) — #10 in `01-`
- **4-tuple**: P0 / confirmed / large / prerequisite: span position / patch ID / regen-trigger only schema
- **Codex 매핑**: debt map §5 P1-5 + hygiene spec §7.3 / **사용자 메모**: LLM-side #3
- **Dual-sync risk**: prompt phrase enum 변경 → code 변경 없이 영향. LLM emit `target` substring 이 prompt 외 여러 번 등장 시 over-replace (Codex map P1-5 risk).

**Fix applied (Area #6 v1, 2026-05-18+)**: Option A' (regen-trigger / diagnostic-only) 채택.
- **Status**: CLOSED (2026-05-18+, W1-W3 commits + W1 per-wave APPROVED + W1..W3c range review APPROVED).
- **Wave commits**: W1 atomic `8469511` + W2 docs `7e2b8cf` + W3a canary `b9a64c7` + W3b residue gate `85d2c0a` + W3c closure (closure commit anchor).
- `target.replace()` mutation 완전 폐기 (3 site: `t2i_review.py:_apply_entity_fixes` 폐기 / `_apply_scene_fixes` 폐기 / `run_t2i_review` mutation call 폐기).
- LLM emit shape = 5 core fields (`{id, scope, issue_code, action, hint_diagnostic}`) + required debug alias (`short_id` / `item_id`; alias=id strict, mismatch raises `t2i_review.diagnostic_alias_mismatch`).
- v1 = signal-only audit log + future regeneration hint (별도 area).
- cascade 1-pass policy (`step_runner.py:1295-1308`) 변경 0.
- Patch A/B/B1 5 functions 보존 (`_build_item_id_map` / `_refresh_scene_detail_sentinels` / `_capture_card_hash_state` / `_assert_card_hash_unchanged` / `_save_checkpoint_data` — defensive regression guard).
- **Prompt v6 pack**: `prompts/_base/t2i_review/6.202605181200/` 4 file 동시 신설, entity 4.x stem drift 해소.
- **Manifest**: `t2i_review` row `schema_version: 1` 신규 (output cp shape invalidation, D6 T5d 패턴).
- **Closure verdict**: Codex W1 per-wave APPROVED (NEEDS_REVISION_MINOR fix-up 1 round + alias wording plan amend 4 후 narrow re-review APPROVED). W2/W3a/W3b per-wave 위임 안 함 (W3 range review 묶음). canary 5 test PASS (`test_area_6_no_mutation.py`) + residue gate 2 test PASS (`test_area_6_residue_gate.py`) + scoped Python strict 0.

### L-4 (신규). `scene_detail/system.md:155` + render_prompt_card `framing_scale_keywords` inject

- **classifier instruction 요약**: `primary_framing_rule.framing_scale_keywords` — close 판정 11-entry (`close-up / CU / MCU / ECU / XCU / extreme close-up / 클로즈업 / 손가락이 / 손이 / 눈이 / 얼굴이`), wide 5-entry (`wide shot / establishing / aerial / 전경 / 전신`), 그 외 medium default. LLM 에게 phrase 분류 요청.
- **code dual-sync (triple-list 위험)**:
  - `render_prompt_card.py:749-772` (LLM-facing 11+5 inject)
  - `render_prompt_card.py:417-426` (canary 9-entry `_SPATIAL_FRAMING_CLOSE_KEYWORDS` 별도 binding)
  - production `_CLOSE_FRAMING_RE` (별도 module, #1 in `01-`)
- **4-tuple**: P0 / confirmed / large / prerequisite: framing_scale enum SOT (Codex 결론 = first structural prerequisite, debt map §7.1)
- **Codex 매핑**: debt map §4 P0-1 (close-framing regex shared routing SOT, LLM-side counterpart) / **사용자 메모**: #4 ↔ debt map §7.1 routing prerequisite (단 LLM-side counterpart 명시 누락)
- **신규 발견**: 본 audit 가 Codex P0-1 (code-side regex SOT) 의 **prompt-side counterpart** 를 별도 row 로 등록. 사용자 인벤토리도 LLM-side 만 3 site 명시했으나 본 site 미포함.

### L-5 (신규). `scene_detail/system.md:45-46` + render_prompt_card `close_framing_face_phrasing` inject

- **classifier instruction 요약**: `close_framing_face_phrasing.forbidden_phrases` 6-entry (`face filling the entire frame / face filling nearly the entire frame / her face fills the frame / shoulders only entering the frame / head snapped sideways / his face fills the frame`) + `recommended_phrasings` 4-entry. LLM 이 forbidden 회피 + recommended 선호하라는 closed-list 지침.
- **code dual-sync**:
  - `render_prompt_card.py:131-146` (6 forbidden + 4 recommended 정의)
  - `visible_entities_validator.py:139-145` `_FACE_CLOSE_UP_PATTERNS` regex (sibling site)
- **4-tuple**: P1 / confirmed / medium / prerequisite: framing_scale + body_part_focus structured SOT
- **Codex 매핑**: debt map §4 P0-6 (body-part/face close-up exemption regex, LLM-side counterpart) / **사용자 메모**: 누락 — Codex P0-6 의 LLM-side counterpart 신규 발견.
- **Dual-sync 의무**: prompt 변경 시 code 6 forbidden list 동기.

### L-6 (신규). `scene_detail/system.md:61` perception_mode 4-token + schema description drift

- **classifier instruction 요약**: `perception_mode 가 mirror / reflection / through_device / projection 이면 reproduction_surface_rule 와 별도로 perception_mode constraint 가 우선 적용` — closed 4-token list.
- **code dual-sync (3-way description drift, schema non-enforced)**:
  - prompt 4-token (`mirror / reflection / through_device / projection`)
  - `render_prompt_card.py:1292-1296` 4-token `.lower() in` (동일 4)
  - `shot_staging/10.../schema.json:13` = `{"type": "string", "description": "How the scene is perceived: direct, hallucination, dream, memory, reflection, through_device, projection."}` — **JSON schema enum 아님 (type: string + description token list, non-enforced)**. 7-token description (`direct / hallucination / dream / memory / reflection / through_device / projection`) — `mirror` 가 **description 에도 부재**.
- **drift**: schema 미강제 (type: string) → arbitrary string silent miss. `mirror` 는 prompt + code 만의 description token, schema description 미언급. dream / memory / hallucination / direct 는 schema description 에 있으나 prompt + code 에 부재 — instruction-side underspec.
- **위험**: schema 가 enum 강제 안 함 → LLM 이 description 외 token (e.g. `"screen"`, `"lens"`, `"camera_feed"`, 또는 mirror) emit 시 모두 통과. fail-fast 0.
- **4-tuple**: P1 / confirmed / medium / prerequisite: perception_mode enum SOT 통일 (shot_staging schema `enum` 강제 + prompt + code 정렬)
- **Codex 매핑**: debt map §4 P0-7 (perception_mode string token compare, LLM-side counterpart) / **사용자 메모**: 누락 — Codex P0-7 의 prompt-side counterpart 신규 발견 + schema description drift / non-enforcement 추가 발견.

### L-7 (신규). `scene_detail/system.md:71-77` — Rule B body-light verb forbidden list

- **classifier instruction 요약**: 빛이 신체에 작용하는 closed verb list 5-entry — `cut / slice / split / carve / bisect` + body part 조합 금지 + 4 explicit forbidden phrasing 예시 (`red light cuts across her eyes` 등). LLM 에게 forbidden phrase 분류 instruction.
- **code dual-sync**: 없음 (pure LLM-side — post-process X)
- **4-tuple**: P2 / plausible / small / independent (low blast radius — phrase 자체가 의미 충돌 없으면 fail-fast 不要)
- **Codex 매핑**: 미명시 — neither audit caught / **사용자 메모**: 누락 — 본 audit 단독 신규 발견.
- **✓ closed (C9 v1, 2026-05-20+)**: scene_detail v31 prompt-pack — Rule B 섹션 4개 닫힌 enumeration (closed verb list + forbidden/recommended 예시 + recommended verb list) → generic semantic principle 1문단 추상화. prompt-only, schema/code 변경 0. `docs/fix-critical-1/index.html` C9 + roadmap §5.16 + spec/plan `docs/superpowers/specs|plans/2026-05-20-c9-scene-detail-body-light-verb-v1-*.md`. §8 L-7 row 참조.

### L-8 (신규). cinematography closed-list SOT dual-site (Area #7d)

- **classifier instruction 요약**: dual-site (Site 1 `variation_recommender/v2/system.md` 3-axis examples-based 권장 4+4 phrase + Site 2 `scene_extractor_v2/19.* → 20.202605190631/turn_scene_detail.md:87-91` 7-token camera angle + 7-token color tone closed-list 안 `camera_effect` string field carrier 안 "카메라구도 + 색감" 형식 강제). LLM 에게 cinematography prior 시나리오-specific hard-prime instruction.
- **code dual-sync**: E6 `backend/app/services/prompt_service.py:347-352` cinematography 7-token stripping regex (Site 2 prompt 7-token vs 본 regex 7-token drift — `extreme wide / tight medium` 누락 + `tracking` 추가 + `bird's eye` vs `bird eye` 형태 diff). 4-Gate Semantic Regex Ban 대상.
- **4-tuple**: P1 / confirmed / small / independent (closed by Area #7d v1)
- **Codex 매핑**: 미명시 — neither audit caught / **사용자 메모**: 누락 — Area #7d v1 신규 발견 candidate
- **Status: closed by Area #7d (2026-05-19+, W1-W4 atomic; push pending until APPROVED_FOR_PUSH)** — Site 1 `variation_recommender/v2/system.md` R5-R6 examples 4+4 phrase 폐기 + Site 2 `scene_extractor_v2/20.202605190631/turn_scene_detail.md:87-91` R1-R4 7+7 closed-list 폐기 (v20 major bump, 5 file: 2 modified + 3 byte-identical sibling) + E6 `prompt_service.py:345-352` 7-token cinematography stripping regex R7-R9 폐기 (W2 preferred regex 폐기 채택). 9 strict residue (R1-R9 closed-world exact phrase membership) — 0 count obligatory in v20 dir + variation_recommender + prompt_service. carrier shape preserve (`camera_effect` string + `_VARIATION_ITEM_SCHEMA` shape `type/angle/composition/color/reason` + `scene_variation_service` consumer signature + `i2i_editor` dispatch). dual-owner fully fixed claim X (`scene_detail/28.202605190927` primary `camera_effect.description` aligned by Carry-D7d-1 W1 `05af1d5` + W2 closure-docs; field-shape migration X; full dual-owner remediation claim X). 4-Gate Boundary Doctrine (Semantic Regex Ban + Prompt Closed-List Ban refined full-phrase only + Structured SOT Required + No Silent Fallback). NO VLM hard constraint. standalone token global ban 엄금.

## 5. Dual-Sync 매핑 표

| LLM-side site | code-side site | sync 의무 + 위반 시 결과 |
|---|---|---|
| `shot_director/system.md:29-49` (gaze / framing / offscreen / blocking / reaction phrase set) | `shot_visibility.py:36-94` lexicon + `shot_director.py:184-190` visible 변조 | prompt 패턴 변경 → `_KOREAN_GAZE_STEMS / _KOREAN_FRAMING_NOUNS / _OFFSCREEN_PHRASES` 동기 update. **gap 발견**: prompt 가 instruct 하는 blocking 패턴 (`block / obstruct / 차단 / 막다 / 가리다`) 이 code lexicon regex 에 부재 — LLM emit 안 해도 code 가 detect X (silent miss). |
| `scene_detail_owned_judge/system.md:18-61` (redraw verb whitelist 16) | 없음 (verdict enum 만 consumer) | dual-sync 아님. 단 verdict `redraw_violation` hard fail → routing-level open-world risk. 새 verb 추가 시 silent miss. **closed by C2 (2026-05-20+); see §10.** |
| `t2i_review/scene_system.md:31-91` (6 issue type + target/suggestion) | `t2i_review.py:383-403` (entity replace) + `t2i_review.py:407-454` (scene replace) | prompt phrase enum 변경 → code 변경 없이도 영향. LLM emit `target` substring 다중 등장 시 over-replace (Codex P1-5 risk). prompt `forbidden_phrases` 추가 시 `_apply_*_fixes` blind `str.replace()` 가 collateral 영향. |
| `scene_detail/system.md:155` + render_prompt_card `framing_scale_keywords` 11+5 inject | `render_prompt_card.py:749-772` (LLM list inject) + `render_prompt_card.py:417-426` (canary 9 list) + production `_CLOSE_FRAMING_RE` | **triple-sync 위험** — LLM list 11 (`손이 / 눈이 / 얼굴이` 포함), canary 9, production regex 별도. RO-5 binding comment 가 "분리 strict" 명시하지만 production regex 변경 시 3-way sync 의무. |
| `scene_detail/system.md:45-46` + render_prompt_card `close_framing_face_phrasing` 6+4 inject | `render_prompt_card.py:131-146` + `visible_entities_validator.py:139-145` `_FACE_CLOSE_UP_PATTERNS` | code 6 forbidden list 가 LLM 에 그대로 inject → prompt 변경 시 6 list 동기. `_FACE_CLOSE_UP_PATTERNS` (validator) 는 별도 regex — sibling, dual-sync 의무. |
| `scene_detail/system.md:61` perception_mode 4-token | `render_prompt_card.py:1292-1296` 4-token lower-in + `shot_staging/10.../schema.json:13` `type: string + description 7-token` (**non-enforced**) | **3-way description drift, schema 미강제**: prompt 4-token (`mirror` 포함) vs code 4-token (`mirror` 포함) vs schema description 7-token (`mirror` 부재 + `dream / memory / hallucination / direct` 포함). schema `type: string` 이므로 enum 강제 0 — arbitrary string silent miss. `mirror` 가 description 위반이지만 fail-fast 0. |

## 6. Codex Absorption Mapping

| Codex 항목 | 본 audit row | 관계 |
|---|---|---|
| debt map §4 P0-1 (close-framing regex shared routing SOT) | **L-4** | LLM-side counterpart — prompt 도 같은 11+5 keyword list 가 inject. Codex 가 code-side 만 명시. |
| debt map §4 P0-3 (shot_visibility 변조) | **L-1** | code regex 의 짝 LLM-side prompt — 둘 다 silent SOT mutation 위험 |
| debt map §4 P0-5 (owned-object verb whitelist) | **L-2** | LLM-side primary (Codex 가 정확히 prompt path 지목) |
| debt map §4 P0-6 (body-part/face close-up exemption) | **L-5** | LLM-side counterpart — `close_framing_face_phrasing` 6+4 inject. Codex 가 code-side `_FACE_CLOSE_UP_PATTERNS` 만 명시. |
| debt map §4 P0-7 (perception_mode string token compare) | **L-6** | LLM-side counterpart + 추가 finding: `mirror` schema drift |
| debt map §5 P1-5 (t2i_review blind substring replace) | **L-3** | LLM-side primary (Codex 가 정확히 prompt path 지목) |
| hygiene spec §7.1 / §7.2 / §7.3 | L-1 / L-2 / L-3 | 1:1 매핑 (Codex 가 LLM-side 3 site 만 별도 분리) |

**Codex 보강 사항 (4건)**:
- L-4 신규 row — Codex P0-1 LLM-side counterpart
- L-5 신규 row — Codex P0-6 LLM-side counterpart
- L-6 신규 row — Codex P0-7 LLM-side counterpart + schema drift
- L-7 신규 row — Codex / 사용자 미발견 단독 finding

## 7. Boundary Notes

- prompt scenario leak / 도메인 nomenclature contamination → `02-` 영역. 본 audit row 는 classifier instruction 위험만.
- code regex / substring (open-world semantic) → `01-` 영역. 본 audit dual-sync column 은 매핑만, 위반 등급은 `01-` 가 정함.
- DB row override 여부 → `04-` 영역. L-1 ~ L-7 의 active prompt 가 DB row override 인지 본 audit 미확인.
- structured emit (e.g. `directionality_class` 5-enum, `keep_elements.kind` 2-enum) → 본 audit excluded — gate 3 (Structured SOT Required) 와 정합, **P2 keep**.

## 8. Fix 방향 (v1 외 명시)

Codex 결론: LLM-side fix 는 Hygiene v1 외 (모두 schema + code 동시 변경 필요).

| Row | Fix direction |
|---|---|
| L-1 shot_director | structured visibility/offscreen SOT — shot_director schema 에 `visibility_relation: {entity_id, status: "in_frame"/"off_camera"/"blocked_by"/"reaction_only", reason_short}` field 추가 + code 에서 `detect_gaze_pattern_exclusions` 폐기 + drift diagnostic 만. Codex debt map §8 Area 1/2 와 정합. |
| L-2 scene_detail_owned_judge | scene_detail schema 에 `owned_object_usage[]: {owned_token, usage_kind: "redraw"/"anchor"/"absent", source_phrase}` echo field 신설 + judge prompt 는 echo verify 만 (verb whitelist 폐기). Codex P0-5 fix direction. |
| L-3 t2i_review | `target.replace()` mutation 폐기 + LLM 이 `{item_id, issue_code, regenerate_required: bool, hint_diagnostic: str}` 만 emit → 코드는 regenerate trigger 만. span position / patch ID 도입 시 mutation 유지 가능. Codex P1-5 fix direction. |
| L-4 framing_scale_keywords | `framing_scale` enum SOT (`close / medium / wide / insert`) 가 shot_staging emit 으로 producer-side 확립 → scene_detail 은 enum consume 만. LLM 에 keyword list inject 폐기. Codex §7.1 "first structural prerequisite" + Area 1. **본 prerequisite 충족 후 L-1 / L-5 도 unblock**. |
| L-5 close_framing_face_phrasing | L-4 framing_scale + `body_part_focus` structured field 확립 후 `_FACE_CLOSE_UP_PATTERNS` + 6+4 inject 모두 폐기. Codex P0-6 fix direction. |
| L-6 perception_mode | shot_staging `schema.json:13` 의 description token list (현재 `type: string + description 7-token`, **JSON schema enum 아님 / 미강제**) 를 정렬 — 가능하면 JSON schema `enum` 강제로 승격 + LLM-side `mirror` 제거 또는 schema description / enum 에 `mirror` 추가. `render_prompt_card.py:1292` 코드 4-token 도 정합. Codex P0-7 fix direction. |
| L-7 body-light verb | **✓ closed (C9 v1, 2026-05-20+)** — pure LLM-side phrase reasoning hint. scene_detail v31 prompt-pack Rule B 섹션 4개 닫힌 enumeration (closed verb list + forbidden/recommended 예시 + recommended verb list) → generic semantic principle 1문단 추상화. schema/code 변경 0, prompt-only. |

## 9. 핵심 발견 Summary

1. **사용자 인벤토리 3 site (L-1/L-2/L-3) 모두 confirmed** — Codex spec §7.1/§7.2/§7.3 과 1:1 매핑.
2. **추가 4 site 발견** — Codex map P0-1/P0-6/P0-7 의 prompt-side counterpart 가 인벤토리 누락 (L-4/L-5/L-6) + 본 audit 단독 발견 1 (L-7 body-light verb).
3. **shot_visibility 코드 gap** — prompt 가 instruct 하는 blocking 패턴 (`차단/막다/가리다/block/obstruct`) 이 code lexicon regex 에 부재. dual-sync silent miss 발생 가능.
4. **perception_mode 3-way description drift (schema 미강제)** — prompt 4-token / code 4-token / `shot_staging/10.../schema.json:13` `type: string + description 7-token` (**JSON schema enum 아님**). `mirror` 는 prompt + code description token 이나 schema description 에 부재. 단 schema `type: string` 이므로 어떤 string 도 통과 — arbitrary string silent miss + fail-fast 0.
5. **framing_scale triple list** — LLM-facing 11-entry / canary 9-entry / production regex 별도 → RO-5 strict binding 으로 분리 의도지만 production regex 변경 시 3-way sync 의무.

## 10. C2 Closure (owned_object_usage[] echo, 2026-05-20+)

**Status**: **closed** — L-2 (`scene_detail_owned_judge/system.md:18-61` redraw verb whitelist 16 + 5-step priority) 가 C2 owned_object_usage[] echo v1 W1-W4 atomic execution 으로 해소. `docs/fix-critical-1/index.html` C2 section 신규 area (Track B Tier α #2). spec `docs/superpowers/specs/2026-05-20-c2-owned-object-usage-echo-v1-design.md` (status closed) + plan `docs/superpowers/plans/2026-05-20-c2-owned-object-usage-echo-v1-implementation.md` (status closed).

**Fix 요약** (§8 Fix 방향 표 L-2 row 그대로 적용): scene_detail schema 에 `owned_object_usage[]: {owned_token, usage_kind enum [redraw/anchor/absent], source_phrase}` echo field 신설 + judge prompt 는 echo verify only (verb whitelist 폐기).

**Wave commits**:
- W1 `eb8343c` — scene_detail v30 schema/prompt: `t2i_variations[].owned_object_usage[]` required echo field + system.md OWNED OBJECT USAGE ECHO section + `SCENE_DETAIL_SCHEMA_VERSION` 11→12 + version alignment.
- W2 `55f54ab` — owned sentinel v2: `OWNED_SENTINEL_SCHEMA_VERSION` 1→2 + `owned_usage_hash` 4th hash + `validate_owned_object_usage_coverage` / `compute_owned_usage_hash` / `assert_owned_usage_hash_matches` / `assert_close_framing_absent_echo` 신설 + detail_steps owned path echo read/validate.
- W3 `bc05dc7` — scene_detail_owned_judge v4 prompt-pack: redraw verb whitelist + redraw 예시 + 5-step priority 폐기 → echo-verify-only (owned_object_usage echo vs t2i_prompt cross-check) + `run_owned_judge` owned_object_usage echo plumbing + `test_c2_owned_object_usage_echo.py` integrated G1-G7 26 test.
- W4 closure commit — 본 closure docs atomic (path-limited 5 docs).

**Gate result**: W3.1 C2 integrated 26 PASS / W3.2 owned regression bundle 158 PASS (Codex 6-file re-verify 152 PASS) / W3.3 judge v4 no closed-list residue / W3.4 v4 prompt-loader latest source proof. 전체 백엔드 4036 passed (5 pre-existing failure — `text_cleaner.clean_text` ImportError 등, `git stash` clean HEAD 재실행 동일 실패 → W3 무관 확정).

**Boundary preserve**: verdict enum (`redraw_violation` / `anchor_reference`) + `has_redraw_violation` semantics 변경 0. t2i_prompt body shape 변경 0 (owned_object_usage = sidecar structured evidence). scene_detail_owned_judge version_registry entry invent X (prompt-loader latest dir source). **NO VLM hard constraint** — integrated test 전부 mock / AST canary, live LLM 0. 4-Gate Boundary Doctrine (Prompt Closed-List Ban + Structured SOT Required + No Silent Fallback) 정합.

**Codex review**: spec v1 narrow re-review APPROVED_FOR_PLAN / plan v1 narrow re-review #3 APPROVED_FOR_EXECUTION / W1 per-wave APPROVED_FOR_W2_ENTRY / W2 per-wave APPROVED_FOR_W3_ENTRY / W3 entry sanity APPROVED_FOR_W3_ENTRY_WITH_NARROW_PLAN_GAP_ABSORB / W3 per-wave APPROVED_FOR_W4_ENTRY. Final pushed range/hash = external memory only after push (live closure docs 안 push-complete pre-claim 0).

**Carry follow-up** (fix-critical-1 index.html, 2026-05-20+ 갱신): C1·C2·C3·C7·C6·C9 ✓ closed → C4 #8 background classifier (다음 진입) → C5 #9 action segment SOT → C8 #7 잔여 sub-area split → C10 future structured carries.
