
    01jҘ              	      D   U d Z ddlmZ ddlZddlmc mZ ddl	Z	ddl
Z
ddlZddlZddlZddlmZ  ee      j%                         j&                  d   Z ee      ej,                  vr"ej,                  j/                  d ee             ddlmZ edz  dz  Zej8                  j;                  d      Ze eedd	      xs d	 ee      k7  r e ej8                        D  cg c]  } | dk(  s| jC                  d
      s|  c} D ]  Z"ej8                  e"=   ejF                  de eedz        g      Z$g Z%dZ&e$e&uZ'e'Z(e're$jR                  Z*dZ+e*e+uZ,e,Z(e(sB ejZ                  de'fde$e&f      d ej\                         v s ej^                  e$      r ej`                  e$      nd ej`                  e&      dz  Z1dde1iz  Z2e%jg                  e2       e'r ejZ                  de,fde*e+f      d ej\                         v s ej^                  e$      r ej`                  e$      nd ej`                  e*       ej`                  e+      dz  Z4dde4iz  Z5e%jg                  e5        ejl                  e%d      i z  Z7dde7iz  Z8 e9 ejt                  e8            dxZ(xZ%xZ'xZ&xZ*xZ,Z+ ejv                  e$      Z<e<ej8                  d<   e$jR                  j{                  e<       ddl>m?Z@ ddl>mAZB ddlCmDZE eEZFdeGd<   dZHdZIdZJd ZKdHd!ZLeHeId"d#ZMdId$ZNdJd%ZOdKdJd&ZPdLd'ZQdMdNd(ZRd) ZSdOdPd*ZTd+ ZUd, ZV G d- d.      ZW G d/ d0      ZXd1 ZYd2 ZZddd	d	d	d	ddd3	 	 	 	 	 	 	 dQd4Z[d5 Z\d6 Z]d7 Z^d8 Z_d9 Z`d: Zad; Zbd< Zcd= Zdd> Zed? Zfd@ ZgdA ZhdB ZidC ZjdD ZkdE ZldF ZmdG Znyc c} w )Ru  task-2756 provenance ADOPTED → ANU-owned callback bridge 회귀 테스트.

검증 대상:
  dispatch.anu_pickup_driver.process_one 의 provenance ADOPTED 분기에서
  동작하는 _provenance_callback_bridge 를 포함한 end-to-end 통합 검증.

절대 제약:
  - 실제 ANU key 는 raw literal 금지 — ANU_KEY 상수 변수(callback_owner_enforcer
    .ANU_KEY_2553 import)를 통해서만 참조한다. 실 builder 통합 검증도 상수 변수로만.
  - pickup_once 실호출 0 — 전부 mock 주입.
  - tmp_path fixture 만 사용. 실제 memory 디렉토리에 쓰지 않는다.
  - dispatch/anu_pickup_driver.py 수정 0 (읽기만).
    )annotationsN)Path   dispatchz__init__.py__file__ z	dispatch.)submodule_search_locationsis not)z%(py2)s is not %(py5)s_spec)py2py5%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16zassert %(py19)spy19)anu_pickup_driver)anu_executor_provenance)ANU_KEY_2553strANU_KEYz	task-2756@abcdef01abcdef01abcdef01abcdef01abcdef01abcdef01abcdef01abcdef01zexecutor-self-key-2756deadbeef12345678c                 "    t         ddt        ddS )uB   provenance-path 통과용 valid executor_result (envelope 없음).EXECUTOR_RESULT_WRITTENPASSz	report.md)task_idcompletion_signalterminal_statuscapsule_sha256report_path)TASK_IDCAPSULE_SHA     L/home/jay/workspace/tests/regression/test_provenance_callback_bridge_2756.py_valid_resultr*   =   s     6!%" r(   r    source_sha256c                      fdS )Nc                    dS )Nr+   r'   )tidr,   r    s    r)   <lambda>z_cap_reader.<locals>.<lambda>J   s    7]K r(   r'   r+   s   ``r)   _cap_readerr1   I   s	    KKr(   c                    | dz  dz  dz  j                  dd       | dz  dz  j                  dd       | dz  dz  j                  dd       | S )Nmemoryevents	p0b_inboxTparentsexist_okstatecapabilities)mkdir)tmp_paths    r)   
_make_dirsr=   N   sd    8#k188PT8U7"))$)F>)000MOr(   c                    | dz  dz  dz  S )Nr3   r4   r5   r'   )roots    r)   _events_dirr@   U   s    (?X%33r(   c                    |	t          d}|
t               }t        |       |z  }|j                  t	        j
                  |      d       |S )Nz.result.jsonutf-8encoding)r%   r*   r@   
write_textjsondumps)r?   namepayloadps       r)   _write_resultrK   Y   sL    |,'/DD ALLG$wL7Hr(   c                    | dz  dz  dz  }|j                   j                  dd       |j                  t        j                  dz   d       y )	Nr3   r9   p0b_driver_enabledTr6   
rB   rC   )parentr;   rE   drvACTIVATION_ENABLED)r?   flags     r)   _enable_activationrS   c   sH    (?W$';;DKKdT2OOC**T1GODr(   c                t    t        j                         |z
  }t        j                  t	        |       ||f       y N)_timetimeosutimer   )pathsecondspasts      r)   _ager]   i   s(    ::<'!DHHSYt%r(   c                      y rU   r'   aks     r)   r0   r0   n       r(   c                (     g  fd}|_         |S )Nc                 n    j                  | |f       t        j                  dk(  dgt        g       S )N
WAKE_BUILTx)verdictokargvr    reasons)appendtypesSimpleNamespacer%   )argskwargscallsrg   s     r)   _pickupz!make_pickup_mock.<locals>._pickupt   s9    dF^$$$L!8
 	
r(   rp   )rg   rq   rp   s   ` @r)   make_pickup_mockrs   q   s    E
 GMNr(   c                 :    g g fd} | _         | _        | S )u<   callback_launch_fn spy — 호출 인자(request)를 기록.c                z    j                  | ||f       j                  |        t        j                  d      S )NLAUNCHED)decision)rk   rl   rm   )requestrn   ro   rp   captureds      r)   _launchz make_launch_spy.<locals>._launch   s3    gtV,- $$j99r(   )rp   ry   )rz   rp   ry   s    @@r)   make_launch_spyr{      s(    EH:
 GMGNr(   c                 $    g fd} | _         | S )Nc                .    j                  | |f       |S rU   )rk   )	collectorrZ   rp   s     r)   _writerz*make_collector_writer_spy.<locals>._writer   s    i&'r(   rr   )r   rp   s    @r)   make_collector_writer_spyr      s    E GMNr(   c                  ,    e Zd ZdZdZej                  Zy)
_GateReadyu9   owner_gate_fn 이 PASS 를 반환하는 mock gate 결과.TN)__name__
__module____qualname____doc__readyrP   GATE_READY_STATUSstatusr'   r(   r)   r   r      s    CE""Fr(   r   c                      e Zd ZdZdZdZy)_GateNotReadyu9   owner_gate_fn 이 FAIL 을 반환하는 mock gate 결과.FOWNER_PICKUP_NOT_READYN)r   r   r   r   r   r   r'   r(   r)   r   r      s    CE%Fr(   r   c                    t               S rU   )r   result_pathkws     r)   	gate_passr      s
    <r(   c                    t               S rU   )r   r   s     r)   	gate_failr      s
    ?r(   )callback_launch_fnowner_gate_fncallback_owner_keycallback_executor_keycallback_chat_idcallback_atcallback_dedupe_seenrI   c                  t        |       }	t        |	       t               }
t               }t	        |	|      }t        |       ddl}|j                  |j                               j                         fd}t        j                  t        |      fi dt        |	      d|
dt        dd	d
t               d|d|d|d|d|d|d|d|ddd|dddddd	}|fS )u  provenance-path ADOPTED 분기를 통해 process_one 을 호출하고 DriverRecord 반환.

    test_provenance_path_2753.py 의 test_integration_provenance_adopted 패턴을 그대로 가져옴.
    provenance_fn 은 SpyResult(ok=True) 반환 함수로 고정한다.

    cron_id 는 process_one 파라미터로 직접 주입한다(wrapper 없이 실제 production 경로 검증).
    callback_request_builder 는 기본 None(= 실제 build_anu_owned_callback_request 사용).
    )rI   r   Nc                2    t        j                  d      S NT)rh   source_result_sha256provProvenanceResultresultr   ro   shas      r)   _provenance_fnz$_run_adopted.<locals>._provenance_fn       $$3GGr(   r?   	pickup_fnsleep_fnprovenance_path_enabledTcapability_readercollector_writer_fnprovenance_fnr   r   r   r   r   r   callback_request_builderr   callback_dispatch_cron_iddispatch-cron-2756!callback_normal_collector_cron_idnormal-collector-cron-2756callback_no_fallback)r=   rS   rs   r   rK   r]   hashlibsha256
read_bytes	hexdigestrP   process_oner   	_NO_SLEEPr1   )r<   r   r   r   r   r   r   r   rI   r?   pickupwriterrJ   r   r   recr   s                   @r)   _run_adoptedr      s=   ( hDtF&(FdG,AG 
..
(
2
2
4CH //AY  	
 !% &- # % . $ . 4 *   "&  2!" #7#$ +G%& "'C* 8Or(   c           	     
   t               }t        | |t        t        t        dd      \  }}|j
                  }t        |      }d}||k(  }|s7t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }t        j                  d
t        |j
                         d      dz   d|iz  }	t        t        j                  |	            dx}x}x}}|j                   d   }
d}d}t#        |
||      }d}||k(  }|sCt        j                  d|fd||f      dt        j                         v st        j                  t"              rt        j                  t"              nddt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	t        j                  dt#        |
dd      d      dz   d|	iz  }t        t        j                  |            dx}x}x}x}}|j$                  }t&        j(                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t&              rt        j                  t&              ndt        j                  |      dz  }t        j                  d|j$                        dz   d |iz  }t        t        j                  |            dx}x}}|j*                  }t&        j,                  }||k(  }|st        j                  d|fd!||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t&              rt        j                  t&              ndt        j                  |      dz  }d"d |iz  }t        t        j                  |            dx}x}}y)#u   callback_launch_fn + owner_gate_fn(ready=True) + ANU owner_key → fire 정확히 1회.
    request.verdict==PASS, DriverRecord.callback_launch_verdict==BRIDGE_CALLBACK_REQUEST_BUILT,
    verdict==PROVENANCE_ADOPTED.
    	chat-275610mr   r   r   r   r   r      ==zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.calls
})
} == %(py8)slen
launch_spypy0py1py3r   py8u!   callback_launch_fn 호출 횟수  != 1
>assert %(py10)spy10Nr   rg   r   zC%(py7)s
{%(py7)s = %(py0)s(%(py1)s, %(py3)s, %(py5)s)
} == %(py10)sgetattrreqr   r   r   r   r   r   zrequest.verdict=z
 != 'PASS'
>assert %(py12)spy12za%(py2)s
{%(py2)s = %(py0)s.callback_launch_verdict
} == %(py6)s
{%(py6)s = %(py4)s.BRIDGE_FIRED
}r   rP   r   r   py4py6callback_launch_verdict=
>assert %(py8)sr   z_%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_PROVENANCE_ADOPTED
}assert %(py8)s)r{   r   r   r   EXECUTOR_SELF_KEYrp   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_saferepr_format_assertmsgAssertionError_format_explanationry   r   callback_launch_verdictrP   BRIDGE_FIREDrg   VERDICT_PROVENANCE_ADOPTED)r<   r   r   _sha@py_assert2@py_assert4@py_assert7@py_assert6@py_format9@py_format11r   @py_assert9@py_assert8@py_format13@py_assert1@py_assert5@py_assert3@py_format7s                     r)   +test_bridge_fires_on_adopted_with_gate_passr      sT   
 !"J%"/$IC  3  A  A%    A                             !    %&    ,C
0@0@,A+B%H      

a
 C! 4 73	4( F (F2   (F                        "    $(    )    -3    73	48;:F      && #*:*: &*::   &*:              '      +.    +.    +;    #3#>#>"AB     ;;8#888;88888;888888838883888;888888#888#88888888888r(   c           	     v   t               }t        | |t        t        t        dd      \  }}|j
                  }t        |      }d}||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}x}x}}|j
                  d   }
t        |
dd      }d}||u}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        j                   d      dz   d|iz  }t        t        j                  |            dx}}dj#                  d |D              }t$        |v }|st        j                  d|fdt$        |f      dt        j                         v st        j                  t$              rt        j                  t$              nddt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                   dt$         d      dz   d|iz  }t        t        j                  |            d}t&        j(                  }||v }|st        j                  d|fd ||f      d!t        j                         v st        j                  t&              rt        j                  t&              nd!t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd"z  }t        j                   d#      d$z   d%|iz  }t        t        j                  |            dx}}||v }|st        j                  d|fd||f      d&t        j                         v st        j                  |      rt        j                  |      nd&dt        j                         v st        j                  |      rt        j                  |      nddz  }t        j                   d'| d      dz   d|iz  }t        t        j                  |            d}d(}||v }|st        j                  d|fd)||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd*z  }t        j                   d+      dz   d|iz  }t        t        j                  |            dx}}d,}||v }|st        j                  d|fd)||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndd*z  }t        j                   d-      dz   d|iz  }t        t        j                  |            dx}}y).u   bridge request.argv 직렬화 문자열에 필수 필드 포함 확인.
    task_id / "PROVENANCE_ADOPTED"(terminal_status) / source_result_sha256 /
    "ANU"(collector_role) / "OWNER_ANU"(owner_proof) 가 argv join 문자열에 있어야 함.
    r   r   r   r   r   zN%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.captured
})
} == %(py8)sr   r   r   assert %(py10)sr   Nr   ri   r
   z%(py0)s is not %(py3)sr   r   u#   request.argv is None (FAIL 상태?)
>assert %(py5)sr    c              3  2   K   | ]  }t        |        y wrU   )r   ).0r`   s     r)   	<genexpr>z?test_bridge_payload_contains_required_fields.<locals>.<genexpr>*  s     -1A-s   inz%(py0)s in %(py2)sr%   argv_strr   r   z	task_id 'z' not in argv
>assert %(py4)sr   )zB%(py2)s
{%(py2)s = %(py0)s.VERDICT_PROVENANCE_ADOPTED
} in %(py4)srP   r   r   r   z2'PROVENANCE_ADOPTED' (terminal_status) not in argvz
>assert %(py6)sr   r   zsource_result_sha256 'ANUz%(py1)s in %(py3)sr   r   z"'ANU' (collector_role) not in argv	OWNER_ANUz%'OWNER_ANU' (owner_proof) not in argv)r{   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   joinr%   rP   r   )r<   r   r   r   r   r   r   r   r   r   r   ri   r   @py_format4@py_format6r  @py_format3@py_format5r   r   @py_assert0s                        r)   ,test_bridge_payload_contains_required_fieldsr    s   
 !"J%"/$HC ""(3"#(q(#q((((#q((((((3(((3((((((z(((z((("(((#(((q(((((((


a
 C3%DB4tBBB4tBBBBBB4BBB4BBBtBBBBBBBBBBxx---H hBBB7hBBBBBB7BBB7BBBBBBhBBBhBBBB)G9M BBBBBBB)) >)X5 >,=,=>)X > >7=v> >%=%=  > >4=I  > >4=I * > >7=v> >%=%= .6 > >4=I .6 > >,=,=
<> > >*=*=> >(?GGG3(GGGGGG3GGG3GGGGGG(GGG(GGGG4SEGGGGGGGB5HBBB5HBBB5BBBBBBHBBBHBBBBBBBBBBBK;("KKK;(KKK;KKKKKK(KKK(KKKK$KKKKKKKr(   c           	        t               }t        | |t        t        t        dd      \  }}|j                  }t        |      }d}||k(  }|s7t        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }t        j                  d
t        |j                         d      dz   d|iz  }	t        t        j                  |	            dx}x}x}}|j                  }
t         j"                  }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dz  }t        j                  d|j                        dz   d|iz  }t        t        j                  |            dx}
x}}y)u?  callback_owner_key == callback_executor_key (self-callback) → fire 0,
    callback_launch_verdict==BRIDGE_CALLBACK_OWNER_FAIL.
    실제 build_anu_owned_callback_request 를 경유하여 enforce 가 FAIL 내는지 검증.
    cron_id 는 valid 하게 주입하되 owner_key 가 self-key(non-ANU) 이므로 FAIL.
    r   r   r   r   r   r   r   r   r   u   self-key 케이스에서 fire    회 발생 (0 이어야 함)r   r   Nzo%(py2)s
{%(py2)s = %(py0)s.callback_launch_verdict
} == %(py6)s
{%(py6)s = %(py4)s.BRIDGE_CALLBACK_OWNER_FAIL
}r   rP   r   r   r   r   )r{   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   r   rP   BRIDGE_CALLBACK_OWNER_FAILr<   r   r   _r   r   r   r   r   r   r   r   r   r   s                 r)   test_bridge_self_key_failsr  6  s    !"J %,/$FC  ]3  ]A ] A% ] ]K\K\] A ] ]V\V\] ]D\D\  ] ]S\S\  ] ]V\V\] ]D\D\  ] ]S\S\  ] ]S\S\   ] ]S\S\ ! ] ]S\S\ %& ] ]K\K\
(Z-=-=)>(??[\] ] ]I\I\] ] ]&& C#*H*H C&*HH C C1B1BC&*H C C<BFC C*B*B  C C9B  C C9B ' C C<BFC C*B*B +. C C9B +. C C9B +I C C1B1B
"3#>#>"ABC C C/B/BC C Cr(   c           	        t               }t        | |t        t        t        dd      \  }}|j
                  }t        |      }d}||k(  }|s7t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }t        j                  d
t        |j
                         d      dz   d|iz  }	t        t        j                  |	            dx}x}x}}|j                   }
t"        j$                  }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dt        j                         v st        j                  t"              rt        j                  t"              ndt        j                  |      dz  }t        j                  d|j                         dz   d|iz  }t        t        j                  |            dx}
x}}y)u  callback_owner_key='deadbeef...'(비 ANU key) → fire 0, BRIDGE_CALLBACK_OWNER_FAIL.
    실제 build_anu_owned_callback_request 사용 — enforce 가 ANU 아닌 key 를 거부.
    cron_id 는 valid 하게 주입하되 owner_key 가 비-ANU 이므로 FAIL.
    r   r   r   r   r   r   r   r   r   u!   비 ANU key 케이스에서 fire r  r   r   Nr  r   rP   r   r   r   r   )r{   r   r   NON_ANU_KEYr   rp   r   r   r   r   r   r   r   r   r   r   r   rP   r  r  s                 r)   #test_bridge_non_anu_owner_key_failsr  P  s   
 !"J%&/$FC  `3  `A ` A% ` `N_N_` A ` `Y_Y_` `G_G_  ` `V_V_  ` `Y_Y_` `G_G_  ` `V_V_  ` `V_V_   ` `V_V_ ! ` `V_V_ %& ` `N_N_
+C
0@0@,A+BB^_` ` `L_L_` ` `&& C#*H*H C&*HH C C1B1BC&*H C C<BFC C*B*B  C C9B  C C9B ' C C<BFC C*B*B +. C C9B +. C C9B +I C C1B1B
"3#>#>"ABC C C/B/BC C Cr(   c           	        t               }t        | |dt        t        dd      \  }}|j                  }t        |      }d}||k(  }|s7t        j                  d|fd||f      dt        j                         v st        j                  t
              rt        j                  t
              ndd	t        j                         v st        j                  |      rt        j                  |      nd	t        j                  |      t        j                  |      t        j                  |      d
z  }t        j                  dt        |j                         d      dz   d|iz  }	t        t        j                  |	            dx}x}x}}|j                  }
t         j"                  }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dz  }t        j                  d|j                        dz   d|iz  }t        t        j                  |            dx}
x}}y)u  callback_launch_fn 주입 + owner_gate_fn=None → fail-closed: fire 0,
    callback_launch_verdict==BRIDGE_OWNER_GATE_BLOCKED.

    주의: process_one 의 task-2741-r2 MANDATORY fail-closed(envelope 경로) 는
    ADOPTED 분기(envelope 부재) 에서는 적용되지 않는다.
    bridge 내부의 fail-closed 검사(② 단계)로 BRIDGE_OWNER_GATE_BLOCKED 가 반환됨.
    Nr   r   r   r   r   r   r   r   r   u*   owner_gate_fn 부재 케이스에서 fire r  r   r   )zn%(py2)s
{%(py2)s = %(py0)s.callback_launch_verdict
} == %(py6)s
{%(py6)s = %(py4)s.BRIDGE_OWNER_GATE_BLOCKED
}r   rP   r   r   r   r   )r{   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   r   rP   BRIDGE_OWNER_GATE_BLOCKEDr  s                 r)   *test_bridge_owner_gate_missing_fail_closedr!  h  s    !"J%"/$FC  i3  iA i A% i iWhWhi A i ibhbhi iPhPh  i i_h_h  i ibhbhi iPhPh  i i_h_h  i i_h_h   i i_h_h ! i i_h_h %& i iWhWh
4S9I9I5J4KKghi i iUhUhi i i&& C#*G*G C&*GG C C1B1BC&*G C C<BFC C*B*B  C C9B  C C9B ' C C<BFC C*B*B +. C C9B +. C C9B +H C C1B1B
"3#>#>"ABC C C/B/BC C Cr(   c           	        t               }t        | |t        t        t        dd      \  }}|j
                  }t        |      }d}||k(  }|s7t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }t        j                  d
t        |j
                         d      dz   d|iz  }	t        t        j                  |	            dx}x}x}}|j                   }
t"        j$                  }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dt        j                         v st        j                  t"              rt        j                  t"              ndt        j                  |      dz  }t        j                  d|j                         dz   d|iz  }t        t        j                  |            dx}
x}}y)uO   owner_gate_fn 이 ready=False 결과 반환 → fire 0, BRIDGE_OWNER_GATE_FAIL.r   r   r   r   r   r   r   r   r   u   gate FAIL 케이스에서 fire r  r   r   Nzk%(py2)s
{%(py2)s = %(py0)s.callback_launch_verdict
} == %(py6)s
{%(py6)s = %(py4)s.BRIDGE_OWNER_GATE_FAIL
}r   rP   r   r   r   r   )r{   r   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   r   rP   BRIDGE_OWNER_GATE_FAILr  s                 r)   #test_bridge_owner_gate_fail_no_firer%    s    "J%"/$FC  ^3  ^A ^ A% ^ ^L]L]^ A ^ ^W]W]^ ^E]E]  ^ ^T]T]  ^ ^W]W]^ ^E]E]  ^ ^T]T]  ^ ^T]T]   ^ ^T]T] ! ^ ^T]T] %& ^ ^L]L]
)#j.>.>*?)@@\]^ ^ ^J]J]^ ^ ^&& C#*D*D C&*DD C C1B1BC&*D C C<BFC C*B*B  C C9B  C C9B ' C C<BFC C*B*B +. C C9B +. C C9B +E C C1B1B
"3#>#>"ABC C C/B/BC C Cr(   c           	        t               }t        | dt        t        t        dd      \  }}|j
                  }d}||u }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d	|j
                  d
      dz   d|iz  }t        t        j                  |            dx}x}}|j                  }t         j"                  }	||	k(  }|st        j                  d|fd||	f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |	      dz  }
t        j                  d|j                        dz   d|
iz  }t        t        j                  |            dx}x}}	y)u   callback_launch_fn=None (기본, 무회귀) → fire 0, callback_launch_verdict is None,
    verdict==PROVENANCE_ADOPTED 정상.
    Nr   r   r   isz?%(py2)s
{%(py2)s = %(py0)s.callback_launch_verdict
} is %(py5)sr   r   r   r   r       (None 이어야 함)
>assert %(py7)sr   r   r   rP   r   zverdict=r   r   )r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rg   rP   r   )r<   r   r   r  r   r   r   r  @py_format8r   r   r   s               r)   !test_bridge_off_when_no_launch_fnr.    s2    !"J "/$FC && X$ X&$. XFWFWX&$ X XQWQWX X?W?W  X XNWi  X XNWi ' X XNWi +/ X XFWFW
"3#>#>"AAVWX X XDWDWX X;; ##88 #;88 # #""#;8 # #"F# #
"
"  # #"  # #"  # #"F# #
"
"  # #"  # #" 9 # #""(3;;/"# # #""# # #r(   c                   t               }t               }t        | dz        }t        |       t	        |      }t        |       ddl}|j                  |j                               j                         t         d }fd}t        j                  t        |      fi dt        |      dt               dt        d	d
dt!               dt#               d|d|dt$        dt&        dt(        ddddddd|dddddd
}|j*                  }	t-        |	      }
d}|
|k(  }|s7t/        j0                  d|fd|
|f      d t3        j4                         v st/        j6                  t,              rt/        j8                  t,              nd d!t3        j4                         v st/        j6                  |      rt/        j8                  |      nd!t/        j8                  |	      t/        j8                  |
      t/        j8                  |      d"z  }t/        j:                  d#t-        |j*                         d$      d%z   d&|iz  }t=        t/        j>                  |            dx}	x}
x}}||v }|st/        j0                  d'|fd(||f      d)t3        j4                         v st/        j6                  |      rt/        j8                  |      nd)d*t3        j4                         v st/        j6                  |      rt/        j8                  |      nd*d+z  }t/        j:                  d,| d-|       d.z   d/|iz  }t=        t/        j>                  |            d}|j@                  }t        jB                  }||k(  }|st/        j0                  d|fd0||f      d1t3        j4                         v st/        j6                  |      rt/        j8                  |      nd1t/        j8                  |      d2t3        j4                         v st/        j6                  t              rt/        j8                  t              nd2t/        j8                  |      d3z  }d4d5|iz  }t=        t/        j>                  |            dx}x}}t        | d6z        }t        |       t	        |      }t        |       |j                  |j                               j                         }fd7}t        j                  t        |      fi dt        |      dt               dt        d	d
dt!               dt#               d|d|dt$        dt&        dt(        ddddddd|dddddd
}|j*                  }	t-        |	      }
d}|
|k(  }|s7t/        j0                  d|fd|
|f      d t3        j4                         v st/        j6                  t,              rt/        j8                  t,              nd d!t3        j4                         v st/        j6                  |      rt/        j8                  |      nd!t/        j8                  |	      t/        j8                  |
      t/        j8                  |      d"z  }t/        j:                  d8t-        |j*                         d9      d%z   d&|iz  }t=        t/        j>                  |            dx}	x}
x}}|j@                  }t        jD                  }||k(  }|st/        j0                  d|fd:||f      d;t3        j4                         v st/        j6                  |      rt/        j8                  |      nd;t/        j8                  |      d2t3        j4                         v st/        j6                  t              rt/        j8                  t              nd2t/        j8                  |      d3z  }t/        j:                  d<|j@                  d=      d>z   d5|iz  }t=        t/        j>                  |            dx}x}}y)?u   dedupe_seen set 양방향 검증.
    1) 처음 호출(빈 set) → fire 1회 + set 에 key 추가됨.
    2) 동일 set 두 번째 호출 → fire 0 + BRIDGE_DEDUPED.
    run1r   N:c                2    t        j                  d      S r   r   r   r   ro   sha1s      r)   
_prov_fn_1z6test_bridge_dedupe_skips_duplicate.<locals>._prov_fn_1  s    $$4HHr(   r?   r   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   u$   첫 번째 호출에서 fire 횟수 r   r   r   r  r  expected_dedupe_keydedupe_seenr  u   dedupe_seen 에 'u   ' 가 추가되지 않음. set=r  r   r   rec1rP   r   r   r   run2c                2    t        j                  d      S r   r   r3  s      r)   
_prov_fn_2z6test_bridge_dedupe_skips_duplicate.<locals>._prov_fn_2  s    $$4HHr(   u"   두 번째 호출 후 fire 횟수 u    != 1 (dedupe 실패)zc%(py2)s
{%(py2)s = %(py0)s.callback_launch_verdict
} == %(py6)s
{%(py6)s = %(py4)s.BRIDGE_DEDUPED
}rec2u#   두 번째 callback_launch_verdict=    (BRIDGE_DEDUPED 이어야 함)r   )#setr{   r=   rS   rK   r]   r   r   r   r   r%   rP   r   r   rs   r   r1   r   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   BRIDGE_DEDUPED)r<   r7  r   root1p1r   r6  r5  r8  r   r   r   r   r   r   r   r  r  r   r   r   root2p2_sha2r;  r=  r4  s                             @r)   "test_bridge_dedupe_skips_duplicaterF    s    uK "Jx&()Eu	u	BH>>"--/*446D$IQtf-I ??BZ #$ 	
 !% &- 67 ! &   # 0 %  "&  )!" #7#$ +G%& "'D.  L3  LA L A% L L:K:KL A L LEKVL L3K3K  L LBK)  L LEKVL L3K3K  L LBK)  L LBK)   L LBK) ! L LBK) %& L L:K:K
.s:3C3C/D.EUKL L L8K8KL L L +- ^L]L]^+ ^ ^W]W]^ ^E]E]  ^ ^T]T]  ^ ^W]W]^ ^E]E] #. ^ ^T]T] #. ^ ^L]L]
/00OP[}]^ ^ ^J]J]^ ^'';3+;+;;'+;;;;;'+;;;;;;;4;;;4;;;';;;;;;3;;;3;;;+;;;;;;;; x&()Eu	u	BHNN2==?+557EI ??BZ #$ 	
 !% &- 67 ! &   # 0 %  "&  )!" #7#$ +G%& "'D.  Z3  ZA Z A% Z ZHYHYZ A Z ZSYSYZ ZAYAY  Z ZPYPY  Z ZSYSYZ ZAYAY  Z ZPYPY  Z ZPYPY   Z ZPYPY ! Z ZPYPY %& Z ZHYHY
,S1A1A-B,CCXYZ Z ZFYFYZ Z Z'' n3+=+= n'+== n n\m\mn'+= n ngmgmn nUmUm  n ndmdm  n ndmdm ( n ngmgmn nUmUm ,/ n ndmdm ,/ n ndmdm ,> n n\m\m
-d.J.J-MMlmn n nZmZmn n nr(   c                   t               }t        | dz        }t        |       t        |      }t	        |       t        j                  t        |      t        |      t               t        dt               |t        t        t        
      }|j                  }t
        j                  }||k(  }|st!        j"                  d|fd||f      dt%        j&                         v st!        j(                  |      rt!        j*                  |      ndt!        j*                  |      dt%        j&                         v st!        j(                  t
              rt!        j*                  t
              ndt!        j*                  |      dz  }t!        j,                  d	|j                        d
z   d|iz  }	t/        t!        j0                  |	            dx}x}}|j2                  }
t5        |
      }d}||k(  }|s7t!        j"                  d|fd||f      dt%        j&                         v st!        j(                  t4              rt!        j*                  t4              nddt%        j&                         v st!        j(                  |      rt!        j*                  |      ndt!        j*                  |
      t!        j*                  |      t!        j*                  |      dz  }	t!        j,                  dt5        |j2                         d      dz   d|	iz  }t/        t!        j0                  |            dx}
x}x}}t               }t        | dz        }t        |       t        |      }t	        |       d }t        j                  t        |      t        |      t               t        dt               |t7               |t        t        t              }|j                  }t
        j                  }||k(  }|st!        j"                  d|fd||f      dt%        j&                         v st!        j(                  |      rt!        j*                  |      ndt!        j*                  |      dt%        j&                         v st!        j(                  t
              rt!        j*                  t
              ndt!        j*                  |      dz  }t!        j,                  d|j                        d
z   d|iz  }	t/        t!        j0                  |	            dx}x}}|j2                  }
t5        |
      }d}||k(  }|s7t!        j"                  d|fd||f      dt%        j&                         v st!        j(                  t4              rt!        j*                  t4              nddt%        j&                         v st!        j(                  |      rt!        j*                  |      ndt!        j*                  |
      t!        j*                  |      t!        j*                  |      dz  }	t!        j,                  dt5        |j2                         d      dz   d|	iz  }t/        t!        j0                  |            dx}
x}x}}y)uH  ADOPTED 아닌 분기(quarantine/invalid)에서는 bridge fire 가 없음 검증.

    케이스 A: provenance_path_enabled=False + envelope 없음 → QUARANTINE(owner_unprovable)
    케이스 B: provenance_fn 이 ok=False → QUARANTINE(provenance_fail)
    양쪽 모두 callback_launch_fn 이 0회 호출되어야 함.
    case_aF)	r?   r   r   r   r   r   r   r   r   r   )zW%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_QUARANTINE
}rec_arP   r   u   케이스A verdict=r   r   Nr   r   r   launch_spy_ar   u4   케이스A: owner_unprovable quarantine 에서 fire u
   회 발생r   r   case_bc                L    t        j                  dt         j                        S )NF)rh   reason)r   r   REASON_CAPSULE_SHA_MISMATCH)r   r   ro   s      r)   _prov_fn_failzGtest_bridge_not_called_on_quarantine_and_invalid.<locals>._prov_fn_fail6  s    $$d6V6VWWr(   T)r?   r   r   r   r   r   r   r   r   r   r   rec_bu   케이스B verdict=launch_spy_bu3   케이스B: provenance FAIL quarantine 에서 fire )r{   r=   rS   rK   r]   rP   r   r   rs   r   r1   r   r   r   rg   VERDICT_QUARANTINEr   r   r   r   r   r   r   r   r   rp   r   r   )r<   rJ  root_ap_arI  r   r   r   r   r   r   r   r   r   r   rQ  root_bp_brO  rP  s                       r)   0test_bridge_not_called_on_quarantine_and_invalidrW    s    #$L8+,Fv

CIOOC["$ %%-'"/E == 0C22 0=22 0 0//0=2 0 0)/0 0//  0 0&/i  0 0&/i  0 0)/0 0//   0 0&/i   0 0&/i 3 0 0//
emm./0 0 0//0 0!! c3!" ca c"a' c cQbQbc"a c c\b\bc cJbJb  c cYbYb  c c\b\bc cJbJb  c cYbYb  c cYbYb " c cYbYb # c cYbYb '( c cQbQb
>s<CUCU?V>WWabc c cObObc c c #$L8+,Fv

CIX OOC["$ $%-#57'"/E == 0C22 0=22 0 0//0=2 0 0)/0 0//  0 0&/i  0 0&/i  0 0)/0 0//   0 0&/i   0 0&/i 3 0 0//
emm./0 0 0//0 0!! b3!" ba b"a' b bPaPab"a b b[a[ab bIaIa  b bXaXa  b b[a[ab bIaIa  b bXaXa  b bXaXa " b bXaXa # b bXaXa '( b bPaPa
=c,BTBT>U=VV`ab b bNaNab b br(   c           	     <   t               }t        | |t        t        t        dd      \  }}|j
                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|j                   }t        j"                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}x}}|j$                  }	t'        |	      }
d}|
|k(  }|s
t        j                  d|fd|
|f      dt        j                         v st        j                  t&              rt        j                  t&              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |
      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}	x}
x}}y)u   bridge 결과(BRIDGE_OWNER_GATE_FAIL 등)가 record.verdict 를 바꾸지 않음.
    ADOPTED 분기에서 어떤 bridge 결과라도 verdict 는 항상 PROVENANCE_ADOPTED.
    r   r   r   r   r   r   rP   r   r   r   Nr#  r   r   r   r   r   r   r   )r{   r   r   r   r   rg   rP   r   r   r   r   r   r   r   r   r   r   r$  rp   r   )r<   r   r   r  r   r   r   r   r   r   r   r   r   r   s                 r)   @test_bridge_callback_launch_verdict_does_not_change_main_verdictrY  P  s   
 !"J%"/$FC ;;8#888;88888;888888838883888;888888#888#88888888888&&D#*D*DD&*DDDDD&*DDDDDDD3DDD3DDD&DDDDDD#DDD#DDD*DDDDDDDD%3 %A% A%%%% A%%%%%%3%%%3%%%%%%z%%%z%%%%%% %%%A%%%%%%%r(   c           	     <   t               }t        | |t        t        t        dd      \  }}|j
                  }t        |      }d}||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}x}x}}|j                  }
t         j"                  }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}|j$                  }
t         j&                  }|
|k(  }|st        j                  d|fd|
|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |
      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}
x}}y)uS   ADOPTED 분기에서 fire 가 정확히 1회(중복 없음) 발생함을 재확인.r   r   r   r   r   r   r   r   r   r   r   Nr   r   rP   r   r   r   r   )r{   r   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   rP   r   rg   r   r  s                 r)   (test_bridge_fires_exactly_once_not_twicer[  d  s    "J%"/$FC %3 %A% A%%%% A%%%%%%3%%%3%%%%%%z%%%z%%%%%% %%%A%%%%%%%&&:#*:*::&*:::::&*:::::::3:::3:::&::::::#:::#:::*::::::::;;8#888;88888;888888838883888;888888#888#88888888888r(   c                 $    g fd} | _         | S )uG   callback_launch_fn 이 예외를 raise 하는 spy (HIGH fix 검증용).c                <    j                  |        t        d      )Nzboom-2756 launch failure)rk   RuntimeError)rx   rn   ro   rp   s      r)   rz   z$make_raising_launch.<locals>._launch}  s    W566r(   rr   )rz   rp   s    @r)   make_raising_launchr_  y  s    E7 GMNr(   c           	        t               }t        | |t        t        t        dd      \  }}d}||u}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }d	d
|iz  }t        t        j                  |            dx}}|j                  }d}||u }	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j                  d|j                  d      dz   d|iz  }
t        t        j                  |
            dx}x}	}g }|j                  }	d}|	|u}|}|rd}|j                  }||v }|}|st        j                  d|fd|	|f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |	      t        j                  |      dz  }
dd|
iz  }|j!                  |       |rt        j                  dfdf      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }|j!                  |       t        j"                  |d      i z  }t        j                  d|j                  d      dz   d |iz  }t        t        j                  |            dx}x}x}	x}x}x}x}}|j$                  }t&        j(                  }||k(  }	|	st        j                  d!|	fd"||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      d#t        j                         v st        j                  t&              rt        j                  t&              nd#t        j                  |      d$z  }d%d&|iz  }t        t        j                  |            dx}x}	}|j*                  }t-        |      }d'}||k(  }|s
t        j                  d!|fd(||f      d)t        j                         v st        j                  t,              rt        j                  t,              nd)d*t        j                         v st        j                  |      rt        j                  |      nd*t        j                  |      t        j                  |      t        j                  |      d+z  }d,d-|iz  }t        t        j                  |            dx}x}x}}y).u  ★ HIGH: callback_launch_fn 이 예외 raise → driver crash 0.
    bridge_verdict(callback_launch_verdict)==None, DriverRecord.error 에 'callback launch 실패'
    라벨 기록(영구 누락 대신 관측 가능), verdict==PROVENANCE_ADOPTED 불변, launch 시도 1회.
    r   r   r   Nr
   r   r   r   assert %(py5)sr   r'  r)  r*  r   r+  r,  r      callback launch 실패z1%(py4)s
{%(py4)s = %(py2)s.error
} is not %(py7)sr   r   r   %(py9)sr   r  z1%(py12)s in %(py16)s
{%(py16)s = %(py14)s.error
}r   r   r   %(py18)spy18r   z
rec.error=u/    ('callback launch 실패' 포함되어야 함)z
>assert %(py21)spy21r   r   rP   r   r   r   r   r   r   raisingr   r   r   )r_  r   r   r   r   r   r   r   r   r   r   r   r   r   r   errorrk   _format_booloprg   rP   r   rp   r   )r<   rk  r   r   r   r   r  r  r   r   r-  r   r   r  @py_assert11@py_assert15@py_assert13@py_format10@py_format17@py_format19@py_format20@py_format22r   r   r   r   s                             r)   .test_bridge_launch_exception_graceful_no_crashrv    s6   
 "#G""/$IC 3d?3d33d&& $ &$.  &$              '    +/    #3#>#>"AAVW    399 D 9D  %=  %=%J   9D                  !     %=    &>      BE    BE    BK        SYYM!PQ       ;;8#888;88888;888888838883888;888888#888#88888888888}}"3}""""""""""""3"""3""""""w"""w"""}"""""""""""""r(   c           	        t               }t        | |t        t        t        dd      \  }}|j
                  }t        |      }d}||k(  }|s
t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }d
d|iz  }	t        t        j                  |	            dx}x}x}}|j
                  d   }
d}d}t        |
||      }d}||k(  }|sCt        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }	t        j                   dt        |
dd      d      dz   d|	iz  }t        t        j                  |            dx}x}x}x}}|j"                  }t$        j&                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t$              rt        j                  t$              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}y)u   ★ Medium-1: 실제 builder 경유 시 request.cron_id == normal_collector_cron_id 일관성.
    _run_adopted 는 callback_normal_collector_cron_id='normal-collector-cron-2756' 주입.r   r   r   r   r   r   r   r   r   r   r   Nr   cron_idr   r   r   r   r   zrequest.cron_id=uG    != 'normal-collector-cron-2756' (Medium-1 cron_id 일관성 미반영)r   r   r   r   rP   r   r   r   )r{   r   r   r   r   ry   r   r   r   r   r   r   r   r   r   r   r   r   rP   r   )r<   r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                     r)   'test_bridge_request_cron_id_consistencyry    s    !"J%"/$FC ""(3"#(q(#q((((#q((((((3(((3((((((z(((z((("(((#(((q(((((((


a
 C! 4 73	4( ,H (,HH   (,H                        "    $(    )    -I    73	48; <1 	1     
 &&:#*:*::&*:::::&*:::::::3:::3:::&::::::#:::#:::*::::::::r(   c                  " ddl }|j                  t        dd        t               }t	               }t        | dz        }t        |       t        |      }t        |       |j                  |j                               j                         "t         d" }"fd}t        dLi dt        |      d	t        d
ddt!               d|d|dt"        dt$        dt&        ddddddd|dddddd}	t        j(                  t        |      ft+               t-               d|	}
|j.                  }t1        |      }d}||k(  }|s7t3        j4                  d|fd ||f      d!t7        j8                         v st3        j:                  t0              rt3        j<                  t0              nd!d"t7        j8                         v st3        j:                  |      rt3        j<                  |      nd"t3        j<                  |      t3        j<                  |      t3        j<                  |      d#z  }t3        j>                  d$t1        |j.                         d%      d&z   d'|iz  }tA        t3        jB                  |            dx}x}x}}|
jD                  }t        jF                  }||k(  }|st3        j4                  d|fd(||f      d)t7        j8                         v st3        j:                  |
      rt3        j<                  |
      nd)t3        j<                  |      d*t7        j8                         v st3        j:                  t              rt3        j<                  t              nd*t3        j<                  |      d+z  }d,d-|iz  }tA        t3        jB                  |            dx}x}}g }|
jH                  }d}||u}|}|rd.}|
jH                  }||v }|}|st3        j4                  d/|fd0||f      d)t7        j8                         v st3        j:                  |
      rt3        j<                  |
      nd)t3        j<                  |      t3        j<                  |      d1z  }d2d3|iz  }|jK                  |       |rt3        j4                  d4fd5f      t3        j<                  |      d)t7        j8                         v st3        j:                  |
      rt3        j<                  |
      nd)t3        j<                  |      d6z  }d7d8|iz  }|jK                  |       t3        jL                  |d      i z  }d9d:|iz  }tA        t3        jB                  |            dx}x}x}x}x}x}x}}||v }|st3        j4                  d4|fd;||f      d<t7        j8                         v st3        j:                  |      rt3        j<                  |      nd<d=t7        j8                         v st3        j:                  |      rt3        j<                  |      nd=d>z  }d?d@|iz  } tA        t3        jB                  |             d}|jN                  } |       }|st3        j>                  dA      dBz   dCt7        j8                         v st3        j:                  |      rt3        j<                  |      ndCt3        j<                  |      t3        j<                  |      dDz  } tA        t3        jB                  |             dx}}t        j(                  t        |      ft+               t-               d|	}!|j.                  }t1        |      }d}||k(  }|s7t3        j4                  d|fd ||f      d!t7        j8                         v st3        j:                  t0              rt3        j<                  t0              nd!d"t7        j8                         v st3        j:                  |      rt3        j<                  |      nd"t3        j<                  |      t3        j<                  |      t3        j<                  |      d#z  }t3        j>                  dEt1        |j.                         dF      d&z   d'|iz  }tA        t3        jB                  |            dx}x}x}}|!jD                  }t        jP                  }||k(  }|st3        j4                  d|fdG||f      dHt7        j8                         v st3        j:                  |!      rt3        j<                  |!      ndHt3        j<                  |      d*t7        j8                         v st3        j:                  t              rt3        j<                  t              nd*t3        j<                  |      d+z  }t3        j>                  dI|!jD                  dJ      dKz   d-|iz  }tA        t3        jB                  |            dx}x}}y)Mu   ★ Medium-2: _move_processed 실패(move_err) 시 result inbox 보존 + 재처리 시
    dedupe 가 callback duplicate 0 보장. callback 은 write 성공 후·move 전에 fire 됨.
    r   N_move_processedc                      y)Nu%   processed move 실패: simulated-2756r'   r_   s     r)   r0   z=test_bridge_move_err_reprocess_no_duplicate.<locals>.<lambda>  rb   r(   c1r1  c                2    t        j                  d      S r   r   r   s      r)   _provz:test_bridge_move_err_reprocess_no_duplicate.<locals>._prov  r   r(   r?   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   zcycle1 fire r   r   r   r   r8  rP   r   r   r   u   processed move 실패r
   rc  rd  re  r   r  rf  rg  rh  ri  assert %(py21)srj  r  
dedupe_keyr7  r  zassert %(py4)sr   u4   move 실패 시 result 는 inbox 보존되어야 함C
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}rB  r	  u   재처리 후 fire u!    != 1 (callback duplicate 발생)r<  r=  zcycle2 callback_launch_verdict=r>  r   r'   ))r   setattrrP   r?  r{   r=   rS   rK   r]   r   r   r   r%   dictr   r   r1   r   r   r   r   rs   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   rl  rk   rm  existsr@  )#r<   monkeypatchr   r7  r   rA  rB  r  r  commonr8  r   r   r   r   r   r   r   r   r   r   r  rn  ro  rp  r-  rq  rr  rs  rt  ru  r  r  r=  r   s#                                     @r)   +test_bridge_move_err_reprocess_no_duplicater    s     ?
 uK "Jx$'Eu	u	BH
..
)
3
3
5C9AcU#JH  Z !% &-	
  &   # 0 %  "& ) #7 +G  "!F( ??B+-57;AD R3 RAR A%RRR ARRRRRR3RRR3RRRRRRzRRRzRRRRRR RRRARRRc*:J:J6K5LE'RRRRRRRR'';3+;+;;'+;;;;;'+;;;;;;;4;;;4;;;';;;;;;3;;;3;;;+;;;;;;;;K4::KTK:T!K&=KK&=&KKKKK:TKKKKKK4KKK4KKK:KKKTKKKKKKK&=KKK&=KKKKKKKKKKKKKKKKKKKKKKKKKK$$$$:$$$$$$:$$$:$$$$$$$$$$$$$$$$99N9;N;NNNNNNNNN2NNN2NNN9NNN;NNNNNN ??B+-57;AD  3  A  A%    A                             !    %&    c*"2"2344UV      '' 3+=+= '+==   '+=              (      ,/    ,/    ,>    *$*F*F)IIhi     r(   c                  # ddl }t               }t               }t        | dz        }t	        |       t        |      }t        |       |j                  |j                               j                         #t         d# }#fd}t        dSi dt        |      dt        dd	d
t               d|d|dt        dt         dt"        ddddddd|dddddd	}t%        j&                  t        |      ft)               t+               d|}	d}
|	|
u}|st-        j.                  d|fd|	|
f      dt1        j2                         v st-        j4                  |	      rt-        j6                  |	      ndt-        j6                  |
      dz  }d d!|iz  }t9        t-        j:                  |            dx}}
|	j<                  }d}||u }|st-        j.                  d"|fd#||f      dt1        j2                         v st-        j4                  |	      rt-        j6                  |	      ndt-        j6                  |      t-        j6                  |      d$z  }d%d&|iz  }t9        t-        j:                  |            dx}x}}g }|	j>                  }d}||u}|}|rd'}|	j>                  }||v }|}|st-        j.                  d|fd(||f      dt1        j2                         v st-        j4                  |	      rt-        j6                  |	      ndt-        j6                  |      t-        j6                  |      d)z  }d*d+|iz  }|jA                  |       |rt-        j.                  d,fd-f      t-        j6                  |      dt1        j2                         v st-        j4                  |	      rt-        j6                  |	      ndt-        j6                  |      d.z  }d/d0|iz  }|jA                  |       t-        jB                  |d      i z  }d1d2|iz  }t9        t-        j:                  |            dx}x}x}x}x}x}x}}|	jD                  }t$        jF                  }||k(  }|st-        j.                  d3|fd4||f      dt1        j2                         v st-        j4                  |	      rt-        j6                  |	      ndt-        j6                  |      d5t1        j2                         v st-        j4                  t$              rt-        j6                  t$              nd5t-        j6                  |      d6z  }d7d8|iz  }t9        t-        j:                  |            dx}x}}|jH                  }
tK        |
      }d9}||k(  }|s7t-        j.                  d3|fd:||f      d;t1        j2                         v st-        j4                  tJ              rt-        j6                  tJ              nd;d<t1        j2                         v st-        j4                  |      rt-        j6                  |      nd<t-        j6                  |
      t-        j6                  |      t-        j6                  |      d=z  }t-        jL                  d>tK        |jH                         d?      d@z   dA|iz  }t9        t-        j:                  |            dx}
x}x}}|jN                  } |       }|st-        jL                  dB      dCz   dDt1        j2                         v st-        j4                  |      rt-        j6                  |      ndDt-        j6                  |      t-        j6                  |      dEz  } t9        t-        j:                  |             dx}}||v}|st-        j.                  dF|fdG||f      dHt1        j2                         v st-        j4                  |      rt-        j6                  |      ndHdIt1        j2                         v st-        j4                  |      rt-        j6                  |      ndIdJz  }!t-        jL                  dK      dLz   dM|!iz  } t9        t-        j:                  |             d}t%        j&                  t        |      ft)               t+               d|}"|jH                  }
tK        |
      }dN}||k(  }|s7t-        j.                  d3|fd:||f      d;t1        j2                         v st-        j4                  tJ              rt-        j6                  tJ              nd;d<t1        j2                         v st-        j4                  |      rt-        j6                  |      nd<t-        j6                  |
      t-        j6                  |      t-        j6                  |      d=z  }t-        jL                  dOtK        |jH                         dP      d@z   dA|iz  }t9        t-        j:                  |            dx}
x}x}}|"j<                  }d}||u }|st-        j.                  d"|fd#||f      dQt1        j2                         v st-        j4                  |"      rt-        j6                  |"      ndQt-        j6                  |      t-        j6                  |      d$z  }d%d&|iz  }t9        t-        j:                  |            dx}x}}|jN                  } |       }|st-        jL                  dR      dCz   dDt1        j2                         v st-        j4                  |      rt-        j6                  |      ndDt-        j6                  |      t-        j6                  |      dEz  } t9        t-        j:                  |             dx}}y)Tu   ★ HIGH fix①: callback_launch_fn 예외 → result inbox 보존(move 0) + 다음 cycle
    재처리(재시도) 가능 + dedupe 미기록. _move_processed 는 mock 하지 않는다(실제 move 경로 검증).
    r   Nx1r1  c                2    t        j                  d      S r   r   r   s      r)   r  zHtest_bridge_launch_exception_preserves_result_and_retries.<locals>._prov  r   r(   r?   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
   r   r8  r   ra  r   r'  r)  r*  zassert %(py7)sr   rb  rc  rd  re  r   r  rf  rg  rh  ri  r  rj  r   r   rP   r   r   r   r   r   r   rk  r   u   cycle1 launch 시도 r   r   r   uM   callback 실패 시 result 는 inbox 에 보존되어야 함(영구 누락 0)r  rB  r	  not in)z%(py0)s not in %(py2)sr  r7  r  u1   callback 실패 시 dedupe 미기록이어야 함r  r   r   uC   재처리 시 callback 재시도가 일어나야 함(누적 launch z != 2)r=  u'   재처리 후에도 result inbox 보존r'   )(r   r?  r_  r=   rS   rK   r]   r   r   r   r%   r  r   r   r1   r   r   r   rP   r   rs   r   r   r   r   r   r   r   r   r   r   rl  rk   rm  rg   r   rp   r   r   r  )$r<   r   r7  rk  rA  rB  r  r  r  r8  r   r   r  r  r   r   r-  r   r   r  rn  ro  rp  rq  rr  rs  rt  ru  r   r   r   r   r  r  r=  r   s$                                      @r)   9test_bridge_launch_exception_preserves_result_and_retriesr    ss    uK!#Gx$'Eu	u	BH
..
)
3
3
5C9AcU#JH  Z !% &-	
  #   # 0 %  "& ) #7 +G  "!F( ??B+-57;AD 4t4t44t''/4/'4////'4//////4///4///'///4///////L4::LTL:T!L&>L$**L&>*&LLLLL:TLLLLLL4LLL4LLL:LLLTLLLLLLL&>*LLL&>LLLLLL$LLL$LLL*LLLLLLLLLLLLLL<<93999<99999<999999949994999<9999993999399999999999}}U3}UU"UUUUUUUUU3UUU3UUUUUUwUUUwUUU}UUUUUUUUU&;C<N;Ou$UUUUUUUU99g9;g;ggggggggg2ggg2ggg9ggg;gggggg[(]]]:[]]]]]]:]]]:]]]]]][]]][]]]]*]]]]]]] ??B+-57;AD }} 3}  "                                   "#    NcRYR_R_N`Maagh      ''/4/'4////'4//////4///4///'///4///////99A9;A;AAAAAAAAA2AAA2AAA9AAA;AAAAAAr(   c                    ddl }d }t               }t               }t        | dz        }t	        |       t        |      }t        |       |j                  |j                               j                           fd}t        j                  t        |      fi dt        |      dt               dt        d	d
dt               d|dt!               d|d|dt"        dt$        ddddddd|dddddd
}d}	||	u}
|
st'        j(                  d|
fd||	f      dt+        j,                         v st'        j.                  |      rt'        j0                  |      ndt'        j0                  |	      d z  }d!d"|iz  }t3        t'        j4                  |            dx}
}	|j6                  }	t9        |	      }d}||k(  }|s7t'        j(                  d#|fd$||f      d%t+        j,                         v st'        j.                  t8              rt'        j0                  t8              nd%d&t+        j,                         v st'        j.                  |      rt'        j0                  |      nd&t'        j0                  |	      t'        j0                  |      t'        j0                  |      d'z  }t'        j:                  d(t9        |j6                         d)      d*z   d+|iz  }t3        t'        j4                  |            dx}	x}x}}|j<                  }
t        j>                  }|
|k(  }|st'        j(                  d#|fd,|
|f      dt+        j,                         v st'        j.                  |      rt'        j0                  |      ndt'        j0                  |
      d-t+        j,                         v st'        j.                  t              rt'        j0                  t              nd-t'        j0                  |      d.z  }t'        j:                  d/|j<                        d0z   d1|iz  }t3        t'        j4                  |            dx}
x}}g }
|j@                  }d}||u}|}|rd2}|j@                  }||v }|}|st'        j(                  d|fd3||f      dt+        j,                         v st'        j.                  |      rt'        j0                  |      ndt'        j0                  |      t'        j0                  |      d4z  }d5d6|iz  }|
jC                  |       |rt'        j(                  d7fd8f      t'        j0                  |      dt+        j,                         v st'        j.                  |      rt'        j0                  |      ndt'        j0                  |      d9z  }d:d;|iz  }|
jC                  |       t'        jD                  |
d      i z  }d<d=|iz  }t3        t'        j4                  |            dx}x}
x}x}x}x}x}}|jF                  }
t        jH                  }|
|k(  }|st'        j(                  d#|fd>|
|f      dt+        j,                         v st'        j.                  |      rt'        j0                  |      ndt'        j0                  |
      d-t+        j,                         v st'        j.                  t              rt'        j0                  t              nd-t'        j0                  |      d.z  }d?d1|iz  }t3        t'        j4                  |            dx}
x}}|jJ                  }
 |
       }|st'        j:                  d@      dAz   dBt+        j,                         v st'        j.                  |      rt'        j0                  |      ndBt'        j0                  |
      t'        j0                  |      dCz  }t3        t'        j4                  |            dx}
}t9        |      }	d}|	|k(  }|st'        j(                  d#|fdD|	|f      d%t+        j,                         v st'        j.                  t8              rt'        j0                  t8              nd%dEt+        j,                         v st'        j.                  |      rt'        j0                  |      ndEt'        j0                  |	      t'        j0                  |      dFz  }d?d1|iz  }t3        t'        j4                  |            dx}	x}}y)Gu   ★ fix④: owner_gate_fn 예외 → fail-closed(fire 0·crash 0), BRIDGE_OWNER_GATE_FAIL,
    error 라벨 관측, verdict 불변, result inbox 보존(bridge_err → move 0).
    r   Nc                    t        d      )Nzgate-boom-2756)r^  r   s     r)   gate_raiseszAtest_bridge_owner_gate_exception_fail_closed.<locals>.gate_raisesN  s    +,,r(   g1c                2    t        j                  d      S r   r   r   s      r)   r  z;test_bridge_owner_gate_exception_fail_closed.<locals>._provZ  r   r(   r?   r   r   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r   r   r   ra  r   r   r   r   r   r   u   gate 예외 시 fire z != 0r   r   r#  rP   r   r   r   r   u   owner_gate 예외rc  rd  re  r   r  rf  rg  rh  ri  r  rj  r   r   u/   gate 예외(bridge_err) 시 result inbox 보존r  rB  r	  z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr7  r   r   r   r   )&r   r?  r{   r=   rS   rK   r]   r   r   r   rP   r   r   rs   r   r1   r   r   r   r   r   r   r   r   r   r   r   rp   r   r   r   r$  rl  rk   rm  rg   r   r  )!r<   r   r  r7  r   rA  rB  r  r   r   r   r  r  r   r   r   r   r   r   r   r   r  rn  ro  rp  r-  rq  rr  rs  rt  ru  r  r   s!                                   @r)   ,test_bridge_owner_gate_exception_fail_closedr  H  s    - uK "Jx$'Eu	u	BH
..
)
3
3
5CH //BZ #$ 	
 !% &-  67 & " # 0 %  "&  )!" #7#$ +G%& "'C, 3d?3d33d[3 [A[ A%[[[ A[[[[[[3[[[3[[[[[[z[[[z[[[[[[ [[[A[[[)>s:CSCS?T>UUZ'[[[[[[[[&& #*D*D &*DD   &*D              '      +.    +.    +E    #3#>#>"AB     F399EDE9D E%8ECIIE%8I%EEEEE9DEEEEEE3EEE3EEE9EEEDEEEEEEE%8IEEE%8EEEEEECEEECEEEIEEEEEEEEEEEEEE;;8#888;88888;888888838883888;888888#888#8888888888899I9;I;IIIIIIIII2III2III9III;IIIIII{ q q    q      3   3      {   {      q       r(   c           
     8   t               }t               }t        | dz  |t        t        t
        dd|      \  }}|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }d
d|iz  }	t        t        j                   |	            dx}x}}t"         d| }
|
|v }|st        j                  d|fd|
|f      t        j                  |
      dt        j                         v st        j                  |      rt        j                  |      nddz  }t        j$                  d      dz   d|iz  }t        t        j                   |            dx}
}t               }t               }t        | dz  |t&        t        t
        dd|      \  }}|j                  }t        j(                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }d
d|iz  }	t        t        j                   |	            dx}x}}t+        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t*              rt        j                  t*              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        j$                  d      dz   d|iz  }	t        t        j                   |	            dx}x}}t               }t               }t        | dz  |t        t,        t
        dd|      \  }}|j                  }t        j.                  }||k(  }|st        j                  d|fd ||f      d!t        j                         v st        j                  |      rt        j                  |      nd!t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d	z  }d
d|iz  }	t        t        j                   |	            dx}x}}t+        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t*              rt        j                  t*              ndd"t        j                         v st        j                  |      rt        j                  |      nd"t        j                  |      t        j                  |      dz  }t        j$                  d#      dz   d|iz  }	t        t        j                   |	            dx}x}}y)$u   ★ fix②: callback launch 성공(BRIDGE_FIRED) 시에만 dedupe 기록. 실패 경로
    (gate FAIL / owner FAIL)에서는 dedupe 미기록.
    rh   r   r   r   r   r   r   r   r   r   r   r   rec_okrP   r   r   r   Nr1  r  r  	dedupe_okr  u%   성공 시 dedupe 기록되어야 함r   r   failr#  rec_failr   r  r   dedupe_failr  u+   gate FAIL 시 dedupe 미기록이어야 함r   ownerr  	rec_ownerdedupe_owneru,   owner FAIL 시 dedupe 미기록이어야 함)r?  r{   r   r   r   r   r   rP   r   r   r   r   r   r   r   r   r   r%   r   r   r$  r   r  r  )r<   r  	launch_okr  sha_okr   r   r   r   r   r  r   r  r  r  launch_failr  r  r   r  launch_ownerr  s                         r)   +test_bridge_dedupe_recorded_only_on_successr    s4   
 UI!I!4$"/$&	NFF ))=S-=-==)-=====)-=======6===6===)======S===S===-========Yax V I-VVV IVVV VVVVVVIVVVIVVVV/VVVVVVV uK!#K6&"/$(	KHa ++Is/I/II+/IIIII+/IIIIIII8III8III+IIIIIIsIIIsIII/IIIIIIII{OqOq OOOqOOOOOO3OOO3OOOOOO{OOO{OOOOOOqOOO"OOOOOOOO L"$L7'&/$)	LIq ,,N0N0NN,0NNNNN,0NNNNNNN9NNN9NNN,NNNNNNNNNNNN0NNNNNNNN|QQ!QQQQQQQQQ3QQQ3QQQQQQ|QQQ|QQQQQQQQQ#QQQQQQQQr(   c           
        t        j                  d      }|j                  d       |j                  d       |j                  d       g }d}||v }|}|rd}||v }|}|rd}||v }	|	}|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndd	z  }
d
d|
iz  }|j                  |       |rt        j                  dfd|f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       |rt        j                  d	fd|f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}	t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}|j                  d       t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      dz  }t        j                  dt        |             d z   d|iz  }t        t        j                  |            dx}x}}d}||v}|st        j                  d!|fd"||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndd#z  }t        j                  d$      d%z   d&|iz  }
t        t        j                  |
            dx}}g }d}||v }|}|rd}||v }|}|rd}||v }	|	}|st        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      ndd	z  }
d
d|
iz  }|j                  |       |rt        j                  d|fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       |rt        j                  d|	fd||f      t        j
                  |      dt        j                         v st        j                  |      rt        j
                  |      nddz  }dd|iz  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}x}}	t        d'      D ]  }|j                  d(|         t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j
                  t              nddt        j                         v st        j                  |      rt        j
                  |      ndt        j
                  |      t        j
                  |      dz  }t        j                  d)t        |             d z   d|iz  }t        t        j                  |            dx}x}}t        j                  d*      }t!               }t#        | d+z  |t$        t&        t(        d,d-|.      \  }}|j*                  }t         j,                  }||k(  }|st        j                  d|fd/||f      d0t        j                         v st        j                  |      rt        j
                  |      nd0t        j
                  |      d1t        j                         v st        j                  t               rt        j
                  t               nd1t        j
                  |      d2z  }dd|iz  }t        t        j                  |            dx}x}}t.         d3| }||v }|st        j                  d|fd4||f      t        j
                  |      d+t        j                         v st        j                  |      rt        j
                  |      nd+d#z  }d5d&|iz  }
t        t        j                  |
            dx}}y)6u   ★ fix⑤: _BoundedDedupeSet 가 maxlen 초과 시 가장 오래된 키부터 evict(무한 증가 0).
    build_callback_dedupe_seen 헬퍼로 생성. bridge 와 동일 인터페이스(in, add) 동작 확인.
       )maxlenk1k2k3r  )z%(py3)s in %(py5)ss)r   r   r   r   )z%(py10)s in %(py12)s)r   r   z%(py14)sr   )z%(py17)s in %(py19)s)py17r   z%(py21)srj  r   zassert %(py24)spy24Nr   r  r   r  r   r   k4u   maxlen 상한 위반: len=r   r  )z%(py1)s not in %(py3)sr  u/   가장 오래된 키(k1)가 evict 되어야 함r   r   d   zbulk-u8   대량 추가 후에도 상한 유지되어야 함: len=   boundedr   r   r  r   r   rP   r   r1  r  ra  )rP   build_callback_dedupe_seenaddr   r   r   r   r   r   rk   rm  r   r   r   r   ranger{   r   r   r   r   r   r   r%   )r<   r  r   r   r   r  r   rn  @py_assert16@py_assert18r  r-  r   @py_format15rt  ru  @py_format23@py_format25r   r   r   r  ir  r   r   r   r   s                               r)   %test_bounded_dedupe_set_evicts_oldestr    s    	&&a0AEE$KEE$KEE$K040419000t0tqy000041000400000010001000000000000000000000000000tq000t000000q000q000000000000000q6Q6Q;6Q33qq6QEE$Kq6=Q=6Q;===6Q======3===3======q===q===6===Q===4SVH========K4q=KKK4qKKK4KKKKKKqKKKqKKKKKKKKKKK040419000t0tqy000041000400000010001000000000000000000000000000tq000t000000q000q0000000000000003Z 	aSkq6[Q[6Q;[[[6Q[[[[[[3[[[3[[[[[[q[[[q[[[6[[[Q[[[RSVWXSYRZ[[[[[[[[ ,,A6G "J9%"/$$	HC &&:#*:*::&*:::::&*:::::::3:::3:::&::::::#:::#:::*::::::::Yau((((((((((((((((((((((((r(   )returnr  )r<   r   r  r   )r?   r   r  r   )NN)r?   r   r  None)g      $@)r[   floatr  r  )re   )rg   r   )r   r   r   r   r   r   r   r   )or   
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   rF   rX   sysrW   rV   rl   pathlibr   r   resolver7   _ROOTr   rZ   insertimportlib.utilutil_ilu
_real_initmodulesget_cachedr   list
startswith_kspec_from_file_locationr   r   r   r   r  loader@py_assert10rp  @py_assert12r   r   r   r   r  r-  rk   r  rr  rm  @py_format18rt  r   r   module_from_spec_pkgexec_moduler   r   rP   r   r    dispatch.callback_owner_enforcerr   _ANU_KEYr   __annotations__r%   r&   r   r  r*   r1   r=   r@   rK   rS   r]   r   rs   r{   r   r   r   r   r   r   r   r  r  r  r!  r%  r.  rF  rW  rY  r[  r_  rv  ry  r  r  r  r  r  )ra   s   0r)   <module>r     s`   #    	 
    	X ((+u:SXXHHOOAs5z" Z-/

++//*
%
?ww
B7=2#j/Qs{{+\QqJ!,,{B[q\ KKO(D((JC
@R<S;TE :9599T9T!9999599999599959999999999T9999999999999T9999999999999 4  'D"CKK
	LLT" - 4 F   ,  	 #+ L
4E&
 !	# #& &  !#8
 8 8 8 8@9FLDC4C0C6C*#4Ynz<bB&(9*	#B;2AP>BB5!p2Rj")e ]s   !N=N