---
title: Carry-A099 — VWR system.md director_notes prose redesign V8+ (v1 design)
date: 2026-05-19
status: closed (Codex iter rounds APPROVED — Q0-light + Q1-Q7 outline + spec quality iter + plan iter + W1 per-wave + W2 per-wave + W2 fix-up 1 narrow re-review + W3 entry sanity APPROVED_FOR_W3_ENTRY_WITH_SCOPE_GUARD; final pushed range/count external memory only after push)
roadmap_ref: docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md §5.7 Area #7 (Track B Tier 3 carry follow-up post #7a/#7b/#7c/#7d/Carry-D7d-1, audit 02 §11.3/§13/§14 line 308 A099 row Carry-A099 V8+ VWR prose redesign)
prerequisites:
  - Area #7a (visual_world_rules SOT v1, closed 2026-05-19, push `d0410eb`) — VWR producer SOT boundary preserve; Carry-A099 source 정의 (spec §1.4 + §11.4 + §12.1 line 72/413).
  - Area #7b (VWR downstream prompt cascade v1, closed 2026-05-19+, push `e751e72`) — Carry-A099 boundary preserve mention (spec §1.3 + §6.2 + §11.6 line 14/109/129/570/715).
  - Area #7c (t2i_review v6 placeholder example abstraction v1, closed 2026-05-19+, push `62aa2ef`) — abstraction pattern reference.
  - Area #7d (cinematography closed-list SOT dual-site v1, closed 2026-05-19+, push `b9c610e`) — dual-site cascade pattern reference.
  - Carry-D7d-1 (scene_detail v28 description align v1, closed 2026-05-19+, push `05d5265`) — TEMPLATE ONLY fix-up 1 doctrine source.
non_supersedes:
  - Carry-A100 (VWR system.md t2i_context demonym redesign V8+) — 별도 carry, 본 carry 영향 0.
  - Carry-P021 (scene_consistency 7 enumeration broad, source unresolved) — 별도 carry.
---

# Carry-A099 — VWR system.md director_notes prose redesign V8+ (v1)

## 1. Purpose + Scope

### 1.1 Purpose

Codex Q0-light allowed claim verbatim (Area #7a v1 spec §1.4 source): **`director_notes prose examples / bad examples were abstracted to remove closed-list semantic hard-prime examples and scenario-summary examples while preserving the existing director_notes carrier contract`**.

VWR latest `prompts/_base/visual_world_rules/7.202605181540/system.md:57-80` `director_notes` section 안 5 line 올바른 예시 (line 68-72) + 4 line 잘못된 예시 (line 75-78) prose hard-prime examples = LLM-generate natural-language rule 으로 physical-presence routing 위임 (Area #7a v1 spec §1.4 + audit 02 line 308 A099 row 정의).

본 carry v1 = **Option 2 추상화 (abstract) only** (Codex Q0-light verdict 정합). closed-list semantic hard-prime example phrases + scenario-summary example phrases 모두 제거 + generic principle process wording 으로 lift. `director_notes: array<string> required` carrier contract preserve, schema shape change X, consumer rewrite X.

### 1.2 In-scope

- **VWR prompt pack v8 신규 dir**: `prompts/_base/visual_world_rules/8.202605191102/` (2 file, underscore-escaped prose placeholder per post-Carry-D7d-1 fix-up 1 doctrine; W1 controller shell substitute → actual `8.${UTC}` value at execution time):
  - `system.md` modified (line 57-80 director_notes section prose abstraction; 작성 규칙 4 rule line 61-65 preserve, 5 올바른 예시 + 4 잘못된 예시 모두 abstract; final self-questioning sentence line 80 preserve by default unless plan iter explicit change + Codex approval).
  - `rules_schema.json` byte-identical copy from `7.202605181540/rules_schema.json` (sha256 match obligatory, Codex Q3 lock 정합).
- **Prompt-pack activation + STEP_MANIFEST verify** (Codex Q2 명명 정정, no actual code sync surface):
  - `prompts/_base/visual_world_rules/8.202605191102/` active-version latest resolution by `_latest_active_dir` / `load_prompt` / `load_schema` source-path proof (Area #7b 패턴 정합; loader source-path 통해 v8 resolution verify, plain shell directory count = helper only per Codex IMPORTANT 3 정합).
  - `STEP_MANIFEST['visual_world_rules']['schema_version'] == 1` preserve verify-only (no edit unless mismatch; default = no STEP_MANIFEST edit per Codex Q2/Q3 lock).
- **W2 integrated test** (file-level new, no live LLM + NO VLM + no regex semantic):
  - `backend/tests/integration/test_carry_a099_director_notes_abstraction.py` (G1-G5 verify gate, Area #7c/#7d 패턴 정합).
- **W3 closure docs** (path-limited):
  - 본 spec frontmatter status closed + §10 closure section.
  - Carry-A099 plan first commit (drafting closure).
  - Roadmap §5.7 Sub-area (b) Phase 1+/Phase 2+ post-#7d carry follow-up narrow append `Carry-A099 resolved by W1/W2 + W3 closure-docs (Option 2 abstract; structured emit follow-up deferred)`.
  - Audit 02 §11.3/§13/§14 + line 308 A099 row narrow update `Carry-A099 resolved by W1/W2 + W3 closure-docs`.
  - Area #7a v1 spec §1.4 + §11.4 + §12.1 line 72/413 Carry-A099 status narrow update.
  - Area #7b v1 spec §1.3 + §6.2 + §11.6 line 14/109/129/570/715 Carry-A099 status narrow update.

### 1.3 Out-of-scope (Codex 7 narrow guard 흡수)

- **`director_notes` field carrier shape change**: `array<string> required` preserve. Schema shape migration X.
- **`rules_schema.json` description-only wording change**: byte-identical default lock (Codex Q3 정합). Current schema description 자체는 generic enough, hard-prime 부재. Schema description change = open option X unless new concrete finding + Codex re-approve scope.
- **STEP_MANIFEST schema_version bump**: `schema_version=1` preserve verify-only. cp invalidation cascade 회피 (Codex Q2 lock).
- **Production consumer rewrite (4 file)**: `visual_context_helper.py` / `character_list_step.py` / `director_steps.py` / `beat_shot_steps.py` 변경 0. W1 시 consumer break 발견 시 즉시 stop + Codex re-discuss (silent widen W1 금지, Codex 7 narrow guard 2).
- **`director_steps.py:122-128` fallback chain edit**: preservation only — empty `director_notes` → rules `possession/projection/ghost` extract → `visual_guideline` join. Gate 4 No Silent Fallback 정합. W2 안 fallback canary source/behavior preservation gate 가능, file edit X (Codex 7 narrow guard 4).
- **Replacement prose = new closed-list category inventory**: enumerated category example (예: fixed list `scene-time/space mismatch`, `perception-restricted entity`, `screen-layer mediation`, `crosscut juxtaposition`, `occlusion ambiguity` 등) 금지. 본 spec 안 process wording 으로 추상화 — "principle must be scenario-agnostic, one physical-presence ambiguity per item, no entity/scene/event specifics". Illustrative design note 사용 시 closed taxonomy 아님 explicit 명시 (Codex 7 narrow guard 3).
- **Carry-A100** (VWR `system.md` t2i_context demonym redesign line 95+) — 별도 carry.
- **Carry-P021** (scene_consistency 7 enumeration broad, source unresolved) — 별도 carry.
- **Area #7a v1 closure boundary** (A047/A096/A097/A098 처리 완료).
- **Area #7b v1 closure boundary** (VWR downstream prompt cascade 11-site W6 commit `c92d460`).
- **Area #7c v1 closure boundary** (t2i_review v6 placeholder example abstraction).
- **Area #7d v1 closure boundary** (cinematography closed-list SOT dual-site).
- **Carry-D7d-1 v1 closure boundary** (scene_detail v28 description align).
- **Field-shape migration** (structured `directing_principle: {category, guideline}` etc.) = major carry / future Carry-A099-structured or Area follow-up.
- **VLM / live LLM / semantic regex / standalone-token residue gates** — 모두 ban.
- **TEMPLATE ONLY / self-reference rule applies from spec v1 onward**: no literal angle-bracket placeholders outside marker blocks ([[session_20260519_carry_d7d_1_v1_closure]] fix-up 1 강화 doctrine 정합, Codex 7 narrow guard 7).

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

### 2.1 Active VWR pack
- Latest dir = `prompts/_base/visual_world_rules/7.202605181540/` (2 file: `system.md` 130 line + `rules_schema.json` 45 line).
- `system.md` director_notes section: line **57-80** 실측 (W0.1 inventory verified, Codex spot-check confirmed).

### 2.2 director_notes section structure (line 57-80)
- line 57 heading `## director_notes (유형적 메타 판단 기준)`.
- line 59 lead `씬 감독이 물리적 존재 여부를 판단할 때 혼동할 수 있는 유형적 원칙을 추출하세요.`.
- line 61-65 **작성 규칙 (절대)** 4 rule (preserve 의무): (a) 하나의 유형적 원칙, (b) 인물 이름/씬 번호/구체적 사건 금지, (c) 폭력/사망/신체 훼손 구체적 묘사 금지, (d) 한 항목 1~2문장 짧고 추상적.
- line 67-72 **올바른 예시 5** (line 68-72 각 1 example, abstract 대상).
- line 74-78 **잘못된 예시 4** (line 75-78 각 1 quoted example, abstract 대상).
- line 80 final self-questioning sentence (preserve by default unless plan iter explicit change + Codex approval).

### 2.3 `rules_schema.json` director_notes shape (Codex Q3 byte-identical lock)
- Path `7.202605181540/rules_schema.json:32-36`: `"director_notes": {"type": "array", "items": {"type": "string"}, "description": "씬 감독이 물리적 존재 여부를 판단할 때 참고할 구체적 가이드 (작품 전반에 적용 가능한 유형적 원칙만 — 특정 인물/씬/사건 묘사 금지)"}`.
- `"required"` list line 42 안 포함 → director_notes = required.
- Current schema description = generic, no hard-prime example. **Byte-identical lock for v1** (Codex Q3 정합, schema description change = open option X).

### 2.4 Direct director_notes reader (live grep, 4 file, v1 변경 0)
1. `backend/app/services/visual_context_helper.py:109-114` — `_bullet_block("Director notes (physical presence)", vwr.get("director_notes") or [])`. Empty → block omitted.
2. `backend/app/core/steps/character_list_step.py:55-72` — `notes = rules_data.get("director_notes", [])` → optional inject `"[시각적 규칙]"` prefix. Empty → skip.
3. `backend/app/core/steps/director_steps.py:114-129` — `notes = rules_data.get("director_notes", [])` 주력 + **fallback chain line 122-128** (empty → rules `rule_type in ("possession", "projection", "ghost")` extract → `visual_guideline` join). **Gate 4 No Silent Fallback 정합 risk for Option 1 폐기** (rejected v1).
4. `backend/app/core/steps/beat_shot_steps.py:103-119 (beat) + 311-328 (shot)` — `notes = rules_data.get("director_notes", [])` + logger info "물리적 존재 기준 미적용" on empty. No fallback.

### 2.5 STEP_MANIFEST entry (verify-only, v1 변경 0)
- `backend/app/core/step_manifest.py:130-141` `visual_world_rules.schema_version=1` (Area #7a W1 set, `cp invalidation: incompatible-stamp cp blocked via _check_cp_mismatch`). v1 = no edit unless mismatch (default no edit per Codex Q2/Q3 lock).

### 2.6 Test anchor (W0.1 verified)
- `backend/tests/test_visual_world_rules.py` (Area #7a W3a residue, 7 PASS preserve).
- `backend/tests/integration/test_area_7a_no_drift.py` (W3b canary 8 PASS preserve, fixture `"director_notes": []` line 81/102).
- `backend/tests/integration/test_area_7a_residue_gate.py` (W3a 7 PASS preserve).
- `backend/tests/services/test_visual_context_helper.py:46` (fixture `"director_notes": ["N1"]` preserve, prose change 영향 0 verify).

## 3. Sync Contract (prompt-pack activation + STEP_MANIFEST verify, no code sync surface)

| # | site | scope | action |
|---|---|---|---|
| 1 | `prompts/_base/visual_world_rules/8.202605191102/system.md` | new dir 2 file | line 57-80 director_notes section prose abstraction. 작성 규칙 4 rule preserve. 5 올바른 예시 + 4 잘못된 예시 모두 abstract. final self-questioning preserve by default. |
| 2 | `prompts/_base/visual_world_rules/8.202605191102/rules_schema.json` | new dir 2 file | byte-identical copy from `7.202605181540/rules_schema.json` (sha256 match obligatory). Codex Q3 lock. |
| 3 | `STEP_MANIFEST['visual_world_rules']['schema_version']` | verify-only | preserve `1` (no edit). cp invalidation 회피. |
| 4 | active-version resolution by `_version_sort_key` / `load_prompt` / `load_schema` source-path proof | verify-only | v8 resolution verify via loader source-path (loader 반환 path 안 `8.202605191102` prefix dir 명시 확인). plain lexicographic sort tail 위험 회피 (Codex IMPORTANT 3). DB row override 의무 X. |

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

### 4.1 Commit boundary
- Single atomic commit — VWR v8 prompt pack 생성 (2 file). prompt-only change, code edit 0.
- Commit message: `W1(carry-a099-vwr-system-md-director-notes-prose-redesign-v1): director_notes prose abstraction — visual_world_rules v8 (2 file: system.md modified + rules_schema.json byte-identical)`.

### 4.2 File operations
- **(a)** `mkdir -p prompts/_base/visual_world_rules/8.${UTC}` (where `UTC=$(date -u +%Y%m%d%H%M)`).
- **(b)** `cp prompts/_base/visual_world_rules/7.202605181540/rules_schema.json prompts/_base/visual_world_rules/8.${UTC}/rules_schema.json` (byte-identical).
- **(c)** `cp prompts/_base/visual_world_rules/7.202605181540/system.md prompts/_base/visual_world_rules/8.${UTC}/system.md`; then modify line 57-80 director_notes section: 5 올바른 예시 + 4 잘못된 예시 모두 abstract; 작성 규칙 line 61-65 + heading line 57 + lead line 59 preserve; final self-questioning line 80 preserve by default unless plan iter explicit change + Codex approval (Codex spec amend 1 narrow MINOR 1 정합).

### 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/visual_world_rules/8.${UTC}"; test -d "$NEW_DIR"`.
- **(b) New dir 2 file count**: `test "$(ls $NEW_DIR | wc -l)" -eq 2`; exact = `rules_schema.json` + `system.md`.
- **(c) `rules_schema.json` sha256 byte-identical from v7**: `[ "$(shasum -a 256 prompts/_base/visual_world_rules/7.202605181540/rules_schema.json | cut -d' ' -f1)" = "$(shasum -a 256 $NEW_DIR/rules_schema.json | cut -d' ' -f1)" ]`.
- **(d) R1-R9 residue absence in v8 system.md**: 9 strict residue R-id (§7.1 G4 정합) — exact full-phrase membership hit 0.
- **(e) STEP_MANIFEST schema_version=1 preserve**: `python -c "from app.core.step_manifest import STEP_MANIFEST; assert STEP_MANIFEST['visual_world_rules']['schema_version'] == 1"`.
- **(f) Active-version resolution via loader source-path proof** (Codex IMPORTANT 3 정합): `_version_sort_key` + `load_prompt("visual_world_rules", "system", db=None)` + `load_schema("visual_world_rules", "rules_schema", db=None)` 호출 결과 source-path 안 `8.${UTC}` prefix dir 명시 확인. plain shell directory count = helper only, lexicographic sort tail 위험 회피.

### 4.4 Targeted pytest (W1)
`backend/.venv/bin/pytest backend/tests/test_visual_world_rules.py backend/tests/integration/test_area_7a_no_drift.py backend/tests/integration/test_area_7a_residue_gate.py backend/tests/services/test_visual_context_helper.py -v --tb=short` — ALL PASS 의무 (Area #7a inherited test 4 file).

## 5. W2 Integrated Test Contract (1 atomic commit)

### 5.1 New test file
- `backend/tests/integration/test_carry_a099_director_notes_abstraction.py`:
  - Gate 1 (G4) — R1-R9 9 strict residue exact full-phrase membership hit 0 in v8 `system.md`.
  - Gate 2 (G3) — `rules_schema.json` sha256 byte-identical from v7 (Codex Q3 lock).
  - Gate 3 (G5) — new abstract wording presence (spec drafting 시 정해진 abstract wording hit ≥ 1 — process wording, not closed-list category enumeration per Codex 7 narrow guard 3).
  - Gate 4 (G6) — `STEP_MANIFEST['visual_world_rules']['schema_version'] == 1` preserve.
  - Gate 5 (optional, G7) — `director_steps.py:122-128` fallback chain source preservation canary (no edit, behavior verify only).

### 5.2 Doctrine
- no live LLM + NO VLM + no regex semantic + no standalone token global ban (Codex Q6 정합).
- closed-world exact phrase membership only.
- 4-Gate Boundary Doctrine inline.

## 6. W3 Closure Docs Contract (1 atomic commit)

### 6.1 Closure docs scope (6 repo-local docs + external memory, path-limited)
- (a) 본 spec frontmatter `status: draft` → `status: closed` + §10 closure section.
- (b) Carry-A099 plan (`docs/superpowers/plans/2026-05-19-carry-a099-vwr-system-md-director-notes-prose-redesign-v1-implementation.md`) first commit (drafting closure, frontmatter status narrow).
- (c) Roadmap `§5.7` Sub-area (b) Phase 1+/Phase 2+ post-#7d carry follow-up bullet narrow append `Carry-A099 resolved by W1/W2 + W3 closure-docs — director_notes prose hard-prime examples abstracted` (Codex 7 narrow guard 6 verbatim).
- (d) Audit 02 §11.3 + §13 + §14 + line 308 A099 row narrow update `Carry-A099 resolved by W1/W2 + W3 closure-docs`.
- (e) Area #7a v1 spec §1.4 + §11.4 + §12.1 line 72/413 Carry-A099 status `deferred` → `resolved by Carry-A099 W1/W2 + W3 closure-docs` narrow update.
- (f) Area #7b v1 spec §1.3 + §6.2 + §11.6 line 14/109/129/570/715 Carry-A099 status narrow update.
- (g) External memory (non-git): MEMORY.md + 본 carry session memo + Carry priority 정합 update.

**W0.1 inventory + Q1-Q7 outline = untracked reference artifacts** unless plan explicitly decides commit (Codex 7 narrow guard 5 + 권고).

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

## 7. Test/Gate Contract

### 7.1 G1-G7 verify gate (W1 pre-commit + W2 integrated test)
- **G1 Active prompt pack resolution via loader source-path proof** (Codex IMPORTANT 3 정합): `load_prompt`/`load_schema`/`_version_sort_key` 호출 결과 source-path 안 `visual_world_rules/8.202605191102` prefix dir 명시 확인. plain shell `ls + sort` lexicographic tail 위험 회피 (helper only).
- **G2 New v8 file count**: `prompts/_base/visual_world_rules/8.202605191102/` 안 file count = 2 (`system.md` + `rules_schema.json`).
- **G3 `rules_schema.json` sha256**: byte-identical from `7.202605181540/rules_schema.json` (Codex Q3 lock).
- **G4 R1-R9 residue absence** (exact full-phrase membership hit 0 in v8 `system.md`):
  - **R1** = `system.md:68` verbatim full string `회상/F.B 장면의 인물·소품·혈흔 등은 회상하는 인물의 기억 이미지이며, 회상 종료 후 현재 씬 공간에는 물리적으로 존재하지 않는다.`
  - **R2** = `system.md:69` verbatim full string `특정 인물에게만 보이는 환각/현시 대상은 다른 인물이 등장하는 씬에서는 화면에서 제거한다.`
  - **R3** = `system.md:70` verbatim full string `CCTV·모니터·창문 너머 등 화면 매개로 보이는 인물은 그 매개 표면 안쪽 평면 이미지로만 그리고, 매개 밖 공간에는 두지 않는다.`
  - **R4** = `system.md:71` verbatim full string `교차편집/몽타주로 다른 장소가 보일 때 두 장소의 인물을 한 프레임에 합치지 않는다.`
  - **R5** = `system.md:72` verbatim full string `안개·어둠 등 시야 차단 장치는 그 안의 대상을 명확히 묘사하지 말고 차단 그대로 둔다.`
  - **R6** = `system.md:75` verbatim quoted string `"인물A 가 보는 인물B 의 시신은 인물A 의 환각으로 우선 판단한다."`
  - **R7** = `system.md:76` verbatim quoted string `"수사관과 형사가 장소X 에 도착했을 때 시신이 사라진 상태라면..."`
  - **R8** = `system.md:77` verbatim quoted string `"특정 씬 번호의 시신은 회상 이미지이다."`
  - **R9** = `system.md:78` verbatim quoted string `"인물C 의 배가 안개로 들어가는 장면은 다른 세계 이동이 아니다."`
- **G5 New abstract wording presence** (canonical process wording per Codex spec amend 1 narrow MINOR 1): process wording `principle must be scenario-agnostic, one physical-presence ambiguity per item, no entity/scene/event specifics` 또는 한국어 equivalent (예: `원칙은 시나리오에 무관하며, 항목당 하나의 물리적 존재 모호성만 다루고, 특정 인물·씬·사건을 적시하지 않는다`) hit ≥ 1 in v8 `system.md`. **반드시 enumerated output taxonomy 형태 X** — closed-list category enumeration 형식 (예: `category: [recall, hallucination, screen_layer, crosscut, occlusion]`) 명시적 금지 (Codex 7 narrow guard 3 + Codex spec amend 1 narrow MINOR 1 정합).
- **G6 STEP_MANIFEST schema_version preserve**: `STEP_MANIFEST['visual_world_rules']['schema_version'] == 1`.
- **G7 (optional) fallback chain canary**: `director_steps.py:122-128` source preservation (file edit X, behavior preserve verify).

### 7.2 Standalone token global ban X (Codex Q6 precision guard)
- 9 R-id 모두 full-phrase membership check (closed-world).
- **Standalone word global ban 금지** (Codex Q6/spec 7 narrow guard 정합): `회상`, `환각`, `CCTV`, `몽타주`, `안개`, `회상/F.B`, `교차편집`, `시신`, `현시`, `매개`, `시야 차단` 등 single token / fragment global ban X. abstract category descriptor 안 자연 사용 보존.
- Residue constants 안 Korean parenthetical comment 포함 X (예: `(← 특정 인물 이름 + 사건)`). exact quoted strings only.

### 7.3 Test anchor preservation
- `test_visual_world_rules.py` / `test_area_7a_no_drift.py` / `test_area_7a_residue_gate.py` / `test_visual_context_helper.py` 4 file (Area #7a inherited + Carry-A099 anchor) ALL PASS preserve obligatory.

## 8. Doctrine (4-Gate + NO VLM + closed-world + standalone token global ban X + TEMPLATE ONLY)

### 8.1 4-Gate Boundary Doctrine ([[feedback_llm_based_judgment]])
| Gate | Rule | 본 carry 적용 |
|---|---|---|
| Gate 1 Semantic Regex Ban | open-world semantic 판단 code regex X | W1-W3 안 semantic regex 0. R1-R9 full-phrase membership only. |
| Gate 2 Prompt Closed-List Ban refined full-phrase only | full-phrase ban; standalone token global ban X | 9 R-id full-phrase ban. 작품-specific cue 추상화. abstract category descriptor 안 standalone word 보존 (process wording). |
| Gate 3 Structured SOT Required | partial remediation in v1 | v1 = prose abstraction only (carrier `array<string> required` preserve). Structured SOT completion claim X. |
| Gate 4 No Silent Fallback | silent default 추가 X | `director_steps.py:122-128` fallback chain (empty director_notes → rules possession/projection/ghost) 보존. 다른 reader 안 empty → skip / logger info 패턴 preserve. |

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

### 8.3 TEMPLATE ONLY + W3 self-reference + Substitution self-referential bug + Legacy 본 commit retroactive escape + post-Carry-D7d-1 fix-up 1 강화 (`never re-emit literal angle-bracketed forms outside marker blocks`)
- 본 spec body 안 design-time placeholder slug (interior underscore variant `8.202605191102` describing the original angle-bracketed `8.<U_T_C>` design-time form, underscore-escaped for grep gate hygiene per post-Carry-D7d-1 fix-up 1 강화 doctrine) = controller-substitute target only. spec 안 doctrine description block 안 placeholder mention 시 HISTORICAL AUDIT TRAIL marker wrap + interior underscore variant escape 의무 (W3 closure 시 적용 — `never re-emit literal angle-bracketed forms outside marker blocks`).
- W3 closure docs body 안 self-reference placeholder slug 사용 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 #7c/#7d 함정 1 정합).
- post-Carry-D7d-1 fix-up 1 강화 doctrine: `never re-emit literal angle-bracketed forms outside marker blocks` ([[session_20260519_carry_d7d_1_v1_closure]] 함정 2).

### 8.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]]).

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

### 9.1 Allowed claim wording (Codex Q0-light verbatim)
> `director_notes prose examples / bad examples were abstracted to remove closed-list semantic hard-prime examples and scenario-summary examples while preserving the existing director_notes carrier contract`

### 9.2 Forbidden claim wording (Codex Q0-light + 7 narrow guard 6)
- ❌ `director_notes structured SOT complete`
- ❌ `physical-presence routing fixed`
- ❌ `field-shape migration complete`
- ❌ `all VWR downstream raw-prose risk fixed`

### 9.3 Allowed closure-doc wording (Codex 7 narrow guard 6 verbatim)
- ✅ `director_notes prose hard-prime examples abstracted`

### 9.4 Remaining post-Carry-A099 carry priority
1. **Carry-A100** — VWR `system.md` t2i_context demonym redesign V8+ (Area #7a 정합 보존, cost medium).
2. **Carry-P021** — scene_consistency 7 enumeration broad, source unresolved low-priority (cost small).
3. **Future Carry-A099-structured** (or Area follow-up) — Option 3 structured emit (`directing_principle: {category, guideline}` schema migration + cp invalidation cascade + consumer rewrite).

### 9.5 References
- **W0.1 inventory memo (untracked)**: `docs/superpowers/specs/2026-05-19-carry-a099-w0-1-inventory.md` (145 line).
- **Q1-Q7 outline (untracked)**: `docs/superpowers/specs/2026-05-19-carry-a099-q1-q7-outline.md` (183 line).
- **VWR latest pack**: `prompts/_base/visual_world_rules/7.202605181540/` (2 file).
- **director_notes section anchor**: `system.md:57-80`.
- **4 direct readers**: `visual_context_helper.py:109-114` + `character_list_step.py:55-72` + `director_steps.py:114-129 (fallback chain 122-128)` + `beat_shot_steps.py:103-119/311-328`.
- **Tests**: `test_visual_world_rules.py` + `test_area_7a_no_drift.py` + `test_area_7a_residue_gate.py` + `test_visual_context_helper.py:46`.
- **Area #7a v1 spec**: `docs/superpowers/specs/2026-05-18-area-7a-visual-world-rules-sot-v1-design.md:72, 413`.
- **Area #7b v1 spec**: `docs/superpowers/specs/2026-05-19-area-7b-vwr-cascade-downstream-v1-design.md:14, 109, 129, 570, 715`.
- **Roadmap**: `docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md:387-390`.
- **Audit 02**: `docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/02-prompt-side-hygiene-audit.md:308` A099 row + §11.3/§13/§14.
- **Pre-Carry-A099 closure**: [[session_20260519_carry_d7d_1_v1_closure]] (origin/main HEAD `05d5265`).
- **Codex iter trace**: Q0-light `PROCEED_TO_Q1_Q7_OUTLINE_WITH_OPTION_2_ABSTRACT_V1 + W0.1_DIRECTOR_NOTES_CONSUMER_INVENTORY_REQUIRED` + W0.1 ack `W0_1_APPROVED__PROCEED_TO_Q1_Q7_OUTLINE` + outline iter 1 `OUTLINE_APPROVED_FOR_SPEC_V1_DRAFT_WITH_NARROW_GUARDS` (7 narrow guard 흡수).
- **Memory references**: [[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_7a_v1_closure]] + [[session_20260519_area_7b_v1_closure]] + [[session_20260519_area_7c_v1_closure]] + [[session_20260519_area_7d_v1_closure]] + [[session_20260519_carry_d7d_1_v1_closure]].

## 10. Closure

### 10.1 Status + Closure Anchor
- Status: **closed (2026-05-19+)**.
- Atomic commits 본 carry: W1 producer `d1ca603` (2 file / 158 ins / 0 del) + W2 integrated test `d1d32dd` (1 file / 112 ins / 0 del) + W2 fix-up 1 narrow `25a0830` (1 file / 1 ins / 1 del) + W3 closure-docs wave (exact hash recorded by git log/range review, not embedded; final pushed range/count = external memory only after APPROVED_FOR_PUSH + push).
- Parent baseline: `05d5265` (Carry-D7d-1 fix-up 1).

### 10.2 Wave Commit Table
| Wave | Commit | Stat | Scope |
|---|---|---|---|
| W1 producer atomic | `d1ca603` | 2 file / 158 ins / 0 del | `prompts/_base/visual_world_rules/8.202605191102/system.md` (line 57-80 prose abstraction) + `rules_schema.json` (byte-identical from v7) |
| W2 integrated test atomic | `d1d32dd` | 1 file / 112 ins / 0 del | `backend/tests/integration/test_carry_a099_director_notes_abstraction.py` (6 Gate test, 6 PASS) |
| W2 fix-up 1 narrow | `25a0830` | 1 file / 1 ins / 1 del | docstring `5 Gate` → `6 Gate` sync (Codex W2 per-wave NEEDS_REVISION_NARROW N-1 흡수) |
| W3 closure-docs atomic | exact hash by git log | 6 file path-limited | 본 spec + carry plan + roadmap + audit 02 + Area #7a spec + Area #7b spec narrow updates |

### 10.3 R1-R9 Residue Absence Result (G4)
- v8 `system.md` 안 9 strict full-phrase residue membership hit 0 (Gate(d) pre-commit + W2 test `test_gate_1_r1_r9_residue_absent_in_v8_system_md` PASS evidence).

### 10.4 sha256 byte-identical Result (G3)
- `rules_schema.json` sha256 v7=v8 match: `64a627208127535914aad6f91dd8442aa1a64a54d57bdc694915a107c36eaafd` (Gate(c) pre-commit + W2 test `test_gate_2_rules_schema_sha256_byte_identical_from_v7` PASS evidence).

### 10.5 Abstract Wording Presence Result (G5)
- Canonical process wording hit EN=1 + KR=1 in v8 `system.md`:
  - EN: `principle must be scenario-agnostic, one physical-presence ambiguity per item, no entity/scene/event specifics`
  - KR: `원칙은 시나리오에 무관하며, 항목당 하나의 물리적 존재 모호성만 다루고, 특정 인물·씬·사건을 적시하지 않는다`
- Enumerated output taxonomy (`category: [...]`) absence verified (Gate(e2) pre-commit + W2 test `test_gate_3_canonical_process_wording_presence_and_no_enum_taxonomy` PASS evidence).

### 10.6 STEP_MANIFEST Preservation Result (G6)
- `STEP_MANIFEST['visual_world_rules']['schema_version'] == 1` preserve (Gate(f1) pre-commit + W2 test `test_gate_4_step_manifest_schema_version_preserve` PASS evidence).

### 10.7 Fallback Chain Preservation Result (G7)
- `director_steps.py:122-128` 변경 0 (W2 test `test_gate_5_fallback_chain_source_preservation` line 121-128 안 `possession`/`projection`/`ghost` literal preserve PASS evidence).

### 10.8 4 Test Anchor ALL PASS Result (§4.4)
- W1 pre-commit targeted pytest: 27 tests / 27 PASS / 0 FAIL (0.18s).
- W2 regression bundle (4 inherited + 1 신규): 33 tests / 33 PASS / 0 FAIL (0.17s).
- W2 fix-up 1 rerun: 33 tests / 33 PASS / 0 FAIL (0.19s).

### 10.9 Area #7a/#7b carry refs + Audit 02 A099 row + Roadmap §5.7 narrow update Result (§6.1)
- Roadmap §5.7 Sub-area (b) Phase 1 (Area #7a) bullet 안 Carry-A099 carry follow-up reference narrow update (`Carry-A099 resolved by W1/W2 + W3 closure-docs — director_notes prose hard-prime examples abstracted`).
- Audit 02 line 308 A099 row Status column narrow update (`Carry-A099 resolved by W1/W2 + W3 closure-docs`) + §11.3 + §13 + §14 Closure section append.
- Area #7a v1 spec line 72 carry table A099 Resolution column + line 413 Carry-A099 신규 entry Resolution column narrow update.
- Area #7b v1 spec line 14/109/129/570/715 A099 status narrow update.

### 10.10 Closure Verdict
- Codex iter rounds 본 session: Q0-light PROCEED + Q1-Q7 outline APPROVED + spec quality iter 1 + amend 1 narrow APPROVED_FOR_PLAN + plan quality iter 1 (N-1/N-2/N-3/N-4 narrow stack) → plan amend 2 narrow re-review APPROVED_FOR_EXECUTION + W1 entry sanity APPROVED_FOR_W1_ENTRY + W1 mid-state Gate (f4) cwd handling OPTION_D narrow (N-5 plan untracked edit) + W1 per-wave APPROVED_FOR_W2_ENTRY + W2 per-wave NEEDS_REVISION_NARROW N-1 (docstring 5→6 Gate sync) + W2 fix-up 1 narrow re-review APPROVED_FOR_W3_ENTRY + W3 entry sanity APPROVED_FOR_W3_ENTRY_WITH_SCOPE_GUARD.

### 10.11 함정 신규 (본 carry v1)
- **N-5 W1 Python gate cwd-relative path bug**: `cd backend && python -c "..."` 안 `NEW_DIR` (repo-root-relative) 이 backend cwd 안에서 `backend/prompts/...` 로 resolve 되어 `os.path.isfile()` False. Fix doctrine: Python gate 안 `repo_root = os.path.abspath(os.path.join(os.getcwd(), os.pardir))` join 의무. plan §3.3(f) narrow edit (Codex OPTION_D, W3 closure-docs cycle commit obligation).
- **N-1 docstring contract drift**: file-level docstring 안 `5 Gate verify` wording vs 실제 6 test 함수 구현 + commit subject `6 gate verify` 와 sync 누락. Fix doctrine: test docstring contract = file 안 actual test count 와 글자-단위 sync 의무, behavioral change 0 narrow fix-up commit.
- **Open-world semantic prose abstraction = type description lift**: 작품-specific cue (인물A/장소X/씬 번호/CCTV/안개 등) 명시 quoted example → type description form 으로 lift (예: `특정 인물 이름과 그 인물 사이 관찰·판단 사건을 적시한 항목 형태`). 5-line abstract category descriptor + 4-line type description + canonical process wording EN+KR pair = LLM open-world generation 의 closed-world contract.

### 10.12 Carry Follow-up Post Carry-A099
- Carry-A100 resolved by W1-W4 (2026-05-19+) — V8+ VWR `system.md` t2i_context demonym redesign + `rules_schema.json:40` description abstraction (separate v9 bump `9.202605191334` 채택, director_notes section line 57-84 byte-equal preserve from v8).
- Carry-P021 (scene_consistency 7 enumeration broad, source unresolved) — Tier 4 deferred.
- Future Carry-A099-structured: array<string> → array<object> 구조화 migration option (Gate 3 partial → Gate 3 complete). 본 carry v1 scope X (carrier shape preserve).
