
    "j                    j    d Z ddlmZ ddlmZmZmZmZmZ ddl	m
Z
 ddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)	u  FINDING 7 (e2e-bughunt-v1) scene_detail owned redraw repair wrapper.

owned judge 가 redraw_violation 을 검출한 t2i_prompt 를 1-call 로 좁게 rewrite —
owned 환경객체를 redraw 대신 anchor/omit 으로 고친다. caller (detail_steps
`_attempt_owned_redraw_repair`) 가 결과를 기존 validator 로 재검증한 뒤에만 적용한다.

`_owned_judge.py` 와 같은 패턴 — LLM 호출 의존성 (prompt_loader / call_structured)
을 가지므로 pure helper (`_owned_helpers.py`) 와 분리한다.

Contract:
    - redraw_violations 가 비면 AppError (caller 가 redraw 검출 후에만 호출).
    - 1-call only — repair 자체는 재시도하지 않는다 (caller 가 max 1 attempt 관리).
    - 응답에 `t2i_prompt` (non-empty str) / `owned_object_usage` (list) 누락 시
      AppError(step.contract_violation) — silent fallback 금지
      (feedback_no_silent_fallback.md).
    )annotations)AnyCallableDictListOptional)AppErrorN)project_configopik_metadatac           	        |st        dd      ddlm}m} ddlm}	  |dd      }
 |dd	      } |dd
      }dj                  d |D              } |	|      }|j                  d| xs d      j                  d|      j                  d|      j                  d|xs d      } |d|
|||d|      }t        |t              st        dd|      |j                  d      }t        |t              r|j                         st        dd|      |j                  d      }t        |t              s&t        ddt        |      j                   d|      |t        |      dS )uC  owned redraw violation t2i_prompt 1-call repair.

    Args:
        t2i_prompt: 수정 대상 원본 T2I 프롬프트.
        owned: chain_bg owned 객체 English canonical 목록.
        redraw_violations: owned judge violations 중 verdict == "redraw_violation"
            인 것만 (caller 필터). 각 entry = {owned_object, violating_phrase,
            reason, verdict}.
        camera_direction: shot 자연어 카메라 정보.
        call_structured_fn: `app.modules.llm.llm_client.call_structured` (또는
            test fake).
        project_config / opik_metadata: optional passthrough.

    Returns:
        {"t2i_prompt": str, "owned_object_usage": List[Dict[str, str]]}.

    Raises:
        AppError(step.contract_violation) — redraw_violations 가 비었거나 LLM 응답
        schema contract 위반.
    zstep.contract_violationz4run_owned_repair called with empty redraw_violations)codemessager   )load_promptload_schema)format_redraw_violations_blockscene_detail_owned_repairsystemschemauser_template
c              3  &   K   | ]	  }d |   yw)z- N ).0os     R/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/steps/_owned_repair.py	<genexpr>z#run_owned_repair.<locals>.<genexpr>D   s     4ebHes   z{t2i_prompt} z{owned_list_block}z{redraw_violations_block}z{camera_direction})stepsystem_promptuser_promptresponse_schemar
   schema_namer   z/scene_detail_owned_repair response not a dict: 
t2i_promptz?scene_detail_owned_repair response missing/empty 't2i_prompt': owned_object_usagezAscene_detail_owned_repair 'owned_object_usage' must be list (got z): )r#   r$   )r	   app.modules.prompt_loaderr   r   app.core.steps._owned_helpersr   joinreplace
isinstancedictgetstrstriplisttype__name__)r#   ownedredraw_violationscamera_directioncall_structured_fnr
   r   r   r   r   r   r   templateowned_blockviolations_blockr    resultrepaired_promptusages                      r   run_owned_repairr;      s   < *J
 	
 CL4h?F4h?F6HH))4e44K56GH	!1r	2	%{	3	,.>	?	%'7'=2	>   (%/#F fd#*EfZP
 	
 jj.Oos+?3H3H3J*Q*
 	
 JJ+,EeT"*U,,-S
<
 	
 *eMM    )r#   r,   r1   z	List[str]r2   zList[Dict[str, str]]r3   r,   r4   zCallable[..., Dict[str, Any]]r
   Optional[Dict[str, Any]]r   r=   returnzDict[str, Any])__doc__
__future__r   typingr   r   r   r   r   app.core.errorsr	   r;   r   r<   r   <module>rC      s     # 6 6 $ 04.2XNXN XN ,	XN
 XN 6XN -XN ,XN XNr<   