
    +j?<              	      L   d Z ddlmZ ddlZddlmc mZ ddl	m
Z ddlZddlZddlZddlmZ ej"                  j%                  ej"                  j%                  ej"                  j%                  ej"                  j'                  e                        Zeej"                  vrej"                  j-                  de        ee      dz  dz  Zej0                  j3                  d      Ze eedd      xs d ee      k7  r eej0                        D  cg c]  } | dk(  s| j=                  d	      s|  c} D ]  Zej0                  e=   ej@                  de e ee      dz        g
      Z!g Z"dZ#e!e#uZ$e$Z%e$re!jL                  Z'dZ(e'e(uZ)e)Z%e%sB ejT                  de$fde!e#f      d ejV                         v s ejX                  e!      r ejZ                  e!      nd ejZ                  e#      dz  Z.dde.iz  Z/e"ja                  e/       e$r ejT                  de)fde'e(f      d ejV                         v s ejX                  e!      r ejZ                  e!      nd ejZ                  e'       ejZ                  e(      dz  Z1dde1iz  Z2e"ja                  e2        ejf                  e"d      i z  Z4dde4iz  Z5 e6 ejn                  e5            dxZ%xZ"xZ$xZ#xZ'xZ)Z( ejp                  e!      Z9e9ej0                  d<   e!jL                  ju                  e9       ej"                  jw                  edd      Z<ej"                  jw                  eddd      Z=ej"                  jw                  eddd      Z>d*dZ?d Z@d ZAd  ZBd! ZCd" ZDd# ZEd$ ZFd% ZGd+d&ZHd' ZId( ZJd) ZKyc c} w ),u5  task-2729+12 회귀 테스트 — B안 CODE/DATA 분리 + legacy NOOP 검증.

아르고스(QA) 작성.

검증 범위:
  A. CODE/DATA 분리: entrypoint.sh / anu-pickup.service / anu-pickup.path 파일 파싱.
  B. legacy NOOP 회귀: isolated temp DATA root 를 사용하여 driver scan_once 동작 검증.
    )annotationsN)Pathdispatchz__init__.py__file__ z	dispatch.)submodule_search_locations)is not)z%(py2)s is not %(py5)s_spec)py2py5z%(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scriptszanu_pickup_entrypoint.shdeploysystemdzanu-pickup.servicezanu-pickup.pathc                j    t        | dd      5 }|j                         cd d d        S # 1 sw Y   y xY w)Nrutf-8encoding)openread)pathfhs     Y/home/jay/workspace/tests/regression/test_canonical_execution_path_alignment_b_2729p12.py_readr    7   s.    	dC'	* bwwy  s   )2c                    t        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}}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}}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	)uL   entrypoint.sh 가 cd 와 PYTHONPATH 를 CODE_ROOT 기반으로 사용한다.zcd "${CODE_ROOT}"inz%(py1)s in %(py3)scontentpy1py3u6   entrypoint.sh 에 `cd "${CODE_ROOT}"` 가 없습니다
>assert %(py5)sr   NzPYTHONPATH="${CODE_ROOT}"u>   entrypoint.sh 에 `PYTHONPATH="${CODE_ROOT}"` 가 없습니다zcd "${WORKSPACE}"not inz%(py1)s not in %(py3)suY   entrypoint.sh 에 `cd "${WORKSPACE}"` 가 남아 있습니다 — CODE/DATA 분리 위반zPYTHONPATH="${WORKSPACE}"ua   entrypoint.sh 에 `PYTHONPATH="${WORKSPACE}"` 가 남아 있습니다 — CODE/DATA 분리 위반r    _ENTRYPOINT_SH
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_name_format_assertmsgAssertionError_format_explanationr%   @py_assert0@py_assert2@py_format4@py_format6s        r   ,test_entrypoint_cd_pythonpath_uses_code_rootr=   <   s   N#G  ')  '          #*    #*    	C     ' &'1  &'    '      +2    +2    	K    
  g-  g          '.    '.    	f     ' &g5  &g    '      /6    /6    	n        c                    t        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}}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}}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	)ua   entrypoint.sh 의 FLAG_FILE 과 LOCK_DIR 은 ${WORKSPACE}(canonical DATA) 기반이어야 한다.zFLAG_FILE="${WORKSPACE}/r"   r$   r%   r&   u1   FLAG_FILE 이 ${WORKSPACE} 기반이 아닙니다r)   r   NzLOCK_DIR="${WORKSPACE}/u9   LOCK_DIR fallback 이 ${WORKSPACE} 기반이 아닙니다zFLAG_FILE="${CODE_ROOT}r*   r,   uT   FLAG_FILE 이 CODE_ROOT 기반으로 변경되었습니다 — DATA canonical 위반zLOCK_DIR="${CODE_ROOT}uS   LOCK_DIR 이 CODE_ROOT 기반으로 변경되었습니다 — DATA canonical 위반r-   r8   s        r   (test_entrypoint_flag_lock_stay_canonicalr@   Q   s   N#G & %0  %    &      *1    *1    	<    
 % $/  $    %      )0    )0    	D    
 % $G3  $G    %      -4    -4    	_     $ #72  #7    $      ,3    ,3    	^    r>   c                    t        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}}y	)
u@   CODE_ROOT 기본값이 ${HOME}/p0b-pickup-main 을 참조한다.z8CODE_ROOT="${PICKUP_CODE_ROOT:-${HOME}/p0b-pickup-main}"r"   r$   r%   r&   u>   CODE_ROOT 기본값 라인이 없거나 형식이 다릅니다r)   r   Nr-   r8   s        r   !test_entrypoint_code_root_defaultrB   h   s    N#GE EP  E    F      JQ    JQ    	I    r>   c                    t        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}}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}}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	)uh   CODE_ROOT 부재 또는 driver 파일 누락 시 fail-closed 블록이 존재한다 (git 의존 제거).z! -d "${CODE_ROOT}"r"   r$   r%   r&   u]   entrypoint.sh 에 CODE_ROOT 디렉토리 부재 조건 `! -d "${CODE_ROOT}"` 이 없습니다r)   r   Nz*${CODE_ROOT}/dispatch/anu_pickup_driver.pyud   entrypoint.sh 에 driver 파일 체크 `${CODE_ROOT}/dispatch/anu_pickup_driver.py` 가 없습니다zexit 0u=   entrypoint.sh 에 fail-closed exit 0 (no-op) 이 없습니다zgit -Cr*   r,   ua   entrypoint.sh 에 `git -C` 가 남아 있습니다 — git 의존이 제거되지 않았습니다r-   r8   s        r   %test_entrypoint_code_root_fail_closedrD   q   s~   N#G !  G+   G    !      %,    %,    	j    
 8 77B  77    8      <C    <C    	o    
  8w  8w                  	H    
  87"  87          #    #    	l    r>   c                    t        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}}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	)uF   anu-pickup.service 가 CODE_ROOT(%h/p0b-pickup-main) 를 참조한다.z#WorkingDirectory=%h/p0b-pickup-mainr"   r$   r%   r&   uK   anu-pickup.service WorkingDirectory 가 %h/p0b-pickup-main 이 아닙니다r)   r   Nz)Environment=PYTHONPATH=%h/p0b-pickup-mainuQ   anu-pickup.service Environment PYTHONPATH 가 %h/p0b-pickup-main 이 아닙니다z%h/p0b-pickup-main/scripts/uZ   anu-pickup.service ExecStart 이 %h/p0b-pickup-main/scripts/ 를 참조하지 않습니다)r    _SERVICE_FILEr/   r0   r1   r2   r3   r4   r5   r6   r7   r8   s        r    test_service_points_to_code_rootrG      s   M"G0 0G;  0G    1      5<    5<    	V     7 6'A  6'    7      ;B    ;B    	\     ) (G3  (G    )      -4    -4    	e    r>   c                    t        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}}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  task-2733: anu-pickup.path 는 전용 inbox(%h/workspace/memory/events/p0b_inbox/
    task-*.result.json)만 watch 한다. memory/events 직속 legacy 를 watch 하면 잔존 result.json
    다수 매칭→start-limit-hit 폭주가 재발하므로, inbox 전용 glob 만 허용한다.zFPathExistsGlob=%h/workspace/memory/events/p0b_inbox/task-*.result.jsonr"   r$   r%   r&   uD   anu-pickup.path 가 전용 inbox 경로를 watch 하지 않습니다r)   r   Nz<PathExistsGlob=%h/workspace/memory/events/task-*.result.jsonr*   r,   ua   anu-pickup.path 가 memory/events 직속 legacy 를 watch 하여 잔존 폭주를 유발합니다z!PathExistsGlob=%h/p0b-pickup-mainuT   anu-pickup.path 가 CODE_ROOT 경로를 watch 하도록 잘못 변경되었습니다)r    
_PATH_FILEr/   r0   r1   r2   r3   r4   r5   r6   r7   r8   s        r   'test_path_unit_watches_canonical_eventsrJ      s    JGS SW^^  SW^    T      X_    X_    	O    
 J IQXX  IQX    J      RY    RY    	l    
 / .g=  .g    /      7>    7>    	_    r>   c                x    | dz  dz  dz  }|j                  dd       | dz  dz  }|j                  dd       |S )u   tmp_path 에 inbox(memory/events/p0b_inbox) 와 memory/state 구조를 생성하고 scan 대상
    디렉토리(inbox)를 반환. task-2733: driver scan/watch 대상은 전용 inbox 이다.memoryevents	p0b_inboxTparentsexist_okstate)mkdir)tmp_path
events_dir	state_dirs      r   _make_events_dirrW      sP     H$x/+=JTD18#g-IOOD4O0r>   c                z    | dz  dz  dz  }|j                   j                  dd       |j                  dd       y	)
u5   memory/state/p0b_driver_enabled 에 'enabled' 기록.rL   rR   p0b_driver_enabledTrO   zenabled
r   r   N)parentrS   
write_text)rT   flags     r   _enable_driverr]      s>    h(+??DKKdT2OOK'O2r>   c                    |g d}g }t        j                          dz
  }|D ]U  }| |z  }|j                  dd       t        j                  t	        |      ||f       |j                  t	        |             W |S )uV   task-*.result.json 파일들을 과거 mtime 으로 생성하고 경로 목록 반환.)ztask-A.result.jsonztask-B.result.jsonztask-C.result.jsonztask-D.result.jsonQ {}r   r   )timer[   osutimestrappend)rU   namespaths	past_timenameps         r   _create_task_filesrk      s|    }
 E		e#I 	TG,
Q)Y/0SV	
 Lr>   c           	        ddl m}m}m} t	        |       }t        |        t        |      }t        t        j                  t        |                  }t        |      }t        |      }||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"                  |      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}x}	}t+        j*                         dz   } |t        |       d|dddd       }t        t        j                  t        |                  }|D cg c]  }|j,                  s| }}t        |      }t        |      }||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"                  |      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t        |       dt        |       d      d
z   d|
iz  }t'        t        j(                  |            dx}x}	}|D ]  }|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                   |      rt        j"                  |      nddz  }t        j$                  |j,                   d|j.                  d      dz   d |iz  }t'        t        j(                  |            dx}}|j0                  }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$                  |j,                   d$      d%z   d&|iz  }t'        t        j(                  |            dx}x}}	 ||k(  }|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*t3        |       d+t3        |             d,z   d-|iz  }t'        t        j(                  |            d}| |j5                  d.t        j6                        z  }|j9                         rDt;        |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d0t        j                         v st        j                   |      rt        j"                  |      nd0t        j"                  |      t        j"                  |      d1z  }t        j$                  d2|       d3z   d4|iz  }
t'        t        j(                  |
            dx}x}	}yyc c}w )5u   legacy_cutoff=True + 미래 activation_epoch → 모든 task-* 파일이 NOOP_LEGACY_SKIP.
    파일 이동/삭제 0, quarantine 디렉토리 미생성 또는 비어있음.r   )	scan_onceVERDICT_NOOP_LEGACY_SKIPQUARANTINE_DIR_REL==zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}lenbefore
task_filespy0r'   r(   r   py6py8u*   사전 조건: 파일 생성 수 불일치
>assert %(py10)spy10N     @@TF  c                      yNenabled r   r>   r   <lambda>z8test_legacy_cutoff_noop_skip_zero_move.<locals>.<lambda>       r>   legacy_cutoffactivation_epochlauncher_fnwrite_evidence	max_filesflag_reader>=zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}task_recordsu   task-* 파일 u   개에 대한 record 부족: u   건z/%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py4)srecrn   rw   r   py4
: verdict=u    (NOOP_LEGACY_SKIP 기대)
>assert %(py6)srx   is)z3%(py2)s
{%(py2)s = %(py0)s.quarantined
} is %(py5)srw   r   r   u8   : quarantined=True — legacy skip 시 quarantine 금지
>assert %(py7)sr   )z%(py0)s == %(py2)safter)rw   r   uO   scan 전후 events 디렉토리 파일 목록이 달라졌습니다.
  before: z
  after:  z
>assert %(py4)sr   /z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)squarantine_filesrw   r'   r(   rx   u<   quarantine 디렉토리에 파일이 생성되었습니다: 
>assert %(py8)sry   )dispatch.anu_pickup_driverrm   rn   ro   rW   r]   rk   setrb   listdirrd   rs   r/   r0   r2   r3   r4   r1   r5   r6   r7   ra   result_pathverdictquarantinedsortedreplacesepexistslistiterdir)rT   rm   rn   ro   rU   ru   rt   r:   @py_assert7@py_assert4@py_format9@py_format11future_epochrecordsr   r   r   r   @py_assert1@py_assert3@py_format5@py_format7r<   @py_format8@py_format3quarantine_dirr   @py_assert5s                               r   &test_legacy_cutoff_noop_skip_zero_mover      s     "(+J8#J/J C
O,-Fv;W#j/W;/)WWW;/WWWWWW3WWW3WWWWWWvWWWvWWW;WWWWWW#WWW#WWWWWWjWWWjWWW/WWW+WWWWWWWW99;'LH%%G 

3z?+,E  '8!!--A8L8| J /                                 !$    !$      %/    %/    !0    Z))Fs<GXFYY\]      
{{ 	
{66 	
 	
 	
{6 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
	6	
 	
  7 	
 	
 		 7 	
 	
  z#++8RS	
 	
 	
 	
 	
  	
% 	
%' 	
 	
% 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 #( 	
 	
  WX	
 	
 	
 	
 	
 	
	
 U?  	6U   	  	    	    	  	    	    F^$ %E]O	%   	   2 : :3 GGN 6 6 89#$ 	
 	
$) 	
 	
 	
$ 	
 	
	6	
 	
   	
 	
 		  	
 	
	6	
 	
  $ 	
 	
 		 $ 	
 	
 		 % 	
 	
 		 )* 	
 	
  KK[J\]	
 	
 	
 	
 	
 	
 + 9s   (c:cc           	        ddl m}m} t        |       }t	        |        g d}|D ]R  }||z  }|j                  dd       t        j                         dz
  }t        j                  t        |      ||f       T |dz  }|j                  dd       t        j                         dz
  }t        j                  t        |      ||f       |D 	cg c]  }	t        ||	z         }
}	 |t        |       |
d	d
d	d       }t        |      }t        |
      }||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                   |      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t        |
       dt        |       d      dz   d|iz  }t%        t        j&                  |            d
x}x}}|D ]%  }|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                  |      rt        j                   |      nddz  }t        j"                  |j*                   d|j(                  d      dz   d|iz  }t%        t        j&                  |            d
x}}( y
c c}	w ) uI   task- 로 시작하지 않는 파일은 NOOP_NOT_TARGET 을 반환한다.r   )rm   VERDICT_NOOP_NOT_TARGET)zfoo.result.jsonz
task-x.tmpzbar-task-1.result.jsonr`   r   r   r_   ztask-target-001.result.jsonFNc                      yr   r   r   r>   r   r   z&test_non_target_noop.<locals>.<lambda>8  r   r>   )rg   r   r   r   r   rp   rr   rs   r   non_target_pathsrv   u   비대상 파일 u   개에 대해 record u
   건 반환rz   r{   r   r   r   r   r   u    (NOOP_NOT_TARGET 기대)r   rx   )r   rm   r   rW   r]   r[   ra   rb   rc   rd   rs   r/   r0   r2   r3   r4   r1   r5   r6   r7   r   r   )rT   rm   r   rU   non_target_namesri   rj   rh   target_filenr   r   r:   r   r   r   r   r   r   r   r   r   s                         r   test_non_target_noopr     s   
 "(+J8
 ! 1	TG,IIK%'	
Q)Y/0	1 <<K4'2		e#IHHS	9565EFJN+FF H%G w< 3/0 <00   <0                                         0     0    1    C 0122GG~U_`      
{{ 	
{55 	
 	
 	
{5 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
	6	
 	
  6 	
 	
 		 6 	
 	
  z#++8QR	
 	
 	
 	
 	

 Gs   O<c           	     N   ddl m}m}m} t	        |       }t        |        t        |ddg      }t        j                         dz   } |t        |       d|dd	d
d       }|D cg c]  }|j                  s| }	}t        |	      }
t        |      }|
|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                   |
      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}
x}}|	D cg c]  }|j&                  |k(  s| }}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      dz   d|iz  }t#        t        j$                  |            dx}
x}}|	D ]%  }|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                  |      rt        j                   |      ndd z  }t        j(                  |j                   d!|j&                  d"      d#z   d$|iz  }t#        t        j$                  |            dx}}( |	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(                  |j                   d(|j*                  d)      d*z   d+|iz  }t#        t        j$                  |            dx}x}} yc c}w c c}w ),u   launcher_fn=None 기본 → 어떤 record 도 real spawn/wake 를 하지 않는다.
    NOOP_LEGACY_SKIP 으로 surface-only 처리됨을 확인한다.r   )rm   rn   VERDICT_WAKE_BUILTztask-spawn-test-001.result.jsonztask-spawn-test-002.result.json)rf   r|   TNFr}   c                      yr   r   r   r>   r   r   z2test_no_real_spawn_launcher_none.<locals>.<lambda>]  r   r>   r   r   r   rs   r   ru   rv   zassert %(py10)sr{   rp   r   wake_recordsr   u.   launcher_fn=None 인데 WAKE_BUILT record 가 u   건 발생했습니다r   ry   r   r   rn   r   r   uA    — launcher_fn=None + legacy_cutoff 시 NOOP_LEGACY_SKIP 기대r   rx   r   )z4%(py2)s
{%(py2)s = %(py0)s.fire_cron_id
} is %(py5)sr   z: fire_cron_id=u&    — launcher_fn=None 인데 설정됨r   r   )r   rm   rn   r   rW   r]   rk   ra   rd   r   rs   r/   r0   r2   r3   r4   r1   r6   r7   r   r5   fire_cron_id)rT   rm   rn   r   rU   ru   r   r   r   r   r:   r   r   r   r   r   r   r   r   r   r   r   r<   r   s                           r    test_no_real_spawn_launcher_noner   D  sy     "(+J8#J))7 J
 99;'LH%%G  '8!!--A8L8|/J///////////3///3//////|///|//////////////////J///J//////////  ,O!qyy<N/NAOLO|  !                               !"    9\9J8KKab    
  
{{ 	
{66 	
 	
 	
{6 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
	6	
 	
  7 	
 	
 		 7 	
 	
  z#++8yz	
 	
 	
 	
 	

  
 	
4 	
4' 	
 	
4 	
 	
	6	
 	
   	
 	
 		  	
 	
 		   	
 	
 		 $( 	
 	
  s/?/?.BBhi	
 	
 	
 	
 	
 	

! 9 Ps   $V6V$V"9V")r   rd   returnrd   )N)L__doc__
__future__r   builtinsr2   _pytest.assertion.rewrite	assertionrewriter/   importlib.utilutil_ilurb   sysra   pathlibr   r   dirnameabspathr   
_REPO_ROOTinsert_real_dispatch_initmodulesget_cached_dispatchgetattrrd   r   
startswith_kspec_from_file_locationr
   r   r   r   r9   loader@py_assert10@py_assert13@py_assert12r0   r3   r4   r1   r<   r   re   @py_format15@py_format17_format_boolop@py_format18@py_format20r6   r7   module_from_spec_pkgexec_modulejoinr.   rF   rI   r    r=   r@   rB   rD   rG   rJ   rW   r]   rk   r   r   r   )ks   0r   <module>r      s   #     	 
   WW__RWW__RWW__RWW__X=V-WXY
 SXXHHOOAz":&3mC ;;??:. j"-3	  s{{+\QqJ!,,{B[q\ KKO(D(($'Z(8:(E$F#G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"j)5OPZ9>RSWW\\*h	;LM

*.223&:
z.
b/
E	 ]s   N!1N!