
    Oj
                    T    d Z ddlmZ ddlmZmZmZ dZddZddZ	ddZ
ddZdd	Zy
)u  세계관(visual_world_rules) → 프롬프트 블록 조립 — 공용 SOT.

2026-07-25 사용자 지적("맵도 콘티도 샷 이미지도 한국적이지 않다") 실측:
야외 장소 경로만 세계관이 **한 글자도 도달하지 않았다**.
  - outdoor_place_spec_step: ``rules_text``/``text`` 키를 읽는데 CP 에는
    그런 키가 없다(실제 키=region/era/rules/t2i_context) → 항상 "".
  - outdoor_place_canon_step: ``world_facts_block = ""`` 하드코딩.
    (주석은 '제작자 정정 원문 재주입 금지'가 근거인데, 그건 정정 채널
    이야기이고 세계관 자체는 애초에 주입된 적이 없다 — 별개 결손.)
반면 entity_steps/beat_shot_steps 는 region·era·t2i_context 를 정상
주입한다. 그 관례를 모듈로 승격해 야외 경로에도 같은 사실을 흘린다.

코드는 조립만 한다 — 내용은 전부 CP 데이터(시나리오 의존 하드코딩 0).
    )annotations)AnyDictOptional)time_period
technologyarchitectureenvironmentculturec                6    | xs i j                  di       xs i S )Ndata)get)cps    L/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/world_context.py	_vwr_datar      s    H">>&"%++    c                X   t        |       }t        |j                  d      xs d      j                         }t        |j                  d      xs d      j                         }g }|r|j	                  d|        |r|j	                  d|        |j                  d      xs g D ]n  }t        |t              s|j                  d      t        vr,t        |j                  d      xs d      j                         }|s[|j	                  d	|        p |syd
j                  |      S )u  장소 이미지(캐논 사진/맵) 프롬프트용 세계 사실 블록.

    region·era 는 그 지역·시대의 **실제 건축·시설 관행**을 부르는 앵커다
    (이미지 모델이 "대한민국 2020년대"를 알면 정류장·표지·노면 표기가
    그 나라 것이 된다). 장소 물성에 관여하는 rule 의 visual_guideline
    만 함께 싣고, 인물/현상 규칙은 제외한다. CP 부재/빈 값=빈 문자열
    (호출부 byte-identical).
    region era!- Region (real-world reference): - Era: rules	rule_typevisual_guidelinez- 
)	r   strr   stripappend
isinstancedictPLACE_RULE_TYPESjoin)r   dr   r   linesrguides          r   build_world_facts_blockr(      s    	"Ax&B'--/F
aeeEl b
!
'
'
)CE8AB
wse_%UU7^!r!!T"55%55AEE,-34::<LL2eW& " 99Ur   c                   t        |       }g }t        |j                  d      xs d      j                         }t        |j                  d      xs d      j                         }|r|j	                  d|        |r|j	                  d|        t        |j                  d      xs d      j                         }|r|j	                  d|        |j                  d      xs g D ]  }t        |t              st        |j                  d	      xs d      j                         }|sCt        |j                  d
      xs d      j                         xs d}|j	                  d| d|         dj                  |      S )ut  ★고증(다섯 갈래)용 세계 사실 — **규칙을 갈래로 안 거른다**.

    `build_world_facts_block` 은 **장소 물성**만 남긴다(`PLACE_RULE_TYPES`).
    그것으로 다섯 갈래를 판단하면 **옷을 잃는다** — 실측(2026-08-31, 실제 CP
    61건): `costume` 규칙이 **76건**인데 그 필터에 안 들어간다. `projection`
    76 · `body_deformation` 62 · `transformation` 36 도 마찬가지다. 인물과
    아웃룩은 그 규칙들로 판단해야 한다.

    그래서 여기서는 **있는 규칙을 다 싣되 종류를 밝힌다.** 하류가 어느
    규칙인지 알아야 하고, 코드가 뜻을 미리 재단하지 않는다.

    ★조립만 한다 — 내용은 전부 CP 데이터다(시나리오 의존 하드코딩 0).
    ★빈 값이면 **빈 문자열**을 돌려준다. 부르는 쪽이 fail-closed 한다.
    r   r   r   r   r   t2i_contextz- Visual context: r   r   r   otherz- [] r   r   r   r   r   r   r    r!   r#   )	r   r$   r%   r   r   ctxr&   r'   kinds	            r   build_grounding_world_factsr0   <   sU    	"AEx&B'--/F
aeeEl b
!
'
'
)C8AB
wse_%
aeeM"(b
)
/
/
1C
)#/0UU7^!r!!T"AEE,-34::<155%01779DWs4&5'*+ " 99Ur   c                4   t        |       }t        t        |j                  d      xs d      j	                         xs, t        |j                  d      xs d      j	                               }t        d |j                  d      xs g D              }|xr |S )u  고증에 쓸 세계 사실이 **성한가**. ★임의 글자수 문턱을 안 쓴다.

    지역·시대 중 하나라도 있고 규칙 지침이 하나라도 있어야 한다 — 그 둘이
    두 축(만들기 어려움 · 알아챔)의 근거다.
    r   r   r   c              3     K   | ]B  }t        |t              xr, t        |j                  d       xs d      j	                          D yw)r   r   N)r    r!   r   r   r   ).0r&   s     r   	<genexpr>z.grounding_world_facts_ready.<locals>.<genexpr>j   sK      41q a& D155!34:;AACD1s   AA
r   )r   boolr   r   r   any)r   r$   	has_placehas_rules       r   grounding_world_facts_readyr9   a   s     	"ASx.B/557 8AEE%L.B/5579I 4UU7^1r14 4H !!r   c                6   t        |       }g }t        |j                  d      xs d      j                         }t        |j                  d      xs d      j                         }|r|j	                  d|        |r|j	                  d|        |j                  d      xs g D ]  }t        |t              st        |j                  d      xs d      j                         }t        |j                  d      xs d      j                         }t        |j                  d	      xs d      j                         }|s|s|rd
| dnd}	|j	                  |	 | j                                |s|j	                  d|         dj                  |      S )u0  장소 스펙 저작(LLM)용 세계 물리 규칙 텍스트.

    저작 LLM 은 이미지 모델과 달리 규칙 전체를 관련성 판단에 쓸 수
    있으므로 rule_type 필터 없이 전부 싣는다(기존 spec 프롬프트의
    '세계 물리 규칙(참고)' 슬롯 계약 그대로).
    r   r   r   u   지역: u   시대: r   descriptionr   r   [r,   u     시각 지침: r   r-   )
r   r$   partsr   r   r&   descr'   rtypeheads
             r   build_world_rules_textrA   p   sd    	"AEx&B'--/F
aeeEl b
!
'
'
)Cxx()
xu%&UU7^!r!!T"155'-2.446AEE,-34::<AEE+&,"-3355$)QugR=rDLLD6$..01089 " 99Ur   N)r   Optional[Dict[str, Any]]returnzDict[str, Any])r   rB   rC   r   )r   rB   rC   r5   )__doc__
__future__r   typingr   r   r   r"   r   r(   r0   r9   rA    r   r   <module>rH      s7    # & &
. ,<"J"r   