Fix Critical 1 — Track B 10 영역 closure status

regex + 오염 prompt 제거 목표 · 194 audit finding cross-reference · C1-C9 marathon closed
Date: 2026-05-21 Closure baseline: c3612ea (fix-critical-1 marathon / origin/main before e2e-review-fix-v1) Audit total: 194 finding (production 94 + prompt 100) Pre-marathon closed: 73 row (Area #1~#7d + Carry-D7d-1/A099/A100/P021 시점 tally) C1-C9 marathon: all 9 areas closed Remaining original actionable: 0 (C10 = future / superseded)
post-closure E2E follow-up — e2e-review-fix-v1 (original C1-C9 marathon 의 일부 아님; marathon closure 후 별도 follow-up bug-fix range):
  • W1 — shot_extract v15: user.md rule_type enum 목록 format-brace escape (str.format KeyError 크래시 fix, 금월도 E2E blocker)
  • W2 — floor_plan_prompt test-pin sync (v4→v5)
  • W1 fix-up — test_c8_area7 W2a pin sync (shot_extract v15 / shot_extractor 2.4.0)
  • W3 — entity_extractor_v2 v12: active stem(system.md 변형 예시 / turn0_style.md hardcoded 문화권 예시) 닫힌 목록·시나리오 leak 추상화 — C8 v11 turn2.md 는 dead stem (cosmetic)
  • W4 — C1 render_prompt_card build_id_policy perception_mode .lower() 제거 (consumer-boundary tighten)
follow-up range in progress — 자세한 commit 은 git log 참조.

00 전체 개요 + 우선순위 #

194 audit finding 중 Area #1~#7d + Carry-D7d-1/A099/A100/P021 closure 후 진입했던 C1-C10 actionable list. C1-C9 marathon 9 영역 전부 closed, C10 = future / superseded by agentic editing direction. Codex narrow correction 흡수.

Tier α: NEW area, runtime risk Tier β: independent Tier γ: prompt marathon Tier δ: future

10 영역 closure matrix

#AreaTierCost본질Status
1C1 representation_binding / perception_modeαmediumcode regex + LLM closed-list + schema 3-way drift✓ CLOSED 81abd24
2C2 owned_object_usage[] echoαmedium-largeredraw verb closed whitelist + hard fail redraw_violation✓ CLOSED W1-W4
3C3 detail_steps focus rewriteαsmallblind prompt body mutation 폐기✓ CLOSED W1-W2
4C7 #12 shot_dependency_t2i driftβsmallperson/body lexicon ban (structured signal 필요)✓ CLOSED W1-W2
5C6 #10 detail_steps 색감-감정βsmall한국어 감정→색감 closed list✓ CLOSED W1-W2
6C9 L-7 body-light verbβsmallclosed verb list 5 + forbidden/recommended examples 5+5✓ CLOSED W1-W2
7C4 #8 Background / floor-plan classifierβmedium-largeINDOOR/OUTDOOR Korean clue + 색깔 매핑✓ CLOSED W1-W5
8C5 #9 Action segment SOTβmedium시간 연결어 + visible-human-action lexicon✓ CLOSED W1-W4
9C8 #7 잔여 sub-area marathonγlargescenario leak + closed-list (15+ prompt + 7 code carry)✓ CLOSED W1a-W5
10C10 Future structured carriesδdeferredfield-shape migration (P021/A099/A100-structured)future · superseded by agentic editing direction

잔여 진입 순서 (post-C2, Codex APPROVED)

0. C1 perception_mode enum SOT          ✓ CLOSED (push 81abd24, 2026-05-20+)
1. C2 owned_object_usage[] echo          ✓ CLOSED (W1-W4, 2026-05-20+)
2. C3 detail_steps focus rewrite         ✓ CLOSED (W1-W2, 2026-05-20+)
3. C7 #12 shot_dependency_t2i drift      ✓ CLOSED (W1-W2, 2026-05-20+)
4. C6 #10 detail_steps 색감-감정          ✓ CLOSED (W1-W2, 2026-05-20+)
5. C9 L-7 body-light verb abstraction     ✓ CLOSED (W1-W2, 2026-05-20+)
6. C4 #8 background classifier            ✓ CLOSED (W1-W5, 2026-05-20+)
7. C5 #9 action segment SOT             ✓ CLOSED (W1-W4, 2026-05-20+)
8. C8 #7 residual split (a)/(c)/(d) + code carry  ✓ CLOSED (W1a-W5, 2026-05-20+)
9. C10 Carry-P021/A099/A100-structured   [future / superseded by agentic editing direction]

DC Doctrine + Boundary Preserve #

4-Gate Boundary Doctrine

Gate 1 — Semantic Regex Ban: open-world semantic 판단을 code regex / substring matching / keyword list 로 수행 금지. closed-world (ID, status, schema, hash, path) 만 허용.
Gate 2 — Prompt Closed-List Ban: LLM-facing closed phrase list 가르침 금지. principle-only constraint 또는 structured emit 으로 대체. full-phrase ban only (generic Korean standalone 예외).
Gate 3 — Structured SOT Required: 모든 semantic 판단 = LLM-produced structured field (enum / ID / bool / object). code 는 closed-world consume 만.
Gate 4 — No Silent Fallback: missing / None / invalid type 모두 fail-fast (AppError / KeyError raise). generic fallback path 절대 금지.

Closed Area Boundaries — 변경 0 의무

Area C closed (directionality_class SOT v1):
  • _ALLOWED_DIRECTIONALITY_CLASSES @ render_prompt_card.py:124 frozenset (5-enum)
  • _REPRODUCTION_SURFACE_CLASSES @ :134 frozenset
  • fail-fast @ :1038-1043 (directionality_class_missing/invalid)
  • shot_staging/13/schema.json:80-86 directionality_class enum required
Area D-next-min closed:
  • KEEP_ELEMENT_KINDS = frozenset({"environment", "static_prop"}) @ keep_elements.py:25-26
  • 본체 변경 0, description drift 만 fix 허용 (C7 영역)
Other closed areas — frame_spatial_contract / keep_elements / render_contracts (visual_identity) / framing_scale / close × ref_usage matrix / zoom_in_detail / Hygiene v1 P-1~P-6 / Areas #1~#7d / Carry-D7d-1 / Carry-A099 / Carry-A100 / Carry-P021.

NO VLM Hard Constraint

VLM (Vision Language Model) 기반 판단 / 검증 / 성능 전제 / 의존 구조 절대 금지 (사용자 명시 2026-05-18). 대체 = structured SOT + regex/lexicon 권한 박탈 + prompt hygiene + canary/audit log 검증. Production image gen 정상 모듈 사용은 무관.

C1 representation_binding / perception_mode enum SOT #

code regex + LLM closed-list + schema 3-way drift (mirror schema gap). ✓ CLOSED (2026-05-20+) — W1 4655741 / W2 c486993 / W3 cfc0347 / W4 closure. Codex per-wave APPROVED.

Tier α #1 cost: medium ✓ CLOSED
C1 CLOSED (2026-05-20+): shot_staging v14 perception_mode JSON enum 8-token 강제 (mirror 추가) + backend/app/core/perception_mode.py helper 신설 + render_prompt_card/detail_steps helper consume + scene_detail v29 consumer prompt cross-reference. spec/plan = docs/superpowers/specs|plans/2026-05-20-c1-perception-mode-enum-sot-v1-*.md. 잔여 = C2~C10.

문제 본질

shot_staging schema 안 perception_modetype:string + description 7-token, JSON enum 강제 0. mirror 가 schema description 에도 부재. consumer code 는 4-token literal subset 비교 ((perception_mode or "").lower() in (...)). 결과:

  • arbitrary string silent miss — LLM 이 description 외 token ("screen", "lens", "camera_feed" 등) emit 시 모두 통과
  • 3-way description drift — prompt 4-token / code 4-token / schema description 7-token. mirror 가 prompt+code 안에는 있으나 schema description 에는 없음
  • cascade gapdetail_steps._perception_guides 6-key dict 에 mirror 부재. mirror 들어오면 generic fallback path

4-Layer Source Map (Q0-light LOCKED)

Layer
site
target state
1. Producer schema
prompts/_base/shot_staging/13.../schema.json:18
type:string + description 7-token (direct/hallucination/dream/memory/reflection/through_device/projection) — mirror 부재, JSON enum 강제 0
v14 → JSON enum 강제 8-token (mirror 추가)
2. Consumer code (subset)
backend/app/core/steps/render_prompt_card.py:1144-1146
4-tuple literal ("reflection","mirror","through_device","projection")
REPRODUCTION_PERCEPTION_MODES closed-world frozenset consume
3. Cascade code
backend/app/core/steps/detail_steps.py:2221-2231 perception guide block
non-direct branch + 6-key dict (mirror 부재) + generic fallback @ :2231
non-direct 7-key coverage (mirror 추가, Producer 8 enum 중 direct 제외) + generic fallback 폐기
4. Consumer prompt
prompts/_base/scene_detail/28.../system.md:64
4-token closed list — 본 file 1 site only
v29 → enum cross-reference

Cascade Audit — 4 material passthrough sites

siteactual call
render_prompt_card.py:827pm = perception_mode or RENDER_MODE_DIRECT (default coerce)
render_prompt_card.py:1144reproduction subset routing branch (4-tuple literal, single material decision)
render_prompt_card.py:3449build_render_strategy(... perception_mode=perception_mode, ...) passthrough
render_prompt_card.py:3486build_id_policy(... perception_mode=perception_mode, ...) passthrough

제외: :780, :857, :884, :942, :3409 = signature/dict-key/parameter only (material 아님) / :963, :1098, :1181, :2321, :3545 = comment lines

8 Open Questions

OQ-1 — Producer enum cardinality
enum 어떤 token set 으로 강제할 것인가?
(a) 8-token (direct/hallucination/dream/memory/reflection/mirror/through_device/projection) / (b) 7-token + mirror↔reflection 합병
Claude 권장 = (a) 8-token (mirror vs reflection 의미 분리 유지)
OQ-2 — REPRODUCTION_PERCEPTION_MODES constant location
Consumer subset SOT 어디에 둘 것인가?
(a) render_prompt_card.py module-level / (b) backend/app/core/perception_mode.py 신설 helper / (c) representation_binding.py 신설
Claude 권장 = (b) 신설 helper — 4-token subset SOT + cross-check API
OQ-3 — _perception_guides mirror policy
mirror entry 어떤 wording 으로 추가할 것인가?
(a) reflection wording 복사 / (b) 별도 wording / (c) generic fallback 폐기 + KeyError fail-fast (non-direct 7-key full coverage)
Claude 권장 = (c) fail-fast (Gate 4 No Silent Fallback)
OQ-4 — shot_staging v14 bump scope (prompt+schema)
prompt/schema version bump 어떻게 진행?
(a) v14 dir 신설 (2 file: schema.json + system.md) + version_registry sync + JSON enum 강제 / (b) v13 narrow description-only mirror 추가 (enum 미강제)
Claude 권장 = (a) v14 + JSON enum (Gate 3 Structured SOT)
OQ-5 — step_manifest.schema_version bump (현재 5) + cp invalidation
manifest schema_version + checkpoint invalidation 필요한가?
(a) 6 bump + cp invalidation (output shape change 에 준해) / (b) prompt/schema version bump only (validation contract 강화 = output 필드 shape 추가 X, cp shape 동일)
spec 진입 시 결정 — 의무 아님. (b) 후보 강함 (validation strengthening only), 단 producer LLM emit stricter → cp consumer cross-check 영향 review 의무
OQ-6 — scene_detail v29 prompt-only bump + cp invalidation policy
consumer prompt bump 어떻게?
(a) v29 dir 신설 + cp invalidate / (b) v28 narrow edit (system.md:64 단일 line) / (c) v29 + cp preserve (system.md change only, output shape 동일)
spec 진입 시 결정
OQ-C2 / OQ-C7 — defer (C1 결정 대상 아님, remaining-work guard 보존)
OQ-C2 = owned_object_usage[] echo 범위 (C2 spec entry) / OQ-C7 = structured signal naming (C7 spec entry)

수정 방법 (step-by-step)

  1. spec v1 draftingdocs/superpowers/specs/2026-MM-DD-c1-perception-mode-enum-sot-v1-design.md. OQ-1~6 결정 흡수.
  2. plan v1 drafting — W1-W4 atomic execution plan + gate verify scripts.
  3. W1: shot_staging v14 producer 신설
    prompts/_base/shot_staging/14.YYYYMMDDHHmm/
    ├── schema.json   (perception_mode → JSON enum 강제 8-token)
    └── system.md     (perception_mode 전용 section 신규 추가)

    현 v13 system.md 안 perception_mode 전용 section 부재 (line 57 "reflection" = composition technique 일부만). v14 system.md 에 enum emit instruction 신규.

    version_registry sync + step_manifest schema_version bump 결정 (OQ-5).

  4. W2: REPRODUCTION_PERCEPTION_MODES helper 신설
    backend/app/core/perception_mode.py  (신설 — OQ-2 (b))
    ─ PERCEPTION_MODES: frozenset[str] = frozenset({
        "direct", "hallucination", "dream", "memory",
        "reflection", "mirror", "through_device", "projection",
      })
    ─ REPRODUCTION_PERCEPTION_MODES: frozenset[str] = frozenset({
        "reflection", "mirror", "through_device", "projection",
      })
    ─ def is_reproduction_perception(pm: str) -> bool: ...
    ─ def get_perception_guide(pm: str) -> str: ...   # KeyError fail-fast
  5. W2: render_prompt_card.py:1144 reflection branch rewrite
    - if (perception_mode or "").lower() in (
    -     "reflection", "mirror", "through_device", "projection",
    - ):
    + from app.core.perception_mode import is_reproduction_perception
    + if is_reproduction_perception(perception_mode or ""):
  6. W2: detail_steps.py:2221-2231 perception guide block rewrite
    - _perception_guides = {
    -     "through_device": "...",
    -     "hallucination": "...",
    -     "dream": "...",
    -     "memory": "...",
    -     "reflection": "...",
    -     "projection": "...",
    - }
    - _pguide = _perception_guides.get(perception, f"이 장면은 {perception}으로...")  # generic fallback
    + _perception_guides = {
    +     "through_device": "...",
    +     "hallucination": "...",
    +     "dream": "...",
    +     "memory": "...",
    +     "reflection": "...",
    +     "mirror": "이 장면은 거울 반사이므로 좌우 반전된 구도 + 표면 반사 특성을 고려하세요.",
    +     "projection": "...",
    + }  # non-direct 7-key full coverage
    + try:
    +     _pguide = _perception_guides[perception]
    + except KeyError:
    +     raise AppError(
    +         code="detail_steps.perception_mode_unknown",
    +         message=f"perception_mode={perception!r} not in PERCEPTION_MODES enum",
    +     )
  7. W3: scene_detail v29 consumer prompt
    prompts/_base/scene_detail/29.YYYYMMDDHHmm/
    └── system.md  (line 64 4-token closed list → enum cross-reference)

    변경 예시:

    - - `perception_mode` 가 mirror / reflection / through_device / projection 이면 ...
    + - `perception_mode` ∈ REPRODUCTION_PERCEPTION_MODES (helper SOT) 이면 ...
  8. W3: integrated test 신설
    backend/tests/integration/test_c1_perception_mode_enum_sot.py
    ─ Gate G1: shot_staging v14 schema enum strict (8-token, mirror 포함)
    ─ Gate G2: render_prompt_card reproduction branch uses helper (not literal)
    ─ Gate G3: detail_steps non-direct 7-key full coverage + KeyError fail-fast
    ─ Gate G4: scene_detail v29 system.md 4-token literal 부재
    ─ Gate G5: version_registry + step_manifest 4-point sync
    ─ Gate G6: NO VLM canary + closed-world residue catalog 0 count
  9. W4: closure docs atomic — spec frontmatter status closed + roadmap §5 신설 area entry + audit 02 §15 (신설) C1 closure + 본 doc updated marker

Boundary Preserve (Area C closed, 변경 0)

  • _ALLOWED_DIRECTIONALITY_CLASSES frozenset @ render_prompt_card.py:124
  • _REPRODUCTION_SURFACE_CLASSES frozenset @ :134
  • fail-fast @ :1038-1043 (directionality_class_missing/invalid)
  • shot_staging/13/schema.json:80-86 directionality_class 5-enum required

차원 분리 의무 (Codex Guard 1): perception_mode 와 directionality_class 는 같은 helper 에 묶어도 field 분리. directionality_class 영역은 Area C closed boundary preserve.

C2 scene_detail_owned_judge owned_object_usage[] echo schema #

audit 03 P0 (L-2). redraw verb closed whitelist + hard fail redraw_violation (open-world verb 누락 silent miss). ✓ CLOSED (2026-05-20+) — W1 eb8343c / W2 55f54ab / W3 bc05dc7 / W4 closure. scene_detail v30 owned_object_usage[] echo + owned sentinel v2 + scene_detail_owned_judge v4 echo-verify-only. Codex per-wave APPROVED.

Tier α #2 cost: medium-large ✓ CLOSED

문제 본질

scene_detail_owned_judge LLM 이 redraw verb closed whitelist + anchor/reference phrase examples + spatial/framing examples + adjective/state examples + 5-step priority closed list 로 owned 객체 redraw 여부 판정. verdict redraw_violation = hard fail. 새 verb 누락 silent pass / 의도외 verb 매칭 over-trigger.

현재 site (Channel C confirmed)

Layer
site
현재 상태
Judge prompt
prompts/_base/scene_detail_owned_judge/3.../system.md:18-20
redraw 동사 closed whitelist: 생성군 (create / render / draw / generate / paint / build / furnish) + 추가/배치군 (add / place / put / insert / hang / mount / install / set up)
Judge prompt
scene_detail_owned_judge/3.../system.md:37-58
anchor/reference phrase examples + spatial/framing examples + adjective/state examples + 5-step priority + ambiguous → anchor_reference default
Judge consumer
backend/app/core/steps/_owned_judge.py:99-116
run_owned_judge() — violations list shape 검증만 (실제 판단 = judge prompt 의 verb whitelist 의존)
Sentinel path
backend/app/core/steps/detail_steps.py:2940-2970
_owned_helpers.build_owned_sentinel + assert_owned_sentinel_shape + has_redraw_violation + run_owned_judge이미 owned sentinel/contract path 실존
Producer schema
prompts/_base/scene_detail/28.../detail_schema.json
owned_object_usage[] field 부재 — 신규 추가 대상

OQ-C2 결정 의무 (Codex Guard 2)

OQ-C2 — owned_object_usage[] echo 범위 (spec 진입 시 결정)
(a) 전체 owned_list token echousage_kind: enum [redraw/anchor/absent] + per-variation 안 owned_list 모든 token echo (absent 포함, 검증 완전성 높음, array size 큼)
(b) Present usages only + owned_set_hashusage_kind: enum [redraw/anchor] + present only + owned_set_hash: str sibling field (expected owned set hash 일치 검증, array size 절약)
spec 진입 시 결정 — trade-off = 검증 완전성 vs LLM token cost

수정 방법

  1. Q0-light source verify — 4-layer source map (Producer schema / Producer prompt / Judge prompt / Sentinel consumer) + OQ-C2 결정 ((a)/(b))
  2. spec v1 + plan v1 drafting (Codex 의논)
  3. W1: scene_detail v_next producer schema 신설
    v_next 정책: C1 이 v29 bump 한 경우 → C2 = v30 (또는 C1 v29 미bump 시 C2 = v29). C1+C2 같은 spec/plan 으로 explicitly 묶는 경우만 동일 v29 안에서 bundle.
    prompts/_base/scene_detail/v_next.../detail_schema.json
    ─ variations[].owned_object_usage[]: array<{
        owned_token: str,
        usage_kind: enum [redraw / anchor / absent],  # OQ-C2 (a) 채택 시
        source_phrase: str  # t2i_prompt 안 등장 phrase
      }>
  4. W1: scene_detail v_next producer prompt — owned_object_usage echo instruction (OQ-C2 결정 반영, v_next 정책 C1 cascade dependent)
  5. W2: Sentinel/contract path 재사용 (Codex correction crucial)
    backend/app/core/steps/detail_steps.py:2940-2970
    ─ 기존 owned sentinel/contract path 재사용
    ─ sentinel schema/signature 변경 여부 = C2 spec OQ로 결정
    ─ parallel path 신설 절대 금지
    주의: _owned_helpers.build_owned_sentinel() 현재 signature (_owned_helpers.py:149-156) 에 echo field 부재. sentinel field 변경 가능성은 C2 spec 안에서 OQ로 결정.
  6. W3: scene_detail_owned_judge v4 prompt rewrite
    prompts/_base/scene_detail_owned_judge/v4.../system.md
    ─ redraw 동사 closed whitelist 폐기 (현재 :18-20)
    ─ anchor/reference phrase examples 폐기 (현재 :37-58)
    ─ 5-step priority 폐기 (현재 :54-58)
    ─ echo verify only: variations[].owned_object_usage[] 와 t2i_prompt cross-check 만
  7. W3: judge consumer cross-check 추가
    backend/app/core/steps/_owned_judge.py
    ─ run_owned_judge() echo cross-check 추가 — owned_object_usage echo vs t2i_prompt 안 owned_list token 등장 verify
  8. W4: integrated test + closure docs

Boundary Preserve

  • 기존 owned sentinel/contract path 재사용 — parallel path 신설 0
  • _owned_helpers.build_owned_sentinel + assert_owned_sentinel_shape + has_redraw_violation 시그니처 변경 여부 = C2 spec OQ로 결정 (echo field 추가 필요 시 narrow extension)
  • verdict enum (redraw_violation / anchor_reference) 보존
  • scene_detail t2i_prompt body shape 변경 0

C3 detail_steps focus rewrite 폐기 (upstream fail-fast 우선) #

audit 01 §7 (Excluded — Closed ID syntax cleanup) detail_steps cleanup 을 roadmap §4.4/§225 가 prompt body mutation 으로 재분류. ✓ CLOSED (2026-05-20+) — W1 4740b03 / W2 closure. Codex per-wave APPROVED. (audit 01 #10 t2i_review 와는 별건 — C3 무관.)

Tier α #3 cost: small + upstream verify ✓ CLOSED

C3 CLOSED (2026-05-20+): OQ option (b) upstream token-complete fix — _strip_invalid_sids() module-level helper 신설 (무효 closed-world SID + 후행 소유격 + 인접 공백 token-complete 제거, subn no-match no-op, semantic 재삽입 0) + VE-violation 강제 제거 2 site (t2i_prompt pure_remove / representative_moment bad_in_sfp) helper 호출 교체 + cleanup loop :2872-2882 폐기. test_c3_detail_steps_focus_rewrite.py G1-G7 신설. fail-fast (option a) 미채택 — VE-violation 강제 제거 graceful degradation 보존. spec/plan = docs/superpowers/specs|plans/2026-05-20-c3-detail-steps-focus-rewrite-v1-*.md. 잔여 = C7~C10.

현재 site

sitecode
backend/app/core/steps/detail_steps.py:2876-2886
# 빈 ID 패턴 정리 (엑스트라 인물 등으로 인한 빈 문자열 잔류)   ← :2876
for var in t2i_vars:
    prompt = var.get("t2i_prompt", "")
    if prompt:
        # "showing  lying_down" → "showing lying_down"
        prompt = re.sub(r'\s{2,}', ' ', prompt)                          # :2881
        # "focus on 's" → "focus on the figure's"
        prompt = re.sub(r"focus on\s+'s", "focus on the figure's", prompt)  # :2883
        # " 's " (빈 소유격) → "the figure's "
        prompt = re.sub(r"\s+'s\s+", " the figure's ", prompt)           # :2885
        var["t2i_prompt"] = prompt.strip()                                # :2886

Code comment: # 빈 ID 패턴 정리 (엑스트라 인물 등으로 인한 빈 문자열 잔류) — empty C##/O## ID 잔류로 인한 broken focus on 's cleanup 목적.

Codex Correction

단순 1 block delete 금지 — malformed prompt 어디서 생기는지 (empty C##/O## ID emit source) upstream 추적 + 회귀 테스트 의무. fail-fast 설계 후 폐기.

수정 방법

  1. Upstream investigation — empty C##/O## ID emit source 추적
    • render_prompt_card / scene_detail producer 안 empty ID emit 가능 path 식별
    • outlook_dedup / scene_reference_service 안 ID rewrite path 안 empty 잔류 case
    • t2i_visual_converter [엔티티명] 마커 치환 안 empty 잔류 case
  2. fail-fast 결정
    • 옵션 (a) 폐기 + fail-fast: empty ID 검출 시 producer 또는 helper layer 안 fail-fast (AppError raise) — Gate 4 No Silent Fallback
    • 옵션 (b) upstream fix: empty ID emit source 자체 수정 → cleanup 자동 불필요
    • 옵션 (c) cleanup 유지 + diagnostic log only — 단순 cleanup 보존, 단 warning emit (역행 위험)
  3. 회귀 test 신설
    backend/tests/integration/test_detail_steps_focus_rewrite_regression.py
    ─ Test 1: empty ID 발생 시나리오 (extra 인물 / outlook 누락 / marker 치환 실패) canary
    ─ Test 2: cleanup 폐기 후 malformed prompt downstream 영향 측정
    ─ Test 3: fail-fast path verify (옵션 (a) 채택 시)
  4. 3 substitution 폐기 commit
    backend/app/core/steps/detail_steps.py:2876-2886
    ─ 3 substitution block delete (:2881, :2883, :2885)
      - re.sub(r'\s{2,}', ' ', prompt)
      - re.sub(r"focus on\s+'s", "focus on the figure's", prompt)
      - re.sub(r"\s+'s\s+", " the figure's ", prompt)
    ─ upstream fail-fast 또는 fix 적용 후만

C7 Area #12 — shot_dependency_t2i schema drift #

audit row A059/A060/A061/A063. closed area D-next-min description vs system.md drift + 11-lexicon person/body ban list non-enforced. ✓ CLOSED (2026-05-20+) — W1 c8d2391 / W1 fix-up 1 e4ee3ed / W2 closure. Codex per-wave APPROVED.

Tier β #4 cost: small + structured signal 설계 ✓ CLOSED

C7 CLOSED (2026-05-20+): OQ-C7 option (a) — keep_elements[].subject_kind structured signal enum [non_human_visual_element / human_or_character_reference] required field 신설 (v8 prompt-pack 8.202605200618/). producer LLM 이 각 entry 의 인물/비인물 여부를 explicit emit → validate_keep_elements_entry() 가 enum 소비 + human_or_character_reference fail-fast (routing layer 안내). system.md false "fail-fast 거부" claim 을 subject_kind 기반 TRUE 진술로 정정 + 11-lexicon ban list 폐기 + schema description cleanup. version cascade — schema_version 3→4 / MODULE_VERSIONS 1.5.0 / prompt_dependency v8 / scene_context_loader envelope 3→4. KEEP_ELEMENT_KINDS + kind enum check 본체 + _LEGACY_SCHEMA_BUMP_ALLOWLIST 변경 0. code-side lexicon validator 미추가 (structured signal 소비만). test_c7_shot_dependency_subject_kind.py G1-G9 신설. spec/plan = docs/superpowers/specs|plans/2026-05-20-c7-shot-dependency-subject-kind-v1-*.md. 잔여 = C6/C9/C4/C5/C8/C10.

문제 본질

shot_dependency_t2i schema 안 keep_elements[].label: type:string + description "PERSON/CHARACTER/BODY descriptions are FORBIDDEN" instruction. kind: enum [environment, static_prop] 만 schema-strict. label string 안 11-lexicon ban (human/person/character/body/figure/man/woman/detective/prisoner/child/silhouette) 은 prompt 안 instruction only, code/schema validation 0 — silent miss.

Codex Guard 3 Crucial

kind enum 만으로 label string 의 person/body 단어 막을 수 없다. prompt lexicon 지우려면 upstream structured signal 또는 code/schema validation 필요. code-side banned-list lexicon 추가는 regex/오염 제거 목표와 충돌 → 최후수단.

현재 site

site현재 상태
shot_dependency_t2i/7.../schema.json:28"No add/replace/adjust instructions. No conditional phrasing (no 'if...', 'when...', 'only if')."
shot_dependency_t2i/7.../schema.json:42"character state (dead/unconscious/pose) is handled by separate layers (scene_consistency / character_state_variant / semantic_contract_router), not keep_elements."
shot_dependency_t2i/7.../system.md:15611-lexicon ban: human / person / character / body / figure / man / woman / detective / prisoner / child / silhouette
shot_dependency_t2i/7.../system.md:161-163"enum 외 값 절대 금지 (immobilized_character / character / pose 등)" description-only
backend/app/core/keep_elements.py:32-90validate_keep_elements_entry() — label은 isinstance(str)만 check, kind enum check만. label substring lexicon validation 0

OQ-C7 결정 의무 (Codex Guard 3)

OQ-C7 — structured signal naming (spec 진입 시 결정)
(a) subject_kindenum [non_human_visual_element / human_or_character_reference] per-entry — kind 와 차원 분리 (kind = 환경/소품, subject_kind = 인물/비인물)
(b) contains_person_referencebool per-entry — boolean signal
label_category 금지kind: environment/static_prop 와 의미 중복 (Codex 명시)

수정 방법

  1. Q0-light source verify — 4-layer source map + OQ-C7 결정 ((a)/(b))
  2. Producer schema 1순위 (structured signal 우선)
    prompts/_base/shot_dependency_t2i/v8.../schema.json
    ─ keep_elements[].subject_kind: enum [non_human_visual_element / human_or_character_reference]  # OQ-C7 (a)
      또는
    ─ keep_elements[].contains_person_reference: bool  # OQ-C7 (b)
    ─ producer LLM 이 explicitly emit
    ─ producer schema 안 enum required + additionalProperties false
  3. Schema description cleanup
    prompts/_base/shot_dependency_t2i/v8.../schema.json:28,42
    ─ "No add/replace/adjust instructions" closed list → 일반 instruction
    ─ "character state ... separate layers" prose → cross-reference 한 줄
  4. Producer prompt cleanup
    prompts/_base/shot_dependency_t2i/v8.../system.md
    ─ line 156 11-lexicon ban list **structured signal 도입 후만 폐기**
    ─ line 161-163 enum 외 값 description → schema cross-reference
  5. Code validation 추가 (structured field consume)
    backend/app/core/keep_elements.py:32-90
    ─ validate_keep_elements_entry() 에 subject_kind / contains_person_reference enum check 추가
    ─ subject_kind == "human_or_character_reference" 시 AppError fail-fast (keep_elements 외 layer 라우팅)
  6. code-side banned noun lexicon 추가는 최후수단 — structured signal 실패 case 만 검토. 1순위 진입 = 목표 (regex/오염 제거) 역행

Boundary Preserve

  • Area D-next-min closed boundary: KEEP_ELEMENT_KINDS = frozenset({"environment", "static_prop"}) 본체 변경 0
  • validate_keep_elements_entry() kind enum check 본체 보존, 신규 field validation 만 추가

C6 Area #10 — detail_steps 색감-감정 closed-list 매핑 #

audit row P034. 한국어 감정→시각 색감 closed-list 매핑 (Prompt Closed-List Ban 위반, code-side scenario leak). ✓ CLOSED (2026-05-20+) — W1 9f64928 / W2 closure. Codex per-wave APPROVED.

Tier β #5 cost: small ✓ CLOSED W1-W2

C6 CLOSED (2026-05-20+): OQ-C6 = (a)/(c) hybrid generic instruction 치환. detail_steps.py:2327 의 한국어 감정→색감 closed-list (긴장=어둡고 대비 강한, 슬픔=탈색/청색, 분노=적색) 한 줄을 generic instruction ("색감은 beat의 정서와 씬 분위기에서 직접 derive하고, 특정 정서에 고정 색조를 대응시키도록 강요하지 마세요") 으로 치환 — emotion-drives-color 의도 보존, 특정 감정→색 고정 매핑 제거. 옵션 (b) color_palette_intent enum 미채택 — scene_detail schema 의 camera_effect free-string 이 이미 색감 capture (closed-list 강제 X design intent). 형제 줄 2326/2328 (시간대·색온도·조명 방향 = 객관적 촬영 범주) byte-for-byte 불변 + schema/prompt-pack/version artifact 변경 0. test_scene_detail_analyze_one.py C6 regression test G1-G5 신설. spec/plan = docs/superpowers/specs|plans/2026-05-20-c6-detail-steps-color-emotion-v1-*.md. 잔여 = C9/C4/C5/C8/C10.

현재 site

sitecode
backend/app/core/steps/detail_steps.py:2327 "- 감정에 맞는 색감(긴장=어둡고 대비 강한, 슬픔=탈색/청색, 분노=적색 등)\n" (W1 generic instruction 으로 치환됨)
"[조명/색감 판단]" prompt instruction 안 한국어 감정→색감 closed list mapping (single line)

수정 옵션

  • (a) 폐기 — LLM 이 색감 자체 자유 결정 (운영 자유도 ↑)
  • (b) color_palette_intent enum 흡수 — producer 가 색감 의도 structured emit, code consume (Codex 권장)
  • (c) prompt template 으로 이동 — code 안 한국어 prose 폐기, prompt 안 generic 으로 이동 (보수적)

수정 방법 (옵션 (b) 채택 가정)

  1. Producer schema 신설
    shot_staging or scene_detail v_next schema
    ─ color_palette_intent: {
        intent_kind: enum [tense / sad / angry / calm / hopeful / oppressive / nostalgic / ...],
        descriptor: str  # NL elaboration
      }
    ─ 또는 단순화: color_intent_description: str (free string)
  2. Producer prompt — color_palette_intent emit instruction
  3. Code 폐기
    backend/app/core/steps/detail_steps.py:2305
    - "- 감정에 맞는 색감(긴장=어둡고 대비 강한, 슬픔=탈색/청색, 분노=적색 등)\n"
    + # color_palette_intent → producer LLM emit, code consume only

Boundary Review

C1 cascade boundary: detail_steps.py:2223-2230 _perception_guides 6-token dict 안 한국어 prose mapping = C1 representation_binding 영역. 본 site (line 2305) 와 차원 다름. 분리 영역 유지.

C9 L-7 — scene_detail body-light verb forbidden list 추상화 #

audit 03 L-7 단독 발견. closed verb list 5 + forbidden/recommended phrasing 예시 + recommended verb list → generic semantic principle 로 줄이는 prompt-only hygiene. ✓ CLOSED (2026-05-20+) — W1 04016da / W2 closure. Codex per-wave APPROVED.

Tier β #6 cost: small ✓ CLOSED W1-W2

C9 CLOSED (2026-05-20+): OQ-C9 = (c) narrow Rule B rewrite + (a) 예시 전폐. scene_detail v31 prompt-pack — system.md Rule B 섹션의 4개 닫힌 enumeration (closed verb list cut/slice/split/carve/bisect quoted-comma + slash form 2회 + forbidden 예시 5건 + recommended 예시 5건 + recommended verb list) + sub-header 3개를 단일 generic semantic principle 1문단으로 추상화 — "빛/색은 표면에 머무는 효과로 묘사, 신체를 물리적으로 변형·절단하듯 쓰지 마라". header + WHY 문단 byte-identical 보존, 닫힌 영문 토큰·예문 목록 0. detail_schema.json v30→v31 byte-identical (sha256 동일), SCENE_DETAIL_SCHEMA_VERSION / STEP_MANIFEST schema_version 12 변경 0. version cascade 4-point — SCENE_DETAIL_PROMPT_VERSION 31.202605200805 / MODULE_VERSIONS 1.31.0 / prompt_dependency scene_detail/v31. test_c9_scene_detail_body_light_verb.py G1-G7 신설. 무관 섹션 (실루엣 평면 cutout / windshield slice framing 예시) string boundary preserve. spec/plan = docs/superpowers/specs|plans/2026-05-20-c9-scene-detail-body-light-verb-v1-*.md. 잔여 = C4/C5/C8/C10.

현재 site

site현재 상태
scene_detail/30.202605200303/system.md:74 → v31 31.202605200805"빛이 신체에 직접 작용하는 동사(cut, slice, split, carve, bisect)를 신체 부위와 결합하지 마라." (W1 v31 generic semantic principle 로 추상화 폐기. audit/index 의 "28..." 은 stale — C1 v29 / C2 v30 bump 미반영, 본 W2 정정)
scene_detail/30.202605200303/system.md:78-82forbidden phrasing 예시 5건 (red light cuts across her eyes 등) (W1 v31 전폐. audit/index 의 "4건 :78-81" 은 stale — 실제 5건 :78-82, 본 W2 정정)
scene_detail/30.202605200303/system.md:94-95recommended verb list (falls on / washes / reflects on / catches on / pools on / glows across) + closed verb list 반복 (cut / slice / split / carve / bisect slash form) (W1 v31 전폐)

수정 방법 (W1 적용 완료)

  1. scene_detail v31 prompt rewrite — v30 30.202605200303 → v31 31.202605200805
    prompts/_base/scene_detail/31.202605200805/system.md Rule B 섹션
    ─ v30 (폐기):
      - closed verb list cut/slice/split/carve/bisect (quoted-comma form + slash form 2회)
      - forbidden phrasing 예시 5건
      - recommended phrasing 예시 5건
      - recommended verb list (falls on/washes/reflects on/catches on/pools on/glows across)
    ─ v31 (적용):
      - generic semantic principle 1문단 — "빛/색은 표면(눈에 보이는 표면·재질·영역)에 머무는 효과로 묘사,
        신체를 물리적으로 변형·절단하듯 쓰지 마라"
      - 닫힌 영문 토큰·예문 목록 0, header + WHY 문단 byte-identical 보존
  2. P2 plausible / small / low blast radius — schema/code 변경 X, prompt-only rewrite (detail_schema.json v30→v31 byte-identical, version cascade 4-point)

C4 Area #8 — Background / floor-plan semantic classifier #

audit row A001-A005, A031, A033, P043. INDOOR/OUTDOOR + Korean clue + 색깔 매핑 closed-list reasoning → structured emit.

Tier β #7 cost: medium-large roadmap §5.8

C4 CLOSED (2026-05-20+): OQ-C4-1 옵션 B (narrow, C9/C6 pattern) — 신규 location_space_profile.py producer 미신설. 아래 9-step 수정 방법 원안은 superseded — Codex C4 entry sanity 가 신규 producer NO-GO 판정 (각 step 이 이미 자체 structured SOT emit: background_classify.is_indoor bool / background_chain_planning.skip_chain bool + D6 계열 entity_canon.metadata_json.location.space_profile + bg_state_vocab.validate_location_space_profile() + bg_catalog.normalize_space_key() 기존 SOT 존재 → 신규 producer 는 중복 + routing risk 증폭). C4 v1 = 8 row 해소 — P043 background_chain_planning.py:151-154 location 이름 substring 매칭 폐기 → exact·L-id 실패 시 ValueError fail-loud (W1 2c018f3) + A001/A002/A003/A004 background_chain_planning v5 prompt-pack 5.202605200932/ (W2 7c9a605) + A005 background_classify v4 4.202605200945/ (W3 4bf2c72 + fix-up 1 1130cf9) + A033/A034 location_floor_plan v4 4.202605201000/ (W4 ddcd115) — 닫힌 enumeration → generic semantic principle 추상화. A031 (floor_plan_prompt 색/glyph 매핑) = boundary-reviewed KEEP — schematic diagram 의 deterministic rendering convention, open-world semantic classifier 아님, floor_plan_prompt 변경 0. A020 (entity_extractor_v2 allowed_space_keys — 본 site table 9번째 row) = C4 scope 제외 (deferred — roadmap §5.8 audit row 미포함, file-fallback latest v10 vs version_registry v9, D6 location.space_profile SOT 와 묶인 큰 영역, C8/C10 carry). background_chain_planning (lifecycle deprecated + applicability disabled) / location_floor_plan (lifecycle deprecated) — active latest prompt/code residue 만 좁게 처리, step_manifest lifecycle/applicability entry 변경 0. 세 step PROMPT_VERSION bump (4→5 / 3→4 / 3→4), SCHEMA_VERSION 전부 불변. test_c4_background_classifier.py G1-G12 신설. spec/plan = docs/superpowers/specs|plans/2026-05-20-c4-background-classifier-v1-*.md. 잔여 = C5/C8/C10.

현재 site

site현재 상태grade
background_chain_planning/4.../system.md:19-25INDOOR/ENCLOSED/FIXED-SET vs DETACHED OPEN AREA closed reasoning + skip_chain 결정P1
background_chain_planning/4.../system.md:45-51close-ups vs room state (clean/lived-in/disturbed/heavily-ransacked)P1
background_chain_planning/4.../schema.json:5-7OUTDOOR/OPEN-AIR closed list (street/road/coast/sea/forest/yard/...)P2
background_chain_planning/4.../user_template.md:14-21SKIP outdoor/open-air vs Otherwise indoor/enclosed/fixed-setP2
background_classify/3.../system.md:18-20Korean clues 내부/안/방/실/층 vs 외부/옥상/거리/도로/공터/골목P1
floor_plan_prompt/4.../system.md:10-13living=pale yellow / bedroom=pale blue / kitchen=pale green 색깔 매핑 + 가구 shape (bed/sofa/table)P1
location_floor_plan/3.../system.md:22-25거실/안방/부엌/거실 cues + slash-zone parsingP1
background_chain_planning.py:151-152loc_raw in ename or ename in loc_raw substring 매칭 (P043)P1
entity_extractor_v2/10.../system.md:96-103allowed_space_keys: main/kitchen/rooftop/stairs/yard/exterior/office controlled vocabP1

수정 방법

  1. Q0-light + spec drafting — Codex 의논 의무 (큰 area, dependency graph review)
  2. Producer schema 신설 — location_space_profile structured emit
    backend/app/core/location_space_profile.py  (신설)
    ─ class LocationSpaceProfile:
        is_indoor: bool
        space_type: enum [room / hallway / store_interior / office / kitchen / basement / vehicle_cabin / rooftop_open / street / forest / beach / yard / public_square]
        building_membership: enum [shared_building_set / detached_open_area]
        persistent_architecture: bool  # floor plan 안 있는지 여부
    ─ 또는 background_master_plan 또는 신규 step 안 producer 진입
  3. Code substring fallback 폐기
    backend/app/modules/pipeline/background_chain_planning.py:151-152
    - if len(ename) >= 2 and (loc_raw in ename or ename in loc_raw):
    -     loc_id = esid
    + # ID-based resolve only — name substring fallback 폐기 (gate 1 Semantic Regex Ban)
    + # name match 실패 시 warning + fail-fast
  4. background_chain_planning prompt rewrite
    prompts/_base/background_chain_planning/v_next.../
    ─ INDOOR/ENCLOSED/FIXED-SET vs DETACHED OPEN AREA closed reasoning 폐기
    ─ Korean clue closed list 폐기
    ─ location_space_profile consume 만 (building_membership + persistent_architecture)
  5. background_classify prompt rewrite
    prompts/_base/background_classify/v_next.../
    ─ Korean clues (내부/안/방/실/층 + 외부/옥상/거리/도로) 폐기
    ─ location_space_profile consume — is_indoor + space_type
  6. floor_plan_prompt — boundary review
    floor_plan_prompt/v_next.../system.md:10-13
    ─ living=pale yellow 색깔 매핑 → closed-world 시각 표현 (의미 추론 아님) — boundary review:
      - 옵션 (a): 유지 — closed-world technical color palette
      - 옵션 (b): 폐기 — 모든 색깔을 LLM 자유 결정
    ─ 가구 shape (bed/sofa/table) → closed-world top-down convention — 유지 권장
  7. location_floor_plan prompt rewrite
    prompts/_base/location_floor_plan/v_next.../system.md
    ─ 거실/안방/부엌 cues 폐기
    ─ slash-zone parsing 폐기 (구체 token list 만)
    ─ location_space_profile consume
  8. entity_extractor_v2 cascade
    entity_extractor_v2/v_next.../system.md:96-103
    ─ allowed_space_keys controlled vocab 폐기
    ─ location_space_profile.space_type enum consume
  9. integrated test + canary verification
    backend/tests/integration/test_c4_background_classifier_v1.py
    ─ Production canary: background_chain 운영 routing 영향 (skip_chain 결정 분포)
    ─ NO VLM canary obligatory

Risk

background_chain 운영 routing 영향 — production canary 검증 의무. skip_chain 결정 분포가 prod 운영에 직접 영향 (chain image rendering 비용). NO VLM canary obligatory.

C5 Area #9 — Action segment SOT #

audit row A042, A064, A068, A069, A082, A083. 시간 연결어 + locomotion/water + visible-human-action lexicon → action_segment[] structured.

Tier β #8 cost: medium roadmap §5.9

C5 CLOSED (2026-05-20+): OQ-C5-1 옵션 B narrow — 신규 action_segment[] structured schema 미신설. 아래 "수정 방법" 9-step 원안 (action_segment[] schema 신설 + validator segment count 검증) 은 superseded — Codex C5 entry sanity NO-GO 판정 (shot description 에 routing 하는 code regex 0 → action_segment[] 는 consumer 없는 write-only dead schema; 본질 = producer writing constraint 이지 routing signal 아님; C4 신규 producer NO-GO 와 동일 논리). C5 v1 = 5 row 해소 — A064/A068 shot_extract v13 prompt-pack 13.202605201049/ 시간 연결어 닫힌 목록 추상화 (W1 cfb9184) + A082/A083 shot_validator v6 6.202605201118/ 시간 연결어·locomotion·active-contact·visible-human-action 닫힌 lexicon 추상화 (W2 086ab0a) + A042 scene_detail v32 32.202605201133/ dynamic verb 닫힌 목록 추상화 + 4-point cascade (W3 2f41467 + fix-up 1 3d901cc) — 닫힌 lexicon → generic semantic principle. version_registry 3 module provenance sync (shot_extractor 2.2.0 / shot_validator 1.5.0 / scene_detail_composer 1.32.0). A069 (shot_extract 외모·연령 변화 닫힌 목록) = C5 scope 제외, C8 Area #7 sub-area (c) carry — 중복 closure claim 금지. W1 OQ blocker: shot_schema.json 을 v13 에 통합 시 OpenAI strict linter 가 pre-existing dormant 위반 (characters required 누락) 노출 → Codex OPTION_1_APPROVED 로 schema 미통합 (v10 per-stem fallback 유지), schema-strict 위반은 별도 carry. shot_validator active contact / characters fail-fast contract + schema 구조 byte-identical, SCHEMA_VERSION 전부 불변. test_c5_action_segment_sot.py G1-G10 (12 test) 신설. spec/plan = docs/superpowers/specs|plans/2026-05-20-c5-action-segment-sot-v1-*.md. 잔여 = C8/C10.

현재 site

site현재 상태grade
shot_extract/12.../user.md:18-19시간 연결어 절대 금지: ~하자/~하면서/~하며/~하고/~한 뒤/~한 후/~하고 나서 + 영어 and then/while ~ing/after ~ing/as ~/before ~P1
shot_extract/12.../system.md:14-18동일 시간 연결어 closed listP1
shot_extract/12.../system.md:42-50나이 변화 / 부상 / 얼룩 / 창백해짐 / 멍 / 화상 — 외모 변화 (Area #7 sub-area (c) 와 overlap)P1
shot_validator/5.../system.md:8-12, 37-41연속 동작 금지 + locomotion (running/sprinting/walking/striding/climbing) + riding/driving + water/swim + jumping/leaping + chasing/fleeingP1
shot_validator/5.../system.md:157-161visible-human-action 판정 기준 closed list (얼굴/손/다리/팔/머리/face/hand/leg/arm/잡기/보기/말하기/hold/look/talk/embrace) — (3 중 1 이상 만족)P1
scene_detail/28.../system.md:381,551running/riding/walking/moving/chasing/pedaling/rowing dynamic verb re-frame triggerP1

수정 방법

  1. Producer schema 신설 (shot_extract v13)
    prompts/_base/shot_extract/v13.../schema.json
    ─ shots[].action_segment[]: array<{
        segment_kind: enum [motion / contact / state_change],
        start_anchor: str,  # 동작 시작 phrase
        end_anchor: str     # 동작 끝 phrase
      }>
    ─ 한 shot 안 action_segment 1개 default. 2+ 시 validator 경고/분리.
  2. shot_extract prompt rewrite
    prompts/_base/shot_extract/v13.../user.md + system.md
    ─ 시간 연결어 closed list (~하자/~하면서/and then/while ~ing) 폐기
    ─ action_segment[] 분리 emit instruction
  3. shot_validator prompt rewrite
    prompts/_base/shot_validator/v_next.../system.md
    ─ 시간 연결어 closed list 폐기
    ─ locomotion/riding/water closed list 폐기
    ─ visible-human-action 신체 부위 closed list 폐기
    ─ action_segment count 검증 + segment_kind enum consume
  4. scene_detail cascade
    prompts/_base/scene_detail/v_next.../system.md:381,551
    ─ dynamic verb closed list (running/riding/walking/moving/chasing/pedaling/rowing) 폐기
    ─ action_segment.segment_kind=motion consume
  5. boundary 명시 — Area #7 sub-area (c) overlap
    shot_extract/12.../system.md:35,42-50 (인종/국적 + 나이 변화)
    ─ #9 scope 외, #7 marathon 에서 처리
    ─ 중복 closure claim 금지

Risk

한국어 grammar pattern → structured action_segment 전환 시 LLM 분류 정확도 production verify 의무.

C8 Area #7 잔여 sub-area marathon (a/c/d split) #

roadmap §5.7 sub-area (a)/(c)/(d) 잔여. Hygiene v1 (C-1) + Area #7a/#7b/#7c/#7d (Sub-area (b)/(e)) closure 후 남은 prompt + code carry.

Tier γ #9 cost: large (split 권장) roadmap §5.7

C8 CLOSED (2026-05-20+): Area #7 잔여 sub-area (a)/(c)/(d) + code carry marathon — index.html C8 25-site disposition: FIX 21 추상화 / KEEP 2 (Site 16 background_chain_render palette checklist / Site 21 render_prompt_card _ID_ETHNICITY_COMPONENTS·_ID_AGE_BANDS G4.3 SOT) / SPLIT 1 (Site 20 render_prompt_card camera_frame_rule.applies_when FIX + _SPATIAL_CAMERA_* canary KEEP) / DEFER 1 (Site 19 scene_consistency_step P020 prefix shim — checkpoint migration 설계 필요, Area #7 carry). 8-wave 10-commit: W1a-1 dc06ac1 / W1a-2 b227672 / W1a-3 c0fc5f7 / W1b a3037b6 / W2a ef2fa91 / W2b 589b7b1 / W3a 7c5ab8a / W4a dab5980 / W4b b2f06b8 / W5 closure docs. 13 prompt-pack (sub-area (a) entity_all/entity_extract_v4/entity_filter/entity_extractor_v2/outlook_extractor/location_consistency + (c) shot_extract/shot_essence_extraction/shot_selection/scene_extractor_v2 + (d) t2i_visual_converter/background_master_plan/floor_plan_prompt) 닫힌 enumeration·시나리오 leak → generic semantic principle 추상화 + code carry 5 file (entity_steps/outlook_dedup/scene_validator/reference_image_generator/render_prompt_card) carrier-shape 보존 prose 치환. 신규 schema/producer/mechanism 0, code-path constant 3 module 상수 bump, version_registry 신규 entry 0, NO VLM. test_c8_area7_residual_hygiene.py G-test 53 PASS. OQ-PLAN-1 location_consistency line 18 + lines 41-57 example block = boundary-reviewed KEEP. OQ-PLAN-3 render_prompt_card role_hint_from_outfit = G4.3 SOT reviewed KEEP, C8 closure claim 아님. Known carry (C8 scope 외): shot_schema.json OpenAI strict 위반 (C10/dedicated SchemaStrict) / prompt_service.replace_entity_ids camera-angle prefix strip pre-existing failure (C8 무관 out-of-scope) / outlook_extractor.py:44 docstring 작품 고유명사 (audit 25-site 미열거 out-of-scope). spec/plan = docs/superpowers/specs|plans/2026-05-20-c8-area7-residual-hygiene-v1-*.md. 잔여 = C10.

Sub-area (a) — entity / outlook / location scenario leak (8 site)

site본질grade
entity_all/5.../prop.md:21,25수트/우주복/갑옷/제복 + 피/물/불/연기/안개 (제외 기준)P2
entity_extract_v4/8.../prop.md:22수트/우주복/갑옷 동일 list (live module entity_extractor_v4.py:9 _MODULE = "entity_extract_v4")P2
entity_filter/2.../system.md:12-13수트/우주복/갑옷/벽면 모니터/TV/CCTV closed listP1
entity_extractor_v2/10.../turn2.md:10-1120대→60대 + 군복/정장/일상복 + 부상/결박/사망 상태P2
outlook_extractor/12.../phase2.md변신/갑옷 착용/피의갑옷P2
outlook_extractor/12.../phase3.md고급선비복1 vs 고급선비복2P2
location_consistency/2.../system.md:23-37절대 포함 금지 closed list (날씨/시간/조명/대기/감정/순간적 상태)P1
location_consistency/2.../system.md:43-57apartment wallpaper / utility pole / 한옥 specific examplesP2

Sub-area (c) — shot_extract leftover (Area #9 boundary 명시, 7 site)

site본질grade#9 boundary
shot_extract/12.../user.md:63한국인 경찰 / 동양인 노파P2#9 scope 외
shot_extract/12.../system.md:35인종/국적 반드시 포함 (인간형/외계인/귀신/돌연변이)P2#9 scope 외
shot_extract/12.../system.md:42-50나이 변화 / 부상 / 얼룩 / 창백해짐P1#9 scope 외
shot_essence_extraction/3.../system.md:13혈흔 / 깨진 유리 / 부상 흔적 (사건 영구 흔적)P2-
shot_essence_extraction/3.../system.md:44-66거실 바닥에 엎어진 + 인형 백팩P2-
shot_selection/4.../system.md:54-65연결 순간 단독 선택 금지 closed list (이동/추격/교통/작업)P1-
scene_extractor_v2/20.../system.md:47<몽타주> marker semantic_string_judgmentP1-

Sub-area (d) — t2i_visual_converter / background 작품 고유명사 (4 site)

site본질grade
t2i_visual_converter/v4/system.md:46-49지하 극저온 저장 시설 / 투명 원통형 캡슐 (콘티형 예시)P2
background_chain_render/2.../system.md:11-43wall finish / floor / ceiling / lighting palette mandatory closedP1
background_master_plan/3.../system.md:74-79bg_large_mart L09/L10/L14 specific exampleP2
floor_plan_prompt/4.../system.md:16ondol-friendly bed (한식 가구) — #8 scope 외, 가구 표현 영역P2

Code carry (production, 7 site)

site본질grade
scene_consistency_step.py:317-319, 422-427, 452, 579-582P020 — analysis_summary backward-compat shim (startswith("분석 실패") / "분석 차단") — 5 hitP2
render_prompt_card.py:584P025 — low / hip-height / overhead / ground level / quay level / floor level 카메라 proseP2
render_prompt_card.py:142-163 + 1068-1070P026 — _ID_ETHNICITY_COMPONENTS + _ID_AGE_BANDS constants @ :142, :156 + consume site @ :1068-1070P2
entity_steps.py:453-461P028 — 인물(character) 다른 타입과 중복 proseP2
outlook_dedup.py:136-145P054 — 검은정장1 vs 검은정장2P2
scene_validator.py:144P059 — 동녘(강의원) 원격 조종 proseP2
reference_image_generator.py:61-98P070 — 포박 상태 / 현대 한국 / 근미래 한국 mappingP2

수정 방법 (sub-area split 권장)

  1. Sub-area (a) 진입 — entity/outlook/location scenario leak (8 prompt site). 작품 고유명사 (이무기/구미호/조선시대/한옥/뱀파이어) 폐기 → generic example or pure principle.
  2. Sub-area (c) 진입 — shot_extract leftover. Area #9 closure 후 진입 (boundary 명시 의무, 중복 closure claim 금지).
  3. Sub-area (d) 진입 — t2i_visual_converter / background 작품 고유명사. 콘티형 예시 추상화 + bg_large_mart specific example → generic.
  4. Code carry 통합 — 7 code site (P020/P025/P026/P028/P054/P059/P070) sub-area별 흡수 또는 별도 wave.

Risk

광범위 prompt rewrite — version bump 다수 + DB row override / file fallback 의무 4-point sync. 또한 Area #8/#9 와 overlap row 중복 closure claim 금지.

C10 Future Carry Structured (P021/A099/A100-structured) #

Carry-P021/A099/A100 v1 closure (producer prompt-pack abstraction) 후의 deferred field-shape migration. future / superseded by agentic editing direction — 즉시 진입 대상 아님.

Tier δ #10 future · superseded by agentic editing direction

현재 상태

Carryv1 closed (producer abstraction)Future structured (deferred)
Carry-P021-structured prompts/_base/scene_consistency/8.202605191744/ v8 prompt-pack (hard-prime examples abstracted) scene_consistency carrier type:string → field-shape migration (structured emit)
Carry-A099-structured VWR system.md director_notes prose hard-prime examples abstracted director_notes carrier → field-shape migration
Carry-A100-structured prompts/_base/visual_world_rules/9.202605191334/ v9 prompt-pack — t2i_context + rules_schema.json:40 description abstraction t2i_context + rules_schema.json carrier type:string → structured emit (carrier 보존)

현재 상태 (진입 조건 superseded)

future / superseded by agentic editing direction. C1-C9 9 영역 closure 는 달성됐으나, 이전 "9 영역 closure 후 진입" 조건은 superseded — C10 structured carries 는 즉시 진입 대상이 아니며 agentic editing direction 으로 대체. 향후 진입 시 structured emit / field-shape migration 의 producer/consumer 영향 분석 + dependency review 의무.