---
title: Carry-D7d-1 — scene_detail v28 description align (Area #7d follow-up carry, v1)
date: 2026-05-19
status: closed (W1 atomic `05af1d5` + W2 closure-docs wave; range review/push gate pending at W2 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 Sub-area (e) Carry-D7d-1 resolution (Area #7d v1 closure 후속 carry, audit 03 L-8 row Carry-D7d-1 resolution narrow update obligatory)
prerequisites:
  - Area #7d (cinematography closed-list SOT dual-site v1, closed 2026-05-19+, push `b9c610e`) — Carry-D7d-1 spec §10.1 + plan §10.1 verbatim definition source.
  - Area #7b (VWR downstream prompt cascade v1, closed 2026-05-19+, push `e751e72`) — scene_detail/27.202605181937 4-point sync 정합 source + canonical VWR clause cascade.
  - Area #7a (visual_world_rules SOT v1, closed 2026-05-19, push `d0410eb`) — VWR producer SOT boundary preserve.
non_supersedes:
  - Carry-A099 / Carry-A100 / Carry-P021 (Area #7a 정합 보존 carry — 본 carry 영향 0).
  - Area #1 / #2 (shot_staging `camera_direction` schema field owner) — boundary preserve, 본 carry 변경 0.
---

# Carry-D7d-1 — scene_detail v28 description align (v1)

## 1. Purpose + Scope

### 1.1 Purpose

Codex Q4 verbatim allowed claim: **`scene_detail primary camera_effect description aligned with Area #7d fallback description policy`**. scene_detail/27.202605181937 (Area #7b W3 production primary) 안 `detail_schema.json:15` 의 `camera_effect.description` (`"카메라 구도 + 색감 (필수)"`) 가 Area #7d v1 closure 안 fallback path (`scene_extractor_v2/20.202605190631/scene_detail_schema.json:15`) 의 narrow-aligned description (`"카메라 구도 + 색감 (필수, 시나리오 derivation; closed-list 강제 X)"`) 과 drift. 본 carry = primary path description 을 fallback path policy 와 정렬.

### 1.2 In-scope

- `prompts/_base/scene_detail/28.202605190927/` 신규 dir, **2 file only**:
  - `detail_schema.json` (modified — `t2i_variations.items.properties.camera_effect.description` narrow update; carrier `type="string"` + required preserve).
  - `system.md` (byte-identical copy from `27.202605181937/system.md`, sha256 match obligatory).
- 4-point sync code (3 anchor site, 1 module):
  - `backend/app/core/steps/detail_steps.py:106` (`SCENE_DETAIL_PROMPT_VERSION`).
  - `backend/app/core/version_registry.py:34` (`MODULE_VERSIONS["scene_detail_composer"]`).
  - `backend/app/core/version_registry.py:126` (`_MODULE_INFO["scene_detail_composer"]["prompt_dependency"]`).
- 7 sync-required tests update (Codex Q3 5 + 본 instance reclassified 2; file-level scope where multiple v27 sites exist, Codex IMPORTANT 1 corrected):
  - `backend/tests/test_prompt_versions.py` (line 213/222 — 2 v27 assert site + function rename line 216 `test_version_registry_scene_detail_composer_1_27_0` → `_1_28_0` + comments line 211/221 narrative narrow update, Codex amend 2 N-2).
  - `backend/tests/prompts/test_scene_detail_continuity_alignment.py` (**file-level** — 4-point sync 3 strict assert + 후속 v27 prompt-version block (~line 129) + 후속 latest-dir checks).
  - `backend/tests/prompts/test_scene_detail_spatial_alignment.py` (**file-level** — 4-point sync 3 strict assert + 후속 v27 site (예: line 114 `scene_detail/v27` + line 136/141 `startswith("27.")` 등 후속 site)).
  - `backend/tests/integration/test_g4_5a_spatial_integration.py` (**file-level** — line 562-606 4-point sync block + 후속 v27 site (예: line ~770 `current.startswith("27.")` config_hash check 등)).
  - `backend/tests/integration/test_area_7b_no_drift.py:47/83/96` (R2 nuanced SIBLING_INVENTORY semantic 전환).
  - `backend/tests/integration/test_area_5_residue_gate.py:172-185` (reclassified — `_latest_prompt_dir("prompts/_base/scene_detail/27.*/")` glob → `28.*/` + prose update).
  - `backend/tests/integration/test_area_7b_residue_gate.py` (**file-level** — reclassified, `_latest_active_dir("scene_detail", "27.")` helper line 88 → `"28."` + Gate 1.8 prose/docstring/function naming (line 203+ `scene_detail 27.*/system.md` 등) → `28.*/system.md` + line 285/295 dict literal → `"28."`).

### 1.3 Out-of-scope (boundary preserve)

- **system.md content edit**: scene_detail/27/system.md:579/594 안 `"camera_effect": "eye-level doorway composition"` = free text 예시 only (7+7 closed-list block 부재, Codex Q2 정합). 본 carry edit 0 (byte-identical copy).
- **SCENE_DETAIL_SCHEMA_VERSION bump**: 11 유지 (schema shape preserve, Codex Q3 정합).
- **STEP_MANIFEST schema_version bump**: `step_manifest.py:682` scene_detail entry 변경 0 (verify-only W1 pre-commit gate, Codex R7 정합).
- **field-shape migration**: `camera_effect` string carrier preserve, structured cinematography object 도입 X.
- **신규 strict residue R-id 신설**: closed-world plain string membership만, no regex semantic, no standalone token global ban.
- **Area #7d / #7b / #7a / #7c / #6 closure boundary preserve** (5 area 변경 0).
- **VLM (Vision Language Model)**: NO VLM hard constraint, 본 carry 검증/테스트 안 VLM 사용 0.

## 2. W0 Evidence Inventory (live, 본 instance 2026-05-19+)

### 2.1 scene_detail/27.202605181937 dir
- 실제 file = **2 file only** (`detail_schema.json` + `system.md`). turn_*.md 부재 (scene_detail module = scene_extractor_v2 와 다른 file 구성).
- 7+7 cinematography closed-list literal **부재** 확인 (Codex Q2 정합). system.md 안 `camera_effect` mention = line 579, 594 free text/example only.

### 2.2 4 code anchor (live grep confirmed)
- `detail_steps.py:106`: `SCENE_DETAIL_PROMPT_VERSION = "27.202605181937"`.
- `version_registry.py:34`: `MODULE_VERSIONS["scene_detail_composer"] = "1.27.0"` + Area #7b W3 narrative comment.
- `version_registry.py:126`: `_MODULE_INFO["scene_detail_composer"]["prompt_dependency"] = "scene_detail/v27"` (major suffix only) + Area #7b W3 narrative comment.

### 2.3 7 sync-required tests (live grep confirmed)
- 5 tests (Codex Q3 식별): line 번호 §1.2 참조.
- 2 reclassified (본 instance live grep, Codex Q3 review-only 가 actual update-required): `_latest_prompt_dir` / `_latest_active_dir` prefix `"27."` 가 v28 bump 시 wrong active dir 선택 → prose 안 "active latest" / "fresh canary scope" 명시 → update obligatory.

### 2.4 Fallback target wording source (carrier description verbatim)
- `prompts/_base/scene_extractor_v2/20.202605190631/scene_detail_schema.json:15` (Area #7d W1 commit `6cc4933`): `"camera_effect": {"type": "string", "description": "카메라 구도 + 색감 (필수, 시나리오 derivation; closed-list 강제 X)"}`.
- 본 verbatim wording = Carry-D7d-1 v28 `detail_schema.json:15` 적용 target.

### 2.5 STEP_MANIFEST scene_detail entry (Codex amend 2 N-1)
- `step_manifest.py:682` entry 존재. **dict shape**: `STEP_MANIFEST["scene_detail"]["schema_version"] == 11` (실제 live grep 결과). `prompt_version` field 부재. verify-only — `step_manifest.py` bump/edit 0 unless mismatch (Codex R7 정합 — W1 pre-commit verify-only gate).

## 3. Sync Contract (12-site table)

| # | site | scope | action |
|---|---|---|---|
| 1 | `prompts/_base/scene_detail/28.202605190927/detail_schema.json` | new dir 2 file | `camera_effect.description` narrow update (verbatim §2.4 wording). 다른 schema field 변경 0. |
| 2 | `prompts/_base/scene_detail/28.202605190927/system.md` | new dir 2 file | byte-identical copy from `27.202605181937/system.md` (sha256 match obligatory). |
| 3 | `detail_steps.py:106` `SCENE_DETAIL_PROMPT_VERSION` | 4-point sync (1) | `"27.202605181937"` → `"28.202605190927"` + narrative comment narrow update (Area #7b W3 → Carry-D7d-1 reference). |
| 4 | `version_registry.py:34` `MODULE_VERSIONS["scene_detail_composer"]` | 4-point sync (2) | `"1.27.0"` → `"1.28.0"` + narrative comment narrow update. |
| 5 | `version_registry.py:126` `_MODULE_INFO["scene_detail_composer"]["prompt_dependency"]` | 4-point sync (3) | `"scene_detail/v27"` → `"scene_detail/v28"` + comment narrow update. |
| 6 | `test_prompt_versions.py:211/213/216/221/222` | sync-required test 1 | `startswith("27.")` (line 213) → `startswith("28.")` + `"1.27.0"` (line 222) → `"1.28.0"` + function rename line 216 `test_version_registry_scene_detail_composer_1_27_0` → `_1_28_0` + comments line 211/221 narrative narrow update (Codex amend 2 N-2). `SCENE_DETAIL_SCHEMA_VERSION == 11` 유지. |
| 7 | `test_scene_detail_continuity_alignment.py` (file-level) | sync-required test 2 | 4-point sync 3 strict assert (`MODULE_VERSIONS==1.28.0` + `prompt_dependency==scene_detail/v28`) + 후속 v27 prompt-version block (~line 129) + 후속 latest-dir checks + docstring `v27` literal → `v28` substitute (line 13/14/16/17/18/64/91 + 후속 site). `SCENE_DETAIL_SCHEMA_VERSION == 11` assert 유지. |
| 8 | `test_scene_detail_spatial_alignment.py` (file-level) | sync-required test 3 | continuity_alignment.py 와 평행 substitute + 후속 v27 site (예: line 114 `scene_detail/v27` → `scene_detail/v28` + line 136/141 `startswith("27.")` → `startswith("28.")`) + docstring narrow. |
| 9 | `test_g4_5a_spatial_integration.py` (file-level) | sync-required test 4 | 4-point sync verify block (line 562-606) 안 `27.<timestamp>` → `28.202605190927` + `"1.27.0"` → `"1.28.0"` + `"scene_detail/v27"` → `"scene_detail/v28"` + 후속 site (예: line ~770 `current.startswith("27.")` config_hash check → `"28."`) + narrative comment narrow. |
| 10 | `test_area_7b_no_drift.py:47/83/96` | sync-required test 5 (R2 nuanced) | §3.1 별도 detail. |
| 11 | `test_area_5_residue_gate.py:172-185` | sync-required test 6 (reclassified) | `_latest_prompt_dir("prompts/_base/scene_detail/27.*/")` → `"prompts/_base/scene_detail/28.*/"` + prose line 177 `v27 fresh canary scope` → `v28 fresh canary scope` + docstring/comment narrow. |
| 12 | `test_area_7b_residue_gate.py` (file-level) | sync-required test 7 (reclassified) | `_latest_active_dir("scene_detail", "27.")` (line 88) → `"28."` + Gate 1.8 prose/docstring/function naming (line 203+ `scene_detail 27.*/system.md` 등) → `28.*/system.md` + prose line 285 안 `27.*` → `28.*` + line 295 `"scene_detail": "27."` dict literal → `"28."`. |

### 3.1 R2 nuance — `test_area_7b_no_drift.py` SIBLING_INVENTORY semantic 전환

본 file = Area #7b canary no-drift verification (6 sub-canary: C1-C6). scene_detail 관련 3 site:

**(a) Line 47 — `NEW_DIR_EXPECTED["scene_detail"]: "27."`**
- Action: `"27."` → `"28."` simple substitute (C1 latest activation 의무, v28 latest active expected).

**(b) Line 83 — `SIBLING_INVENTORY[("scene_detail", "27.", "26.202605181435")]: ["detail_schema.json"]`**
- 현재 contract: Area #7b W3 v26→v27 bump 시 v26 `detail_schema.json` 가 v27 안 byte-identical sibling (W3 안 `system.md` 만 modified).
- v28 bump 후 reality: v28 `detail_schema.json` = **modified** (Carry-D7d-1 narrow edit, description align), v28 `system.md` = **byte-identical copy from v27**.
- Action: 본 entry semantic 전환 = `("scene_detail", "28.", "27.202605181937"): ["system.md"]` (Codex R2 verbatim 권고). v26→v27 historical sibling check (`detail_schema.json` byte-identical) 는 active-latest no-drift canary scope 외 = drop (Codex 권고 "if you need to preserve Area #7b historical detail_schema sibling, mark it as historical-v27 only, not active-latest no-drift" → 본 carry v1 = drop, historical preservation 별도 carry 외 = 본 v1 외).

**(c) Line 96 — `MODIFIED_FILES: ("scene_detail", "27.", "system.md")`**
- 현재 contract: v27 `system.md` 가 canonical VWR clause 포함 (C6 glyph-exact membership ≥ 1).
- v28 reality: v28 `system.md` = byte-identical copy from v27 → canonical VWR clause preserve (membership ≥ 1).
- Action: `"27."` → `"28."` substitute (entry contract preserve, system.md canonical clause membership 의무 정합 보존).

## 4. W1 Implementation Contract (1 atomic commit)

### 4.1 Commit boundary
- Single atomic commit (Codex R3 정합) — code anchor + 7 test file 동시 update. **prompt version bump without code/tests = broken intermediate state** 회피 의무.
- Commit message: `area-7d-carry-d7d-1: W1 scene_detail v28 description align (12 site sync atomic — v28 prompt dir 2 file + 4-point sync 3 anchor + 7 sync-required tests + STEP_MANIFEST verify-only gate)`.

### 4.2 File operations (12 site)
§3 table + §3.1 R2 nuance 정합.

### 4.3 Pre-commit verify gate (W1, 6 check)
- **(a) UTC timestamp resolution + new dir name**: `UTC=$(date -u +%Y%m%d%H%M); NEW_DIR="prompts/_base/scene_detail/28.${UTC}"; test -d "$NEW_DIR"`.
- **(b) New dir 2 file count**: `test "$(ls $NEW_DIR | wc -l)" -eq 2`; exact = `detail_schema.json` + `system.md`.
- **(c) System.md sha256 byte-identical v27→v28**: `[ "$(sha256sum prompts/_base/scene_detail/27.202605181937/system.md | cut -d' ' -f1)" = "$(sha256sum $NEW_DIR/system.md | cut -d' ' -f1)" ]`.
- **(d) Description exact match in v28 detail_schema.json**: `grep -F '"카메라 구도 + 색감 (필수, 시나리오 derivation; closed-list 강제 X)"' $NEW_DIR/detail_schema.json` (hit ≥ 1) + `grep -cF '"카메라 구도 + 색감 (필수)"' $NEW_DIR/detail_schema.json` (hit = 0).
- **(e) 4-point sync grep**: `detail_steps.py` `28.${UTC}` + `version_registry.py:34` `"1.28.0"` + `version_registry.py:126` `"scene_detail/v28"` 모두 hit 1.
- **(f) STEP_MANIFEST verify-only (R7 + Codex IMPORTANT 4)**: `python -c "from app.core.step_manifest import STEP_MANIFEST; from app.core.steps.detail_steps import SCENE_DETAIL_SCHEMA_VERSION; assert STEP_MANIFEST['scene_detail']['schema_version'] == SCENE_DETAIL_SCHEMA_VERSION == 11"` — concrete dict access (`STEP_MANIFEST["scene_detail"]` 가 dict with `"schema_version": 11` shape, `step_manifest.py` edit 0 unless mismatch).

**Manual gate boundary** (Codex MINOR 3): 본 (a)-(f) 6 check = manual pre-commit verification gates, repo pre-commit hooks 와 별개. Hook output (예: `ruff` / `prettier`) 가 본 manual gates 를 대체하지 않음.

### 4.4 Targeted pytest (W1)
`backend/.venv/bin/pytest backend/tests/test_prompt_versions.py backend/tests/prompts/test_scene_detail_continuity_alignment.py backend/tests/prompts/test_scene_detail_spatial_alignment.py backend/tests/integration/test_g4_5a_spatial_integration.py backend/tests/integration/test_area_7b_no_drift.py backend/tests/integration/test_area_5_residue_gate.py backend/tests/integration/test_area_7b_residue_gate.py -v` — ALL PASS 의무.

## 5. W2 Closure Contract (1 atomic commit)

### 5.1 Closure docs scope (5 repo-local docs + external memory, Codex IMPORTANT 2 corrected)

**Repo-local docs (5 file, path-limited git add)**:
- (a) 본 spec — frontmatter status `draft` → `closed` + §9 Closure section in-place REPLACE (deferred §9 placeholder 본 spec 안 present → in-place REPLACE, Area #7d W4 함정 1 정합).
- (b) `docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md` §5.7 Sub-area (e) cinematography closed-list SOT dual-site bullet 안 `Carry-D7d-1 resolved at W1 atomic + W2 closure-docs` narrow append (heading 변경 X, 기존 bullet text preserve).
- (c) `docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/03-llm-side-heuristic-audit.md` L-8 row 안 `Carry-D7d-1 resolved` narrow update (row 신설 X, content append narrow only).
- (d) **(Codex R4)** `docs/superpowers/specs/2026-05-19-area-7d-cinematography-sot-dual-site-v1-design.md` §10.1 Carry-D7d-1 entry + §11.10 Carry Follow-up Post #7d row 1 = "deferred" status → "resolved at Carry-D7d-1 W1 commit + W2 closure-docs" narrow update.
- (e) **(Codex R4)** `docs/superpowers/plans/2026-05-19-area-7d-cinematography-sot-dual-site-v1-implementation.md` §10.1 Carry-D7d-1 row + §11.8 Carry Follow-up Post #7d row 1 = "deferred" status → "resolved" narrow update.

**External memory (non-git, 별도 update, git add 대상 X)**:
- (f) `MEMORY.md` + 본 carry session memo (`memory/session_20260519_carry_d7d_1_closure.md`) + Area #7d post-closure carry status update.

**Boundary preserve (R4 정합)**:
- audit 02 §5 P-4 narrow cross-reference 추가 X (Area #7d v1 closure 안 이미 P-4 → Site 2 매핑 완료).
- audit 02 §11.2 VWR table untouched 의무.
- **이유** (Codex R4 verbatim): "Otherwise the just-closed source docs remain stale".

### 5.2 W2 Pre-Commit Placeholder Substitution Gate (Codex IMPORTANT 3)

<!-- HISTORICAL AUDIT TRAIL / TEMPLATE ONLY: §5.2 W2 placeholder substitution gate description (historical — gate executed at W2 commit time `3334cbb`; interior `28.<UTC...>` placeholder mentions preserve as verbatim original substitution patterns; replacement gsub regex / awk marker-exclusion filter / grep pattern verbatim original W1 design-time wording — W2 fix-up 1 narrow `HISTORICAL_AUDIT_TRAIL_TEMPLATE_ONLY` marker wrap obligatory per Codex W2 per-wave NEEDS_REVISION_NARROW false-negative finding; future re-runs should use fixed-string `rg -n -F` over awk-filtered body, not `grep -cE` with literal `<` which BRE/ERE word-boundary may under-match). -->

**Rule**: W2 closure commit 직전, repo-local closure docs (§5.1 (a)-(e), 5 file) 안 live `28.<UTC-timestamp>` / `28.<UTC>` / `28.<timestamp>` placeholders 모두 actual W1 dir name (실제 substituted timestamp, 예 `28.202605XXXX`) 으로 substitute. HISTORICAL AUDIT TRAIL / TEMPLATE ONLY marker-wrapped block 안 placeholder 는 substitute X (marker 보존 — Area #7d 함정 1 정합).

**Pre-Commit Verify** (W2 gate, Codex amend 2 N-3 executable marker-block exclusion helper):

```bash
# W2 closure commit 직전 의무 — marker-block exclusion awk helper 후 grep 0 hit 의무
# (HISTORICAL AUDIT TRAIL / TEMPLATE ONLY ~ end TEMPLATE ONLY block 안 placeholder mention suppress)

CLOSURE_DOCS=(
  docs/superpowers/specs/2026-05-19-carry-d7d-1-scene-detail-v28-description-align-v1-design.md
  docs/superpowers/plans/2026-05-19-carry-d7d-1-scene-detail-v28-description-align-v1-implementation.md
  docs/superpowers/specs/2026-05-19-area-7d-cinematography-sot-dual-site-v1-design.md
  docs/superpowers/plans/2026-05-19-area-7d-cinematography-sot-dual-site-v1-implementation.md
  docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md
  docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/03-llm-side-heuristic-audit.md
)
TOTAL_HITS=0
for f in "${CLOSURE_DOCS[@]}"; do
  # awk suppresses lines between marker start ("HISTORICAL AUDIT TRAIL" + "TEMPLATE ONLY") and end ("end TEMPLATE ONLY")
  hits=$(awk '/HISTORICAL AUDIT TRAIL.*TEMPLATE ONLY/{flag=1; next} /end TEMPLATE ONLY/{flag=0; next} !flag' "$f" \
         | grep -cE "28\\.<UTC|28\\.<timestamp|28\\.<UTC-timestamp")
  TOTAL_HITS=$((TOTAL_HITS + hits))
done
[ "$TOTAL_HITS" -eq 0 ] || { echo "FAIL: placeholder residue $TOTAL_HITS hits in marker-excluded body"; exit 1; }
echo "OK W2 placeholder substitution gate (marker-excluded hit 0)"
```

<!-- end TEMPLATE ONLY -->

### 5.3 Closure verdict + range review + push gate
- W1 + W2 range review = Codex APPROVED_FOR_PUSH 의무 후 즉시 push origin main (사용자 ask 0, [[feedback_push_no_user_ask]] 정합).
- final pushed range/count = external memory only (W2 commit body 안 embedded X — self-reference 회피, Area #7d W4 closure doctrine 정합).

## 6. Test/Gate Contract (Codex Q6 / R5 verbatim 정합)

### G1 Exact closed-world description checks (W1 pre-commit verify-only)
- old description `"카메라 구도 + 색감 (필수)"` hit 0 in `prompts/_base/scene_detail/28.202605190927/detail_schema.json`.
- new description `"카메라 구도 + 색감 (필수, 시나리오 derivation; closed-list 강제 X)"` hit 1 at `camera_effect.description`.

### G2 sha256 byte-identical sibling
- v28 `system.md` sha256 byte-identical to v27 `system.md` (W1 §4.3 (c) 정합).

### G3 carrier shape preserve
- `camera_effect.type == "string"` + required list 안 `camera_effect` 포함 preserve. JSON Schema 다른 field 변경 0 (deep dict equality, Codex Q1 정합).

### G4 Area #7d closed-list absence (optional, descriptive only)
- Area #7d spec §2.6 R1-R6 full-phrase literals hit 0 in v28 dir. **standalone token global ban 절대 X** (`low angle` / `warm amber` / `bird's eye` 등 single token). **no regex semantic** (plain string membership only).

### G5 negative constraints
- No new strict residue R-id 신설 (Codex Q6 정합).
- NO VLM + no live LLM (Codex Q6 정합).
- No `_latest_*_dir` glob 안 `27.*/` 잔존 in 7 sync-required tests (post-W1).

## 7. Doctrine (4-Gate + NO VLM + closed-world + standalone token global ban + TEMPLATE ONLY + Legacy escape)

### 7.1 4-Gate Boundary Doctrine ([[feedback_llm_based_judgment]])
| Gate | Rule | 본 carry 적용 |
|---|---|---|
| Gate 1 Semantic Regex Ban | open-world semantic 판단 code regex X | W1 안 semantic regex 0 (description literal substitute + plain string membership only). |
| Gate 2 Prompt Closed-List Ban refined full-phrase only | closed-list full-phrase ban; standalone token global ban X | scene_detail/27 안 7+7 closed-list 부재 (§2.1) → 본 carry = closed-list 폐기 claim X (description-only align). |
| Gate 3 Structured SOT Required | carrier shape preserve | `camera_effect` string carrier preserve (§G3). field-shape migration 0 (out-of-scope §1.3). |
| Gate 4 No Silent Fallback | silent default 추가 X | description align만, silent default 추가 0. |

### 7.2 NO VLM hard constraint ([[feedback_no_vlm_dependency]])
- 본 carry 검증/테스트 (W1 targeted pytest + W2 closure docs) 안 VLM 사용 0. production `variation_recommender_v2.py` GPT Vision = 정상 module, 본 carry scope 외.

### 7.3 TEMPLATE ONLY + W3/W4 self-reference + Substitution self-referential bug + Legacy 본 commit retroactive escape ([[session_20260519_area_7c_v1_closure]] + [[session_20260519_area_7d_v1_closure]] 함정 1)
- 본 spec body 안 design-time placeholder slug (interior underscore variant `28.UTC` describing the original angle-bracketed `28.<U_T_C>` design-time form, underscore-escaped for grep gate hygiene) = controller-substitute target only. spec 안 doctrine description block 안 placeholder mention 시 HISTORICAL AUDIT TRAIL marker wrap + interior underscore variant escape 의무 (W2 closure 시 적용; W2 fix-up 1 narrow `HISTORICAL_AUDIT_TRAIL` marker wrap + underscore variant escape doctrine 강화 — never re-emit literal angle-bracketed forms outside marker blocks).
- W2 closure docs body 안 self-reference placeholder slug (`본_commit` 형식 등) 사용 X. explicit hash literal + "final pushed range/count = external memory only" suffix 의무.
- Legacy 타 area closure verify chain 안 `본 commit` mentions = 4-file path-limited scope 안 valid 시 retroactive `closure commit` semantic substitute (Area #7d 함정 1 정합).

### 7.4 Workflow doctrine
- Codex first 모든 결정 단계 ([[feedback_codex_mcp_discussion_workflow]]).
- subagent dispatch = opus ([[feedback_subagent_model_opus]]).
- raw typing 5-step `mcp__tmux-bridge__*` ONLY ([[feedback_codex_mcp_claude_mcp_response_trigger]]).
- session 50%+ rule + push 후 = Codex 의논 의무 ([[feedback_session_50pct_codex_close_check]]).
- push destructive = Codex APPROVED_FOR_PUSH 후 즉시 사용자 ask 0 ([[feedback_push_no_user_ask]]).
- /clear ONLY (`/exit` 금지, [[feedback_session_reset_clear_not_exit]]).

## 8. Closure Boundary / Carry Follow-up / References

### 8.1 Allowed claim wording (Codex Q4 verbatim)
> `scene_detail primary camera_effect description aligned with Area #7d fallback description policy`

### 8.2 Forbidden claim wording (Codex R5 5 항목)
- ❌ `full dual-owner remediation` (dual-owner site 1 (Site 1 variation_recommender) + site 2 (scene_extractor_v2 fallback) + scene_detail primary 3 site 중 본 carry = primary description-only align, full remediation claim X).
- ❌ `field-shape migration complete` (carrier string preserve, structured cinematography object 도입 X).
- ❌ `cinematography closed-list 완전 폐기` (scene_detail/27 안 closed-list 부재 → 폐기 claim 자체 무효; Area #7d v1 안 Site 2 7+7 + Site 1 examples 4+4 폐기는 Area #7d 의 claim).
- ❌ `structured cinematography object introduced` (field-shape migration major carry, 본 carry 외).
- ❌ `VLM/LLM validation` (no live LLM + NO VLM in W1/W2).

### 8.3 Remaining post-Carry-D7d-1 carry priority
1. **Carry-A099** — VWR system.md director_notes prose redesign V8+ (Area #7a 정합 보존, cost medium-large).
2. **Carry-A100** — VWR system.md t2i_context demonym redesign V8+ (Area #7a 정합 보존, cost medium).
3. **Carry-P021** — scene_consistency 7 enumeration broad, source unresolved low-priority (cost small).

### 8.4 References
- **Area #7d spec** = `docs/superpowers/specs/2026-05-19-area-7d-cinematography-sot-dual-site-v1-design.md` (§10.1 + §11.10 Carry-D7d-1 verbatim definition source; W2 closure 시 §5.2 (e) "resolved" status narrow update obligatory).
- **Area #7d plan** = `docs/superpowers/plans/2026-05-19-area-7d-cinematography-sot-dual-site-v1-implementation.md` (§10.1 + §11.8 row 1; W2 closure 시 §5.2 (f) "resolved" status narrow update obligatory).
- **Area #7d W4 closure commit** = `b9c610e` ([[session_20260519_area_7d_v1_closure]]).
- **Area #7b W3 commit** = `5060254` (scene_detail/27 4-point sync source, canonical VWR clause).
- **Area #7d W1 commit** = `6cc4933` (fallback target wording source `scene_extractor_v2/20.202605190631/scene_detail_schema.json:15`).
- **Roadmap** = `docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md` §5.7 Area #7 Sub-area (e) (W2 closure 시 §5.1 (b) narrow append target).
- **Audit 03** = `docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/03-llm-side-heuristic-audit.md` L-8 row (W2 closure 시 §5.1 (c) narrow update target).
- **Codex iter trace 본 spec drafting**: Q0-light entry (`Q0_LIGHT_APPROVED_WITH_SCOPE_CORRECTIONS` — 추가 sync site 3 식별) + outline iter 1 review (`OUTLINE_APPROVED_FOR_SPEC_V1_DRAFT_WITH_NARROW_CORRECTIONS` — R1-R9 narrow correction).
- **Memory** = [[feedback_llm_based_judgment]] + [[feedback_no_vlm_dependency]] + [[feedback_codex_mcp_discussion_workflow]] + [[feedback_codex_mcp_claude_mcp_response_trigger]] + [[feedback_subagent_model_opus]] + [[feedback_push_no_user_ask]] + [[feedback_session_50pct_codex_close_check]] + [[feedback_session_reset_clear_not_exit]] + [[session_20260519_area_7d_v1_closure]] + [[session_20260519_area_7c_v1_closure]] + [[session_20260519_area_7b_v1_closure]] + [[session_20260519_area_7a_v1_closure]].

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

### 9.1 Status + Closure Anchor

- **Status**: closed (W1 atomic + W2 closure-docs wave; range review/push gate pending at W2 closure commit time — Codex APPROVED_FOR_PUSH 후 즉시 push origin main, final pushed range/count = external memory only).
- **W1 implementation commit**: `05af1d5` (11 file staged / 12 sync sites / 127 pytest PASS 0.34s).
- **W1 NEW_DIR**: `prompts/_base/scene_detail/28.202605190927/`.
- **Pre-W1 HEAD**: `b9c610e` (Area #7d v1 closure post-push).
- **W2 closure-docs commit**: W2 closure-docs wave; exact hash recorded by git log/range review (not embedded in the same commit to avoid self-reference).
- **Allowed claim wording** (Codex Q4 verbatim, §8.1 정합): `scene_detail primary camera_effect description aligned with Area #7d fallback description policy`.

### 9.2 Wave Commit Table

| # | wave | type | hash | summary |
|---|---|---|---|---|
| 1 | W1 | implementation atomic | `05af1d5` | scene_detail v28 description align — 11 file / 12 sync sites (v28 prompt dir 2 + 4-point sync 3 anchor + 7 sync-required tests file-level + STEP_MANIFEST verify-only); 127 pytest PASS 0.34s. |
| 2 | W2 | closure-docs atomic | (recorded by git log/range review) | 6 file path-limited (본 spec frontmatter + §9 + 본 plan first commit + roadmap §5.7 + audit 03 L-8 + Area #7d source spec/plan §10.1/§11.10/§11.8 + 6 sites Carry-D7d-1 deferred→resolved). |

후속 range-review fix-up commits 가능 (별도 narrow fix-up hash, range review evidence external memory).

### 9.3 12-site Sync Result

§3 table 정합 result (all sync done at W1 commit `05af1d5`):

- **Site 1**: `prompts/_base/scene_detail/28.202605190927/detail_schema.json` — `camera_effect.description` narrow update verbatim from Area #7d fallback wording (`"카메라 구도 + 색감 (필수, 시나리오 derivation; closed-list 강제 X)"`). carrier `type="string"` + required preserve.
- **Site 2**: `prompts/_base/scene_detail/28.202605190927/system.md` — byte-identical copy from `27.202605181937/system.md` (sha256 match obligatory, §9.6 정합).
- **Site 3**: `detail_steps.py:106` `SCENE_DETAIL_PROMPT_VERSION = "28.202605190927"` (Area #7b W3 historical comment preserve + Carry-D7d-1 narrow append).
- **Site 4**: `version_registry.py:34` `MODULE_VERSIONS["scene_detail_composer"] = "1.28.0"` (preserve + append).
- **Site 5**: `version_registry.py:126` `_MODULE_INFO["scene_detail_composer"]["prompt_dependency"] = "scene_detail/v28"` (preserve + append line 127 `updated_at`).
- **Site 6**: `test_prompt_versions.py` (line 211/213/216/221/222 — 5 site narrow update, function rename `_1_27_0` → `_1_28_0` + 2 assert + 2 comment).
- **Site 7**: `test_scene_detail_continuity_alignment.py` (file-level rewrite — 4-point sync 3 strict assert + docstring history preserve + Carry-D7d-1 narrow append).
- **Site 8**: `test_scene_detail_spatial_alignment.py` (file-level rewrite — parallel to continuity_alignment).
- **Site 9**: `test_g4_5a_spatial_integration.py` (file-level — 4-point sync block + line 770 startswith substitute + 후속 active site).
- **Site 10**: `test_area_7b_no_drift.py:47/83/96` (R2 nuanced SIBLING_INVENTORY semantic 전환 — §9.4 참조).
- **Site 11**: `test_area_5_residue_gate.py:172-185` (function rename `_v27_` → `_v28_` + glob `27.*/` → `28.*/`).
- **Site 12**: `test_area_7b_residue_gate.py` (file-level — fixture `scene_detail_v27_dir` → `scene_detail_v28_dir` 6 site replace_all + helper + Gate 1.8 prose + Gate 4 prose + line 295 dict).

### 9.4 R2 nuance applied (`test_area_7b_no_drift.py` SIBLING_INVENTORY semantic 전환 result)

§3.1 R2 nuance 정합:

- **(a) line 47** `NEW_DIR_EXPECTED["scene_detail"]`: `"27."` → `"28."` (C1 latest activation 의무).
- **(b) line 83** `SIBLING_INVENTORY` entry semantic 전환: `("scene_detail", "27.", "26.202605181435"): ["detail_schema.json"]` → `("scene_detail", "28.", "27.202605181937"): ["system.md"]`. v28 `detail_schema.json` = modified (sibling X). v28 `system.md` = byte-identical copy from v27 (active sibling). v26→v27 historical sibling check (detail_schema.json byte-identical) = active-latest no-drift canary scope 외 → drop (Codex R2 verbatim 권고).
- **(c) line 96** `MODIFIED_FILES`: `("scene_detail", "27.", "system.md")` → `("scene_detail", "28.", "system.md")` (canonical VWR clause membership preserve, C6 정합).

### 9.5 Description Exact Match Result (§G1)

- old description `"카메라 구도 + 색감 (필수)"` hit 0 in `prompts/_base/scene_detail/28.202605190927/detail_schema.json` (W1 pre-commit gate (d) PASS).
- new description `"카메라 구도 + 색감 (필수, 시나리오 derivation; closed-list 강제 X)"` hit 1 at `camera_effect.description` (W1 pre-commit gate (d) PASS).

### 9.6 sha256 byte-identical Result (§G2)

- v28 `system.md` sha256 byte-identical to v27 `system.md` = `aab1fae0bb5bff9074593b55b4d778696d6a05eaacd8e2e491dfeb47b904b719` (W1 pre-commit gate (c) PASS).

### 9.7 Carrier Shape Preservation Result (§G3)

- `camera_effect.type == "string"` preserve + required list 안 `camera_effect` 포함 preserve (JSON Schema 다른 field 변경 0, deep dict equality 정합).
- `SCENE_DETAIL_SCHEMA_VERSION == 11` preserve (W1 pre-commit gate (f) STEP_MANIFEST verify-only PASS).

### 9.8 7 sync-required tests ALL PASS Result (§4.4 pytest)

`backend/.venv/bin/pytest backend/tests/test_prompt_versions.py backend/tests/prompts/test_scene_detail_continuity_alignment.py backend/tests/prompts/test_scene_detail_spatial_alignment.py backend/tests/integration/test_g4_5a_spatial_integration.py backend/tests/integration/test_area_7b_no_drift.py backend/tests/integration/test_area_5_residue_gate.py backend/tests/integration/test_area_7b_residue_gate.py -v --tb=short`

- **Result**: 127 tests, 127 PASS, 0 FAIL (0.34s).
- NO VLM. no live LLM. closed-world exact phrase membership only.

### 9.9 Area #7d source carry references update Result (§5.1 (d) + (e), Codex R4)

- **Area #7d source spec** (`docs/superpowers/specs/2026-05-19-area-7d-cinematography-sot-dual-site-v1-design.md`): 6 stale `Carry-D7d-1 deferred` mentions updated to `was deferred from Area #7d v1; resolved by Carry-D7d-1 W1 05af1d5 + W2 closure-docs` (lines 16 frontmatter `non_supersedes` + 59 §1.3 + 173 §5.4 dual-owner producer + 202 §6 W1 in 결정 + 319 §10.2 risks + 412 §11.10 row 1). Area #7d v1 historical scope preserve (Area #7d v1 self-scope 안 scene_detail/28 신설 0 명시).
- **Area #7d source plan** (`docs/superpowers/plans/2026-05-19-area-7d-cinematography-sot-dual-site-v1-implementation.md`): §10.1 Carry-D7d-1 row 안 `Status (post-Carry-D7d-1)` narrow append. §11.8 = TEMPLATE ONLY block historical, untouched (Codex narrow guard 정합 — `Do not rewrite historical template blocks`).
- **Roadmap** (`docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md`): §5.7 Sub-area (e) bullet 안 narrow append `Carry-D7d-1 resolved by W1 05af1d5 + W2 closure-docs — scene_detail primary camera_effect description aligned with Area #7d fallback description policy`.
- **Audit 03** (`docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/03-llm-side-heuristic-audit.md`): L-8 row 안 `(scene_detail/27.202605181937 description-only narrow update = Carry-D7d-1 deferred)` → `(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)` narrow replace.
- **audit 02 §5 P-4** = boundary preserve (cross-reference 추가 X, Area #7d v1 W4 closure 안 이미 매핑). audit 02 §11.2 untouched.

### 9.10 Closure Verdict

Codex iter rounds 본 carry v1:
- Q0-light entry: `Q0_LIGHT_APPROVED_WITH_SCOPE_CORRECTIONS`.
- Outline iter 1: `OUTLINE_APPROVED_FOR_SPEC_V1_DRAFT_WITH_NARROW_CORRECTIONS` (R1-R9).
- Spec quality iter 1: `NEEDS_REVISION_MINOR` (4 IMPORTANT + 3 MINOR).
- Spec narrow re-review 1: `NEEDS_REVISION_NARROW` (N-1/N-2/N-3).
- Spec narrow re-review 2: `APPROVED_FOR_PLAN`.
- Plan quality iter 1: `NEEDS_REVISION_MINOR` (4 IMPORTANT + 3 MINOR + operational note).
- Plan narrow re-review 1: `APPROVED_FOR_EXECUTION_WITH_NARROW_TEXT_FIXES` (TEXT FIX 1/2 적용).
- W1 entry sanity: `APPROVED_FOR_W1_ENTRY_THIS_SESSION`.
- W1 per-wave: `APPROVED_FOR_W2_ENTRY` + `CLOSE_HANDOFF_W2_FRESH`.
- W2 entry sanity: `APPROVED_FOR_W2_ENTRY_THIS_SESSION_WITH_NARROW_GUARDS` (8 narrow guard 흡수).
- W2 per-wave + W1-W2 range review: pending at W2 commit time.

### 9.11 함정 신규 (본 carry v1)

1. **Bash polling loop 폐기 doctrine** (Codex plan iter 1 operational note): `until [ -f /tmp/marker ]; do sleep ...; done` pattern 폐기. raw MCP `tmux_read` 다회 호출만 사용.
2. **Site 12 fixture surface 정정** (Codex plan iter 1 IMPORTANT 3): 초기 wording `test_gate_1_8_*` rename → actual surface = fixture `scene_detail_v27_dir` (line 87) + 5 caller cascade (line 206/208/235/315/327). Plan drafting 시 actual code surface live verify 의무.
3. **SIBLING_INVENTORY R2 nuance semantic transition** (Codex outline iter 1 R2): dict literal substitute 시 entry의 semantic 의미 분석 의무 (prefix-only substitute 위험 — v28 detail_schema.json = modified sibling X, v27 system.md = byte-identical sibling O).
4. **Provenance preservation doctrine** (Codex plan iter 1 IMPORTANT 1): minor/major version bump 시 historical provenance comment 보존 + new bump narrow append. "replace all historical comments" 금지.

### 9.12 Carry Follow-up Post Carry-D7d-1 (§8.3 priority 정합)

1. **Carry-A099** — VWR system.md director_notes prose redesign V8+ (Area #7a 정합 보존, cost medium-large).
2. **Carry-A100** — VWR system.md t2i_context demonym redesign V8+ (Area #7a 정합 보존, cost medium).
3. **Carry-P021** — scene_consistency 7 enumeration broad, source unresolved low-priority (cost small).

### 9.13 Forbidden claims (Codex R5 5 항목, §8.2 정합)

- ❌ `full dual-owner remediation`.
- ❌ `field-shape migration complete`.
- ❌ `cinematography closed-list 완전 폐기` (scene_detail/27 안 closed-list 부재).
- ❌ `structured cinematography object introduced`.
- ❌ `VLM/LLM validation` (no live LLM + NO VLM in W1/W2).
