---
title: Carry-A100 — VWR system.md t2i_context demonym redesign V8+ / V9 bump (v1 design)
date: 2026-05-19+
status: closed (Carry-A100 v1 W1-W4 closed at W4 closure-docs commit, 2026-05-19+; Codex Q0-light NEEDS_REVISION_NARROW_N1 흡수 + W0+outline 2 round narrow re-review APPROVED_FOR_SPEC_V1_DRAFT_WITH_NARROW_GUARDS + spec v1 2 round narrow re-review APPROVED_FOR_PLAN + plan v1 3 round quality iter APPROVED_FOR_EXECUTION_WITH_TEXT_FIXES + W1/W2/W3 per-wave APPROVED + W4 closure-docs atomic + W1-W4 range review)
roadmap_ref: docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md §5.7 (Track B Tier 3 carry follow-up post #7a/#7b/#7c/#7d/Carry-D7d-1/Carry-A099, audit 02 §11.3/§13/§14 line 311 A100 row VWR t2i_context demonym redesign)
prerequisites:
  - Area #7a (visual_world_rules SOT v1, closed 2026-05-19, push `d0410eb`) — VWR producer SOT boundary preserve; Carry-A100 source 정의 (spec §1.4 + §6 + §11.4 + §12.1 line 73/109/414/418/434 cross-cut X with Area #7c).
  - Area #7b (VWR downstream prompt cascade v1, closed 2026-05-19+, push `e751e72`) — Carry-A100 boundary preserve mention (spec §1.3 + §6.2 + §11.6 line 31/110/130/571/716).
  - Area #7c (t2i_review v6→v7 placeholder example abstraction v1, closed 2026-05-19+, push `62aa2ef`) — abstraction pattern reference + `Asian/Korean` t2i_review downstream cleanup boundary (Carry-A100 cross-cut X).
  - 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.
  - Carry-A099 (VWR system.md director_notes prose redesign V8+, closed 2026-05-19+, push `146401c`) — v8 prompt-pack anchor 직접 prerequisite; director_notes section (line 57-84 v8) 변경 0 boundary preserve.
non_supersedes:
  - Carry-P021 (scene_consistency 7 enumeration broad, source unresolved) — 별도 carry.
  - Future Carry-A100-structured (`t2i_context: string` → `object {default_demographic_policy, tone, genre}` field-shape migration) — major carry / future area follow-up.
---

# Carry-A100 — VWR system.md t2i_context demonym redesign V8+ / V9 bump (v1)

## 1. Purpose + Scope

### 1.1 Purpose

Codex Q0-light allowed claim (W0.1 §11 verbatim): **`t2i_context section examples and lead clauses were abstracted to remove single-region demonym coercion and literal angle-bracket placeholder, replaced with outlook/evidence-first scenario-agnostic policy wording; rules_schema.json description aligned with same concept; t2i_context carrier shape (type:string, required, additionalProperties false) and STEP_MANIFEST schema_version preserved.`**.

VWR latest `prompts/_base/visual_world_rules/8.202605191102/system.md:98-114` `t2i_context` section + `rules_schema.json:40` description = LLM-attached producer surface 양쪽 안 single-region demonym coercion + ethnicity-nationality conflation + literal angle-bracket placeholder 강제 (audit 02 §11.1 line 311 A100 row + Area #7a v1 spec §1.4 line 73 정의).

본 carry v1 = **Option B-prime (v9 prompt-pack bump, system.md + rules_schema.json description-only narrow edit)** (Codex Q0-light NEEDS_REVISION_NARROW_N1 incorporation + 2 round narrow re-review APPROVED 정합). literal angle-bracket placeholder 완전 제거 + 예시 form 완전 제거 + Korean residue phrase abstract lift + outlook/evidence-first wording 으로 변환. `t2i_context: string required additionalProperties false` carrier contract preserve, schema shape change X, consumer rewrite X. director_notes section (line 57-84) 변경 0 (Carry-A099 closure boundary preserve).

### 1.2 In-scope

- **VWR prompt pack v9 신규 dir**: `prompts/_base/visual_world_rules/9.UTC_TIMESTAMP/` (2 file, underscore-escaped prose placeholder per post-Carry-D7d-1 fix-up 1 doctrine; W2 controller shell substitute → actual `9.${UTC}` value at execution time):
  - `system.md`: copied from v8 first, t2i_context section (line 98-114) narrow edit per §4.2 — literal angle-bracket placeholder + 예시 form 완전 제거 + Korean residue abstract lift + outlook/evidence-first wording.
  - `rules_schema.json`: copied from v8 first, line 40 description-only narrow edit per §4.3 — Korean phrase abstract lift + outlook/evidence-first wording; carrier shape `type: string` + required list (line 42) + additionalProperties false (line 43) preserve.
- **Prompt-pack activation + STEP_MANIFEST verify** (Codex IMPORTANT 3 정합, scene_detail-style 4-point version sync 아님 — no actual code sync surface):
  - active prompt-pack resolution via `get_effective_source("visual_world_rules", "system", db=None)` + `get_active_version("visual_world_rules", "rules_schema", db=None)` + `load_prompt` / `load_schema` (Carry-A099 N-3/N-5 lesson 정합 — 모듈 active-version sanity + 스키마 stem-specific file 존재성 분리; loader 반환 path 안 `"/visual_world_rules/9."` prefix 명시 확인; plain lexicographic sort = helper only).
  - `STEP_MANIFEST['visual_world_rules']['schema_version'] == 1` preserve verify-only (no edit; shape unchanged 조건). cp invalidation 회피.
- **A099 test compat narrow modification** (Codex 2nd narrow re-review IMPORTANT 1 의무, W1 wave 안 atomic):
  - `backend/tests/integration/test_carry_a099_director_notes_abstraction.py` 안 `_v8_dir()` helper (line 39-44) `get_effective_source` active resolution → historical explicit `prompts/_base/visual_world_rules/8.202605191102/` pin.
  - Docstring + test_gate_6 docstring rewording: `"active v8 source-path proof"` → `"historical v8 closure anchor proof"`.
  - Gate 2 + Gate 6 안 active resolution 참조 → historical pin reference sync.
  - 6 PASS preserve (W1 commit time point after modification).
- **W3 integrated test 신규** (file-level new, no live LLM + NO VLM + no regex semantic):
  - `backend/tests/integration/test_carry_a100_t2i_context_demonym_abstraction.py` (G1-G7 verify gate per §8, Area #7c/#7d/Carry-A099 패턴 정합). Marker-wrapped strict residue constants (R1-R5) 사용 (test constants for producer-surface residue checks, not live prompt wording per Codex 2nd narrow re-review guard 3).
- **W4 closure docs** (path-limited):
  - 본 spec frontmatter status closed + §10 closure section.
  - Carry-A100 plan first commit (drafting closure).
  - Roadmap §5.7 narrow append `Carry-A100 resolved by W1-W4 (Option B-prime: v9 prompt-pack bump, system.md + rules_schema.json description-only abstraction; structured emit / field-shape migration follow-up deferred)`.
  - Audit 02 §11.3/§13/§14 + line 311 A100 row narrow update `Carry-A100 resolved by W1-W4 closure-docs`.
  - Area #7a v1 spec §1.4 + §6 + §11.4 + §12.1 line 73/109/414/418/434 Carry-A100 status update.
  - Area #7b v1 spec §1.3 + §6.2 + §11.6 line 31/110/130/571/716 Carry-A100 status update.
  - Carry-A099 v1 spec carry table line entries Carry-A100 status update (after-Carry-A099 carry priority context).

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

- **`t2i_context` field carrier shape change**: `string required additionalProperties false` preserve. Schema shape migration X (Codex 6 narrow guard 6).
- **STEP_MANIFEST schema_version bump**: `schema_version=1` preserve verify-only. cp invalidation cascade 회피.
- **Production consumer rewrite (8 file)**: `visual_context_helper.py:90,168` / `entity_steps.py:723` / `beat_shot_steps.py:330-339` / `detail_steps.py:1209-1210` / `outlook_steps.py:91` / `t2i_review.py:68,83,88,172,179,280,295` / `shot_staging.py:84,87` + test fixtures 변경 0. W2 시 consumer break 발견 시 즉시 stop + Codex re-discuss (silent widen W2 금지, Codex 6 narrow guard 6).
- **`Asian/Korean` t2i_review placeholder downstream cleanup**: Area #7c v1 closure 완료. Cross-cut X with Carry-A100 (Area #7a v1 spec line 418).
- **Carry-A099 v1 closure boundary** (director_notes prose redesign V8): director_notes section line 57-84 변경 0. v8 prompt-pack anchor preserve. `test_carry_a099_director_notes_abstraction.py` Gate 2 (rules_schema sha256 from v7) + Gate 6 (path `"8."` prefix) historical preserve (W1 atomic 안 active resolution → historical v8 pin narrow modification only).
- **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→v7 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).
- **Carry-P021** (scene_consistency 7 enumeration broad, source unresolved) — 별도 carry.
- **Field-shape migration** (`t2i_context: string` → `object {default_demographic_policy, tone, genre}` etc.) = major carry / future Carry-A100-structured or Area follow-up.
- **VLM / live LLM / semantic regex / standalone-token residue gates** — 모두 ban ([[feedback_no_vlm_dependency]] + [[feedback_llm_based_judgment]]).
- **Standalone global ban**: `demonym` / `nationality` / `ethnicity` / `국적` / `인종` / `region` single token global ban X (Codex Q0-light 명시 — abstract category descriptor 안 자연 사용 보존).
- **TEMPLATE ONLY / self-reference rule from spec v1 onward**: no literal angle-bracket placeholders outside formal `<!-- HISTORICAL AUDIT TRAIL — BEGIN/END -->` marker blocks (Codex 2nd narrow re-review guard 2 — backtick alone ≠ formal marker block). Underscore-escape variant 도 live prompt 안 X (Codex Q0-light Q2 (a) verdict).

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

### 2.1 Active VWR pack
- Latest dir = `prompts/_base/visual_world_rules/8.202605191102/` (2 file: `system.md` 115 line + `rules_schema.json` 45 line; Carry-A099 W1 anchor `d1ca603`).
- `system.md` t2i_context section: line **98-114** 실측 (W0.1 inventory verified, Codex 2 round live verify confirmed).

### 2.2 t2i_context section structure (line 98-114)

<!-- HISTORICAL AUDIT TRAIL — BEGIN (line 102 primary target literal) -->

- line 98 heading `## t2i_context (T2I 프롬프트용 시각 스타일 요약)`.
- line 100 lead — "시나리오를 이미지화할 때 모든 T2I 프롬프트에 공통으로 적용할 시각 스타일을 영어로 2~3문장으로 요약하세요." (preserve 의무).
- line 101 — "반드시 아래 내용을 포함:" (preserve 의무).
- **line 102 (A100 primary target)**: ``- 인물의 기본 국적/인종 — 시나리오의 region 에서 도출된 demonym 을 사용하여 작성 (예: "All human characters are <region-derived demonym> unless stated otherwise.")``.
- line 103 — "- 시각적 톤/분위기 (색감, 조명 무드, 질감)" (preserve 의무).
- line 104 — "- 장르 톤 (예: dark occult horror, gritty realism, warm drama)" (preserve 의무).
- line 106-110 — "**절대 포함하지 말 것:**" 4 prohibition 형식 (preserve 의무).
- line 112 — "시각 스타일만 남기세요. 장소 구체화는 각 씬의 배경(L##)이 개별 처리합니다." (preserve 의무).
- line 114 — 고유명사 원어 표기 정책 (preserve 의무).

<!-- HISTORICAL AUDIT TRAIL — END -->

### 2.3 `rules_schema.json` t2i_context shape (Codex N-1 incorporation: description-only narrow edit in-scope)

<!-- HISTORICAL AUDIT TRAIL — BEGIN (rules_schema.json:40 literal description) -->

- Path `8.202605191102/rules_schema.json:40`: ``"t2i_context": {"type": "string", "description": "T2I 프롬프트용 시각 스타일 요약 (영어 2~3문장, 기본 국적/인종 + 색감/조명/질감 톤 + 장르 무드. 구체적 지명/장소/건축양식 열거 금지)"}``.
- `"required"` list line 42 안 `t2i_context` 포함 → t2i_context = required.
- `"additionalProperties": false` line 43 (preserve 의무).
- Current schema description residue: ``기본 국적/인종`` Korean phrase (R5 in §8). **Description-only narrow edit in-scope per Codex N-1**.

<!-- HISTORICAL AUDIT TRAIL — END -->

### 2.4 Direct t2i_context reader (live grep, 8 file, v1 변경 0)

| # | file | line | code | semantic |
|---|---|---|---|---|
| 1 | `backend/app/services/visual_context_helper.py` | 90, 168 | `("T2I style context", vwr.get("t2i_context"))` + iter `("era", "region", "t2i_context")` | bullet block formatter — t2i_context as labeled context for downstream; missing → key omit |
| 2 | `backend/app/core/steps/entity_steps.py` | 723 | `t2i_ctx = vwr_data.get("t2i_context", "")` | entity step 시각 스타일 context preserve |
| 3 | `backend/app/core/steps/beat_shot_steps.py` | 330-339 | `_ctx = rules_cp["data"].get("t2i_context", "")` + Korean-labeled prefix `[시각적 배경 — 시나리오를 이미지화하는 작업입니다. description 묘사 시 아래 맥락을 반영하세요]` | shot_extract path inject mechanism preserve |
| 4 | `backend/app/core/steps/detail_steps.py` | 1209-1210 | `_t2i_ctx = rd.get("t2i_context", "")` | scene_detail reference (no direct format injection) |
| 5 | `backend/app/core/steps/outlook_steps.py` | 91 | `t2i_ctx = vwr_data.get("t2i_context", "")` | outlook Phase 1/2 reference |
| 6 | `backend/app/modules/pipeline/t2i_review.py` | 68, 83, 88, 172, 179, 280, 295 | `{t2i_context}` format placeholder in v7 scene_system.md / entity_system.md | t2i_review module format mechanism preserve |
| 7 | `backend/app/modules/pipeline/shot_staging.py` | 84, 87 | `{t2i_context}` literal replace | shot_staging module replace mechanism preserve |
| 8 | Test fixtures | various | `vwr = {"t2i_context": "..."}` / `lambda *a, **kw: "{t2i_context}"` etc. | `test_shot_staging_*.py` + `test_t2i_review_apply_scene_fixes.py` — format/replace mechanism check |

**Broad VWR dependents (NOT direct t2i_context reader)**: `scene_director`, `scene_verify`, `entity_relation`, `entity_all`, `entity_extractor_v2`, `shot_validator`, `shot_selection`, `shot_dependency`, etc. — `depends_on visual_world_rules` STEP_MANIFEST edge or Area #7b canonical VWR clause reference only. t2i_context field direct read X. v1 변경 0.

### 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 anchor). v1 = no edit (default no edit, shape unchanged).

### 2.6 Test anchor (W0.1 verified, Codex 2nd narrow re-review MINOR 1 split)

- **A100 impact 0 (preserve)**:
  - `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).
  - `backend/tests/integration/test_area_7a_residue_gate.py` (W3a 7 PASS preserve).
- **A100 v1 안 narrow modification 의무 (Codex IMPORTANT 1)**:
  - `backend/tests/integration/test_carry_a099_director_notes_abstraction.py` (Carry-A099 W2 6 Gate). `_v8_dir()` helper (line 39-44) `get_effective_source` active resolution → historical explicit `prompts/_base/visual_world_rules/8.202605191102/` pin. Docstring rewording per §1.2. Gate 2 + Gate 6 historical pin sync. 6 PASS preserve after W1 modification.
- **W3 신규 (A100 integrated test 신설)**:
  - `backend/tests/integration/test_carry_a100_t2i_context_demonym_abstraction.py` (G1-G7 verify gate per §8, 7 PASS 목표).

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

| # | site | scope | action |
|---|---|---|---|
| 1 | `backend/tests/integration/test_carry_a099_director_notes_abstraction.py` | W1 narrow modification | `_v8_dir()` historical explicit `prompts/_base/visual_world_rules/8.202605191102/` pin + docstring rewording + Gate 2/6 historical pin sync. |
| 2 | `prompts/_base/visual_world_rules/9.UTC_TIMESTAMP/system.md` | W2 new dir 2 file | line 98-114 t2i_context section narrow edit per §4.2. director_notes section (line 57-84) byte-equal preserve. |
| 3 | `prompts/_base/visual_world_rules/9.UTC_TIMESTAMP/rules_schema.json` | W2 new dir 2 file | line 40 description-only narrow edit per §4.3. Carrier shape (`type:string` + required + additionalProperties false) preserve. Other field shape/description preserve. |
| 4 | `STEP_MANIFEST['visual_world_rules']['schema_version']` | verify-only | preserve `1` (no edit; shape unchanged). cp invalidation 회피. |
| 5 | active prompt-pack resolution via `get_effective_source` / `get_active_version` / `load_prompt` / `load_schema` source-path proof | verify-only | v9 resolution verify via loader source-path (loader 반환 path 안 `"/visual_world_rules/9."` prefix 명시 확인). plain lexicographic sort tail 위험 회피 (Codex IMPORTANT 3). DB row override 의무 X. |
| 6 | `backend/tests/integration/test_carry_a100_t2i_context_demonym_abstraction.py` | W3 file-level new | G1-G7 verify gate (active prompt-pack resolution + file count + R1-R5 residue absence + new abstract wording presence + carrier shape preserve + STEP_MANIFEST preserve + director_notes section preserve canary). |

## 4. Wave Implementation Contracts (Option α 4-wave, Codex 2nd narrow re-review guard 4 정합)

### 4.1 W1 — Carry-A099 test compat atomic (1 commit)

#### 4.1.1 Commit boundary
- Single atomic commit — `test_carry_a099_director_notes_abstraction.py` narrow modification only. No prompt-pack change, no schema change.
- Commit message: `W1(carry-a100-vwr-system-md-t2i-context-demonym-redesign-v1): Carry-A099 test compat — historical v8 pin (1 file: test_carry_a099_director_notes_abstraction.py modified _v8_dir() helper + docstring rewording)`.

#### 4.1.2 File operations
- **(a)** Edit `backend/tests/integration/test_carry_a099_director_notes_abstraction.py` (1 file modify):
  - **Import line 19** (`from app.modules.prompt_loader import get_active_version, get_effective_source`) **제거** — historical pin refactor 후 unused (Codex 3rd narrow re-review N-3 정합, lint/readability hygiene).
  - `_v8_dir()` helper (line 39-44): replace `get_effective_source("visual_world_rules", "system", db=None)` resolution + `Path(file_cand["path"]).resolve().parent` flow with literal historical pin: `VWR_V8_DIR = REPO_ROOT / "prompts/_base/visual_world_rules/8.202605191102"` constant + `_v8_dir()` returns `VWR_V8_DIR` literal.
  - Module docstring (line 1-12): "active source-path proof" → "historical v8 closure anchor proof" wording in test_gate_6 description line; Carry-A099 6 Gate intent preserve.
  - `test_gate_6_v8_active_source_path_proof` function name rename + docstring rewording: `"active v8 source-path proof"` → `"historical v8 closure anchor proof"` (line 94-95 + line 96-99); function body refactor — assert `_v8_dir()` returns literal historical path + `(VWR_V8_DIR / "rules_schema.json").is_file()` + path string contains `"/visual_world_rules/8.202605191102"`. `get_effective_source` / `get_active_version` 호출 폐기 (active resolution dependency 폐기).

#### 4.1.3 Pre-commit verify gate (W1, 4 check)
- (a) `test_carry_a099_director_notes_abstraction.py` pytest run = 6 PASS (Gate 1 + Gate 2 + Gate 3 + Gate 4 + Gate 5 + Gate 6 [renamed]) preserve.
- (b) Area #7a inherited 3 test pytest run = 22 PASS (test_visual_world_rules.py 7 + test_area_7a_no_drift.py 8 + test_area_7a_residue_gate.py 7) preserve (A100 impact 0 verify).
- (c) `git diff --stat` = 1 file modified (`test_carry_a099_director_notes_abstraction.py`). No new file, no prompt-pack change.
- (d) Source-tree no regression — `git status` clean except W1 modification.

### 4.2 W2 — v9 producer prompt-pack atomic (1 commit)

#### 4.2.1 Commit boundary
- Single atomic commit — VWR v9 prompt pack 생성 (2 file). prompt-only + schema-description-only change, code edit 0.
- Commit message: `W2(carry-a100-vwr-system-md-t2i-context-demonym-redesign-v1): t2i_context demonym redesign — visual_world_rules v9 (2 file: system.md t2i_context section narrow + rules_schema.json:40 description-only narrow)`.

#### 4.2.2 File operations
- **(a)** `mkdir -p prompts/_base/visual_world_rules/9.${UTC}` (where `UTC=$(date -u +%Y%m%d%H%M)`).
- **(b)** `cp prompts/_base/visual_world_rules/8.202605191102/system.md prompts/_base/visual_world_rules/9.${UTC}/system.md`; then modify line 98-114 t2i_context section per §4.2.3 below.
- **(c)** `cp prompts/_base/visual_world_rules/8.202605191102/rules_schema.json prompts/_base/visual_world_rules/9.${UTC}/rules_schema.json`; then modify line 40 description-only per §4.2.4 below.

#### 4.2.3 system.md t2i_context section After (exact, Codex 2nd narrow re-review guard 5)

**Preserve (lines 98, 100, 101, 103, 104, 106-110, 112, 114)** — only line 102 substituted.

**Line 102 After (replaces current line 102 verbatim)**:

```
- 시나리오 또는 인물별 outlook/character evidence에 명시된 인구학 단서의 반영 원칙 (명시되지 않은 인물에 단일 region default 인구학 표기를 강제하지 않는다)
```

Wording rationale (R1-R5 reference, marker-wrapped literal in §8 only):
- `인구학 단서` = abstract category descriptor (replaces R3 ethnicity-nationality conflation Korean phrase).
- `시나리오 또는 인물별 outlook/character evidence에 명시된 경우` = outlook/evidence-first scenario-agnostic policy (replaces R4 single-region 가정 Korean clause).
- `(명시되지 않은 인물에 단일 region default 인구학 표기를 강제하지 않는다)` = default-coerce 강제 X 명시 (replaces R2 default-coerce example form).
- 예시 form 완전 제거 (Codex Q0-light Q2 (a) verdict — R1 literal angle-bracket placeholder + R2 example form 모두 live prompt 안 X).
- Underscore-escape variant 도 live prompt 안 X.

#### 4.2.4 rules_schema.json:40 description After (exact, Codex 2nd narrow re-review guard 5)

**Line 40 After (replaces current line 40 description value verbatim, type/required/additionalProperties false preserve)**:

```
"t2i_context": {"type": "string", "description": "T2I 프롬프트용 시각 스타일 요약 (영어 2~3문장, 인물별 시각적 인구학 단서가 명시된 경우의 반영 원칙 + 색감/조명/질감 톤 + 장르 무드. 구체적 지명/장소/건축양식 열거 금지)"}
```

Wording rationale: Codex Q0-light 권고 wording direction verbatim adoption (W0.1 §10 + outline References). `인물별 시각적 인구학 단서가 명시된 경우의 반영 원칙` = outlook/evidence-first policy. Other 2 fragments (`색감/조명/질감 톤 + 장르 무드` + `구체적 지명/장소/건축양식 열거 금지`) byte-equal preserve.

#### 4.2.5 Pre-commit verify gate (W2, 7 check)
- (a) `prompts/_base/visual_world_rules/9.${UTC}/` dir exists + file count = 2 (`system.md` + `rules_schema.json`).
- (b) `system.md` byte-equal substring check: line 57-84 director_notes section content = v8 line 57-84 content (Carry-A099 boundary canary).
- (c) `system.md` line 98 + 100 + 101 + 103 + 104 + 106-110 + 112 + 114 byte-equal preserve from v8 (only line 102 substituted).
- (d) `rules_schema.json` jsonschema valid + structural integrity: `t2i_context.type == "string"` + `required` list contains `"t2i_context"` + `additionalProperties == false` + other field (rules / director_notes / era / region / source_language) shape preserve.
- (e) Active prompt-pack resolution `get_effective_source("visual_world_rules", "system", db=None)` → version starts with `"9."` + path contains `"/visual_world_rules/9."`.
- (f) `STEP_MANIFEST['visual_world_rules']['schema_version'] == 1` preserve verify-only.
- (g) Targeted pytest: W1-modified A099 test (6 PASS preserve) + Area #7a inherited 3 test (22 PASS preserve).

### 4.3 W3 — Carry-A100 integrated test atomic (1 commit)

#### 4.3.1 Commit boundary
- Single atomic commit — new test file. No prompt-pack change, no consumer code change.
- Commit message: `W3(carry-a100-vwr-system-md-t2i-context-demonym-redesign-v1): integrated test atomic — 7 gate verify`.

#### 4.3.2 File operations
- New file: `backend/tests/integration/test_carry_a100_t2i_context_demonym_abstraction.py` (7 Gate test, marker-wrapped strict residue R1-R5 constants).

#### 4.3.3 Gate test contract (per §8 G1-G7)
- Gate 1 — G1: active prompt-pack resolution `"9."` prefix proof.
- Gate 2 — G2: v9 dir 안 file count = 2.
- Gate 3 — G3: R1-R5 strict residue absence (5 strict full-phrase, marker-wrapped test constants).
- Gate 4 — G4: new abstract wording presence (line 102 + schema description 양쪽).
- Gate 5 — G5: carrier shape preserve (3-point).
- Gate 6 — G6: STEP_MANIFEST schema_version=1 preserve.
- Gate 7 — G7: director_notes section preserve canary (Carry-A099 boundary, v9 line 57-84 byte-equal substring from v8).

#### 4.3.4 Pre-commit verify gate (W3, 4 check)
- (a) New test file 7 PASS (1 per Gate).
- (b) no live LLM + NO VLM + no regex semantic + no standalone token ban (Gate 1 Semantic Regex Ban 정합).
- (c) Marker-wrapped strict residue constants 명시 (closed-world test constants for producer-surface residue checks, not live prompt wording per Codex 2nd narrow re-review guard 3).
- (d) Targeted pytest: W1-modified A099 test (6 PASS preserve) + Area #7a inherited 3 test (22 PASS preserve) + W3 신규 test (7 PASS).

### 4.4 W4 — Closure docs atomic (1 commit, range review + push gate)

#### 4.4.1 Commit boundary
- Single atomic commit — closure docs path-limited only. No prompt-pack/test/code change.
- Commit message: `W4(carry-a100-vwr-system-md-t2i-context-demonym-redesign-v1): closure docs atomic — N file path-limited (spec frontmatter status closed + §10 closure section + plan first commit + roadmap §5.7 + audit 02 §11.3/§13/§14 + line 311 A100 row + Area #7a/#7b spec narrow + Carry-A099 spec carry table)`.

#### 4.4.2 File operations (path-limited per Codex 7 narrow guard 정합)
- 본 spec frontmatter `status: draft (...)` → `status: closed (...)`.
- 본 spec §10 closure section **in-place REPLACE** (heading 이미 존재; append X — pending placeholder section 전체 replace per Area #7d/Carry-A099 closure doctrine). No self-hash literal in W4 commit body (Codex 3rd narrow re-review N-1 정합).
- Carry-A100 plan first commit drafting closure.
- `docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md:387-390` narrow append `Carry-A100 resolved by W1-W4 (Option B-prime: v9 prompt-pack bump, system.md t2i_context section line 102 narrow + rules_schema.json:40 description-only abstraction; structured emit / field-shape migration follow-up deferred)`.
- `docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/02-prompt-side-hygiene-audit.md` §11.3 + §13 + §14 + line 311 A100 row narrow update + 본 carry §N Closure section append (W3/W6 후속 area pattern 정합).
- Area #7a v1 spec line 73 + 109 + 414 + 418 + 434 Carry-A100 status narrow update.
- Area #7b v1 spec line 31 + 110 + 130 + 571 + 716 Carry-A100 status narrow update.
- Carry-A099 v1 spec carry table line entries Carry-A100 status update (after-Carry-A099 carry priority context).

#### 4.4.3 Range review + push gate (Codex 의무)
- W1-W4 range review (Codex APPROVED_FOR_PUSH 의무).
- Push 시 사용자 ask 0 ([[feedback_push_no_user_ask]] 정합).

## 5. Wave Plan Alternatives — Option β rejected/conditional fallback (Codex 2nd narrow re-review guard 1)

**Option β (3-wave, weaker, conditional)** — primary Option α 채택; Option β = rejected unless plan iter / W2 execution 안 concrete unforeseen constraint emerges:

- W1 v9 producer prompt-pack atomic (`9.UTC_TIMESTAMP/` 신설). Inherited A099 test 실행 X / claim X (W1 commit time known regression 상태 — Codex IMPORTANT 1 verbatim "every committed state to keep known targeted tests green" 위반).
- W2 test atomic combined — A099 test historical pin modification + 신규 A100 integrated test (single commit).
- W3 closure docs atomic.

**Option β reject rationale**: W1 commit time point known regression 상태 = "every committed state to keep known targeted tests green" Codex doctrine 위반. Option α primary 채택.

## 6. Test Contract (G1-G7, no live LLM + NO VLM + no regex semantic)

### 6.1 Gate definitions

- **G1 Active prompt pack resolution**: `get_effective_source("visual_world_rules", "system", db=None)` → version starts with `"9."` + path contains `"/visual_world_rules/9."`. `get_active_version("visual_world_rules", "rules_schema", db=None)` → starts with `"9."`. (Carry-A099 N-3/N-5 lesson 정합 — 모듈 active-version sanity + 스키마 stem-specific file 존재성 분리.)
- **G2 v9 file count**: `prompts/_base/visual_world_rules/9.${UTC}/` 안 file count == 2 (`system.md` + `rules_schema.json`).
- **G3 R1-R5 strict residue absence**: 5 R-id full-phrase membership `not in` v9 `system.md` (R1-R4) + v9 `rules_schema.json` (R5). `str.__contains__` membership only. R1-R5 constants = marker-wrapped strict residue catalog (closed-world test constants for producer-surface residue checks, not live prompt wording per Codex 2nd narrow re-review guard 3).
- **G4 new abstract wording presence**: v9 `system.md` 안 substring `"시나리오 또는 인물별 outlook/character evidence에 명시된 인구학 단서의 반영 원칙"` 1+ hit. v9 `rules_schema.json` 안 substring `"인물별 시각적 인구학 단서가 명시된 경우의 반영 원칙"` 1+ hit.
- **G5 carrier shape preserve**: `rules_schema.json` jsonschema parse + assert `t2i_context.type == "string"` + `"t2i_context" in required` list + `additionalProperties == false` (3-point).
- **G6 STEP_MANIFEST schema_version preserve**: `STEP_MANIFEST['visual_world_rules']['schema_version'] == 1`.
- **G7 director_notes section preserve canary**: v9 `system.md` 안 line 57-84 director_notes section content (byte-equal substring from v8 line 57-84). Carry-A099 boundary canary — director_notes prose abstraction 결과 preserve.

### 6.2 Test count target

- W3 신규 `test_carry_a100_t2i_context_demonym_abstraction.py` = **7 PASS (1 per Gate)**.

### 6.3 Test mechanism contract

- **No live LLM call**: pytest fixture 안 LLM mock 도 X (G1-G7 모두 file/schema/STEP_MANIFEST inspection only).
- **NO VLM**: vision model 의존 0.
- **No regex semantic**: Gate 3 residue check = fixed-string `not in` 만. Gate 4 abstract wording presence = fixed-string `in` 만.
- **No standalone token global ban**: residue list = 5 R-id full-phrase (closed-world). single token (`demonym` / `nationality` / `ethnicity` / `국적` / `인종` / `region`) 별도 ban X.
- **Marker-wrapped strict residue constants**: R1-R5 = test constants for producer-surface residue checks (closed-world). Spec/plan/closure docs 안 literal exact strings = explicit `<!-- HISTORICAL AUDIT TRAIL — BEGIN/END -->` marker block 안 wrap. Test code 안 literal constants = acceptable (Codex 2nd narrow re-review guard 3).

## 7. 4-Gate Boundary Doctrine (Codex Q0-light verdict 정합, [[feedback_llm_based_judgment]])

- **Gate 1 Semantic Regex Ban**: no regex semantic classification / token-stripping in Carry-A100 v1 W1-W4. Residue verify = fixed-string `str.__contains__` 또는 `rg -F` membership only.
- **Gate 2 Prompt Closed-List Ban refined full-phrase only**: residue contract = exact 5-item full-phrase from `system.md:102` + `rules_schema.json:40` only (§8 R1-R5). Standalone word global ban X (Codex 명시 — abstract category descriptor 안 자연 사용 보존).
- **Gate 3 Structured SOT Required**: v1 = abstraction of existing free-text carrier + schema description-only narrow edit (partial remediation). Carrier shape `string` preserve. Field-shape migration = Future Carry-A100-structured (별도 carry / area follow-up).
- **Gate 4 No Silent Fallback**: `t2i_context` field shape `string required additionalProperties false` preserve. 8 direct reader 안 empty `t2i_context` → omit / skip / empty-string pass-through 패턴 preserve (no silent default coerce; downstream consumer 변경 0).

## 8. Strict Residue Catalog (Codex 명시 5-item, closed-world exact phrase membership only)

W3 integrated test 안 v9 active prompt-pack producer surface (`system.md` + `rules_schema.json`) verify 의무 — historical v7/v8 packs / closure docs / audit memo / TEMPLATE ONLY marker-block site 검사 X.

<!-- HISTORICAL AUDIT TRAIL — BEGIN (5-item strict residue catalog; literal phrases below are historical residue exact strings for test-constant use only, not live prompt content per Codex 2nd narrow re-review guard 3) -->

| # | strict residue phrase | source line (v8 evidence anchor) | site to verify in v9 |
|---|---|---|---|
| R1 | ``<region-derived demonym>`` | v8 system.md:102 inside example | v9 system.md t2i_context section 안 hit 0 |
| R2 | ``All human characters are <region-derived demonym> unless stated otherwise.`` | v8 system.md:102 full example | v9 system.md t2i_context section 안 hit 0 |
| R3 | ``인물의 기본 국적/인종`` | v8 system.md:102 Korean lead | v9 system.md t2i_context section 안 hit 0 |
| R4 | ``시나리오의 region 에서 도출된 demonym`` | v8 system.md:102 Korean middle clause | v9 system.md t2i_context section 안 hit 0 |
| R5 | ``기본 국적/인종 + 색감/조명/질감 톤 + 장르 무드`` | v8 rules_schema.json:40 description phrase | v9 rules_schema.json description 안 hit 0 |

<!-- HISTORICAL AUDIT TRAIL — END -->

**Verification mechanism**: fixed-string `str.__contains__` 또는 `rg -F` membership only. semantic regex / token-stripping / VLM 사용 X.

## 9. Allowed / Forbidden Claim

### Allowed claim (Codex Q0-light verdict + 2 round narrow re-review 정합)
> `t2i_context section examples and lead clauses were abstracted to remove single-region demonym coercion and literal angle-bracket placeholder, replaced with outlook/evidence-first scenario-agnostic policy wording; rules_schema.json description aligned with same concept; t2i_context carrier shape (type:string, required, additionalProperties false) and STEP_MANIFEST schema_version preserved.`

### Forbidden claim
- ❌ `t2i_context structured SOT complete`
- ❌ `multi-cultural ethnic routing fixed end-to-end`
- ❌ `field-shape migration complete`
- ❌ `all VWR downstream demonym pollution fixed`

## 10. Closure section (W4 closure-docs wave, 2026-05-19+)

본 Carry-A100 v1 = closed at W4 closure-docs commit.

### Wave atomic commit trace (4 commits, no self-hash literal — exact hash recorded by git log/range review)
- W1 — Carry-A099 test compat atomic (`test_carry_a099_director_notes_abstraction.py` historical v8 pin + unused import 제거 + test_gate_6 rename; 33 PASS — A099 6 + Area #7a inherited 18 + visual_context_helper 9 direct consumer).
- W2 — v9 producer prompt-pack atomic (`prompts/_base/visual_world_rules/9.202605191334/` 2 file: system.md line 102 narrow + rules_schema.json:40 description-only narrow; carrier shape preserve + STEP_MANIFEST schema_version=1 preserve).
- W3 — Carry-A100 integrated test atomic (`test_carry_a100_t2i_context_demonym_abstraction.py` 신규 7 Gate G1-G7).
- W4 — Closure docs atomic (본 in-place REPLACE + roadmap §5.7 narrow append + audit 02 §11.3/§13/§14 + line 311 A100 row + Area #7a/#7b spec narrow + Carry-A099 spec carry table).

### Final pushed range/count = external memory only after push ([[feedback_push_no_user_ask]] 정합, pre-claim 0).

### Doctrine reaffirm
- 4-Gate Boundary Doctrine inline (Semantic Regex Ban / Closed-List Ban refined full-phrase only / Structured SOT Required partial / No Silent Fallback).
- NO VLM hard constraint.
- Closed-world exact full-phrase membership only.
- Standalone token global ban X.
- TEMPLATE ONLY + post-Carry-D7d-1 fix-up 1 + post-Carry-A099 N-5 + Codex 3rd narrow re-review N-1 doctrine.

### Carry follow-up post Carry-A100
- Carry-P021 (scene_consistency 7 enumeration broad, source unresolved) — Tier 4 deferred.
- Future Carry-A100-structured (`t2i_context: string` → `object` field-shape migration) — major carry / area follow-up.

## 11. References

- **Codex iter verdict trace (본 carry drafting)**:
  - Q0-light: `NEEDS_REVISION_NARROW_N1_THEN_PROCEED_TO_W0_INVENTORY_AND_Q1_Q7_OUTLINE` (N-1 scope correction: `rules_schema.json:40` description-only edit in-scope).
  - 1st narrow re-review: `NEEDS_REVISION_MINOR` (IMPORTANT 1 A099 test compat scope + IMPORTANT 2 angle-bracket placeholder marker block + IMPORTANT 3 4-point sync wording + MINOR 1 inherited test impact split).
  - 2nd narrow re-review: `APPROVED_FOR_SPEC_V1_DRAFT_WITH_NARROW_GUARDS` (6 narrow guards 명시 → 본 spec 안 흡수).
- **W0.1 inventory artifact** (untracked, reference only): `docs/superpowers/specs/2026-05-19-carry-a100-w0-1-inventory.md`.
- **Q1-Q7 outline artifact** (untracked, reference only): `docs/superpowers/specs/2026-05-19-carry-a100-q1-q7-outline.md`.
- **Active VWR pack** (v8, Carry-A099 anchor): `prompts/_base/visual_world_rules/8.202605191102/` (2 file: `system.md` line 98-114 t2i_context section + `rules_schema.json:40` description).
- **8 direct readers**: `visual_context_helper.py:90,168` + `entity_steps.py:723` + `beat_shot_steps.py:330-339` + `detail_steps.py:1209-1210` + `outlook_steps.py:91` + `t2i_review.py:68,83,88,172,179,280,295` + `shot_staging.py:84,87` + test fixtures.
- **Test anchors**: `test_visual_world_rules.py` + `test_area_7a_no_drift.py` + `test_area_7a_residue_gate.py` (A100 impact 0) + `test_carry_a099_director_notes_abstraction.py` (A100 W1 narrow modification 의무).
- **Area #7a v1 spec**: `docs/superpowers/specs/2026-05-18-area-7a-visual-world-rules-sot-v1-design.md:73, 109, 414, 418, 434` (Carry-A100 source 정의 + cross-cut X with Area #7c).
- **Area #7b v1 spec**: `docs/superpowers/specs/2026-05-19-area-7b-vwr-cascade-downstream-v1-design.md:31, 110, 130, 571, 716` (Carry-A100 boundary preserve).
- **Carry-A099 v1 spec**: `docs/superpowers/specs/2026-05-19-carry-a099-vwr-system-md-director-notes-prose-redesign-v1-design.md` (v8 anchor + director_notes section line 57-84 preserve).
- **Roadmap**: `docs/superpowers/specs/2026-05-16-track-b-semantic-debt-roadmap-design.md:387-390` (Track B §5.7).
- **Audit 02**: `docs/visual-reliability-audit/2026-05-14-semantic-string-routing-debt-audit/02-prompt-side-hygiene-audit.md:311` A100 row + §11.3/§13/§14 carry follow-up.
- **Pre-Carry-A100 closure**: [[session_20260519_carry_a099_v1_closure]] (origin/main HEAD `146401c`, range pushed `05d5265..146401c` = 4 commits).
- **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]] + [[session_20260519_carry_a099_v1_closure]] + [[next_session_carry_a100_q0_light]].
