# Semantic String Debt Full Run Triage

Generated from `full_20260516_0105` after reading snippets for production app and latest-dir prompt findings.

## Run Integrity

- Full run: 864/864 chunks completed, 0 failures.
- Raw findings: 632.
- Experimental scope excluded from primary report: `backend/experiments/**`, `backend/scripts/experiment_*`.
- Old prompt versions separated from latest-dir prompts: old prompt findings are archive residue, not primary runtime findings.

## Scope Counts

- Production app findings reviewed: 94.
- Latest-dir prompt findings reviewed: 100.
- Old prompt findings separated: 349.
- Excluded experiments findings separated: 61.
- Support script/canary findings separated: 28.

## Production App Triage Counts

- CONFIRMED: 58
- LOW_SCHEMA_OR_CONTRACT: 26
- FP_OR_ALLOWED: 8
- LEGACY_OR_ORPHAN: 2
- UNCLASSIFIED: 0

## Latest-Dir Prompt Triage Counts

- CONFIRMED: 78
- LOW_SCHEMA_OR_CONTRACT: 20
- FP_OR_ALLOWED: 0
- LEGACY_OR_ORPHAN: 2
- UNCLASSIFIED: 0

## Must-Hit Verification

- HIT: visible_entities_validator `_FACE_CLOSE_UP_PATTERNS` and `body_part_focus_rule.trigger_phrases`.
- HIT: scene_consistency `_ELEMENT_ID_CLOSE_REGEX` / `_DESCRIPTION_CLOSE_KEYWORDS`.
- HIT: shot_visibility gaze/offscreen lexicons and drift detectors.
- HIT: ref_contract_validator `classify_from_the_reference` phantom guard.
- HIT: render_prompt_card body-part trigger + fixed_elements substitution contract.
- HIT: t2i_review target/suggestion blind mutation contract.
- HIT: semantic_contract_router `IMMOBILIZED_GAZE` / `gaze_target` overload.
- HIT: scene_reference_service prompt regex/ref rewrite/gaze overload sites.

## Priority Root Areas

1. ID / body-part / face-focus policy: `visible_entities_validator`, `scene_detail`, `render_prompt_card`, `t2i_review`.
2. Prompt/prose mutation contracts: `_rewrite_t2i_helper`, `t2i_review target/suggestion`, T2I marker conversion, exact substring split anchors.
3. Visibility / physical-presence routing: `shot_visibility`, `scene_extractor_v2`, `visual_world_rules`, `scene_detail visible_entities`.
4. Reference phrase and phantom guard: `ref_contract_validator`, `scene_reference_service`, `scene_image translate_prompt`.
5. State/gaze overload: `gaze_target` carrying dead/unconscious/severely_injured across router/reference/asset readiness/image steps.
6. Background chain/classification open-world routing: skip_chain, background node split, indoor/outdoor and space-key vocab.
7. Scenario-polluted active prompts: scene generator genre bans, Korean/era examples, concrete mart/apartment/storage-facility examples, domain trope examples.

## Production App Rows

| ID | Verdict | Sev | Location | Category | Evidence |
|---|---|---|---|---|---|
| P001 | CONFIRMED | P1 | `backend/app/core/asset_readiness.py:435-440` | semantic_string_judgment | gaze = ca.get("gaze_target", "") ... if gaze in ("dead", "severely_injured", "unconscious") |
| P002 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/core/bg_state_vocab.py:26-56` | schema_or_enum_drift | STATE_CLASS_ENUM, validate_state_class |
| P003 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/core/bg_state_vocab.py:128-201` | schema_or_enum_drift | LOCATION_SPACE_KEY_VOCAB, validate_location_space_profile |
| P004 | FP_OR_ALLOWED | P1 | `backend/app/api/v1/images.py:107-115` | semantic_string_judgment | prompt_used contains 'outlook_id:{outlook_id}' |
| P005 | LOW_SCHEMA_OR_CONTRACT | P1 | `backend/app/core/name_matcher.py:51-161` | semantic_string_judgment | _BRACKET_PATTERN and lookup_name logic |
| P006 | CONFIRMED | P1 | `backend/app/core/ref_contract_validator.py:49-457` | semantic_string_judgment | _CHARACTER_TOKENS, _GENERIC_VERB_TOKENS, classify_from_the_reference, and validate_attached_refs |
| P007 | LEGACY_OR_ORPHAN | P2 | `backend/app/core/steps/analysis_steps_legacy.py:810-817` | scenario_dependent_prompt | 인물: 자기 물리적 몸으로 존재하는 인물만. 대사를 하더라도 빙의/원격접속 중이면 제외... 앞쪽 씬에서 인물A가 인물B의 몸에 접속/빙의/라이드했다면... |
| P008 | LEGACY_OR_ORPHAN | P1 | `backend/app/core/steps/analysis_steps_legacy.py:852-863` | semantic_string_judgment | clean = raw_id.replace("CHAR_", "").replace("BG_", "").replace("PROP_", "") ... if clean in name_to_uuid: |
| P009 | LOW_SCHEMA_OR_CONTRACT | P1 | `backend/app/core/steps/beat_shot_steps.py:110-326` | scenario_dependent_code | if r.get("rule_type") in ("possession", "projection", "ghost") and [물리적 존재 판단 기준] |
| P010 | CONFIRMED | P1 | `backend/app/api/v1/entities.py:433-477` | semantic_string_judgment | _re.finditer(r'\[\[([^\]]+)\]\+\[([^\]]+)\]\]', t2i_text) ... lookup_name(_char_name_idx, c_name) |
| P011 | CONFIRMED | P1 | `backend/app/core/steps/location_consistency_step.py:104-105` | semantic_string_judgment | if name in heading: scenes_by_location[sid].append(si) |
| P012 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/core/steps/location_consistency_step.py:179-179` | schema_or_enum_drift | if summary.startswith("실패"): |
| P013 | CONFIRMED | P1 | `backend/app/core/steps/image_steps.py:665-666` | semantic_string_judgment | gaze = ca.get("gaze_target", "") ... if gaze in self.STATE_DESCRIPTIONS: |
| P014 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/core/steps/image_steps.py:638-642` | schema_or_enum_drift | STATE_DESCRIPTIONS = { "dead": "...", "severely_injured": "...", "unconscious": "..." } |
| P015 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/core/steps/image_steps.py:639-641` | scenario_dependent_prompt | "dead": "lying motionless, pale/ashen skin...", "severely_injured": "visible bruises and cuts..." |
| P016 | FP_OR_ALLOWED | P1 | `backend/app/core/steps/location_floor_plan_step.py:714-734` | semantic_string_judgment | _summarize_prompt using text.find(sep) with (". ", ".\n", "\n\n") and length check < 200 |
| P017 | LOW_SCHEMA_OR_CONTRACT | P1 | `backend/app/core/steps/scene_steps.py:110-144` | semantic_string_judgment | pattern.finditer(fulltext), avg_len < min_avg, and len(matches) >= threshold |
| P018 | FP_OR_ALLOWED | P2 | `backend/app/core/steps/scene_steps.py:131-131` | scenario_dependent_prompt | f"씬 내부의 장소 전환('- 장소명')이 아니라 씬 번호('숫자.') 패턴으로 분리해야 합니다." |
| P019 | CONFIRMED | P1 | `backend/app/core/steps/scene_consistency_step.py:65-180` | semantic_string_judgment | _ELEMENT_ID_CLOSE_REGEX, _DESCRIPTION_CLOSE_KEYWORDS, _classify_framing |
| P020 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/core/steps/scene_consistency_step.py:352-620` | semantic_string_judgment | summary.startswith("분석 실패"), summary.startswith("분석 차단") |
| P021 | CONFIRMED | P2 | `backend/app/core/steps/scene_consistency_step.py:749-751` | scenario_dependent_prompt | "사망/부상/의식불명", "깨진 창문, 열린 문, 혈흔" |
| P022 | CONFIRMED | P1 | `backend/app/core/steps/render_prompt_card.py:1494-1498` | blind_string_mutation | "substitution": "replace the common-noun person reference inside fixed_elements[i].description ... with the matched C## or C##O##" |
| P023 | CONFIRMED | P2 | `backend/app/core/steps/render_prompt_card.py:1187-1191` | llm_closed_list_instruction | "triggered by 'focus on / close on / tight on / detail on' phrasing" |
| P024 | CONFIRMED | P2 | `backend/app/core/steps/render_prompt_card.py:1326-1334` | llm_closed_list_instruction | "do not use any of: 'the existing X', 'from the reference', 'use the X from the reference', ..." |
| P025 | CONFIRMED | P2 | `backend/app/core/steps/render_prompt_card.py:584-584` | scenario_dependent_prompt | "(low / hip-height / overhead / ground level / quay level / floor level / from above)" |
| P026 | CONFIRMED | P2 | `backend/app/core/steps/render_prompt_card.py:1138-1140` | llm_closed_list_instruction | "ethnicity": list(_ID_ETHNICITY_COMPONENTS), "age_band": list(_ID_AGE_BANDS) |
| P027 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/core/steps/director_steps.py:126-127` | schema_or_enum_drift | if r.get("rule_type") in ("possession", "projection", "ghost") |
| P028 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/core/steps/entity_steps.py:453-461` | llm_closed_list_instruction | 인물(character)은 다른 타입과 중복될 가능성이 거의 없으니 주로 배경/소품 간 중복을 확인하세요. |
| P029 | LOW_SCHEMA_OR_CONTRACT | P1 | `backend/app/core/steps/entity_steps.py:796-811` | schema_or_enum_drift | validate_entity_metadata_shape(etype, md, short_id=name_to_sid.get(ename, "") or ename) |
| P030 | CONFIRMED | P1 | `backend/app/core/steps/shot_dependency_step.py:141-142` | semantic_string_judgment | if prev["location"] != cur_loc: continue |
| P031 | CONFIRMED | P1 | `backend/app/core/steps/detail_steps.py:251-310` | semantic_string_judgment | _OUTLOOK_COMPOSITE_RE = re.compile(r'(C\d{2,3})(O\d{2,3})') and _STATE_VARIANT_GAZE_VALUES = ("unconscious", "dead", "severely_injured") |
| P032 | CONFIRMED | P1 | `backend/app/core/steps/detail_steps.py:1939-1967` | semantic_string_judgment | _base_name = re.split(r'\s*[\(（]', name)[0].strip() |
| P033 | CONFIRMED | P1 | `backend/app/core/steps/detail_steps.py:2865-2870` | blind_string_mutation | re.sub(r"focus on\s+'s", "focus on the figure's", prompt) |
| P034 | CONFIRMED | P2 | `backend/app/core/steps/detail_steps.py:2286-2291` | llm_closed_list_instruction | 긴장=어둡고 대비 강한, 슬픔=탈색/청색, 분노=적색 등 |
| P035 | CONFIRMED | P1 | `backend/app/core/visible_entities_validator.py:139-161` | semantic_string_judgment | _FACE_CLOSE_UP_PATTERNS and _is_face_close_up(prompt) |
| P036 | CONFIRMED | P1 | `backend/app/core/visible_entities_validator.py:212-231` | semantic_string_judgment | t.lower() in prompt_lower where t is from body_part_focus_rule.trigger_phrases |
| P037 | CONFIRMED | P1 | `backend/app/core/visible_entities_validator.py:102-128` | semantic_string_judgment | _entity_specific_id_in_window using _ANCHOR_WINDOW = 60 |
| P038 | CONFIRMED | P1 | `backend/app/modules/name_matcher.py:8-51` | semantic_string_judgment | _PAREN_RE, match_shot_char, and its use in filter_ve_by_shot_chars (line 49) |
| P039 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/models/project.py:34-199` | schema_or_enum_drift | entity_type (line 34), variation_a_type (line 110), scene_type (line 127), asset_type (line 166), status (line 175), sanitization_strategy (line 179), prompt_type (line 187), variant_label (line 199) |
| P040 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/models/project.py:193-297` | schema_or_enum_drift | reference_image_ids (line 193) vs reference_image_ids (line 297) |
| P041 | CONFIRMED | P1 | `backend/app/modules/llm/safety.py:26-89` | blind_string_mutation | _SAFETY_REPLACEMENTS_KO, _SAFETY_REPLACEMENTS_EN, sanitize_for_safety |
| P042 | CONFIRMED | P2 | `backend/app/modules/llm/safety.py:94-102` | scenario_dependent_prompt | SAFETY_SYSTEM_SUFFIX |
| P043 | CONFIRMED | P1 | `backend/app/modules/pipeline/background_chain_planning.py:151-154` | semantic_string_judgment | if len(ename) >= 2 and (loc_raw in ename or ename in loc_raw): loc_id = esid |
| P044 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/pipeline/background_classify.py:147-168` | schema_or_enum_drift | kind not in {"chain_bg", "prev_shot_ref"} |
| P045 | CONFIRMED | P1 | `backend/app/modules/pipeline/entity_filter.py:71-83` | semantic_string_judgment | re.sub(r'^[CLP]\d{2,3}\s*', '', raw_name).strip() |
| P046 | FP_OR_ALLOWED | P1 | `backend/app/modules/pipeline/entity_extractor_v2_legacy.py:193-196` | semantic_string_judgment | e.get("importance") == "none" and int(e.get("appearances", 0)) < 2 |
| P047 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/pipeline/entity_extractor_v2_legacy.py:72-72` | schema_or_enum_drift | "entity_type": {"type": "string", "description": "character|location|prop"} |
| P048 | CONFIRMED | P1 | `backend/app/modules/pipeline/entity_relation.py:15-50` | semantic_string_judgment | bn = base_name(name) ... members.sort(key=lambda x: (len(x[0]), x[0])) |
| P049 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/pipeline/entity_extractor_v3.py:84-169` | schema_or_enum_drift | ENTITY_DETAIL_SCHEMA, metadata_json, entity_type |
| P050 | CONFIRMED | P1 | `backend/app/modules/pipeline/entity_lister.py:199-371` | blind_string_mutation | type_prompt.replace("scene_count", "shot_count") and _patch_schema_shot_count(schema) |
| P051 | CONFIRMED | P1 | `backend/app/modules/pipeline/outlook_merger.py:97-105` | blind_string_mutation | t2i.replace(f"[{old_name}]", f"[{new_name}]") |
| P052 | CONFIRMED | P1 | `backend/app/modules/pipeline/outlook_dedup.py:72-83` | blind_string_mutation | re.sub(r'C\d{2,3}O\d{2,3}', _replace_sid, text) ... re.sub(r'\s{2,}', ' ', result) |
| P053 | CONFIRMED | P1 | `backend/app/modules/pipeline/outlook_dedup.py:288-300` | blind_string_mutation | t2i_v.replace(remove_marker, keep_marker) |
| P054 | CONFIRMED | P2 | `backend/app/modules/pipeline/outlook_dedup.py:136-145` | scenario_dependent_prompt | "검은정장1"과 "검은정장2"는 다를 수 있음 |
| P055 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/pipeline/ref_image_pipeline.py:66-337` | schema_or_enum_drift | _VALIDATION_SCHEMA, _COMPARISON_SCHEMA, validation.get('severity') == 'severe', comparison.get('winner') |
| P056 | CONFIRMED | P1 | `backend/app/modules/pipeline/shot_director.py:182-199` | semantic_string_judgment | detect_gaze_pattern_exclusions(desc, name_to_char_id) |
| P057 | CONFIRMED | P1 | `backend/app/modules/pipeline/background_render.py:148-150` | semantic_string_judgment | if not sanitized.lstrip().startswith("BACKGROUND-ONLY"): sanitized = _BACKGROUND_ONLY_REINFORCEMENT + sanitized |
| P058 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/pipeline/scene_image_pipeline.py:36-522` | schema_or_enum_drift | _SCENE_VALIDATION_SCHEMA (severity), _COMPARISON_SCHEMA (winner), _IMPROVEMENT_SCHEMA (type) |
| P059 | CONFIRMED | P2 | `backend/app/modules/pipeline/scene_validator.py:144-144` | scenario_dependent_prompt | "동녘(강의원)" 같은 표현 → 동녘의 몸만 있고, 강의원은 원격에서 조종 중이므로 강의원은 false |
| P060 | CONFIRMED | P1 | `backend/app/modules/pipeline/scene_validator.py:222-236` | blind_string_mutation | _clean_prompt using re.sub with escaped name and sid patterns |
| P061 | CONFIRMED | P1 | `backend/app/modules/pipeline/background_chain_render.py:57-61` | blind_string_mutation | _BACKGROUND_ONLY_REINFORCEMENT = "BACKGROUND-ONLY architectural still — empty space, NO people, NO faces..." |
| P062 | CONFIRMED | P2 | `backend/app/modules/pipeline/background_chain_render.py:89-92` | scenario_dependent_prompt | Thoroughly describe wall/floor/ceiling/lighting/palette since later children inherit from this rendered photo. |
| P063 | CONFIRMED | P1 | `backend/app/modules/pipeline/shot_visibility.py:37-445` | semantic_string_judgment | _KOREAN_GAZE_STEMS, _KOREAN_FRAMING_NOUNS, _BODY_PART_NOUNS, _OFFSCREEN_PHRASES, detect_gaze_pattern_exclusions, detect_offscreen_drift |
| P064 | FP_OR_ALLOWED | P2 | `backend/app/modules/pipeline/text_cleaner.py:31-31` | scenario_dependent_prompt | 예: "네메\\n시스" → "네메시스" |
| P065 | CONFIRMED | P1 | `backend/app/modules/pipeline/t2i_review.py:383-454` | blind_string_mutation | old.replace(target, suggestion) and old_prompt.replace(target, suggestion) |
| P066 | CONFIRMED | P1 | `backend/app/modules/semantic_contract_router.py:22-107` | semantic_string_judgment | IMMOBILIZED_GAZE = frozenset({"dead", "unconscious", "severely_injured"}) ... gaze = entry.get("gaze_target") ... if gaze not in IMMOBILIZED_GAZE |
| P067 | CONFIRMED | P1 | `backend/app/modules/scene_still_extractor_legacy.py:19-192` | semantic_string_judgment | HEADING_PREFIXES = ("INT.", "EXT.", "INT/EXT.", "I/E.") ... if upper.startswith(prefix) and len(stripped) <= HEADING_MAX_LEN |
| P068 | CONFIRMED | P1 | `backend/app/modules/prompt_sanitizer.py:228-230` | blind_string_mutation | if not sanitized.startswith(strategy["prefix"].strip()[:40]): |
| P069 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/prompt_sanitizer.py:67-106` | schema_or_enum_drift | _STATE_GUIDANCE and the loop over preserve_pose, preserve_subject_state, etc. |
| P070 | CONFIRMED | P2 | `backend/app/modules/reference_image_generator.py:61-98` | scenario_dependent_prompt | mapping = { "character": [ ..., "포박 상태", "현대 한국/근미래 한국 기준의 현실적 기본 복장", ... ] } |
| P071 | CONFIRMED | P1 | `backend/app/modules/t2i_visual_converter.py:128-133` | blind_string_mutation | ## [마커] 규칙 — 반드시 준수... 1. 각 씬 아래의 '★ 엔티티 목록'에 있는 이름만 [이름] 마커 사용 가능... 3. [이름]은 목록의 이름을 공백 포함 정확히 복사... 4. [] 마커는 참조 이미지 치환용이므로 목록 외 사용 시 시스템 오류 발생 |
| P072 | FP_OR_ALLOWED | P2 | `backend/app/modules/scene_image_generator.py:62-63` | blind_string_mutation | world_summary = world_summary[:200].rsplit(".", 1)[0] + "." |
| P073 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/scene_image_generator.py:89-97` | schema_or_enum_drift | traits_data.get("visual_anchor_traits", []) |
| P074 | FP_OR_ALLOWED | P2 | `backend/app/modules/scene_image_generator.py:301-303` | scenario_dependent_prompt | Keep exact face, hair, and build from this image. |
| P075 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/variation_recommender.py:14-88` | schema_or_enum_drift | _RESPONSE_SCHEMA |
| P076 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/modules/variation_recommender_v2.py:24-66` | schema_or_enum_drift | type: { "type": "string", "description": "angle | color | angle+color | none" }, recommended: {"type": "string"} |
| P077 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/schemas/image.py:28-84` | schema_or_enum_drift | variant_type (line 28), prompt_type (line 33), status (line 84) |
| P078 | CONFIRMED | P1 | `backend/app/modules/pipeline/scene_extractor_v2.py:330-330` | semantic_string_judgment | pos = fulltext.find(start_text, search_from) |
| P079 | CONFIRMED | P1 | `backend/app/modules/pipeline/scene_extractor_v2.py:450-451` | semantic_string_judgment | if split_text in scene_text: split_pos = scene_text.index(split_text) |
| P080 | CONFIRMED | P1 | `backend/app/modules/pipeline/scene_extractor_v2.py:817-822` | blind_string_mutation | if marker not in current_t2i ... var["t2i_prompt"] = current_t2i.rstrip() + " " + suffix |
| P081 | CONFIRMED | P1 | `backend/app/services/checkpoint_sync/scene_still_normalizer.py:69-76` | semantic_string_judgment | used = set(_BARE_ID_RE.findall(text)); ... return [sid for sid in director_ve if sid in used] |
| P082 | FP_OR_ALLOWED | P1 | `backend/app/services/checkpoint_sync/outlook_sync_service.py:233-238` | semantic_string_judgment | csid_raw.split("O")[0] if "O" in csid_raw and csid_raw.startswith("C") |
| P083 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/services/checkpoint_sync/outlook_sync_service.py:73-231` | schema_or_enum_drift | ol.get("outlook_id") or ol.get("short_id", ""); sa.get("assignments", sa.get("characters", [])) |
| P084 | CONFIRMED | P1 | `backend/app/services/prompt_service.py:75-116` | semantic_string_judgment | _classify_label uses substring checks like 'previous shot', 'same room', 'wearing', 'outfit', 'prop', 'background' |
| P085 | CONFIRMED | P1 | `backend/app/services/prompt_service.py:235-239` | semantic_string_judgment | if sid in label: return idx |
| P086 | CONFIRMED | P1 | `backend/app/services/prompt_service.py:296-301` | blind_string_mutation | re.sub(r"In a (low angle|dutch angle|high angle|bird eye|wide|tracking|over the shoulder)\s*(frame|composition|shot|view)\s*", "", cleaned) |
| P087 | CONFIRMED | P2 | `backend/app/services/prompt_service.py:368-369` | scenario_dependent_prompt | "'from the reference', 'from Reference image N' 같은 표현은 절대 새로 만들지 마세요 (phantom guard 충돌)." |
| P088 | CONFIRMED | P2 | `backend/app/services/prompt_service.py:417-417` | blind_string_mutation | cleaned.replace('Photorealistic cinematic still.', '').strip() |
| P089 | CONFIRMED | P1 | `backend/app/services/scene_reference_service.py:367-478` | semantic_string_judgment | _re.finditer(r'(C\d{2,3})(O\d{2,3})', t2i_prompt), _re.finditer(r'\[\[([^\]]+)\]\+\[([^\]]+)\]\]', t2i_prompt) |
| P090 | CONFIRMED | P1 | `backend/app/services/scene_reference_service.py:111-130` | blind_string_mutation | rewritten = _re.sub(pattern, replacement, rewritten) |
| P091 | CONFIRMED | P1 | `backend/app/services/scene_reference_service.py:932-988` | semantic_string_judgment | ca.get("gaze_target", "") in ("unconscious", "dead", "severely_injured") |
| P092 | CONFIRMED | P2 | `backend/app/services/scene_reference_service.py:65-88` | semantic_string_judgment | _re.search(r'character\s+(C\d{2,3}(?:O\d{2,3})?)', label) |
| P093 | LOW_SCHEMA_OR_CONTRACT | P2 | `backend/app/services/scene_variation_service.py:280-467` | schema_or_enum_drift | var_type == "angle" / "color" / "angle+color" |
| P094 | CONFIRMED | P1 | `backend/app/services/scene_generation_coordinator.py:718-719` | blind_string_mutation | if shot_name and shot_name.lower() not in var_t2i.lower(): var_t2i = f"[Camera: {shot_name}] {var_t2i}" |

## Latest-Dir Prompt Rows

| ID | Verdict | Sev | Location | Category | Evidence |
|---|---|---|---|---|---|
| A001 | CONFIRMED | P2 | `prompts/_base/background_chain_planning/4.202604291315/schema.json:5-7` | llm_closed_list_instruction | true if this location is OUTDOOR/OPEN-AIR (street, road, coast, sea, forest, yard, park, exterior rooftop, public square, beach, dock, vehicle exterior, etc.) |
| A002 | CONFIRMED | P2 | `prompts/_base/background_chain_planning/4.202604291315/user_template.md:14-21` | llm_closed_list_instruction | If SKIP applies (outdoor / open-air) ... Otherwise (indoor / enclosed / fixed-set) |
| A003 | CONFIRMED | P1 | `prompts/_base/background_chain_planning/4.202604291315/system.md:21-25` | llm_closed_list_instruction | INDOOR / ENCLOSED / FIXED-SET... vs DETACHED OPEN AREA... (a road far from any building, an unrelated forest, a wide beach, a public street block, a mountain trail, a public square not attached to a tracked building) |
| A004 | CONFIRMED | P1 | `prompts/_base/background_chain_planning/4.202604291315/system.md:45-51` | llm_closed_list_instruction | Close-ups, prop inserts, hand-scale plates... vs different room state (clean / lived-in / disturbed / heavily-ransacked) |
| A005 | CONFIRMED | P1 | `prompts/_base/background_classify/3.202604300520/system.md:18-20` | llm_closed_list_instruction | Korean clues that often imply indoor: 내부 / 안 / 방 / 실 / 층 / 차내 / 매장 안 / 사무실 ... Korean clues: 외부 / 옥상 / 거리 / 도로 / 공터 / 골목 / 해안 / 숲 / 마당 |
| A006 | CONFIRMED | P1 | `prompts/_base/background_chain_render/2.202604282201/system.md:11-43` | scenario_dependent_prompt | Photoreal architectural still — empty room/space, Same room/space, wall finish, floor, ceiling, TV is in the upper-left, sofa cluster |
| A007 | CONFIRMED | P1 | `prompts/_base/background_chain_render/2.202604282201/system.md:44-44` | blind_string_mutation | t2i prompt에 직접 prepend되므로 영어. |
| A008 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/background_master_plan/3.202605092023/system.md:41-45` | llm_closed_list_instruction | state_class enum (정확히 한 값. 그 외는 reject): `normal` / `quiet` / `busy` / `busy_exit` / `ransacked` / `clean_after` / `blood_scene` / `intrusion` / `arrival` / `evidence_display` / `dream_or_vision_state` |
| A009 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/background_master_plan/3.202605092023/system.md:86-90` | llm_closed_list_instruction | space_key_hint: controlled vocab ... 모르는 공간은 `main` 으로 fallback. |
| A010 | CONFIRMED | P2 | `prompts/_base/background_master_plan/3.202605092023/system.md:74-79` | scenario_dependent_prompt | Example (group `bg_large_mart` covers L09 외부 + L10 매장 + L14 사무실): ... fp_sales_floor ... fp_exterior_entrance |
| A011 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/character_state_variant/1.202604101200/system.md:12-12` | scenario_dependent_prompt | skin pallor, posture, wounds/blood as appropriate for the state |
| A012 | CONFIRMED | P2 | `prompts/_base/background_prompt/6.202605091200/system.md:15-15` | blind_string_mutation | Convert numbered references (e.g., "number 2 (wardrobe)") into descriptive phrases using the input numbered_elements mapping |
| A013 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/background_prompt/6.202605091200/system.md:20-20` | schema_or_enum_drift | objects_owned_by_background ... items MUST be English canonical common nouns ... 이 list 는 scene_detail 이 같은 객체를 다시 그리지 않도록 contract 역할을 한다. |
| A014 | CONFIRMED | P2 | `prompts/_base/entity_all/4.202603310100/character.md:30-30` | scenario_dependent_prompt | (이무기, 구미호, 요괴화, 뱀파이어 등) |
| A015 | CONFIRMED | P2 | `prompts/_base/entity_all/4.202603310100/prop.md:21-28` | llm_closed_list_instruction | 제외 기준 (중요!) ... 수트, 우주복, 갑옷 ... 피, 물, 불 ... 자동차, 트럭 ... 의자, 탁자 ... |
| A016 | CONFIRMED | P2 | `prompts/_base/entity_extract_v4/8.202603290500/prop.md:22-26` | llm_closed_list_instruction | 수트, 우주복, 갑옷, 제복, 의상, 입는 장치나 로봇 / 벽면 모니터, TV, CCTV / 문, 창문, 계단, 엘리베이터 / 상태창, 모니터 화면, HUD / 피, 물, 불, 연기, 안개 |
| A017 | LEGACY_OR_ORPHAN | P2 | `prompts/_base/entity_extraction/v7/chunk_user.md:4-4` | llm_closed_list_instruction | identity, transformation, possession, containment only. Exclude kinship, social, conflict, collaboration, membership, control, goal, and event relations. |
| A018 | LEGACY_OR_ORPHAN | P2 | `prompts/_base/entity_extraction/v7/chunk_system.md:16-24` | scenario_dependent_prompt | (예: 아머 유닛, 가면, 무기류 등) ... (예: 은성<->ZRBB51) |
| A019 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/entity_extraction/v7/chunk_system.md:78-79` | llm_closed_list_instruction | Only extract: identity (same person/different name), transformation (appearance change — age, disguise, injury), possession (character carries/wears item), containment (entity is inside/part of location). |
| A020 | CONFIRMED | P1 | `prompts/_base/entity_extractor_v2/9.202605130226/system.md:97-101` | llm_closed_list_instruction | allowed_space_keys 는 controlled vocab 안에서 선택: main / kitchen / rooftop / stairs / yard / exterior / office. ... 위 controlled vocab 밖 단어 사용 절대 금지. |
| A021 | CONFIRMED | P1 | `prompts/_base/entity_extractor_v2/9.202605130226/turn0_style.md:11-15` | llm_closed_list_instruction | visual_world_rules: "이 인물이 이 장소에 물리적으로 존재하는가?" ... 원격 접속/조종/빙의/텔레파시 ... 몽타주/교차편집 |
| A022 | CONFIRMED | P2 | `prompts/_base/entity_extractor_v2/9.202605130226/turn0_style.md:17-23` | scenario_dependent_prompt | 조선시대, 한국 서울, 현대 한국 도시 + 미래 연구시설, 조선시대 한옥, 현대복 + 군복 + 미래 전투복 |
| A023 | CONFIRMED | P2 | `prompts/_base/entity_extractor_v2/9.202605130226/turn2.md:10-11` | llm_closed_list_instruction | 허용: 20대→60대... 금지: 의상만 바뀌는 경우(군복/정장/일상복...), 부상/결박/사망 상태 |
| A024 | CONFIRMED | P1 | `prompts/_base/entity_filter/2.202603241900/system.md:12-13` | llm_closed_list_instruction | 수트, 우주복, 갑옷, 제복 ... 벽면 모니터, TV, CCTV |
| A025 | CONFIRMED | P1 | `prompts/_base/location_consistency/2.202604201230/system.md:11-34` | blind_string_mutation | 이 문장은 나중에 scene_detail이 t2i_prompt에 그대로 삽입하므로 ... 영어로 작성 (T2I 프롬프트에 직접 삽입) |
| A026 | CONFIRMED | P1 | `prompts/_base/location_consistency/2.202604201230/system.md:23-83` | llm_closed_list_instruction | 절대 포함 금지 — 환경 상태는 씬마다 달라짐 ... 이 문장에 날씨·조명·인물이 섞여 있는가? — YES라면 그 부분만 삭제 |
| A027 | CONFIRMED | P2 | `prompts/_base/location_consistency/2.202604201230/system.md:43-57` | scenario_dependent_prompt | A compact one-room apartment with faded wallpaper and a worn linoleum floor ... utility pole wrapped with tangled wires |
| A028 | CONFIRMED | P2 | `prompts/_base/lvm_prompts/2.202603181600/style_rules_generator.md:5-9` | scenario_dependent_prompt | 조선시대, 한국/일본/미국, 한옥, 한복 |
| A029 | CONFIRMED | P2 | `prompts/_base/outlook_extractor/11.202603311724/phase2.md:12-13` | scenario_dependent_prompt | 변신, 갑옷 착용, 피의갑옷 |
| A030 | CONFIRMED | P2 | `prompts/_base/outlook_extractor/11.202603311724/phase3.md:6-6` | scenario_dependent_prompt | "고급선비복1"과 "고급선비복2" |
| A031 | CONFIRMED | P1 | `prompts/_base/floor_plan_prompt/4.202605091200/system.md:10-13` | llm_closed_list_instruction | living = pale yellow, bedroom = pale blue, kitchen = pale green, bathroom = pale cyan, rooftop = pale gray, hallway = pale beige... bed = rectangle with pillow shape; sofa = long rectangle with cushion division; table =  |
| A032 | CONFIRMED | P2 | `prompts/_base/floor_plan_prompt/4.202605091200/system.md:16-16` | scenario_dependent_prompt | low ondol-friendly bed vs western mattress; wall-mounted air-con position; built-in wardrobe on a specific wall |
| A033 | CONFIRMED | P1 | `prompts/_base/location_floor_plan/3.202604291130/system.md:22-25` | llm_closed_list_instruction | Cues to look for: ... 거실/안방, 부엌/거실 ... 문을 열고 들어간다 ... 거실에서 안방으로 |
| A034 | CONFIRMED | P2 | `prompts/_base/location_floor_plan/3.202604291130/system.md:31-31` | scenario_dependent_prompt | 옥탑방 안 / 실내, 한옥 / 안방 / 마루 |
| A035 | CONFIRMED | P2 | `prompts/_base/ref_image_prompts/5.202603311724/prop_ref.md:3-3` | llm_closed_list_instruction | ONLY the relevant body part (ear, neck, wrist, face, hand, shoulder, torso) |
| A036 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/scene_camera_flow/1.202604151200/system.md:26-37` | llm_closed_list_instruction | flow_position: `start` / `mid` / `end` / `transition`, stage_label: establishing / approach / ..., camera_motion: `static` / ... / `cut` 중 하나 |
| A037 | CONFIRMED | P1 | `prompts/_base/scene_consistency/6.202605031033/system.md:30-35` | llm_closed_list_instruction | 전신형(full): ... 전신/상반신/미디엄 / 확대형(zoom): ... close-up / tight on / focus on body part / detail shot |
| A038 | CONFIRMED | P2 | `prompts/_base/scene_consistency/6.202605031033/system.md:41-41` | semantic_string_judgment | element_id에 _close_up 등 접미사 |
| A039 | CONFIRMED | P1 | `prompts/_base/scene_detail/24.202605151451/system.md:41-44` | semantic_string_judgment | body_part_focus_rule.trigger_phrases (focus on / close on / tight on / detail on + body part) |
| A040 | CONFIRMED | P1 | `prompts/_base/scene_detail/24.202605151451/system.md:119-119` | blind_string_mutation | fixed_elements[i].description 안 보통명사 인물 ... 이 ... 매핑이 id_policy 안에 존재 시 해당 보통명사를 C##/C##O## 로 치환 |
| A041 | CONFIRMED | P1 | `prompts/_base/scene_detail/24.202605151451/system.md:219-221` | semantic_string_judgment | stable_traits ... 'face fully obscured' / 'no visible facial features' ... face / jaw / feature 묘사 표현 금지 |
| A042 | CONFIRMED | P1 | `prompts/_base/scene_detail/24.202605151451/system.md:369-369` | semantic_string_judgment | running / riding / walking / moving / chasing / pedaling / rowing ... re-frame 가능 |
| A043 | CONFIRMED | P1 | `prompts/_base/scene_detail/24.202605151451/system.md:511-516` | semantic_string_judgment | entity_canon.name ... 같은 sentence + ±60 char window ... ID 가 ... 있어야 한다 |
| A044 | CONFIRMED | P1 | `prompts/_base/scene_detail_owned_judge/3.202605051746/system.md:7-7` | llm_closed_list_instruction | owned 어휘는 t2i_prompt 의 English token 과 정확히 매칭되어야 한다 (semantic gloss / 번역 매칭 금지) |
| A045 | CONFIRMED | P1 | `prompts/_base/scene_detail_owned_judge/3.202605051746/system.md:18-45` | llm_closed_list_instruction | redraw 동사 화이트리스트 (create, render, draw, generate, paint, build, furnish, add, place, put, insert, hang, mount, install, set up) and anchor_reference phrases (from the reference, from chain_bg, the existing X, leaning int |
| A046 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/scene_director/8.202604081200/analyze_schema.json:11-11` | schema_or_enum_drift | "scene_type": {"type": "string", "description": "normal | montage | flashback | dream | voiceover | transition | other"} |
| A047 | CONFIRMED | P2 | `prompts/_base/scene_director/8.202604081200/system.md:7-24` | llm_closed_list_instruction | 교차편집/몽타주... 영상통화, CCTV, 방송 화면, 홀로그램, VR, 원격 조종/빙의 기술... V.O.(보이스오버), 내레이션... 변장, 쌍둥이 교체, 바디더블... 회상/꿈/환상/상상... 유령... 빙의/원격접속 |
| A048 | CONFIRMED | P1 | `prompts/_base/scene_detail/24.202605151451/detail_schema.json:16-16` | semantic_string_judgment | 신체 부위 클로즈업, reproduction surface... 등 예외 구도에서는 보통명사로 대체 |
| A049 | CONFIRMED | P1 | `prompts/_base/scene_detail/24.202605151451/detail_schema.json:16-16` | blind_string_mutation | 합성 단계가 'the character from Image N'으로 자동 치환 |
| A050 | CONFIRMED | P1 | `prompts/_base/scene_extractor_v2/18.202605150955/system.md:47-47` | semantic_string_judgment | (<몽타주> 표시 또는 빠른 컷 전환) |
| A051 | CONFIRMED | P2 | `prompts/_base/scene_extractor_v2/18.202605150955/system.md:60-60` | scenario_dependent_prompt | rule_type=possession, remote_identity, visible_body |
| A052 | CONFIRMED | P1 | `prompts/_base/scene_extractor_v2/18.202605150955/turn1_split_long.md:8-11` | blind_string_mutation | split_after_line 규칙 (매우 중요): - 원문에서 정확히 복사한 한 줄이어야 함 (띄어쓰기, 문장부호 포함 100% 일치) |
| A053 | CONFIRMED | P1 | `prompts/_base/scene_extractor_v2/18.202605150955/turn_scene_detail.md:34-38` | semantic_string_judgment | 얼굴/형태 식별 불가 인물 — short_id 사용 금지: 실루엣, 그림자, 창문 반사, 역광, 안개 속 등으로 인물의 얼굴이나 신체 형태를 식별할 수 없는 경우 C##O## short_id를 사용하지 마세요. |
| A054 | CONFIRMED | P2 | `prompts/_base/scene_extractor_v2/18.202605150955/turn_scene_detail.md:91-92` | llm_closed_list_instruction | 카메라 구도 선택지: low angle / high angle / dutch angle / over-the-shoulder / bird's eye / extreme wide / tight medium 색감 선택지: warm amber / cold blue / high contrast / desaturated / golden hour / neon-lit / silhouette backlight |
| A055 | CONFIRMED | P1 | `prompts/_base/scene_extractor_v2/18.202605150955/turn_scene_detail.md:105-109` | semantic_string_judgment | visible_entities 주의사항: 이 씬의 화면에 물리적으로 존재하는 대상만 넣으세요 ... 예: "<container descriptor> 안의 인물들"이 <transport vehicle>에 타고 있다면 → container 는 transport vehicle 에 없으므로 제외 |
| A056 | CONFIRMED | P2 | `prompts/_base/scene_generator/v2/scene_rules_en.md:6-6` | scenario_dependent_prompt | No ... fantasy armor, or medieval architecture |
| A057 | CONFIRMED | P2 | `prompts/_base/scene_generator/v2/scene_rules_ko.md:6-6` | scenario_dependent_prompt | 사극풍 복식, 판타지 갑옷, 중세풍 건축 금지 |
| A058 | CONFIRMED | P1 | `prompts/_base/scene_image/3.202605101200/translate_prompt.md:23-26` | semantic_string_judgment | PHANTOM PHRASE PROHIBITION (strict): ... phrases trigger a downstream phantom-reference validator and will fail the render |
| A059 | CONFIRMED | P1 | `prompts/_base/shot_dependency_t2i/7.202605151200/schema.json:26-29` | blind_string_mutation | No add/replace/adjust instructions. No conditional phrasing (no 'if...', 'when...', 'only if'). E.g. 'Ignore the standing man by the door.' |
| A060 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_dependency_t2i/7.202605151200/schema.json:39-49` | llm_closed_list_instruction | character state (dead/unconscious/pose) is handled by separate layers (scene_consistency / character_state_variant / semantic_contract_router) |
| A061 | CONFIRMED | P1 | `prompts/_base/shot_dependency_t2i/7.202605151200/system.md:146-163` | semantic_string_judgment | human / person / character / body / figure / man / woman / detective / prisoner / child / person silhouette |
| A062 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_dependency_t2i/7.202605151200/system.md:20-59` | llm_closed_list_instruction | ref_usage (zoom_in_detail, exact_background, atmosphere_reference) |
| A063 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_dependency_t2i/7.202605151200/system.md:161-161` | schema_or_enum_drift | immobilized_character / character / pose 등 enum 외 값 절대 금지 |
| A064 | CONFIRMED | P1 | `prompts/_base/shot_extract/11.202604201230/user.md:18-19` | llm_closed_list_instruction | 시간 연결어 절대 금지: "~하자" / "~하면서" / "~하며" / "~하고" / "~한 뒤" / "~한 후" / "~하고 나서", 영어 금지: "and then", "while ~ing", "after ~ing", "as ~", "before ~" |
| A065 | CONFIRMED | P2 | `prompts/_base/shot_extract/11.202604201230/user.md:63-63` | scenario_dependent_prompt | "한국인 경찰", "동양인 노파" |
| A066 | CONFIRMED | P2 | `prompts/_base/shot_essence_extraction/3.202605081814/system.md:13-83` | llm_closed_list_instruction | 혈흔, 깨진 유리, 부상 흔적 |
| A067 | CONFIRMED | P2 | `prompts/_base/shot_essence_extraction/3.202605081814/system.md:44-66` | scenario_dependent_prompt | 거실 바닥에 엎어진 채 누워있다, 인형 백팩 |
| A068 | CONFIRMED | P1 | `prompts/_base/shot_extract/11.202604201230/system.md:15-18` | llm_closed_list_instruction | "~하자", "~하면서", "and then", "while ~ing", "after ~ing", "as ~" |
| A069 | CONFIRMED | P1 | `prompts/_base/shot_extract/11.202604201230/system.md:42-50` | llm_closed_list_instruction | "나이 변화, 분장/변장 전후", "부상, 얼룩, 창백해짐, 멍, 화상" |
| A070 | CONFIRMED | P2 | `prompts/_base/shot_extract/11.202604201230/system.md:35-35` | scenario_dependent_prompt | 인간형(외계인/귀신/돌연변이 포함)이면 인종/국적을 반드시 포함 |
| A071 | CONFIRMED | P1 | `prompts/_base/shot_selection/4.202604191600/system.md:54-65` | llm_closed_list_instruction | 연결 순간 단독 선택 금지, 일상 이동 남용 금지, before+during+after 모두 선택 금지, 대사만 오가는 반복 정면 샷, 접촉 직전 |
| A072 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_selection/4.202604191600/system.md:71-76` | schema_or_enum_drift | 서사 High / 시각 High — <왜 이 순간이 서사 전환점인지> |
| A073 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_selection/4.202604191600/user.md:18-23` | schema_or_enum_drift | Low 서사 샷, reason: 서사 High 또는 Medium / 시각 High 또는 Medium |
| A074 | CONFIRMED | P1 | `prompts/_base/shot_staging/11.202605150319/schema.json:30-30` | semantic_string_judgment | gaze_target: ..., 'unconscious', 'dead', 'severely_injured' |
| A075 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_staging/11.202605150319/schema.json:16-28` | schema_or_enum_drift | perspective, perception_mode, angle |
| A076 | CONFIRMED | P1 | `prompts/_base/shot_director/5.202605131800/system.md:31-49` | llm_closed_list_instruction | Gaze-target close-up 패턴 (X[를을] (응시하|...)), 명시적 off-camera/off-screen phrase, 차단(blocking) 패턴, Reaction-only 패턴 |
| A077 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_staging/11.202605150319/system.md:121-123` | schema_or_enum_drift | "closed", "unconscious", "dead", "severely_injured" |
| A078 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_staging/11.202605150319/system.md:150-155` | llm_closed_list_instruction | content_surface, reflective_surface, transparent_surface, directional_3d, non_directional |
| A079 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_staging/11.202605150319/system.md:202-213` | llm_closed_list_instruction | movement_direction, points_to_anchor, looks_to_anchor, shared_space_relation, required_background_position, primary_subject_isolation |
| A080 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_staging/11.202605150319/system.md:225-225` | schema_or_enum_drift | target_id is an exception... must use C## / P## |
| A081 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/shot_staging/11.202605150319/system.md:236-238` | llm_closed_list_instruction | none, points_to, reaches_for, looks_toward, moves_toward |
| A082 | CONFIRMED | P1 | `prompts/_base/shot_validator/5.202605081700/system.md:12-116` | llm_closed_list_instruction | 시간 연결어 절대 금지 (~하자, ~하면서, and then, while ~ing), 대상 동작 카테고리 (locomotion, riding/driving, water/swim), Active contact freeze rule (stabbing, punching, pinning) |
| A083 | CONFIRMED | P1 | `prompts/_base/shot_validator/5.202605081700/system.md:157-161` | llm_closed_list_instruction | visible-human-action 판정 기준 (얼굴, 손, 다리, 팔, face, hand, leg, arm, 잡기, 보기, 말하기, hold, look, talk) |
| A084 | CONFIRMED | P1 | `prompts/_base/shot_validator/5.202605081700/system.md:80-86` | semantic_string_judgment | entity name substring 일치, name / stable_traits substring 매칭 |
| A085 | CONFIRMED | P1 | `prompts/_base/t2i_review/4.202605150957/entity_schema.json:17-18` | blind_string_mutation | target: T2I 원문에서 정확히 찾을 수 있는 치환 대상, suggestion: target을 대체할 문자열 |
| A086 | CONFIRMED | P1 | `prompts/_base/t2i_review/4.202605150957/scene_schema.json:38-39` | blind_string_mutation | target: "T2I 원문에서 정확히 찾을 수 있는 치환 대상 (unique sub-string)", suggestion: "target을 대체할 문자열" |
| A087 | CONFIRMED | P1 | `prompts/_base/t2i_review/4.202605150957/entity_system.md:21-23` | blind_string_mutation | target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 / suggestion: target을 대체할 문자열 |
| A088 | CONFIRMED | P1 | `prompts/_base/t2i_review/4.202605150957/scene_system.md:31-32` | semantic_string_judgment | close-framing tag (`ECU`, `XCU`, `extreme close-up`, `MCU`, `medium close-up`, `close-up`, `CU`) |
| A089 | CONFIRMED | P1 | `prompts/_base/t2i_review/4.202605150957/scene_system.md:34-39` | semantic_string_judgment | the existing X, the reference X, from the reference image, use the X from the reference |
| A090 | CONFIRMED | P1 | `prompts/_base/t2i_review/4.202605150957/scene_system.md:3-89` | blind_string_mutation | target/suggestion 형태로 치환 정보를 제공하면 시스템이 자동으로 적용합니다 ... target: T2I 프롬프트 원문에서 정확히 찾을 수 있는 문자열 |
| A091 | CONFIRMED | P1 | `prompts/_base/t2i_review/4.202605150957/scene_system.md:52-55` | semantic_string_judgment | low at ground/floor/quay level + <surface> visible behind subject's hands |
| A092 | CONFIRMED | P1 | `prompts/_base/t2i_visual_converter/v4/system.md:16-67` | blind_string_mutation | 제공된 엔티티 이름을 그대로 [] 안에 사용, [엔티티명] 마커를 반드시 포함하세요 |
| A093 | CONFIRMED | P2 | `prompts/_base/t2i_visual_converter/v4/system.md:46-49` | scenario_dependent_prompt | 지하 극저온 저장 시설, 투명 원통형 캡슐, 산업용 파이프, 발광 장치들이 늘어선 어두운 시설 복도 |
| A094 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/variation_recommender/v2/system.md:6-6` | schema_or_enum_drift | Variation types: angle (camera position change), color (lighting/color grading), angle+color (both), or none (no variation needed). |
| A095 | CONFIRMED | P1 | `prompts/_base/variation_recommender/v2/system.md:23-23` | llm_closed_list_instruction | Examples: "tight close-up on face", "wide establishing shot", "over-shoulder framing", "low angle hero shot" |
| A096 | LOW_SCHEMA_OR_CONTRACT | P2 | `prompts/_base/visual_world_rules/6.202605021400/rules_schema.json:9-9` | schema_or_enum_drift | rule_type: possession, transformation, ghost, time_period, costume, technology 등 |
| A097 | CONFIRMED | P2 | `prompts/_base/visual_world_rules/6.202605021400/rules_schema.json:20-20` | scenario_dependent_prompt | 예: A의 영혼이 B의 몸에 전이된 경우 A는 물리적 존재가 아님 |
| A098 | CONFIRMED | P1 | `prompts/_base/visual_world_rules/6.202605021400/system.md:51-51` | llm_closed_list_instruction | rule_type: possession, transformation, ghost, projection, superpower, body_deformation, time_period, costume, technology, other |
| A099 | CONFIRMED | P1 | `prompts/_base/visual_world_rules/6.202605021400/system.md:57-73` | semantic_string_judgment | director_notes (물리적 존재 여부를 판단할 때 혼동할 수 있는 유형적 원칙) |
| A100 | CONFIRMED | P2 | `prompts/_base/visual_world_rules/6.202605021400/system.md:98-98` | scenario_dependent_prompt | All human characters are <region-derived demonym> unless stated otherwise. |

## Notes

- `LOW_SCHEMA_OR_CONTRACT` is not ignored; it means structured enum/schema contract drift or exact technical value routing that should be handled after the higher-risk semantic/prose routing debt.
- `FP_OR_ALLOWED` means closed technical format, harmless formatting, or generic prompt infrastructure, not open-world semantic judgment.
- `LEGACY_OR_ORPHAN` means it was detected in code/prompt that appears legacy or previously identified as orphan; do not prioritize without runtime reachability proof.
- Latest-dir prompt does not always mean runtime-active; runtime loader reachability still needs module-level verification before any patch.
