
    G,>jS                       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m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j6                  j9                  d      Ze eed	d
      xs d
 ee      k7  r eej6                        D  cg c]  } | dk(  s| jA                  d      s|  c} D ]  Z!ej6                  e!=   ejD                  de eedz        g      Z#g Z$dZ%e#e%uZ&e&Z'e&re#jP                  Z)dZ*e)e*uZ+e+Z'e'sB ejX                  de&fde#e%f      d ejZ                         v s ej\                  e#      r ej^                  e#      nd ej^                  e%      dz  Z0dde0iz  Z1e$je                  e1       e&r ejX                  de+fde)e*f      d ejZ                         v s ej\                  e#      r ej^                  e#      nd ej^                  e)       ej^                  e*      dz  Z3dde3iz  Z4e$je                  e4        ejj                  e$d      i z  Z6dde6iz  Z7 e8 ejr                  e7            dxZ'xZ$xZ&xZ%xZ)xZ+Z* ejt                  e#      Z;e;ej6                  d<   e#jP                  jy                  e;       dEdZ= e=dd        e=dd        e=dd        e=d d!        e=d"d#      Z> e=d$d%      Z?d&Z@e@fZAd'ZBdFd)ZCd* ZDd+ ZEdGd-ZFd,d.d/ZGeDdd0d0d(eBdd1d2ZHd3 ZId4 ZJd5 ZKd6 ZLd7 ZMd8 ZNd9 ZOd: ZPd; ZQd< ZRd= ZSd> ZTd? ZUd@ ZVdA ZWdB ZXdC ZYdD ZZyc c} w )Hu  task-2774+13 normal callback delivery real launcher wiring 회귀 테스트.

검증: dispatch.anu_callback_launch_audit.launch_callback_for_closeout 의 gated real-fire
결선. default OFF(surface-only) 보존 + activation_intent/canary_only/ACTIVE flag/self-key/
dedupe/owner-proof/governor 게이트별 real fire 0 증명 + raw key redaction.

절대 제약: 이 1개 파일만 신규 생성. ANU key literal 0(fake key 만). tmp_path 만. 실 cron/
subprocess/network 0.
    )annotationsNPath)mock   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py14%(py16)spy16assert %(py19)spy19c                r   | t         j                  v rt         j                  |    S t        j                  j	                  | t
        |z        }g }d }||u}|}|r|j                  }d }||u}	|	}|slt        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  }|j                  |       |rt        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                  |       t        j                  |d      i z  }dd|iz  }t        t        j                   |            d x}x}x}x}x}x}	}t        j                  j#                  |      }|t         j                  | <   |j                  j%                  |       |S )Nr   r   specr   r   r   r   r   r   r   r   r   r   )sysmodules	importlibutilspec_from_file_location_ROOTloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationmodule_from_specexec_module)modnamerelpathr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                    R/home/jay/workspace/tests/regression/test_normal_callback_real_launcher_2774p13.py_loadrD   '   sI   #++{{7##>>11'57?KD7t74t77474 777774t77777747774777t77777774777777777777777477777777777777
..
)
)$
/CCKKKKC J    z dispatch.callback_owner_enforcerz#dispatch/callback_owner_enforcer.pyz(dispatch.normal_fallback_callback_helperz+dispatch/normal_fallback_callback_helper.pyz'dispatch.anu_owned_callback_enforcementz*dispatch/anu_owned_callback_enforcement.pyzdispatch.anu_collector_resultz dispatch/anu_collector_result.pyz!dispatch.anu_result_pickup_runnerz$dispatch/anu_result_pickup_runner.pyz"dispatch.anu_callback_launch_auditz%dispatch/anu_callback_launch_audit.py FAKEANUKEY0000000000000000000000zdev-self-key-foreign-xyztask-canary13c                z    | | dz  }|j                  t        j                  |dd      d       t        |      S )Nz.result.jsonRESULT_JSON_WRITTEN)task_idcompletion_signalutf-8encoding)
write_textjsondumpsstr)tmp_pathrJ   ps      rC   _write_resultrU   A   sA    gYl++ALLF[\]!  #q6MrE   c                      y)Nenabled rX   rE   rC   _flag_onrY   H   s    rE   c                      y)Nr
   rX   rX   rE   rC   	_flag_offr[   L   s    rE   Tc                "     g  fd}|fS )Nc                F    j                  t        |              dddS )NTspawnedcron_registeredcallback_evidenceschedule_idr-   list)argvcallsr`   rb   s    rC   _fnz_fire_spy.<locals>._fnS   s)    T$Z O%)+G 	GrE   rX   )r`   rb   rg   rf   s   `` @rC   	_fire_spyrh   P   s    EG
 #:rE   okc                ,      G  fdd      fd}|S )uQ   anu_runner_pickup_and_fire 대체 stub — fake key 포함 argv 반환(rr.ok=ok).c                      e Zd Z fdZy)_stub_runner_fire.<locals>._RRc           
     T    | _         rddddddddt        d	g
nd | _        g | _        y )
Ncokacdir--cronzenvelope-promptz--atz2026-01-01 00:00:00--chat
6937032012--key--once)rj   FAKE_ANUre   reasons)selfrj   s    rC   __init__z'_stub_runner_fire.<locals>._RR.__init__^   sB    DG ;= %h0A "7<!8X7BF I DLrE   N)__name__
__module____qualname__rx   ri   s   rC   _RRrm   ]   s    	rE   r|   c                             S NrX   )kwargsr|   s    rC   _firez _stub_runner_fire.<locals>._firee   s
    urE   rX   )rj   r   r|   s   ` @rC   _stub_runner_firer   [   s      LrE   F)flag_readerreal_launch_fnactivation_intentcanary_onlyrJ   executor_key
audit_pathc                   t        | |      }|xs t        | dz        }	t        j                  ||d|ddd|	|t        d t        d      |||	      S )
u   공통 호출 헬퍼.)rJ   audit.jsonlsha256-test-canary13r
   Fc                     t         S r~   ru   rX   rE   rC   <lambda>z_call.<locals>.<lambda>|       x rE   Tri   )rJ   sha256r   rb   terminal_intentrelay_requiredr   r   anu_keysanu_key_loaderrunner_fire_fnr   r   r   )rU   rR   auditlaunch_callback_for_closeout	FAKE_KEYSr   )
rS   r   r   r   r   rJ   r   r   result_json_path_audits
             rC   _callr   k   so     %Xw?83x-78F--%!'(D1%+ .  rE   c                	   t        | dt              }|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                  }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  }dd|iz  }	t        t        j                  |	            dx}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  }dd|iz  }	t        t        j                  |	            dx}x}}t        j                  }|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t        j                  |      dz  }dd	|iz  }t        t        j                  |            dx}x}}|j                  }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t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}}y)uI   real_launch_fn=None → LAUNCH_ENFORCED(surface-only). argv 는 redacted.N)r   r   ==)zT%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.LAUNCH_ENFORCED
}resultr   py0r   py4py6assert %(py8)spy8Tisz*%(py2)s
{%(py2)s = %(py0)s.ok
} is %(py5)sr   r   r   assert %(py7)sr   r   z0%(py2)s
{%(py2)s = %(py0)s.argv
} is not %(py5)sinz_%(py2)s
{%(py2)s = %(py0)s.CALLBACK_ARGV_KEY_PLACEHOLDER
} in %(py6)s
{%(py6)s = %(py4)s.argv
}not inz0%(py0)s not in %(py4)s
{%(py4)s = %(py2)s.argv
}ru   r   r   r   assert %(py6)sr   )r   rY   verdictr   LAUNCH_ENFORCEDr'   r(   r)   r*   r+   r,   r/   r0   rj   re   CALLBACK_ARGV_KEY_PLACEHOLDERru   )rS   r   r5   @py_assert5r7   @py_format7@py_format9r6   r<   r=   @py_format5s              rC   test_default_off_surface_onlyr      s   8DhGF>>2U222>22222>222222262226222>222222U222U222222222229999669;;"d";d"""";d""""""6"""6""";"""d"""""""..=&++=.+====.+======5===5===.======&===&===+=======!;;&8;&&&&8;&&&&&&8&&&8&&&&&&6&&&6&&&;&&&&&&&rE   c                   t               \  }}t        | |ddt              }|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}
}g }|j                   }|}	|sg }|}	t"        |	v}|sDddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }|j%                  |       |s+ddt        j                        iz  }|j%                  |       t        j&                  |d      i z  }t        j                  d|fdt"        |	f      dt        j                         v st        j                  t"              rt        j                  t"              nd|dz  }dd|iz  }t        t        j                  |            dx}x}	x}x}}y)uC   activation_intent=False → LAUNCH_REAL_FIRE_BLOCKED; spy calls==0.FTr   r   r   r   r   z]%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.LAUNCH_REAL_FIRE_BLOCKED
}r   r   r   r   r   Nr   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)slenrf   r   py1py3r   u(   real fire 0(activation_intent 미충족)
>assert %(py8)sz!%(py6)s
{%(py6)s = %(py4)s.argv
})r   r   z%(py9)sr      r   )z%(py0)s not in (%(py12)s)ru   )r   py12zassert %(py14)sr   )rh   r   rY   r   r   LAUNCH_REAL_FIRE_BLOCKEDr'   r(   r)   r*   r+   r,   r/   r0   r   _format_assertmsgre   ru   r-   r.   )rS   rf   spyr   r5   r   r7   r   r   @py_assert2r6   @py_assert8@py_format10@py_format11@py_format13r>   s                   rC   4test_real_launch_fn_but_no_activation_intent_blockedr      s   JE38C5VZ')F>>;U;;;>;;;;;>;;;;;;;6;;;6;;;>;;;;;;U;;;U;;;;;;;;;;;u:FF:?FFF:FFFFFF3FFF3FFFFFFuFFFuFFF:FFFFFFFFFFFFFF.FKK.K.K2.2.8........F...F...K....K...2.........8......8...8........rE   c                   t               \  }}t        | |ddt              }|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(  }
|
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}
}y)u9   canary_only=False → LAUNCH_REAL_FIRE_BLOCKED; calls==0.TFr   r   r   r   r   r   r   r   Nr   r   r   rf   r   )rh   r   rY   r   r   r   r'   r(   r)   r*   r+   r,   r/   r0   r   rS   rf   r   r   r5   r   r7   r   r   r   r6   s              rC   .test_real_launch_fn_but_no_canary_only_blockedr      sC   JE38C4UZ')F>>;U;;;>;;;;;>;;;;;;;6;;;6;;;>;;;;;;U;;;U;;;;;;;;;;;u::?:33uu:rE   c                   t        dd      \  }}t        | |ddt              }|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}
}|d   }	t         |	v }|st        j                  d|fdt         |	f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |	      dz  }t        j                  d      dz   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  }dd |iz  }t        t        j                  |            dx}x}}
|j"                  }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t        j                  |      d#z  }t        j                  d$      d%z   d&|iz  }t        t        j                  |            dx}}t        j$                  }|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t        j                  |      d	z  }d
d|iz  }t        t        j                  |            dx}x}}|j&                  }d}
||
k(  }|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  }t        t        j                  |            dx}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  }dd |iz  }t        t        j                  |            dx}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  }dd |iz  }t        t        j                  |            dx}x}}
y),uX   모든 게이트 충족 → LAUNCH_REAL_FIRED; spy 정확히 1회; result.argv redacted.Tsched-mock-13r`   rb   r   r   zV%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.LAUNCH_REAL_FIRED
}r   r   r   r   r   Nr   r   r   rf   r   u   spy 정확히 1회 호출r   r   r   )z%(py0)s in %(py3)sru   r   r   u(   real key 는 fire boundary 에만 전달
>assert %(py5)sr   r   r   r   r   r   r   r   r   u!   result.argv 에 raw key 미노출z
>assert %(py6)sr   r   z3%(py2)s
{%(py2)s = %(py0)s.schedule_id
} == %(py5)sr   z;%(py2)s
{%(py2)s = %(py0)s.real_fire_attempted
} is %(py5)sr   )rh   r   rY   r   r   LAUNCH_REAL_FIREDr'   r(   r)   r*   r+   r,   r/   r0   r   r   ru   re   r   rb   real_fire_attemptedrj   )rS   rf   r   r   r5   r   r7   r   r   r   r6   @py_format4r<   r=   r   s                  rC   test_full_gates_fires_oncer      s   4_MJE38C4UY')F>>4U444>44444>444444464446444>444444U444U44444444444u:77:?777:77777737773777777u777u777:77777777777777QxK8xKKK8xKKKKKK8KKK8KKKxKKK!KKKKKKK;;"d";d"""";d""""""6"""6""";"""d"""""""!;;K8;&KKK8;KKKKKK8KKK8KKKKKK6KKK6KKK;KKK(KKKKKKK..=&++=.+====.+======5===5===.======&===&===+=======000000000000600060000000000000%%--%----%------6---6---%----------9999669rE   c                   t               \  }}t        | |ddt              }|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
)u0   flag OFF → LAUNCH_NOOP_DISABLED; spy calls==0.Tr   r   )zY%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.LAUNCH_NOOP_DISABLED
}r   r   r   r   r   Nr   r   r   rf   r   u   ACTIVE flag OFF → real fire 0r   )rh   r   r[   r   r   LAUNCH_NOOP_DISABLEDr'   r(   r)   r*   r+   r,   r/   r0   r   r   r   s              rC   test_active_flag_off_no_firer      sO   JE38C4UY(*F>>7U777>77777>777777767776777>777777U777U77777777777u:==:?===:======3===3======u===u===:==============rE   c                   t               \  }}t        | |ddt        t              }|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
)uF   executor_key == FAKE_ANU(self-key) → SELF_KEY_REFUSED; spy calls==0.T)r   r   r   r   r   r   )z\%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.LAUNCH_SELF_KEY_REFUSED
}r   r   r   r   r   Nr   r   r   rf   r   u   self-key → fire 0r   )rh   r   rY   ru   r   r   LAUNCH_SELF_KEY_REFUSEDr'   r(   r)   r*   r+   r,   r/   r0   r   r   r   s              rC   test_self_key_executor_no_firer      sR   JE38C4UY'h@F>>:U:::>:::::>:::::::6:::6:::>::::::U:::U:::::::::::u:11:?111:11111131113111111u111u111:11111111111111rE   c                   d }t        | |ddt              }|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                  }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  }	dd|	iz  }
t        t        j                  |
            dx}x}}|j                  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|      dz   d|iz  }t        t        j                  |            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  }	dd|	iz  }
t        t        j                  |
            dx}x}}y)uO   real_launch_fn 예외 → REAL_FIRE_FAILED; ok=False; raw key reason 미포함.c                    t        d      )Nzmock fire failure)RuntimeError)re   s    rC   _boomz0test_real_launch_fn_raises_failed.<locals>._boom   s    .//rE   Tr   r   z\%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.LAUNCH_REAL_FIRE_FAILED
}r   r   r   r   r   NFr   r   r   r   r   r   z%(py0)s not in %(py2)sru   reasonr   r   u   raw key 노출: 
>assert %(py4)sr   r   )r   rY   r   r   LAUNCH_REAL_FIRE_FAILEDr'   r(   r)   r*   r+   r,   r/   r0   rj   rv   ru   r   r   )rS   r   r   r5   r   r7   r   r   r6   r<   r=   r   @py_format3r   s                 rC   !test_real_launch_fn_raises_failedr      s#   0 8ETW[')F>>:U:::>:::::>:::::::6:::6:::>::::::U:::U:::::::::::9999669.. Ev%DDDxvDDDDDDxDDDxDDDDDDvDDDvDDDD)9&'DDDDDDDE%%--%----%------6---6---%----------rE   c                d   t        d      \  }}t        | |ddt              }|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}
}|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  }dd|iz  }t        t        j                  |            dx}x}}
y)u?   cron_registered=False → REAL_FIRE_FAILED; spy 1회; ok=False.F)r`   Tr   r   r   r   r   r   r   r   Nr   r   r   rf   r   u+   spy 1회 호출(fire 시도·등록 실패)r   r   r   r   r   r   )rh   r   rY   r   r   r   r'   r(   r)   r*   r+   r,   r/   r0   r   r   rj   )rS   rf   r   r   r5   r   r7   r   r   r   r6   r<   r=   s                rC   )test_real_launch_fn_not_registered_failedr      s   51JE38C4UY')F>>:U:::>:::::>:::::::6:::6:::>::::::U:::U:::::::::::u:II:?III:IIIIII3III3IIIIIIuIIIuIII:IIIIIIIIIIIIII9999669rE   c                B
   t        | dz        }t               \  }}t        j                  t	        |       ddt
        |t        t        d t        d      |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(  }|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}}t               \  }}t        j                  t	        |       ddt
        |t        t        d t        d      |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)uR   같은 (task_id, sha256): 1차 REAL_FIRED(spy1 1회); 2차 SKIP_DEDUPE(spy2 0회).r   rG   r   c                     t         S r~   r   rX   rE   rC   r   z+test_single_flight_dedupe.<locals>.<lambda>   r   rE   Tri   rJ   r   r   r   r   r   r   r   r   r   r   r   r   result1r   r   r   r   Nr   r   r   calls1r   c                     t         S r~   r   rX   rE   rC   r   z+test_single_flight_dedupe.<locals>.<lambda>  r   rE   )zW%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.LAUNCH_SKIP_DEDUPE
}result2r   calls2u(   dedupe → spy2 미호출(double fire 0)r   )rR   rh   r   r   rU   EXEC_KEYrY   r   r   r   r   r'   r(   r)   r*   r+   r,   r/   r0   r   LAUNCH_SKIP_DEDUPEr   )rS   shared_auditr   spy1r   r5   r   r7   r   r   r   r6   r   spy2r   s                  rC   test_single_flight_deduper      s   x-/0L;LFD00h%'(D1 1 G ??5e555?55555?555555575557555?555555e555e55555555555v;!;!;!33vv;! ;LFD00h%'(D1 1 G ??6e666?66666?666666676667666?666666e666e66666666666v;G!G;!GGG;!GGGGGG3GGG3GGGGGGvGGGvGGG;GGG!GGGGGGGGGGGrE   c                8   t        | dz        }t               \  }}t        j                  t	        |       ddt
        |t        t        d t        d      |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'        |      j)                  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|
      dz   d|iz  }t#        t        j$                  |            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  }dd|iz  }t#        t        j$                  |            dx}x}}|j.                  }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
t        j                   |      d z  }d!d"|iz  }t#        t        j$                  |            dx}}d#}|j.                  }||v }|st        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  }t#        t        j$                  |            dx}x}}|j.                  j1                  d#      }|j.                  |d'z      }t        j2                  }||k(  }|st        j                  d|fd(||f      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))uH   REAL_FIRED 후 audit.jsonl 에 FAKE_ANU 미포함; result.argv redacted.r   rG   zsha256-hygiene-13c                     t         S r~   r   rX   rE   rC   r   z3test_raw_key_hygiene_audit_no_key.<locals>.<lambda>)  r   rE   Tri   r   r   r   r   r   r   r   r   NrL   rM   r   r   ru   
audit_textr   u    audit.jsonl 에 raw key 노출: r   r   r   r   r   r   r   r   r   r   r   rs   r   )z,%(py1)s in %(py5)s
{%(py5)s = %(py3)s.argv
}r   r   r   r   zE%(py1)s == %(py5)s
{%(py5)s = %(py3)s.CALLBACK_ARGV_KEY_PLACEHOLDER
})rR   rh   r   r   rU   r   rY   r   r   r   r   r'   r(   r)   r*   r+   r,   r/   r0   r   	read_textru   r   re   indexr   )rS   r   rf   r   r   r5   r   r7   r   r   r  r   r   r6   r<   r=   r8   r   key_idxs                      rC   !test_raw_key_hygiene_audit_no_keyr    sy   X-.JJE3//h"'(D1 0 F >>4U444>44444>444444464446444>444444U444U44444444444 j!++W+=J:%XXX8:XXXXXX8XXX8XXXXXX:XXX:XXXX)I*'XXXXXXX ;;"d";d"""";d""""""6"""6""";"""d"""""""!;;&8;&&&&8;&&&&&&8&&&8&&&&&&6&&&6&&&;&&&&&&&!fkk!7k!!!!7k!!!7!!!!!!f!!!f!!!k!!!!!!!kk(G;;w{#Ju'J'JJ#'JJJJJ#'JJJJ#JJJJJJuJJJuJJJ'JJJJJJJJrE   c           	     B   g fd}t         j                  |      }t        j                  d      5 }t        j                  d      5 }t	        | |ddt
              }ddd       d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"                  }d}||k(  }|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  }t        t        j                   |            dx}x}}j%                          j%                          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}}y# 1 sw Y   *xY w# 1 sw Y   /xY w)uW   build_oneshot_cokacdir_fire_fn(runner=...) 재사용; subprocess 미호출; REAL_FIRED.c                F    j                  t        |              dddddS )NTsched-reuser^   rc   )re   runner_callss    rC   _mock_runnerz6test_reuse_build_oneshot_fire_fn.<locals>._mock_runnerC  s+    DJ'D%)-I 	IrE   )runnerzsubprocess.runzsubprocess.PopenTr   Nr   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r  r   )
runner_modbuild_oneshot_cokacdir_fire_fnr   patchr   rY   r   r   r   r'   r(   r)   r*   r+   r,   r/   r0   rb   assert_not_calledr   )rS   r  r   m_runm_popenr   r5   r   r7   r   r   r6   r<   r=   r   r  s                  @rC    test_reuse_build_oneshot_fire_fnr  ?  s2   LI
  >>l>SN	$	% -

;M0N -RYx)-4#+-- -
 >>4U444>44444>444444464446444>444444U444U44444444444............6...6.............	|!!!!!!!!!!!!3!!!3!!!!!!|!!!|!!!!!!!!!!!!!- - - -s#   N
NNN	NNc                   t        |       }t        | dz        }t               \  }}t        j	                  t        |       |t
        d t        d      |dd      } G d d      fd}t        j                  |||d	 d
 t        t        t        | dz              }|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<   spawn_governor BLOCK → PICKUP_SPAWN_BLOCKED; spy calls==0.r   c                     t         S r~   r   rX   rE   rC   r   z8test_pickup_governor_block_no_callback.<locals>.<lambda>c  r   rE   Tri   rootr   r   r   r   r   r   r   c                  ,    e Zd Zej                  ZdZg Zy):test_pickup_governor_block_no_callback.<locals>._ReadyGateTN)ry   rz   r{   r  GATE_OWNER_PICKUP_READY_NO_FIREstatusreadyrv   rX   rE   rC   
_ReadyGater  j  s    ;;rE   r  c                            S r~   rX   )pathr  s    rC   r   z8test_pickup_governor_block_no_callback.<locals>.<lambda>o  s	     rE   c                    dddS )NBLOCKDEDUP)decisionr   rX   )cands    rC   r   z8test_pickup_governor_block_no_callback.<locals>.<lambda>u  s    Gw'O rE   c                     t         S r~   r   rX   rE   rC   r   z8test_pickup_governor_block_no_callback.<locals>.<lambda>v      ( rE   ledger.jsonlcallback_launch_fnowner_gate_fnspawn_governor_fnsealed_key_loaderr   r   ledger_pathr   )zY%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.PICKUP_SPAWN_BLOCKED
}r   r  r   r   r   Nr   r   r   rf   r   u@   governor BLOCK → callback_launch_fn 미호출 → spy calls==0r   )rU   rR   rh   r   build_callback_launch_fnrY   r   r  pickup_oncer   r   r   PICKUP_SPAWN_BLOCKEDr'   r(   r)   r*   r+   r,   r/   r0   r   r   )rS   r   r   rf   r   cb_fnr,  r   r5   r   r7   r   r   r   r6   r  s                  @rC   &test_pickup_governor_block_no_callbackr4  Y  s   $X.x-/0LJE3**]'(D1 + 	E 
 .M## #O*>12 $ 	F >><Z<<<><<<<<><<<<<<<6<<<6<<<><<<<<<Z<<<Z<<<<<<<<<<<u:^^:?^^^:^^^^^^3^^^3^^^^^^u^^^u^^^:^^^^^^^^^^^^^^rE   c                   t        |       }t        | dz        }t               \  }}t        j	                  t        |       |t
        d t        d      |dd      } G d d      fd}t        j                  |||d	d
 t        t        t        | dz              }|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	)uF   owner_gate_fn ready=False → PICKUP_OWNER_GATE_BLOCKED; spy calls==0.r   c                     t         S r~   r   rX   rE   rC   r   z9test_pickup_owner_gate_fail_no_callback.<locals>.<lambda>  r   rE   Tri   r  c                      e Zd ZdZdZdgZy)<test_pickup_owner_gate_fail_no_callback.<locals>._FailedGateFAIL_CLOSED_NON_ANU_KEYFznon-ANU keyN)ry   rz   r{   r  r  rv   rX   rE   rC   _FailedGater8    s    * /rE   r:  c                            S r~   rX   )r!  r:  s    rC   r   z9test_pickup_owner_gate_fail_no_callback.<locals>.<lambda>  s	     rE   Nc                     t         S r~   r   rX   rE   rC   r   z9test_pickup_owner_gate_fail_no_callback.<locals>.<lambda>  r(  rE   r)  r*  r   )z^%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.PICKUP_OWNER_GATE_BLOCKED
}r   r  r   r   r   r   r   r   rf   r   uA   owner gate FAIL → callback_launch_fn 미호출 → spy calls==0r   )rU   rR   rh   r   r0  rY   r   r  r1  r   r   r   PICKUP_OWNER_GATE_BLOCKEDr'   r(   r)   r*   r+   r,   r/   r0   r   r   )rS   r   r   rf   r   r3  r,  r   r5   r   r7   r   r   r   r6   r:  s                  @rC   'test_pickup_owner_gate_fail_no_callbackr>    s   $X.x-/0LJE3**]'(D1 + 	E" "
 /M## #*>12 $ 	F >>AZAAA>AAAAA>AAAAAAA6AAA6AAA>AAAAAAZAAAZAAAAAAAAAAAu:__:?___:______3___3______u___u___:______________rE   c                    ddddddt         dg} t        j                  |       }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}}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  }dd|iz  }t        t        j                  |            d}d}|j                  } ||      }	t         |	v}|st        j                  d|fdt         |	f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      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}x}x}}	|j                  d      }||dz      }t        j                  }||k(  }|st        j                  d|fd||f      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)!uK   --key VALUE(공백) redaction 기존 동작 유지: raw key 0, placeholder.ro   rp   rT   rq   rr   rs   rt   Nr   z%(py0)s is not %(py3)soutr   assert %(py5)sr   r   r   ru   r   assert %(py4)sr    zN%(py0)s not in %(py8)s
{%(py8)s = %(py5)s
{%(py5)s = %(py3)s.join
}(%(py6)s)
}r   r   r   r   r   assert %(py10)spy10r   r   r  r   r  r   r   )ru   r   _redact_callback_argvr'   r(   r)   r*   r+   r,   r/   r0   joinr  r   )re   rA  r   r5   r   r<   r   r   r6   @py_assert7r   r   idxr8   r=   s                  rC   test_redact_space_form_retainedrM    s   #xwRZ[D

%
%d
+C3d?3d33d3838833(388(8C=(8=((((8=((((((8(((8(((3(((8((((((C(((C(((=(((((((
))G
CsQw<>5>>><>>>>><>>>><>>>>>>5>>>5>>>>>>>>>>>rE   c                    ddddddt          dg} t        j                  |       }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}}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  }dd|iz  }t        t        j                  |            d}d}|j                  } ||      }	t         |	v}|st        j                  d|fdt         |	f      dt        j                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      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}x}x}}	d}t        j                  }||z   }||v }|st        j                  d|fd||f      t        j                  |      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  }dd|iz  }t        t        j                  |            dx}x}x}}y) u@   --key=VALUE(등호) redaction 신규: raw key 0, --key=<sealed>.ro   rp   rT   rq   rr   --key=rt   Nr   r@  rA  r   rB  r   r   r   ru   r   rC  r   rD  rE  rF  rG  rH  r   zQ(%(py1)s + %(py4)s
{%(py4)s = %(py2)s.CALLBACK_ARGV_KEY_PLACEHOLDER
}) in %(py7)sr   r   r   r   r   assert %(py9)sr   )ru   r   rI  r'   r(   r)   r*   r+   r,   r/   r0   rJ  r   )re   rA  r   r5   r   r<   r   r   r6   rK  r   r   r8   r7   r   @py_assert6r=   r   s                     rC   test_redact_equals_form_newrT    s-   #xz?RT\]D

%
%d
+C3d?3d33d3838833(388(8C=(8=((((8=((((((8(((8(((3(((8((((((C(((C(((=(((((((Bu::BH::B:sBBBB:sBBBHBBBBBBuBBBuBBB:BBBBBBsBBBsBBBBBBBBrE   c                    t         j                  g 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}}d	}t         j                  }||z   }|| v }|st        j                  d
|fd|| f      t        j                  |      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  }	dd|	iz  }
t        t        j                  |
            dx}x}x}}t         j                  }d} ||      }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}x}x}x}}y)uN   --key=(빈 값) 등 비정상도 raw key 노출 없이 안전: --key=<sealed>.)ro   rO  rt   Nr   r@  rA  r   rB  r   rO  r   rP  r   rQ  rR  r   r   )z[%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._redact_callback_argv
}(%(py4)s)
} is %(py9)s)r   r   r   r   r   zassert %(py11)sr   )r   rI  r'   r(   r)   r*   r+   r,   r/   r0   r   )rA  r   r5   r   r<   r8   r7   r   rS  r=   r   r   rK  @py_format12s                 rC   #test_redact_equals_empty_value_saferW    s   

%
%&F
GC3d?3d33dBu::BH::B:sBBBB:sBBBHBBBBBBuBBBuBBB:BBBBBBsBBBsBBBBBBB&&4t4&t,44,4444,44444454445444&444t444,44444444444rE   c                   t        | dz        } G d dt              dt         fd}t        | |ddt        |      }|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                   }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  }
dd|
iz  }t        t        j                  |            dx}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  }
dd|
iz  }t        t        j                  |            dx}x}}	dj%                  |j&                        }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}}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&      d'z   d(|iz  }t        t        j                  |            d}d)d*lm}  ||      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}}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/      d'z   d(|iz  }t        t        j                  |            d}y)0ul   real_launch_fn 예외 → REAL_FIRE_FAILED; reason 에 예외 type 포함, message 원문/raw key 미포함.r   c                      e Zd Zy)Atest_real_launch_fn_exception_type_only.<locals>._CustomFireErrorN)ry   rz   r{   rX   rE   rC   _CustomFireErrorrZ    s    rE   r[  zsuper-secret-message-with-c                           r~   rX   )re   r[  
secret_msgs    rC   r   z6test_real_launch_fn_exception_type_only.<locals>._boom  s    z**rE   T)r   r   r   r   r   r   r   r   r   r   r   r   NFr   r   r   r   r   r   rD  r   )z%(py1)s in %(py3)sreasons_joined)r   r   u   예외 type 미기록: r   r   zsuper-secret-messager   )z%(py1)s not in %(py3)su   예외 message 원문 노출r   ru   r   u   raw key 노출r   r   r   r   rL   rM   r  u   audit 에 message 원문 노출u   audit 에 raw key 노출)rR   	Exceptionru   r   rY   r   r   r   r'   r(   r)   r*   r+   r,   r/   r0   rj   r   rJ  rv   r   pathlibr   r  )rS   r   r   r   r5   r   r7   r   r   r6   r<   r=   r^  r8   r   r   r   r   _Pr  r[  r]  s                       @@rC   'test_real_launch_fn_exception_type_onlyrb    s   X-.J9  .hZ8J+ 8ETW['J@F>>:U:::>:::::>:::::::6:::6:::>::::::U:::U:::::::::::9999669%%--%----%------6---6---%----------XXfnn-N]/]]]]]]]]]]]]]]]]]]]3J>J\1]]]]]]]!W!7WWW!WWW!WWWWWWWWWWWWW9WWWWWWW>);;;8>;;;;;;8;;;8;;;;;;>;;;>;;;;+;;;;;;;"J))7);J!V!3VVV!VVV!VVVVVVVVVVVVV5VVVVVVV:%AAA8:AAAAAA8AAA8AAAAAA:AAA:AAAA'AAAAAAArE   c                    t         j                  d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}}d}||k(  }|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}}t         j                  dd
d      \  } }d}||k(  }|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}}t         j                  ddd      \  } }d}||k(  }|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}||k7  }|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}}t         j                  ddd      \  } }d}||k(  }|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}||k7  }|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}}t         j                  ddi      \  } }d}||k(  }|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}}t         j                  d
      \  } }g }d}| |u }|}|r	d}	||	k(  }
|
}|sXt        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }d$d%|iz  }t        t        j                  |            d
x}x}x}x}x}
}	y
)&u_   schedule_id 가 None 일 때만 빈 문자열. 정수 0/False 같은 non-None falsy 는 보존.Tz	sched-xyzr   r   )z%(py0)s is %(py3)sregr   rB  r   Nr   )z%(py0)s == %(py3)ssidr
   u%   None 은 빈 문자열이어야 함: r   r   0u"   0 이 빈 문자열로 오판됨: )!=)z%(py0)s != %(py3)su'   non-None falsy(0)가 None 과 혼동됨FFalseu&   False 가 빈 문자열로 오판됨: u+   non-None falsy(False)가 None 과 혼동됨r`   )z%(py2)s is %(py5)sr   r   r   )z%(py9)s == %(py12)s)r   r   z%(py14)sr   zassert %(py17)spy17)r   _read_real_fire_outcomer'   r(   r)   r*   r+   r,   r/   r0   r   r-   r.   )rd  re  r   r5   r   r<   r6   r7   r8   @py_assert11r9   r=   r   r>   @py_format16r@   s                   rC   5test_read_real_fire_outcome_schedule_id_none_explicitrm    sr    ,, =?HC3$;3$33$3+3+33+ ,, 68HCE3"9EEE3"EEEEEE3EEE3EEE"EEE=cWEEEEEEE ,, 35HCC3#:CCC3#CCCCCC3CCC3CCC#CCC;C7CCCCCCC?3"9???3"??????3???3???"?????????? ,, 79HCK3'>KKK3'KKKKKK3KKK3KKK'KKKCC7KKKKKKKC3"9CCC3"CCCCCC3CCC3CCC"CCCCCCCCCC ,,.?-FGHC3"93"33" ,,T2HC%%%3%<%2%C2I%%%%3%%%%%%%3%%%3%%%%%%%%%%%C2%%%%%%C%%%C%%%2%%%%%%%%%%%%%%rE   )r3   rR   r4   rR   )rG   )Tr   )[__doc__
__future__r   builtinsr)   _pytest.assertion.rewrite	assertionrewriter'   importlib.utilr"   rP   r    r`  r   unittestr   r	   resolveparentsr%   rR   r!  insertr#   _ilu
_real_initr!   get_cachedgetattrrd   
startswith_kr$   r   r5   r6   r7   r8   r&   r9   r:   r;   r(   r*   r+   r,   r<   r=   r-   r>   r?   r.   r@   rA   r/   r0   r1   _pkgr2   rD   r  r   ru   r   r   rU   rY   r[   rh   r   r   r   r   r   r   r   r   r   r   r   r  r  r4  r>  rM  rT  rW  rb  rm  )ks   0rC   <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" (*O P 02_ ` /1] ^ %'I J68^_
24[\-K	%
 !   $,D!uoD6'/(>2.$&HVKD"4#_P#`P?C5B@&c ]s   M9:M9