---
title: Area #7d — cinematography closed-list SOT dual-site (Track B Tier 3 #4, v1)
date: 2026-05-19
status: closed (spec Codex APPROVED_FOR_PLAN + plan Codex APPROVED_FOR_EXECUTION + W1-W3 per-wave APPROVED + W4 closure docs atomic; W4 per-wave/range review/push gate pending at W4 closure commit time — Codex APPROVED_FOR_PUSH 후 즉시 push origin main, final pushed range/count = external memory only)
roadmap_ref: docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md §5.7 Area #7 carry follow-up (Area #7d from Area #7c closure; roadmap sub-area label 신설 의무 — W4 closure 시 verbatim `Sub-area (e) cinematography closed-list SOT dual-site` bullet 추가)
prerequisites:
  - Hygiene v1 (closed 2026-05-15, commit `91d1dfd`) — P-1 ~ P-6 1차 abstraction 보존.
  - Area #6 (T2I Review Mutation Redesign, closed 2026-05-18+) — `t2i_review.py` mutation 폐기 boundary preserve.
  - Area #7a (visual_world_rules SOT v1, closed 2026-05-19, push `d0410eb`) — VWR producer SOT + scene_director A047 흡수 boundary preserved.
  - Area #7b (VWR Downstream Prompt Cascade, closed 2026-05-19+, push `e751e72`) — VWR consumer cascade 9 site closed boundary preserved + scene_detail/27.202605181937 4-point sync 정합.
  - Area #7c (t2i_review v6 placeholder example abstraction, closed 2026-05-19+, push `62aa2ef`) — t2i_review v7 prompt pack boundary preserved.
non_supersedes:
  - Carry-A099 (VWR system.md director_notes prose redesign V8+) — Area #7a 정합 보존.
  - Carry-A100 (VWR system.md t2i_context demonym redesign V8+) — Area #7a 정합 보존.
  - Carry-P021 (scene_consistency 7 enumeration broad, source unresolved low-priority) — Area #7a 정합 보존.
  - Carry-D7d-1 (scene_detail v28 description align — `prompts/_base/scene_detail/27.202605181937/detail_schema.json:15` 안 `"카메라 구도 + 색감 (필수)"` description 의 open-world align 추가 wave) — was deferred from Area #7d v1 (이유: scene_detail/27 안 7+7 closed-list 본문 부재 + description-only narrow update 효과 미미 + 4-point sync + pinned tests cascade 부담 ↑ + dual-owner fully fixed claim X); resolved by Carry-D7d-1 W1 `05af1d5` + W2 closure-docs (Area #7d v1 scope preserve, 후속 carry resolution).
  - Area #1 / #2 (shot_staging area scope, `camera_direction` schema field owner) — boundary preserve, 본 area 변경 0.
---

# Area #7d — cinematography closed-list SOT dual-site (v1)

## 1. Purpose + Scope

### 1.1 Purpose

Track B Tier 3 #4 — cinematography 도메인 closed-list SOT 분산 + LLM-side prompt 권장 형식 (Site 2 `camera_effect` carrier 안 7+7 token 명시 강제 + Site 1 `variation_recommender` 3-axis examples-based 권장) + 신규 발견 code-side semantic regex drift (`prompt_service.py:347-352`) 가 다음 위험 유발:

- Site 2 (`prompts/_base/scene_extractor_v2/19.202605161434/turn_scene_detail.md:87-91`) = 7-token camera angle closed-list (`low angle / high angle / dutch angle / over-the-shoulder / bird's eye / extreme wide / tight medium`) + 7-token color tone closed-list (`warm amber / cold blue / high contrast / desaturated / golden hour / neon-lit / silhouette backlight`) 가 `camera_effect` string field carrier 안 "카메라구도 + 색감" 형식으로 명시 강제. **Prompt Closed-List Ban refined full-phrase ban 대상**.
- Site 1 (`prompts/_base/variation_recommender/v2/system.md`) = 3-axis 분리 (`angle` 3D numeric + `composition` lens/framing examples + `color` lighting examples) 안 examples-based 권장 4+4 phrase. 시나리오-specific cinematic prior 가능성 (`tight close-up on face` / `wide establishing shot` / `over-shoulder framing` / `low angle hero shot` / `warm golden hour lighting` / `cold blue moonlight` / `high contrast noir shadows` / `desaturated muted tones`).
- E6 신규 발견 (`backend/app/services/prompt_service.py:347-352`) = code-side cinematography 7-token regex 자동 제거: `r"In a (low angle|dutch angle|high angle|bird eye|wide|tracking|over the shoulder)\s*(frame|composition|shot|view)\s*"` → cleaned 안 phrase 자동 제거. **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 대상.
- 본 cinematography redesign = audit `03-llm-side-heuristic-audit.md` L-1~L-7 inventory **부재** (LLM-side heuristic audit 신규 발견 candidate). 본 area W4 closure docs 안 L-8 row 신설 의무.

본 area = cinematography 도메인 closed-list SOT 분산 + LLM-side prompt 권장 형식 + E6 code regex drift 해소 위한 **Option B minimum (carrier shape preserve + description/closed-list 제거 + code regex narrow/remove)**. carrier shape (`camera_effect` string field + `variation_recommender` output `type/angle/composition/color` shape) 변경 X (downstream consumer cascade 회피).

### 1.2 In-scope

**Primary dual-site** (prompt-pack):
- **Site 1**: `prompts/_base/variation_recommender/v2/system.md` (32 line, narrow edit). `variation_recommender_v2.py` PROMPTS_DIR Path 직접 hardcode (`prompts/_base/variation_recommender/v2/`) 이므로 **v3 새 dir 생성 X**, v2 narrow edit only.
- **Site 2**: `prompts/_base/scene_extractor_v2/20.202605190631/turn_scene_detail.md` (v20 major bump 새 dir 신설, 19.* boundary preserve). 7+7 closed-list line 87-91 → open-world cinematography derivation wording 으로 narrow rewrite. 본 dir 안 **5 file** (v19 pack file count 정합 — `scene_extractor_v2/19.202605161434/` 안 실제 5 file 확인):
  - `turn_scene_detail.md` (Site 2 본문 modified, 7+7 closed-list 폐기 + carrier description align).
  - `scene_detail_schema.json` (modified — carrier shape preserve, description narrow-align).
  - `system.md` (byte-identical sibling from 19. — 변경 0).
  - `turn0_context.md` (byte-identical sibling from 19. — 변경 0).
  - `turn1_split_long.md` (byte-identical sibling from 19. — 변경 0).

**E6 code-side regex** (W2 mandatory in-scope, silent carry X):
- `backend/app/services/prompt_service.py:347-352` 7-token cinematography regex = narrow/remove (preferred: 본 regex 폐기 또는 non-semantic structured metadata handling 으로 교체). token regex 로 교체 X.

**Adjacent contract inventory** (W0 evidence only, edit 0):
- `backend/app/modules/pipeline/scene_extractor_v2.py` (producer module — `load_prompt("turn_scene_detail") + load_schema("scene_detail_schema.json")`).
- `backend/app/core/steps/detail_steps.py:1182-1188` (scene_detail primary + scene_extractor_v2 fallback loadsite).
- `backend/app/modules/variation_recommender_v2.py` (Site 1 v2 file-only producer, PROMPTS_DIR Path 직접 hardcode).
- `backend/app/modules/variation_recommender.py` (legacy v1 file-only — `_load_pl(_MODULE, stem)` db 인자 미전달; `scene_variation_service.py:529` live caller — default no change).
- `backend/app/services/scene_variation_service.py` (consumer cascade: line 344 v2 + line 529 v1 + line 403-411 angle/composition/color persist + i2i_editor.edit_angle/edit_color dispatch).
- `backend/app/services/scene_generation_coordinator.py:811` (`var.get("camera_effect", var.get("theme_label", var_theme))` consumer).

### 1.3 Non-goals (Out-of-scope boundary)

- **scene_detail/28 신설 = 본 v1 외 (D2 verdict)**: `prompts/_base/scene_detail/27.202605181937/system.md` 안 7+7 closed-list **부재** (carrier description 만), description-only edit 시 4-point sync + pinned tests cascade 부담 ↑. v1 = dual-owner fully fixed claim X. scene_detail description alignment = `Carry-D7d-1` was deferred from Area #7d v1; resolved by Carry-D7d-1 W1 `05af1d5` + W2 closure-docs (scene_detail/28.202605190927 신설, Area #7d v1 boundary preserve). 자세한 wording §6 / §10.
- **`camera_effect` carrier field-shape migration** (예: structured cinematography object `{shot_scale, camera_angle, lighting_tone}` enum) = **major carry** (v1 외). 본 v1 = string carrier preserve.
- **`variation_recommender` output shape 변경** = backward-compat 의무 (`type / angle / composition / color` shape preserve, `scene_variation_service` consumer + `i2i_editor` dispatch + DB `variation_a_angle / variation_a_color` persist).
- **legacy `variation_recommender.py` v1** = live compatibility inventory (default no-change). `scene_variation_service.py:529` live caller behavior W0 verify 완료, prompt/schema sync 의무 0 (legacy code path 자체가 v1 prompt 사용 — 본 area Site 1 v2 변경이 cascade 영향 0 확인 의무 plan).
- **`shot_staging` `camera_direction` schema field** = Area #1 / #2 owner, 본 area boundary preserve. `turn_scene_detail.md:30` reference 만 (`camera_direction의 카메라 위치/거리`) informational only.
- **Area #6 / #7a / #7b / #7c closure boundary preserve** (4 area 변경 0).
- **VLM (Vision Language Model) 기반 판단 / 검증 / 성능 전제 / 의존 구조** = hard constraint 절대 금지 (NO VLM doctrine). Site 1 `variation_recommender_v2.py` GPT Vision = **production 정상 모듈 사용** (image 입력 i2i 변형 추천, hygiene scope 외), 본 area 검증/테스트에서 VLM 사용 0.

## 2. W0 Evidence Inventory

본 area Q0-light brainstorming + Q1-Q7 outline drafting 안 본 instance 가 실시간 W0 inventory 진행. 본 §2 = drafting 시점 (2026-05-19+) 의 evidence pack. W1 execution 시 W0.3 (entry sanity) 재확인 의무.

### 2.1 W0 initial inventory (5 finding)

- `prompts/_base/variation_recommender/v2/system.md` 32 line — 3-axis (angle / composition / color) examples-based 권장 4+4 phrase.
- `prompts/_base/scene_extractor_v2/19.202605161434/turn_scene_detail.md:87-91` — 7+7 closed-list + `camera_effect` carrier 안 "카메라구도 + 색감" 형식 명시.
- `backend/app/modules/variation_recommender_v2.py` PROMPTS_DIR hardcode = `prompts/_base/variation_recommender/v2/` (file-only Path 직접).
- `backend/app/services/scene_variation_service.py:344` v2 import + `:529` v1 legacy import (dual path live).
- `backend/app/services/prompt_service.py:347-352` E6 신규 발견 7-token camera-angle stripping regex.

### 2.2 W0.1 producer/loadsite confirmation (3 finding)

- `backend/app/modules/pipeline/scene_extractor_v2.py:21,31,35,38` = `load_prompt(_MODULE="scene_extractor_v2", "turn_scene_detail") + load_schema("scene_detail_schema.json")`. STEP_MANIFEST direct entry 0 = manifest fact only.
- `backend/app/core/steps/detail_steps.py:1182-1188` = `scene_detail` primary `load_prompt + load_schema` → fallback `scene_extractor_v2 / turn_scene_detail + scene_detail_schema` (dual-owner cascade confirmed).
- E6 W2 in-scope decision: 본 area scope 안 mandatory in-scope (silent carry X). 4-Gate Semantic Regex Ban gate 직접 정합 + cinematography 도메인 SOT 일원화 효과.

### 2.3 W0.2 live correction (evidence hygiene)

> W0 initial memo treated 26.* as latest; W0.2 live verify corrected latest to 27.202605181937 after Area #7b W3. This spec uses the W0.2 value.

해당 W0 inventory step 안 본 instance 가 `prompts/_base/scene_detail/` ls 결과 첫 inspection 시 `26.202605181435` 가 latest 라고 잠시 claim. 그러나 4-point sync grep (Codex iter R4 권고) 안 `backend/tests/test_prompt_versions.py:213` (`SCENE_DETAIL_PROMPT_VERSION.startswith("27.")`) + `backend/tests/prompts/test_scene_detail_continuity_alignment.py:111` (`info["prompt_dependency"] == "scene_detail/v27"`) 등 27 정합 expected fact 발견 → 실 ls 재확인 시 `27.202605181937` 가 latest (Area #7b W3 closure commit `5060254` 안 생성됨). 본 spec = W0.2 corrected value (27.202605181937) 사용.

### 2.4 scene_detail/27 carrier evidence (D2 verdict input)

- `prompts/_base/scene_detail/27.202605181937/system.md:594` = `"camera_effect": "eye-level doorway composition"` (free text 예시).
- `prompts/_base/scene_detail/27.202605181937/detail_schema.json:15` = `{"camera_effect": {"type": "string", "description": "카메라 구도 + 색감 (필수)"}}`.
- **7+7 cinematography closed-list system.md 안 부재** (Site 2 scene_extractor_v2/19. 안만 있음).
- 4-point sync 정합: `detail_steps.py:106` (`SCENE_DETAIL_PROMPT_VERSION = "27.202605181937"`) + `version_registry.py:34` (`MODULE_VERSIONS["scene_detail_composer"] = "1.27.0"`) + `_MODULE_INFO.prompt_dependency = "scene_detail/v27"` + pinned tests (`test_prompt_versions.py:213/222` + `test_scene_detail_continuity_alignment.py:75/111/129`).

### 2.5 변경 surface 카탈로그

| # | site | line | 변경 본질 | wave |
|---|---|---|---|---|
| S1 | `variation_recommender/v2/system.md` | 21-31 (3-axis 분리 section) | composition/color examples 4+4 phrase abstraction → open-world derivation wording | W1 |
| S2 | `scene_extractor_v2/20.<TS>/turn_scene_detail.md` | 87-91 (구 19. line 87-91 신규 dir 재기록) | 7+7 closed-list 폐기 → carrier `camera_effect` string 안 open-world cinematography derivation wording | W1 |
| S3 | `scene_extractor_v2/20.<TS>/scene_detail_schema.json` | 15 (구 19. line 15 신규 dir 재기록) | `"camera_effect" description` narrow align (string type preserve, required preserve) | W1 |
| S4 | `variation_recommender_v2.py` schema-description | `_VARIATION_ITEM_SCHEMA` composition/color description | examples wording narrow (`"e.g. 'tight close-up on face'"` 등 hard-prime 제거) — schema shape preserve | W1 (optional, narrow) |
| E6 | `prompt_service.py:347-352` | 6 line (re.sub block 4 line + comment 1) | camera-angle stripping regex 제거 OR non-semantic structured metadata 교체 | W2 |

### 2.6 strict residue catalog (W3 gate 1)

본 area 안 strict residue (closed-world exact phrase membership, W3 full-phrase ban 의무):

**Site 2 7+7 token full-phrase line** (line 87-88 verbatim 형식):
- (R1) `카메라 구도 선택지: low angle / high angle / dutch angle / over-the-shoulder / bird's eye / extreme wide / tight medium`
- (R2) `색감 선택지: warm amber / cold blue / high contrast / desaturated / golden hour / neon-lit / silhouette backlight`
- (R3) `각 변형의 camera_effect 필드에 "카메라구도 + 색감"을 명시하세요.`
- (R4) line 90 `예: "low angle, warm amber lighting" / "high angle, cold blue-toned" / "dutch angle, high contrast silhouette"` (verbatim format).

**Site 1 examples 4+4 phrase block** (line 23, 29 verbatim 형식):
- (R5) `'tight close-up on face'`, `'wide establishing shot'`, `'over-shoulder framing'`, `'low angle hero shot'` (composition examples block).
- (R6) `'warm golden hour lighting'`, `'cold blue moonlight'`, `'high contrast noir shadows'`, `'desaturated muted tones'` (color examples block).

**E6 regex literal line** (full line):
- (R7) `r"In a (low angle|dutch angle|high angle|bird eye|wide|tracking|over the shoulder)\s*"` (line 348).
- (R8) `r"(frame|composition|shot|view)\s*",` (line 349).
- (R9) line 346 comment `# 카메라 앵글 제거`.

**Standalone token** (`low angle` / `warm amber` / `bird's eye` 등) = **global ban 절대 X** (Codex R5 권고: semantic word matching 회피).

## 3. Scope and Non-goals

§1.2 + §1.3 참조. 본 §3 = 4-Gate Boundary Doctrine 정합 명시:

- **Gate 1 Semantic Regex Ban**: E6 code-side cinematography regex (W2 mandatory in-scope) = semantic regex (open-world cinematography token detection) → 본 v1 narrow/remove. token regex 로 교체 X.
- **Gate 2 Prompt Closed-List Ban refined (full-phrase ban only)**: Site 2 7+7 token closed-list + Site 1 examples 4+4 phrase = full-phrase prompt closed-list → 본 v1 폐기. Area #7b refined doctrine 정합 (standalone token global ban X).
- **Gate 3 Structured SOT Required**: 본 v1 = **carrier shape preserve** (camera_effect string + variation_recommender output type/angle/composition/color shape). field-shape migration (structured cinematography object) = major carry (v1 외).
- **Gate 4 No Silent Fallback**: 본 v1 fix 후 LLM 자유 텍스트 → variant text 자유. silent fallback 추가 0 (4-Gate Doctrine 정합).

## 4. Option B Minimum Design (carrier-preserving SOT alignment)

본 v1 = **Option B minimum staged** (Codex iter Q0-light + outline iter 2 round APPROVED). field-shape migration = major carry.

### 4.1 carrier 보존

- `scene_extractor_v2/20.<TS>/scene_detail_schema.json:15` = `{"camera_effect": {"type": "string", ...}}` shape preserve. required field preserve.
- `variation_recommender_v2.py _VARIATION_ITEM_SCHEMA` = `type` (4-enum: angle/color/angle+color/none) + `angle` (3D numeric object horizontal/vertical/zoom) + `composition` (string) + `color` (string) + `reason` (string) shape preserve.
- `scene_variation_service.py` consumer cascade 변경 0 (Site 1 output shape preserve → `var.get("angle/composition/color")` + `i2i_editor.edit_angle/edit_color` dispatch + DB `variation_a_angle / variation_a_color` persist).
- `scene_generation_coordinator.py:811` (`var.get("camera_effect", var.get("theme_label", var_theme))`) 변경 0 (Site 2 carrier shape preserve).

### 4.2 Prompt closed-list / examples 제거

- Site 2 `turn_scene_detail.md:87-91` 7+7 closed-list 폐기 → open-world cinematography derivation wording (LLM 이 시나리오 context + camera_direction (shot_staging) 기반 자유 텍스트 emit).
- Site 1 `variation_recommender/v2/system.md:23, 29` examples 4+4 phrase → 추상 wording (시나리오-specific cinematic prior 제거).
- `variation_recommender_v2.py _VARIATION_ITEM_SCHEMA composition/color description` 예시 wording 안 hard-prime (`"e.g. 'tight close-up on face'"` 등) narrow 제거.

### 4.3 E6 code regex narrow/remove (W2 mandatory)

- `prompt_service.py:347-352` 7-token regex = 폐기 또는 non-semantic structured metadata handling 으로 교체.
- preferred action = **regex 자체 폐기** (cinematography token 자동 제거 의무 자체 재검토). cleaned string consumer cascade verify 의무 plan.
- alternative = LLM emit 직후 structured field (예: `cinematography.derived_phrasing`) 안 token 보관 + cleaned 안 자동 제거 0. 단 본 alternative = field-shape migration approaches → major carry → v1 외.
- **W2 mandatory unless W0.3 proves prompt_service path unreachable**: spec 안 명시 = E6 in-scope mandatory, no silent carry. plan W2 must grep `cleaned` consumer cascade (`cleaned` 변수 downstream consumer 함수 grep 의무).

### 4.4 schema/prompt description open-world align

- Site 2 carrier description (`"카메라 구도 + 색감 (필수)"`) = **narrow-align** (예: `"카메라 구도 + 색감 (시나리오 derivation; closed-list 권장 X)"` 또는 동등 wording). type=string preserve + required list 안 `camera_effect` 포함 preserve. 정확 wording = Codex plan iter 1 round narrow 의논 의무.
- Site 1 composition/color description = examples 폐기 후 open-world derivation hint only (시나리오 cinematic intent / camera_direction shot_staging reference).

## 5. Producer/Consumer Contracts

### 5.1 Producer side

- **Site 1 producer** = `variation_recommender_v2.py` (file-only PROMPTS_DIR hardcode `prompts/_base/variation_recommender/v2/`). v2 narrow edit only (v3 dir 생성 X, code hardcoded path migration 회피).
- **Site 2 producer** = `pipeline/scene_extractor_v2.py` (`load_prompt + load_schema` **file-only** — line 31/35/38 모두 db 인자 미전달; prompt_loader docstring `거의 모든 caller 가 file-only (db 미전달)` 정합). 본 v1 = 20.<TS>/ 신규 dir 생성 → **file fallback latest activation** (20.<TS>/ 가 `_version_sort_key` 기준 latest → 자동 active). DB row override 의무 X.
- **scene_detail dual-owner producer** = `prompts/_base/scene_detail/27.202605181937/` (D2 verdict v1 외; Carry-D7d-1 was deferred from Area #7d v1, resolved by Carry-D7d-1 W1 `05af1d5` + W2 closure-docs → scene_detail/28.202605190927).
- **legacy variation_recommender v1 producer** = `app/modules/variation_recommender.py` (file-only — `_load_pl(_MODULE, stem)` db 인자 미전달, line 93). 본 v1 변경 0 (live caller scene_variation_service.py:529 prompt/schema sync 의무 0 — legacy v1 prompt 자체 변경 0).

### 5.2 Consumer side

- **Site 1 consumer** = `scene_variation_service.py:344` (`from app.modules.variation_recommender_v2 import VariationRecommenderV2`) + line 403-411 (`var_a.get("angle/composition/color")` + DB persist).
- **Site 2 consumer** = `scene_extractor_v2.py:722` (`load_prompt("turn_scene_detail")`) + `scene_generation_coordinator.py:811` (`var.get("camera_effect", ...)`).
- **scene_detail dual-owner consumer** = `detail_steps.py:1182-1188` (primary scene_detail → fallback scene_extractor_v2).
- **E6 consumer** = `prompt_service.py:347-352` (`cleaned` 변수 fully consumed downstream — W2 cascade verify 의무 plan).

### 5.3 Backward-compat contract

- variation_recommender output shape preserve → scene_variation_service consumer + i2i_editor edit_angle/edit_color dispatch + DB variation_a_angle / variation_a_color persist 변경 0.
- camera_effect carrier shape preserve → scene_generation_coordinator + downstream T2I prompt assembly 변경 0.
- legacy variation_recommender v1 prompt 변경 0 → live caller scene_variation_service.py:529 cascade 영향 0.

## 6. Wave Plan W1-W4

| Wave | Scope | atomic boundary | Codex per-wave review obligatory |
|---|---|---|---|
| **W0** | initial inventory (✅ §2.1 5 finding) | memo/internal — repo edit 0 | N/A |
| **W0.1** | producer/loadsite confirmation (✅ §2.2 3 finding) + E6 W2 in-scope decision (mandatory) | memo/internal — repo edit 0 | N/A |
| **W0.2** | live correction (§2.3 evidence hygiene — scene_detail latest 27.202605181937 confirm) | memo/internal — repo edit 0 | N/A |
| **W0.3** | entry sanity (W1 직전): file fallback latest activation verify (`scene_extractor_v2/20.<TS>/` 가 `_version_sort_key` 기준 numeric-desc latest 확인) + new dir creation precondition (시간 단조 증가, 19.202605161434 보다 후행). prompt_loader file-only mode 정합 (db 인자 미전달, DB row override 의무 X) | memo/internal — repo edit 0 | YES (W1 entry 직전 Codex iter 의논 의무) |
| **W1** | Producer prompt-pack + schema-description sync atomic: (1) `prompts/_base/scene_extractor_v2/20.202605190631/` 신규 dir 5 file (modified: `turn_scene_detail.md` + `scene_detail_schema.json` / byte-identical sibling from v19: `system.md` + `turn0_context.md` + `turn1_split_long.md`), Site 2 7+7 closed-list 폐기 + carrier description narrow-align. (2) `prompts/_base/variation_recommender/v2/system.md` narrow edit (Site 1 examples 4+4 phrase 폐기). (3) `backend/app/modules/variation_recommender_v2.py` `_VARIATION_ITEM_SCHEMA` composition/color description narrow (examples hard-prime 제거 only, shape preserve). | 1 atomic commit (`area-7d-cinematography-sot-dual-site-v1`) | YES |
| **W2** | Code-side E6 regex narrow/remove atomic: `backend/app/services/prompt_service.py:346-352` cinematography 7-token regex 폐기 (또는 non-semantic structured metadata 교체). cleaned 변수 consumer cascade verify (`rg "cleaned" backend/app/services/prompt_service.py` 의무). | 1 atomic commit | YES |
| **W3** | Integrated test atomic: `backend/tests/integration/test_area_7d_cinematography_sot.py` 신규 (5 gate, no live LLM + NO VLM + no semantic regex). 자세한 gate spec = §7. | 1 atomic commit | YES |
| **W4** | Closure docs atomic: (1) 본 spec frontmatter status closed + §11 Closure section append. (2) roadmap §5.7 `Sub-area (e) cinematography closed-list SOT dual-site` 신설 verbatim bullet. (3) `audit/02-prompt-side-hygiene-audit.md` §5 P-4 또는 §10 narrow cross-reference (§11.2 VWR table 추가 X). (4) `audit/03-llm-side-heuristic-audit.md` L-8 row 신설 (cinematography closed-list SOT dual-site Site 1 + Site 2 + E6 W2 outcome). path-limited 3-5 file. | 1 atomic commit (`area-7d-cinematography-sot-dual-site-v1 W4 closure`) | YES (range review W1-W4 의무) |

**scene_detail/28 W1 in 결정 (D2 verdict 정합)**: 본 v1 = scene_detail/28 새 dir 생성 X (4-point sync + pinned tests cascade 부담 ↑ + carrier description-only narrow update 효과 미미). scene_detail/27 안 7+7 closed-list 본 system 부재 (§2.4 evidence). **본 area v1 fix scope = `scene_extractor_v2` direct + fallback pack only** (`scene_extractor_v2/20.<TS>/turn_scene_detail.md` + `scene_extractor_v2/20.<TS>/scene_detail_schema.json`). production primary `scene_detail/27.202605181937` (detail_steps.py:1182 primary path) = 변경 0 within Area #7d v1; **Carry-D7d-1 was deferred from Area #7d v1, resolved by Carry-D7d-1 W1 `05af1d5` + W2 closure-docs (scene_detail/28.202605190927 신설, Area #7d v1 historical scope preserve)**. **dual-owner fully fixed claim X** 명시 (§10 carry).

## 7. Test + Residue Gate Contract (W3 5 gate)

W3 atomic = `backend/tests/integration/test_area_7d_cinematography_sot.py` 신규 pytest. **no live LLM + NO VLM + no semantic regex**.

### Gate 1: Site 2 7+7 closed-list residue 0 (full-phrase strict)

- `prompts/_base/scene_extractor_v2/20.<TS>/turn_scene_detail.md` 안 §2.6 R1-R4 full-phrase line **literal 0 hit** (strict line membership).
- `prompts/_base/scene_extractor_v2/20.<TS>/` 전체 dir 안 R1-R4 0 hit.
- **standalone token `low angle` / `warm amber` / `bird's eye` global ban 절대 X** (Codex R5 권고).

### Gate 2: Site 1 examples 4+4 phrase residue 0

- `prompts/_base/variation_recommender/v2/system.md` 안 §2.6 R5-R6 examples block literal 0 hit (strict line membership).
- `backend/app/modules/variation_recommender_v2.py` 안 `_VARIATION_ITEM_SCHEMA composition/color description` 안 R5-R6 examples 0 hit.

### Gate 3: E6 regex literal residue 0

- `backend/app/services/prompt_service.py` 안 §2.6 R7-R9 regex literal 0 hit (강제 regex narrow/remove 의무).
- alternative consumer (regex remove 후 structured handling) = §4.3 alternative 채택 시 별도 sanity check (단 v1 = regex 폐기 권장).

### Gate 4: carrier shape preservation

- `prompts/_base/scene_extractor_v2/20.<TS>/scene_detail_schema.json:camera_effect` type = `string` (preserve) + required (preserve) + description align (narrow update, exact wording Codex plan iter 의논 의무).
- `backend/app/modules/variation_recommender_v2.py _VARIATION_ITEM_SCHEMA` shape preserve (`type` 4-enum + `angle` 3D numeric object + `composition` string + `color` string + `reason` string) — 정확 shape sha256 anchor 또는 deep dict equality assertion.
- `scene_variation_service.py:344, 403-411` consumer call signature 변경 0 (import + var.get key list verify).

### Gate 5: loadsite + 4-Gate compliance

- `pipeline/scene_extractor_v2.py` `load_prompt + load_schema` latest dir activation = 20.<TS>/ (file fallback `_version_sort_key` 기준 numeric-desc latest verify).
- `detail_steps.py:1182-1188` fallback path preserve (primary scene_detail/27 + fallback scene_extractor_v2/20.<TS>).
- 4-Gate Doctrine inline assertion: Gate 1 (Semantic Regex Ban — E6 폐기 verify) + Gate 2 (Prompt Closed-List Ban refined full-phrase ban only) + Gate 3 (Structured SOT Required — carrier shape preserve, field-shape migration 0) + Gate 4 (No Silent Fallback — variation_recommender output schema preserve).

### no-live policy + NO VLM

- pytest 안 OpenAI / Gemini / Anthropic / fal.ai API 호출 0 (`rg "openai|gemini|anthropic|fal.ai|completion|chat" backend/tests/integration/test_area_7d_cinematography_sot.py` 0 hit).
- VLM (Vision Language Model) 사용 0 (검증/테스트 안 image 입력 0). production module (`variation_recommender_v2.py` GPT Vision) = test 안 mock 또는 직접 호출 0.
- regex semantic 0 (closed-world exact phrase membership only).

## 8. Doctrine (4-Gate + NO VLM + TEMPLATE ONLY)

본 area = doctrine inline 명시 의무. plan / W1-W4 execution / range review 시 항상 정합.

### 8.1 4-Gate Boundary Doctrine ([[feedback_llm_based_judgment]] 정합)

| Gate | Rule | 본 area 적용 |
|---|---|---|
| **Gate 1 Semantic Regex Ban** | Open-world semantic 판단을 code regex 로 X | E6 W2 in-scope narrow/remove. token regex 로 교체 X. |
| **Gate 2 Prompt Closed-List Ban (refined full-phrase only)** | Open-world classification 을 prompt 안 closed-list 강제 X. **standalone token global ban X** (semantic word matching 회피, Area #7b refined doctrine 정합) | Site 2 7+7 + Site 1 examples 4+4 full-phrase ban only. |
| **Gate 3 Structured SOT Required** | Open-world semantic 결정 = LLM-produced structured emit (enum / ID / bool / object) 안 owner-side ownership 의무 | v1 = carrier shape preserve (camera_effect string + variation_recommender output shape). field-shape migration = major carry. |
| **Gate 4 No Silent Fallback** | code-side silent recovery / default value 금지 (open-world 결정 fail 시 fail-fast 또는 명시적 boundary fallback) | LLM 자유 텍스트 emit 후 silent default 추가 0. |

### 8.2 NO VLM hard constraint ([[feedback_no_vlm_dependency]] 정합)

- VLM (Vision Language Model) 기반 판단 / 검증 / 성능 전제 / 의존 구조 절대 금지.
- production module (`variation_recommender_v2.py` GPT Vision) = 정상 image 입력 i2i 변형 추천 module, hygiene scope 외.
- 본 area 검증/테스트 (W3) = VLM 사용 0.

<!-- HISTORICAL AUDIT TRAIL / TEMPLATE ONLY: §8.3 doctrine description block (post-W4 substitute, interior placeholder/marker mentions escaped to non-literal forms — UTC_TIMESTAMP / 본_commit underscore variant + TEMPLATE_ONLY underscore variant — so they describe doctrine without re-triggering grep + marker awk start) -->

### 8.3 TEMPLATE ONLY doctrine

- spec body 안 placeholder 형식 (예: UTC_TIMESTAMP / 20.TS_SUFFIX 등 design-time slug) = controller-substitute targets only. spec body 안 substitution 의무 site:
  - §1.2 In-scope `scene_extractor_v2/20.202605190631/` (W1 execution 시 controller-substitute, W4 closure 시 live substituted).
  - §2.5 변경 surface 카탈로그 S2/S3 = post-W1 substituted to `20.202605190631`.
  - §5 / §6 / §7 / §10 안 `20.202605190631/` post-W1 substituted live data.
- **HISTORICAL_AUDIT_TRAIL marker wrap 의무** ([[session_20260519_area_7c_v1_closure]] 함정 1 정합): 본 spec body 안 design-time placeholder slug (UTC_TIMESTAMP 형식) 가 substitution awk pattern 트리거 가능 — pre-substitution marker wrap 의무. W1 execution 시 controller awk substitute 전 본 §8.3 또는 별도 doctrine description block 안 wrapping marker 추가 의무.
- **W3 / W4 self-reference doctrine** ([[session_20260519_area_7c_v1_closure]] 함정 2 정합): W4 closure docs body 안 self-reference placeholder slug (본_commit 형식 등) 사용 X. explicit hash literal + "후속 range-review fix-up commits 가능; final pushed range/count = external memory only" suffix 의무.

<!-- end TEMPLATE ONLY -->

## 9. Audit / Roadmap Closure Targets (W4 closure docs only)

### 9.1 audit `03-llm-side-heuristic-audit.md` L-8 row 신설 (primary closure target)

- L-8 row title: `cinematography closed-list SOT dual-site (Area #7d)`.
- 본 L-8 row = Site 1 (`variation_recommender/v2/system.md`) + Site 2 (`scene_extractor_v2/19.* → 20.<TS>/turn_scene_detail.md:87-91`) + E6 code regex outcome (`prompt_service.py:347-352`).
- 본 row 신설 wording = W4 closure docs atomic 안만 추가. spec/plan 안 본 row 직접 edit 절대 X.

### 9.2 audit `02-prompt-side-hygiene-audit.md` narrow cross-reference (W4 only)

- §5 P-4 (`turn_scene_detail.md:83-85` Korean/Joseon hard-prime) 직후 narrow cross-reference 한 줄: `87-91 cinematography 5-line block = Area #7d (audit 03 L-8) 처리됨` 형식.
- 또는 §10 Boundary Notes 안 narrow cross-reference (LLM-side redesign 별도 카테고리 정합).
- **§11.2 VWR downstream table 추가 절대 X** (Codex R6 권고).

### 9.3 roadmap `§5.7 Area #7` Sub-area (e) 신설 (W4 only)

verbatim wording (Codex R7 권고):

> `Sub-area (e) cinematography closed-list SOT dual-site`

본 verbatim wording + Area #7d closure bullet (자세한 closure 정보 — W1-W4 commits + push range + carry — W4 closure 시 작성).

### 9.4 spec/plan 안 audit/roadmap 직접 edit 절대 X

- 본 §9 = target wording 명시 only.
- W1-W3 execution 안 audit/roadmap edit 0.
- W4 closure docs atomic 안만 audit + roadmap edit (path-limited 3-5 file).

## 10. Carry / Risks / References

### 10.1 Carry follow-up post-#7d

본 area v1 closure 후 deferred:

1. **`Carry-D7d-1`** — scene_detail v28 description align: scene_detail/27.202605181937 is the current primary scene_detail prompt pack after Area #7b W3 and is already 4-point synced. It contains no 7+7 cinematography closed-list; only the camera_effect string description remains. Area #7d v1 does not open scene_detail/28 because a description-only edit would require a full scene_detail 4-point sync and pinned-test cascade. Area #7d therefore does not claim full dual-owner remediation; scene_detail description alignment is carried as Carry-D7d-1. (Codex Q-DR4 D2 verbatim 권고 흡수.)
2. **`Carry-A099`** — VWR system.md director_notes prose redesign V8+ (Area #7a 정합 보존).
3. **`Carry-A100`** — VWR system.md t2i_context demonym redesign V8+ (Area #7a 정합 보존).
4. **`Carry-P021`** — scene_consistency 7 enumeration broad, source unresolved low-priority.
5. **`Carry-D7d-2`** (optional, W2 outcome 따라): `prompt_service.py:347-352` E6 regex W2 narrow/remove 시 cleaned consumer cascade 안 alternative structured handling (cinematography token preserve 의무 시) = field-shape migration 영역 → Carry-A100 또는 별도 area.

### 10.2 Risks

- **camera_effect string carrier preserve 의무 cascade**: downstream T2I prompt assembly + i2i_editor + DB persist 다중 consumer. shape 변경 시 cascade ↑ — v1 minimum staged 의무 (§4.1).
- **prompt closed-list 폐기 시 LLM 자유 텍스트** = variant 다양성 ↑ but consistency ↓ — production canary 의무 (W3 no live LLM 안 canary test 0, manual production 검증 별도).
- **E6 regex narrow/remove cleaned consumer cascade** = `prompt_service.py:347-352` cleaned 변수 downstream consumer (T2I prompt 본문 안 inserted). W2 narrow/remove 시 cleaned 안 cinematography token 잔존 시 downstream 영향 — W2 plan 안 consumer cascade grep + sanity verify 의무.
- **scene_detail/27 D2 carry 안 fully fixed claim X 명시 (Area #7d v1 scope)**: dual-owner v1 fix 효과 = Site 2 (scene_extractor_v2 fallback path) only. production primary path `detail_steps.py:1182 scene_detail` 안 carrier description 그대로 within Area #7d v1 (Carry-D7d-1 was deferred from Area #7d v1, resolved by Carry-D7d-1 W1 `05af1d5` + W2 closure-docs).
- **`variation_recommender.py` legacy v1 live caller (`scene_variation_service.py:529`)**: 본 v1 변경 0 (default no-change). plan 안 cascade 영향 0 verify 의무 (legacy v1 prompt 자체 변경 0 → output shape 정합 보존).
<!-- HISTORICAL AUDIT TRAIL / TEMPLATE ONLY: §10.2 doctrine reference bullets (interior placeholder/marker phrase mentions escaped to non-literal forms — UTC_TIMESTAMP / 본_commit underscore variant + TEMPLATE_ONLY underscore variant) -->

- **Substitution self-referential bug doctrine** ([[session_20260519_area_7c_v1_closure]] 함정 1 정합): spec §8.3 doctrine description 안 design-time placeholder slug (UTC_TIMESTAMP 형식) = HISTORICAL_AUDIT_TRAIL marker wrap 의무 pre-substitution. wrapping 없이 substitution 시 substitution awk pattern 트리거 risk.
- **W3 / W4 self-reference doctrine** ([[session_20260519_area_7c_v1_closure]] 함정 2 정합): W4 closure docs 안 self-reference placeholder slug (본_commit 형식 등) 사용 X. explicit hash literal + "후속 range-review fix-up commits 가능; final pushed range/count = external memory only" suffix 의무.

<!-- end TEMPLATE ONLY -->

### 10.3 References

- **Audit `02-prompt-side-hygiene-audit.md`** = `docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/02-prompt-side-hygiene-audit.md` (§5 P-4 boundary + §10 Boundary Notes + §11.2 VWR table 추가 X).
- **Audit `03-llm-side-heuristic-audit.md`** = `docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/03-llm-side-heuristic-audit.md` (L-1 ~ L-7 inventory + L-8 신설 target).
- **Roadmap** = `docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md` §3:263 (variation_recommender hardcoded examples A095 → Area #7 매핑) + §5.7 Area #7 Sub-area (e) 신설 target.
- **Area #6 closure** = push `0a659f6` ([[session_20260518_area_6_t2i_review_mutation_redesign_v1_closure]]).
- **Area #7a closure** = push `d0410eb` ([[session_20260519_area_7a_v1_closure]]).
- **Area #7b closure** = push `e751e72` ([[session_20260519_area_7b_v1_closure]]).
- **Area #7c closure** = push `62aa2ef` ([[session_20260519_area_7c_v1_closure]]).
- **Codex iter trace 본 spec drafting** = Q0-light entry (PROCEED_TO_Q1_Q7_OUTLINE_WITH_OPTION_B_STAGED) + outline iter 1 (NEEDS_REVISION_NARROW: W0 grep 의무 + Option B staged + scene_extractor_v2.py 존재 정정 + scene_detail 4-point sync 의무 noted + audit/roadmap W4 closure docs only) + outline iter 2 (APPROVED_FOR_SPEC_V1_DRAFT_WITH_NARROW_CORRECTIONS: R1-R8 narrow corrections, spec §1-§11 pattern 권고) + D1/D2 verdict (D2_APPROVED_SCENE_DETAIL_CARRY, Q-DR4 carry wording + Q-W0-flip W0.2 evidence hygiene verbatim 권고).
- **Memory references** = [[feedback_llm_based_judgment]] (4-Gate Doctrine) + [[feedback_no_vlm_dependency]] (NO VLM) + [[feedback_codex_mcp_discussion_workflow]] (Codex first) + [[feedback_codex_mcp_claude_mcp_response_trigger]] (3 round doctrine raw typing workflow) + [[feedback_subagent_model_opus]] (opus subagent) + [[feedback_push_no_user_ask]] (push no user ask) + [[feedback_session_50pct_codex_close_check]] (session 50%+ Codex close) + [[feedback_session_reset_clear_not_exit]] (/clear ONLY) + [[next_session_area_7d_cinematography_sot]] (본 area 진입점) + [[session_20260519_area_7c_v1_closure]] (직전 phase + 함정 1/2 doctrine).

## 11. Closure (2026-05-19+)

### 11.1 Status + Closure Anchor

- **Status**: closed at W4 closure-docs wave (docs-only closure commit; exact hash recorded by git log/range review, not embedded in the same commit to avoid self-reference; 후속 range-review fix-up commits 가능; final pushed range/count = external memory only after `APPROVED_FOR_PUSH` + `git push origin main`).
- **Closure scope**: 4 docs (본 spec frontmatter status + 본 §11 Closure section + roadmap §5.7 Sub-area (e) bullet + audit 02 §5 P-4 narrow cross-reference + audit 03 L-8 row 신설). Path-limited git add. W4 per-wave / W1-W4 range review / push gate pending at W4 closure commit time.

### 11.2 Wave Commit Table

| Wave | Commit | Action | Line stats |
|---|---|---|---|
| W1 | `6cc4933` | Producer atomic (scene_extractor_v2/20.202605190631 5 file = 2 modified turn_scene_detail/scene_detail_schema R1-R4 + 3 byte-identical sibling + variation_recommender/v2/system.md R5-R6 narrow + variation_recommender_v2.py _VARIATION_ITEM_SCHEMA composition/color description narrow) | 7 file / 254 ins / 4 del |
| W2 | `5b63b89` | E6 prompt_service regex 폐기 atomic (`prompt_service.py:345-351` 7-token cinematography stripping regex 제거 + non-cinematography cleanup line 340 SID + line 343 O## preserve) | 1 file / 0 ins / 7 del |
| W3 | `9139bc9` | Integrated test atomic (`test_area_7d_cinematography_sot.py` 5 verify gate, 18 PASS, no live LLM + NO VLM + no semantic regex) | 1 file / 305 ins |
| W4 | (W4 closure-docs wave; docs-only closure commit, exact hash recorded by git log/range review, not embedded in the same commit) | Closure docs atomic (4 file: 본 spec + roadmap §5.7 + audit 02 §5 P-4 narrow cross-reference + audit 03 L-8) | (recorded by git log) |

Plan amend trace anchors: `8eef6f7` (plan amend 2 §5.3 Gate 4 schema path-navigation `_camera_effect_schema_item()` helper + `camera_effect = root.properties.t2i_variations.items.properties.camera_effect` aware) + `bd8c54a` (plan amend 3 §5.5 (d) AST-based check, broad grep false positive 회피).

### 11.3 In-Scope Dual-Site Mapping

| site | line (legacy) | residue gate? | result |
|---|---|---|---|
| `variation_recommender/v2/system.md:23` | R5 composition examples 4-phrase | strict residue | 0 count ✓ |
| `variation_recommender/v2/system.md:29` | R6 color examples 4-phrase | strict residue | 0 count ✓ |
| `scene_extractor_v2/19.202605161434/turn_scene_detail.md:87` (→ `20.202605190631/`) | R1 7-token camera list | strict residue | 0 count ✓ |
| `scene_extractor_v2/19.202605161434/turn_scene_detail.md:88` (→ `20.202605190631/`) | R2 7-token color list | strict residue | 0 count ✓ |
| `scene_extractor_v2/19.202605161434/turn_scene_detail.md:90` (→ `20.202605190631/`) | R3 carrier description line | strict residue | 0 count ✓ |
| `scene_extractor_v2/19.202605161434/turn_scene_detail.md:91` (→ `20.202605190631/`) | R4 verbatim 예시 line | strict residue | 0 count ✓ |
| `prompt_service.py:347-348` | R7-R8 E6 regex literal | strict residue | 0 count ✓ |
| `prompt_service.py:345` | R9 E6 comment | strict residue | 0 count ✓ |

### 11.4 Strict Residue Catalog Result

9 entry (R1-R9) exact legacy phrase substring membership check — 0 strict count in `prompts/_base/scene_extractor_v2/20.202605190631/` + `prompts/_base/variation_recommender/v2/` + `backend/app/services/prompt_service.py` (closed-world membership only, no regex semantic, standalone token global ban 엄금).

### 11.5 Carrier Shape Preservation Result

- `prompts/_base/scene_extractor_v2/20.202605190631/scene_detail_schema.json` `camera_effect` type=string + required preserve ✓.
- `backend/app/modules/variation_recommender_v2._VARIATION_ITEM_SCHEMA` shape preserve (`type` 4-enum + `angle` 3D numeric object + `composition` string + `color` string + `reason` string) ✓.
- `backend/app/services/scene_variation_service.py:344` v2 import preserve + `:403-411` `var.get("angle/composition/color")` consumer cascade preserve ✓.
- `backend/app/core/steps/detail_steps.py:1182-1188` dual-owner fallback path preserve (primary `scene_detail/27.202605181937` + fallback `scene_extractor_v2/20.202605190631`) ✓.

### 11.6 STEP_MANIFEST + loadsite Preservation

- `backend/app/modules/pipeline/scene_extractor_v2.py` `load_prompt` / `load_schema` file-only file fallback latest = `20.202605190631/` dir (numeric-desc, `_version_sort_key`) ✓.
- STEP_MANIFEST entry-level 변경 0 (`scene_extractor_v2` STEP_MANIFEST direct entry 0; manifest fact 정합 — Area #7a `step_manifest schema_version` 정합).

### 11.7 Closure Verdict

- Codex iter rounds — spec drafting (Q0-light + outline iter 1-2 + spec quality iter 1 + spec narrow re-review iter 1-2) + plan drafting (iter 0 strategy + iter 1 quality + iter 2 narrow + iter 3 narrow) + W1 entry sanity + W1/W2/W3 per-wave + W3 Gate 4 verdict (plan amend 2 narrow trigger) + plan amend 3 next-step (W3 per-wave 결과) + W4 entry sanity APPROVED_FOR_W4_ENTRY_WITH_ONE_EXECUTION_GUARD (deferred §11 in-place replace guard 흡수). W4 per-wave / W1-W4 range review pending at W4 closure commit time.
- **4-Gate Boundary Doctrine reaffirm**: Gate 1 Semantic Regex Ban (E6 폐기 ✓) / Gate 2 Prompt Closed-List Ban refined full-phrase only (R1-R6 폐기 ✓) / Gate 3 Structured SOT Required (carrier shape preserve ✓; field-shape migration major carry) / Gate 4 No Silent Fallback (`variation_recommender_v2` output schema preserve ✓; LLM 자유 텍스트 emit 후 silent default 추가 0).
- **NO VLM hard constraint reaffirm**: W3 integrated test 안 VLM 사용 0; production `variation_recommender_v2.py` GPT Vision module = hygiene scope 외 정상 module.
- **TEMPLATE ONLY doctrine reaffirm**: controller-substitute targets only, HISTORICAL AUDIT TRAIL marker preserved (plan §6.2/§6.3/§6.4/§6.5 안 template block).

### 11.8 함정 신규 (본 area v1)

세션 memo cross-reference (W4 closure history note):

- **함정 1**: W3 Gate 4 schema path navigation bug (plan §5.3 inline pytest body 가 root level path navigation 가정, 실 nested under array items). Plan amend 2 `8eef6f7` 흡수. **정정 doctrine**: W3 commit body 안 plan amend hash mention 의무 (range review amend cause trace 가능) + plan drafting iter 시 schema shape 정확 확인 의무 (Codex spec drafting iter 안 §2.4 carrier evidence + W0.3 entry sanity gate 안 schema path verify 추가).
- **함정 2**: W3 Pre-Commit Verification §5.5(d) broad grep false positive (docstring/comment 안 `re.sub(` mention catch). Plan amend 3 `bd8c54a` 흡수. **정정 doctrine**: AST-based verification 권장 (broad grep pattern catch 회피 — `ast.walk(tree)` 안 `ast.Import`/`ast.ImportFrom`/`ast.Call` 식별 narrow).

### 11.9 W4 closure docs history note (plan §3.2 minor drift, blocker X)

Codex W1 entry sanity 시 W4 closure history-note-only verdict (별도 plan amend X):

1. Plan §3.2 Gate (c) `build_scene_text` expected line 509 vs 실제 508 (line drift 1, cleaned cascade flow 자체는 정합).
2. Plan §3.2 Gate (d) prompt_dependency expected location `backend/app/modules/pipeline/scene_detail_composer.py` 실제 `backend/app/core/version_registry.py:126` (path drift, `_MODULE_INFO` contract preserve).

### 11.10 Carry Follow-up Post #7d

Priority (Codex post-push verdict 정합):

1. **Carry-D7d-1** — scene_detail v28 description align (spec §10.1 full inline verbatim, `prompts/_base/scene_detail/27.202605181937/detail_schema.json:15` 안 `"카메라 구도 + 색감 (필수)"` description open-world align). Status: was deferred from Area #7d v1 (medium cost — 4-point sync + pinned tests cascade 부담 회피); resolved by Carry-D7d-1 W1 `05af1d5` + W2 closure-docs (scene_detail/28.202605190927 신설).
2. **Carry-D7d-2** (conditional W2 outcome) — W2 preferred 채택 (E6 regex 폐기 확정) → **carry 없음 확정** (audit 01 row 신설 X).
3. **Carry-A099** — VWR `system.md director_notes` prose redesign V8+ (Area #7a 정합 보존).
4. **Carry-A100** — VWR `system.md t2i_context` demonym redesign V8+ (Area #7a 정합 보존).
5. **Carry-P021** — `scene_consistency` 7 enumeration broad (source unresolved low-priority).
