
    tVj                        U d Z ddlmZ ddlmZmZ ddlmZ  eddh      Z	de
d<    ed	d
h      Zde
d<   	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 	 	 ddZy)u  Area D-next-min + C7 — keep_elements shape SOT (environment / static_prop only).

producer (shot_dependency_t2i, schema v8) 가 LLM 으로 emit 하는
keep_elements 의 shape 검증. memory `feedback_llm_based_judgment` 정합
— code 가 kind / subject_kind 의미 판단 안 함, enum check 만.

KEEP_ELEMENT_KINDS 는 2종 (environment / static_prop) 만 — character /
person / body / dead / unconscious 묘사는 keep_elements 가 다루지 않음.
C7 (2026-05-20) — KEEP_ELEMENT_SUBJECT_KINDS 는 인물/비인물 enum 2종
(non_human_visual_element / human_or_character_reference). producer 가
각 entry 의 인물 여부를 explicit emit, human_or_character_reference 는
fail-fast 거부. character state 보존은 별도 layer
(scene_consistency.character_state / character_state_variant ref /
semantic_contract_router) 가 deterministic 처리.

이 module 은 leaf — 외부 모듈 import 안 함 (`AppError` 만). 다른
모든 영역 (producer step / loader / scene_reference / detail_steps)
이 import 해서 사용.
    )annotations)AnyIterable)AppErrorenvironmentstatic_propzfrozenset[str]KEEP_ELEMENT_KINDSnon_human_visual_elementhuman_or_character_referenceKEEP_ELEMENT_SUBJECT_KINDSc          	     p   t        | t              s*t        || dt        |       j                   d| dd      d| vsd| vsd| vr-t        || d	t        | j                               d
| d      t        | d   t              s/t        || dt        | d         j                   d| d   d      | d   t        vr&t        || dt        t               d| d   d      | d   t        vr&t        || dt        t               d| d   d      | d   dk(  rt        || d| d   dd      y)u  단일 keep_elements entry 검증 — {label, kind, subject_kind} dict + kind ∈ KEEP_ELEMENT_KINDS (2종) + subject_kind ∈ KEEP_ELEMENT_SUBJECT_KINDS + human_or_character_reference fail-fast.

    Args:
        entry: keep_elements list 의 한 entry.
        label_source: error message 에 포함할 위치 (예: "S1_Shot2 loc_ref[0]").
        error_code: AppError code (layer 별 다름 —
                    "step.shot_dependency_t2i.keep_elements_shape_invalid" /
                    "step.scene_checkpoint_loaders.keep_elements_entry_invalid" /
                    "step.scene_reference.keep_elements_kind_invalid").

    Raises: AppError.
    z(: keep_elements entry must be dict, got : uU   . Producer schema v8: list[{label, kind∈{environment, static_prop}, subject_kind}].  codemessagestatus_codelabelkindsubject_kindu9   : keep_elements entry missing required keys — got keys z, value=z-: keep_elements entry.label must be str, got z*: keep_elements entry.kind must be one of z, got z2: keep_elements entry.subject_kind must be one of r   zM: keep_elements entry has subject_kind='human_or_character_reference' (label=u   ) — keep_elements carries only non-human visual elements (environment / static_prop). Person/character references are routed to scene_consistency.character_state, character_state_variant, and semantic_contract_router.N)

isinstancedictr   type__name__sortedkeysstrr	   r   )entrylabel_source
error_codes      L/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/keep_elements.pyvalidate_keep_elements_entryr"   '   s   $ eT". !E{++,Bui 8jk 
 	
 evU2nE6Q. !"5::<038E9F 
 	
 eGnc*. !E'N+445Rg7IK 
 	
 V}... J,-.fU6]4EG 
 	
 ^$>>. R456fU>=R<UW 
 	
 ^ >>. !99>w8J KIJ 
 	
 ?    N)error_code_legacy_strc                  t        | t              s)t        || dt        |       j                   d| d      t        |       D ]C  \  }}| d| d}t        |t              rt        |xs || d|dd      t        |||	       E y
)u  List 단위 검증 — 각 entry 를 validate_keep_elements_entry 로 검증.

    Args:
        keep_elements: list (or iterable).
        label_source: error message 에 포함할 위치 base.
        error_code_entry: dict shape/key/enum 위반 시 AppError code.
        error_code_legacy_str: 본 list 에 str entry 가 있을 때 (legacy v5)
            사용할 AppError code. None 이면 일반 error_code_entry 사용.

    Raises: AppError.
    z": keep_elements must be list, got r   r   r   []z: keep_elements entry is str (u   ) — legacy v5 shape. shot_dependency_t2i schema_version 가 v8 (1→4) 로 bump 되었고 entry 는 list[{label, kind∈{environment, static_prop}, subject_kind}] 이어야 합니다. cp 를 force re-run 하세요.)r   r    N)r   listr   r   r   	enumerater   r"   )keep_elementsr   error_code_entryr$   idxr   entry_sources          r!   validate_keep_elementsr.   z   s    $ mT*!. !M*334B}6GI 
 	
  .
U&qQ/eS!*>.>#n$B5) L@ A  
 
 	%9I	
 /r#   )r   r   r   r   r    r   returnNone)
r*   zIterable[Any]r   r   r+   r   r$   z
str | Noner/   r0   )__doc__
__future__r   typingr   r   app.core.errorsr   	frozensetr	   __annotations__r   r"   r.    r#   r!   <module>r8      s   & #   $ &/=0 & N  .7 >8 . N 
P
P
 P
 	P

 
P
p )-+
 +
 +
 	+

 &+
 
+
r#   