
    Oj2                        d Z ddlmZ ddlmZmZmZmZmZ dZ	dZ
dZdZdZd	Zd
ZdZdZdZdZdZ G d de      ZddZddZdd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdd	 	 	 	 	 	 	 ddZdZd dZd!dZd"dZy)#u  활성화 **안전문** — 하나라도 빠지면 조립 자체가 선다. ★새 SOT 를 안 만든다.

## 왜 여기인가

Codex (2026-09-01) — 「`grounding_mode` 가 아니라 별도 계약 모듈 +
`step_catalog._build()` 의 조립 직후가 맞습니다. `step_catalog` 가
`STEP_MANIFEST` 와 `STEP_CLASSES` 가 **처음 실제로 합쳐지는** composition
root 라 순환 없이 **실제 조립물**을 검사할 수 있습니다.」

★★**값을 import 해 새 SOT 를 만들지 않는다.** 조립된 catalog 와 실제
`GROUNDING_MODES`/`PLANNED_MODES`/`REFERENCE_SUPPORTED_OWNERS` 를 **인자로**
받는다. 그래야 이 모듈이 「또 하나의 목록」이 되지 않는다.

## 무엇을 보나

    켠 판이면 (accepted)
      ①받는 집합에 있으면 **planned 에서 빠졌나**
      ②새 producer 와 중앙 조사기의 runner 가 catalog 에 **실제로 결속**됐나
      ③차례·직접 의존이 판별·계획·아웃룩 **뒤**이고 씬 상세 **앞**인가
      ④옛 유료 갈래(A0·plan·research)가 그 판에서 **미적용**이고
        중앙 참조 조사만 적용인가
      ⑤`REFERENCE_SUPPORTED_OWNERS` 가 중앙 장부가 낼 **다섯 갈래를 다** 받나

    아직 안 켠 판이면 (planned)
      ⑥그 새 경로가 **어떤 받는 mode 에서도 닿으면 안 된다**
        ★이미 있는 inert 함수 자체는 금지 대상이 아니다 — **닿는 것**이 문제다

## 왜 한꺼번에인가

하나만 먼저 켜면 **반쪽 판**이 된다 — 옛 producer 는 켜져 있고 새 producer 는
manifest 에 없어서, 옛 유료 사슬만 돌고 새 산출은 안 난다. 2026-08-31 에
실제로 그랬다.
    )annotations)AnyDictMappingSequenceSetz1.202609013200grounding_chunkgrounding_screenreference_acquisitiongrounding_planoutlook_phase3scene_detail)grounding_a0r   grounding_research)entity_all_characterentity_all_locationentity_all_propentity_extract_characterentity_extract_locationentity_extract_propif_not_chunk_producerdisabledif_grounding_v2c                      e Zd ZdZy)ActivationContractErroruQ   활성화가 **반쪽**이다. ★조립 자체가 선다 — provider 앞이다.N)__name__
__module____qualname____doc__     \/Users/manta/Documents/Projects/TheRoad-I1/backend/app/core/grounding_activation_contract.pyr   r   F   s    [r!   r   c                J    | j                  |      }|t        d| d      |S )N`uG   ` 가 catalog 에 없다 — 활성화에 필요한 스텝이 빠졌다)getr   )catalogsidgots      r"   _entryr)   J   s6    
++c
C
{%u[\^ 	^Jr!   c                @    t        t        t        | |      d            S )Norder)floatgetattrr)   )r&   r'   s     r"   _orderr.   R   s    -w788r!   N)buys_legacy_researchc               p    ||v r||v rt        |d      ||v rt        | ||||       yt        |        y)u  활성화가 **온전한가**. ★하나라도 빠지면 여기서 선다.

    Args:
        catalog: `step_catalog._build()` 가 **방금 만든** 것.
        accepted_modes: 실제 `GROUNDING_MODES`.
        planned_modes: 실제 `PLANNED_MODES`.
        chunk_mode: `GROUNDING_MODE_V2_CHUNK`.
        reference_owners: 실제 `REFERENCE_SUPPORTED_OWNERS`.
        ledger_owners: 중앙 장부가 낼 갈래 — `MATERIALIZABLE_OWNER_TYPES`.
        buys_legacy_research: `buys_v2_research`. ★켠 판에서 이것이
            `chunk_mode` 에 **False** 를 내야 옛 유료 갈래가 꺼진다.
            안 켠 판에서는 그 값을 물으면 거절당하므로 **안 부른다**.
    ug    가 받는 집합과 계획 집합에 **둘 다** 있다 — 켠 것인지 안 켠 것인지 모른다)
chunk_modereference_ownersledger_ownersr/   N)r   _assert_switched_on_assert_still_unreachable)r&   accepted_modesplanned_modesr1   r2   r3   r/   s          r"   assert_activationr8   V   sY    ( ^#
m(C%n 8 89 	9 ^#G
-=*71E	G
 	"'*r!   c          
     "   t         t        t        fD ]e  }t        t	        | |      dd       t        d| d      t        t        t	        | |      dd            t        k(  sQt        d| dt         d       t	        | t              }t        t        t        fD ]5  }t        | |      t        | t              k\  s!t        dt         d| d	       t        t        t        |d
d            vrt        dt         dt         d      t        | t              t        | t              k\  rt        dt         dt         d      t        D cg c]-  }|| v r't        t        | |   dd            t        t        fvr|/ }}|rt        d| dt         d      | ||      rt        d| d      t        t        t        t	        | t              d
d            vrt        dt         dt         d      t        D cg c]-  }|| v r't        t        | |   dd            t         t        fvr|/ }	}|	rt        d|	 dt          d      |D 
cg c]  }
|
t        |      vs|
 }}
|rt        d| d      t#                y c c}w c c}w c c}
w )N
runner_clsr$   uG   ` 에 runner 가 안 붙었다 — manifest 에만 있으면 못 돈다applicability u   ` 가 아직 `u   ` 다 — 안 돈다u   ` 가 `u<   ` 보다 앞이다 — 그 산출 없이 조사하게 된다
depends_onr    uR   ` 에 직접 의존하지 않는다 — 차례만 맞고 재개에서 어긋난다u8   ` 보다 뒤다 — 참조 없이 씬이 만들어진다u   옛 유료 갈래 u    가 `u>   ` 를 안 쓴다 — 그 판에서 꺼지는지 알 수 없다uv   ` 에서 옛 유료 조사 술어가 아직 참이다 — 옛 갈래와 새 갈래가 **같이 돌아 두 번 산다**u^   ` 에 직접 의존하지 않는다 — 조사가 다시 돌아도 씬이 옛 참조를 쓴다u   옛 추출 uR   ` 를 안 쓴다 — C(c) 판에서 같이 돌아 **같은 것을 두 번 산다**u   중앙 장부가 낼 갈래 u]    를 `REFERENCE_SUPPORTED_OWNERS` 가 안 받는다 — 그 갈래는 참조를 못 만든다)CHUNK_PRODUCER_STEPSCREEN_STEPCENTRAL_ACQUISITION_STEPr-   r)   r   strAPPLICABILITY_DISABLED	PLAN_STEPOUTLOOK_LAST_STEPr.   setSCENE_DETAIL_STEPLEGACY_PAID_STEPSLEGACY_APPLICABILITYLEGACY_EXTRACT_STEPSNOT_CHUNK_APPLICABILITY!_assert_every_gate_is_implemented)r&   r1   r2   r3   r/   r'   centralbeforewrongloudomissings               r"   r4   r4   w   s[    $[2JK6'3't<D)C5_`b bwvgs+_bAB&')C5'=&>>RSU U L W67G	+<='6"fW-E'G G),-WVH =8 89 9 > GG\2$F GG%()1B0C D[ [\ 	\ g/0F7;L5N N%()1B0C D> >? 	? . D-SwWWS\?B?@)+ABC -E D % v.B-C D8 89 	9 ',@,L%
| K KL 	L  sF7$56bI(K K%!"'*B)C D` `a 	a
 0 F/Cg~GGCL/2>?+-CDE /D F %$v&=%> ?L LM 	M
 (J-Q1C8H4I+Iq-GJ%*7) 4F FG 	G &'SD,F Ks   2J=2JJ J))z,app.core.steps.episode_reference_policy_stepENFORCES_GATE)z0app.modules.pipeline.grounding_bundle_projectionrR   )z-app.modules.pipeline.grounding_sidecar_writerrR   c                     ddl } t               }t        D ]@  \  }}| j                  |      }t	        ||d      }|s'|j                  t        |             B |S )u;   지금 **실제로 집행되는** 값들. ★공개 끝점.r   N)	importlibrE   GATE_IMPLEMENTORSimport_moduler-   addrA   )rT   r(   modattrmvals         r"   implemented_gatesr\      sR    
%C&	T##C(at$GGCH	 '
 Jr!   c                 D   ddl m} m} t               }| D cg c]	  }||vs| }}|r8t	        d| d|j                         D cg c]  \  }}||v s| c}} d      t        |      D cg c]	  }|| vs| }}|rt	        d| d|        y c c}w c c}}w c c}w )Nr   )ENFORCEMENT_GATESREFERENCE_ENFORCEMENT_BY_OWNERu
   집행자 uD    를 선언해 놓고 **구현한 모듈이 없다** — 그 갈래(u*   )의 참조는 아무 데도 안 붙는다u   모듈이 모르는 집행자 u    를 선언한다 — ).app.modules.pipeline.grounding_entity_contractr^   r_   r\   r   itemssorted)r^   r_   havegorphanrP   unknowns          r"   rK   rK      s    ; D*<*Aatma*F<% !<BBDTDdaVDTU8:; 	;
 !,E,Q!3D*Dq,GE%,WI5K !#$ 	$  =
 UEs"   	BBBB.	B8Bc                    t         fD ]  }|| v st        d| d       | j                  t              }|8t	        t        |dd            t        k7  rt        dt         dt         d      yy)u   아직 안 켰다 — 새 경로가 **어떤 받는 mode 에서도 닿으면 안 된다**.

    ★이미 있는 inert 함수 자체는 금지 대상이 아니다. **catalog 에 붙어
    돌 수 있는 것**이 문제다.
    r$   ub   ` 가 아직 안 켠 판인데 catalog 에 있다 — 새 producer 만 켜진 **반쪽 판**이다Nr;   r<   u    ` 가 아직 안 켠 판인데 `u   ` 가 아니다)r>   r   r%   r?   rA   r-   rB   )r&   r'   scrs      r"   r5   r5      s     $%'>)C5 ? ?@ @ &
 ++k
"C
3wsOR@A"#%}<%&o78 	8#r!   )r&   Mapping[str, Any]r'   rA   )r&   ri   r'   rA   returnr,   )r&   ri   r6   Set[str]r7   rk   r1   rA   r2   Sequence[str]r3   rl   r/   r   rj   None)r&   ri   r1   rA   r2   rl   r3   rl   r/   r   rj   rm   )rj   rk   )rj   rm   )r&   ri   rj   rm   )r   
__future__r   typingr   r   r   r   r   ACTIVATION_CONTRACT_VERSIONr>   r?   r@   rC   rD   rF   rG   rI   rJ   rB   rH   RuntimeErrorr   r)   r.   r8   r4   rU   r\   rK   r5   r    r!   r"   <module>rr      s   B # 4 4.  (  2 	$ "  M 
J  2  $  ) \l \9 37+&.+%-+ #&+ )6	+
 &3+ -0+ <@+H 59N(*7N('4N( /2N( >BN(f 
$&8r!   