
    լ j9=                       d Z ddlmZ ddlZddlmc mZ ddl	Z
ddlZddlZddlZ ej                  e      j!                         j"                  d   Z ee      Zeej*                  v r*ej*                  j-                  e       eej*                  v r*ej*                  j/                  de        eej2                        D ]U  Zedk(  sej7                  d      sej2                  e   Z eedd      xs dZej7                  e      rIej2                  e= W dd	lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) dd
l*m+Z+m,Z, edz  dz  Z-e
j\                  j_                  de-      Z0g Z1dZ2e0e2uZ3e3Z4e3re0jj                  Z6dZ7e6e7uZ8e8Z4e4sB ejr                  de3fde0e2f      d ejt                         v s ejv                  e0      r ejx                  e0      nd ejx                  e2      dz  Z=dde=iz  Z>e1j                  e>       e3r ejr                  de8fde6e7f      d ejt                         v s ejv                  e0      r ejx                  e0      nd ejx                  e6       ejx                  e7      dz  Z@dde@iz  ZAe1j                  eA        ej                  e1d      i z  ZCddeCiz  ZD eE ej                  eD            dxZ4xZ1xZ3xZ2xZ6xZ8Z7e
j\                  j                  e0      ZHeHej2                  d<   e0jj                  j                  eH       d2dZJd ZKd ZLd ZMd ZNd ZOd  ZPd! ZQd" ZRd# ZSd$ ZTd% ZUd& ZVd' ZWd( ZXd) ZYd* ZZd+ Z[d, Z\d- Z]d. Z^d/ Z_d0 Z`d1 Zay)3u,  tests/regression/test_progress_watcher_gate_2729.py — task-2729 Phase 1 회귀.

Phase 1 완료조건(회장 7) 회귀 보호:
  1. gate PASS (watcher_registered=True)
  2. fallback-only → DISPATCH_INCOMPLETE
  3. no watcher (no fallback) → DISPATCH_INCOMPLETE
  4. watcher terminal callback wired (성공 runner)
  5. WATCHER_TERMINAL_CALLBACK_NOT_WIRED (실패 runner)
  6. 6-state tracking
  7. review-settle quiet-window 골격
  8. 기존 callback/fallback behavior 무손상 smoke
  9. classify 재사용 run_once (head drift fixture)

대상 모듈(progress_watcher_gate.py, ci_watch_handoff_runner.py)은 수정하지 않고
모듈의 실제 동작에 맞춰 테스트만 작성한다. fake runner 주입 / 순수 함수 검증만 사용
(외부 네트워크 / 실제 cokacdir / gh 호출 없음).
    )annotationsN   dispatchz	dispatch.__file__ )
DISPATCH_INCOMPLETE#WATCHER_TERMINAL_CALLBACK_NOT_WIREDPROGRESS_WATCHER_REGISTERED_KEYDISPATCH_OKWATCHER_TRACKED_STATES
GateResultevaluate_progress_watcher_gateannotate_dispatch_result watcher_terminal_callback_statusall_states_tracked)
PRSnapshotTERMINAL_STATESscriptszci_watch_handoff_runner.pyci_watch_handoff_runner)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py19c                     d fd	}|S )Nc                Z    t        j                  dk(  rdnddk(  rd      S d      S )Nr   okr   boom)
returncodestdoutstderr)typesSimpleNamespace)cmdcapture_outputtexttimeoutcheckkwargsr$   s         a/home/jay/workspace/.worktrees/task-2729-dev6/tests/regression/test_progress_watcher_gate_2729.py_runnerz"_make_fake_runner.<locals>._runnerY   s<    $$!%?4#q2
 	
 /5
 	
    )TTNF )r$   r0   s   ` r/   _make_fake_runnerr3   X   s    
 Nr1   c                 
   t        d      } t        | t              }|sd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t        j                         v st        j                  t              rt        j                  t              ndt        j                  |      d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                  }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        k(  }d}t        |k(  }|r|st        j                  d||fd|t        |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}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}||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}}y )NTwatcher_registeredz5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstancegrr   )py0py1r   py4Fisz2%(py2)s
{%(py2)s = %(py0)s.incomplete
} is %(py5)sr9   r   r   assert %(py7)sr   zC%(py2)s
{%(py2)s = %(py0)s.progress_watcher_registered
} is %(py5)s
dispatched)==rC   )z7%(py2)s
{%(py2)s = %(py0)s.dispatch_status
} == %(py5)sz%(py5)s == %(py7)sr   )r9   r   r   r   assert %(py9)sr   z5%(py2)s
{%(py2)s = %(py0)s.fallback_only
} is %(py5)sr   rC   z9%(py2)s
{%(py2)s = %(py0)s.incomplete_reason
} == %(py5)s)r   r7   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanation
incomplete_call_reprcompareprogress_watcher_registereddispatch_statusr   fallback_onlyincomplete_reason)	r8   @py_assert3@py_format5@py_assert1@py_assert4@py_format6@py_format8@py_assert6@py_format10s	            r/   !test_gate_pass_watcher_registeredr]   f   s   	'4	@Bb*%%%%%%%%:%%%:%%%%%%b%%%b%%%%%%*%%%*%%%%%%%%%%==!E!=E!!!!=E!!!!!!2!!!2!!!=!!!E!!!!!!!))1T1)T1111)T11111121112111)111T1111111<<<<<<<<<<<<<<<2<<<2<<<<<<<<<<<<<<<<<<<<<<$u$u$$$$u$$$$$$2$$$2$$$$$$u$$$$$$$%2%2%%%%2%%%%%%2%%%2%%%%%%2%%%%%%%r1   c                 \   ddi} t        | d      }|| u }|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  }d
d|iz  }t        t        j                  |            d }|t           }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}}d}||v}|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }	d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  }	dd|	iz  }
t        t        j                  |
            d x}}y )NstatusrB   Tr5   r<   z%(py0)s is %(py2)soutresultr9   r   assert %(py4)sr;   z%(py1)s is %(py4)sr:   r;   assert %(py6)spy6rF   z%(py1)s == %(py4)sprogress_watcher_gate)not in)z%(py1)s not in %(py3)sr:   py3assert %(py5)sr   "progress_watcher_incomplete_reason)
r   rJ   rP   rH   rI   rK   rL   rM   rN   r
   )rb   ra   rW   @py_format3rV   @py_assert0rU   @py_assert2@py_format7@py_format4rY   s              r/   (test_gate_pass_annotate_no_status_changeru   p   s   %F
"6d
CC&=3&33&&./747/47777/4777/77747777777x=(L(=L((((=L(((=(((L((((((("-"#----"#---"------#---#-------/:/s::::/s:::/::::::s:::s:::::::r1   c                 Z   t        dd      } | j                  }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }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                  }|t        k(  }|st        j                  d|fd|t        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dz  }dd|iz  }t        t        j                  |            d 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}}y )NFTr6   fallback_registeredr<   r>   r8   r?   r@   r   rE   rF   z7%(py2)s
{%(py2)s = %(py0)s.dispatch_status
} == %(py4)sr   r9   r   r;   rg   rh   !fallback_only_no_progress_watcherrG   rA   r   rO   rJ   rP   rH   rI   rK   rL   rM   rN   rS   rR   r   rT   rQ   r8   rW   rX   rU   rY   rZ   rV   rs   s           r/   test_fallback_only_incompleter~   ~   s_   	' d
B == D =D    =D      2   2   =   D       #t#t####t######2###2######t#######4!44444!444444424442444444444!4444!44444444F#FF#FFFFF#FFFFFFF2FFF2FFFFFF#FFFFFFFF))2U2)U2222)U22222222222222)222U2222222r1   c                    ddi} t        | ddd      }|t           }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      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}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x}x}}y )Nr_   rB   FTr6   rx   activer<   re   rf   rg   rh   rj   rF   z%(py1)s == %(py3)sr   rl   rn   r   ri   ro   r{   )r   r
   rJ   rP   rL   rM   rN   r   rH   rI   rK   )	rb   ra   rq   rU   rr   rV   rs   rt   rY   s	            r/   1test_fallback_only_annotate_inactive_keeps_statusr      s   %F
"5d5C ./858/58888/5888/88858888888&'>'+>>>>>'+>>>>'>>>>>>+>>>>+>>>>>>>>x=(L(=L((((=L(((=(((L(((((((34[8[[48[[[[[48[[[[4[[[8[[[[[[[[r1   c                    ddi} t        | ddd      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      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}}|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      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}}y )Nr_   rB   FTr   rF   r   r   rl   rn   r   rj   )
r   r   rJ   rP   rL   rH   rI   rK   rM   rN   )rb   ra   rq   rr   rt   rY   s         r/   1test_fallback_only_annotate_active_changes_statusr      s    %F
"5d4C x=/=/////=////=//////////////////&'>'+>>>>>'+>>>>'>>>>>>+>>>>+>>>>>>>>r1   c                 Z   t        dd      } | j                  }d}||u }|st        j                  d|fd||f      dt	        j
                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      dz  }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                  }|t        k(  }|st        j                  d|fd|t        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dz  }dd|iz  }t        t        j                  |            d 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}}y )NFrw   Tr<   r>   r8   r?   r@   r   rE   rF   ry   r   rz   rg   rh   no_progress_watcherrG   rA   r|   r}   s           r/   &test_no_watcher_no_fallback_incompleter      s_   	' e
B == D =D    =D      2   2   =   D       $u$u$$$$u$$$$$$2$$$2$$$$$$u$$$$$$$4!44444!444444424442444444444!4444!444444448#88#88888#888888828882888888#88888888))2U2)U2222)U22222222222222)222U2222222r1   c                    d} d}t        | |      }d}||k(  }|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 )
NTterminal_reachedcallback_firedWATCHER_TERMINAL_CALLBACK_WIREDrF   )zY%(py6)s
{%(py6)s = %(py0)s(terminal_reached=%(py2)s, callback_fired=%(py4)s)
} == %(py9)sr   )r9   r   r;   rh   r   zassert %(py11)sr   )	r   rJ   rP   rH   rI   rK   rL   rM   rN   )rW   rU   @py_assert5@py_assert8@py_assert7r\   @py_format12s          r/   +test_watcher_terminal_callback_status_wiredr      s    :>OS($tT,T,	- T,     	)   	)   ;?   PT   	U   -      r1   c            
        t         j                         } | 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                  dd	t        d
   d| t        d
            }|d   }d}||u }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }d}||k(  }|slt        j                  d|fd||f      t        j                  |      t        j                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }t        d
   }||k(  }|slt        j                  d|fd||f      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 )NFr<   z7%(py2)s
{%(py2)s = %(py0)s.normal_callback
} is %(py5)sstater?   r@   r   2729*   r   
test_wiredtask_id	pr_numberterminal_statereasonr   runnerfiredTre   rf   rg   rh   callback_statusr   rF   ri   r   )
runner_modWatcherStatenormal_callbackrJ   rP   rH   rI   rK   rL   rM   rN   fire_terminal_callbackr   r3   )r   rW   rX   rU   rY   rZ   ra   rq   rr   rV   rs   s              r/   *test_fire_terminal_callback_success_runnerr      s'   ##%E  )E) E)))) E))))))5)))5))) )))E)))))))

+
+&q) # , C w<4<4<4<4 !F%FF!%FFFFF!%FFFF!FFF%FFFFFFFF 6OA$66 $66666 $6666 666$66666666  (D( D(((( D((((((5(((5((( (((D(((((((r1   c                 z   d} d}t        | |      }|t        k(  }|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                  |      t        j                  |      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}}y )NTFr   rF   )zY%(py6)s
{%(py6)s = %(py0)s(terminal_reached=%(py2)s, callback_fired=%(py4)s)
} == %(py8)sr   r	   )r9   r   r;   rh   py8zassert %(py10)spy10)
r   r	   rJ   rP   rH   rI   rK   rL   rM   rN   )rW   rU   r   r   @py_format9@py_format11s         r/   /test_watcher_terminal_callback_status_not_wiredr      s   :>OT($uUU.	/  U.     	)   	)   ;?   PU   	V     /   /      r1   c            
     r   t         j                         } t         j                  dddd| t        d            }|d   }d}||u }|slt	        j
                  d	|fd
||f      t	        j                  |      t	        j                  |      dz  }dd|iz  }t        t	        j                  |            d x}x}}|d   }|t        k(  }|st	        j
                  d|fd|t        f      t	        j                  |      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}}| 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 )Nr   r   HOLD_FOR_CHAIRtest_not_wired   r   r   Fr<   re   rf   rg   rh   r   rF   r   r	   rl   rn   r   r   r   r?   r@   r   )r   r   r   r3   rJ   rP   rL   rM   rN   r	   rH   rI   rK   r   )r   ra   rq   rU   rr   rV   rs   rt   rY   rW   rX   rZ   s               r/   *test_fire_terminal_callback_failure_runnerr      sd   ##%E

+
+' # , C w< 5 <5    <5   <   5        !H!%HHHHH!%HHHH!HHHHHH%HHHH%HHHHHHHH  )E) E)))) E))))))5)))5))) )))E)))))))r1   c            	     V   t         j                         } | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}t         j                  |        t         j                  |        t         j                  |        t         j                  |        t         j                  |        t         j!                  |        | 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                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}| j"                  } |       }t%        |      }d}	||	u }
|
st        j                  d|
fd	||	f      d
t        j                         v st        j                  t$              rt        j                  t$              nd
dt        j                         v st        j                  |       rt        j                  |       ndt        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }dd|iz  }t        t        j                  |            d x}x}x}x}
}	y )NFr<   )zJ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.all_tracked
}()
} is %(py7)sr   )r9   r   r;   r   rD   r   T)zm%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.as_tracked_dict
}()
})
} is %(py10)sr   )r9   r:   rm   r   r   r   zassert %(py12)spy12)r   r   all_trackedrJ   rP   rH   rI   rK   rL   rM   rN   mark_head_changemark_non_force_pushmark_cimark_finish_donemark_normal_callbackmark_fallback_pruneas_tracked_dictr   )r   rW   rU   r[   r   rZ   r\   rr   rX   @py_assert9r   r   @py_format13s                r/   test_six_state_trackingr      s5   ##%E''%'%''''%''''''5'''5'''''''''%'''''''&""5)u&##E*""5)&&$&$&&&&$&&&&&&5&&&5&&&&&&&&&$&&&&&&&#33>35>56>$>6$>>>>6$>>>>>>>>>>>>>>>e>>>e>>>3>>>5>>>6>>>$>>>>>>>>r1   c                    t         j                         } | j                  } |       }|j                  } |       }t	        |      }|t
        k(  }|st        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                  |      t        j                  |      t        j                  |      t        j                  |      t        j                  |      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}x}}y )	NrF   )z%(py11)s
{%(py11)s = %(py0)s(%(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.as_tracked_dict
}()
}.keys
}()
})
} == %(py13)stupler   r   )r9   r:   rm   r   r   r   r   py13assert %(py15)spy15)r   r   r   keysr   r   rJ   rP   rH   rI   rK   rL   rM   rN   )	r   rr   rX   r[   r   @py_assert10@py_assert12@py_format14@py_format16s	            r/   (test_as_tracked_dict_keys_match_constantr      s   ##%E&&J&(J(--J-/J5/0J04JJJJJ04JJJJJJJ5JJJ5JJJJJJJJJJJJ&JJJ(JJJ-JJJ/JJJ0JJJJJJ4JJJJ4JJJJJJJJJr1   c            
     ~   t         j                  } d}d}d} | |||      }d}||u }|st        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                  |      t        j                  |      t        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x} x}x}x}x}x}}y )Nr   w   x   last_event_secnow_secquiet_window_secFr<   z%(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.is_quiet_window_settled
}(last_event_sec=%(py4)s, now_sec=%(py6)s, quiet_window_sec=%(py8)s)
} is %(py13)sr   r9   r   r;   rh   r   r   r   r   r   
r   is_quiet_window_settledrJ   rP   rH   rI   rK   rL   rM   rN   	rW   rU   r   r   r   r   @py_assert11r   r   s	            r/   test_quiet_window_not_settledr      sE   **&)<?*cC	
 		
 	 
 	
 	 
  
 	 	 
 	 	 
 	 	+ 
   
  '* 
  =@ 
 		
 
  	   
    r1   c            
     ~   t         j                  } d}d}d} | |||      }d}||u }|st        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                  |      t        j                  |      t        j                  |      dz  }d	d
|iz  }t        t        j                  |            d x} x}x}x}x}x}}y )Nr   r   r   Tr<   r   r   r   r   r   r   r   s	            r/   test_quiet_window_settledr     sE   **&)<?*cC	
 		
 	 
 	
 	 
  
 	 	 
 	 	 
 	 	+ 
   
  '* 
  =@ 
 		
 
  	   
    r1   c                    t         j                  } d}| |k(  }|st        j                  d|fd| |f      dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }dd|iz  }t        t        j                  |            d x} x}}y )Nr   rF   )zF%(py2)s
{%(py2)s = %(py0)s.REVIEW_SETTLE_QUIET_WINDOW_SEC
} == %(py5)sr   r?   r@   r   )
r   REVIEW_SETTLE_QUIET_WINDOW_SECrJ   rP   rH   rI   rK   rL   rM   rN   )rW   rX   rU   rY   rZ   s        r/   "test_quiet_window_default_constantr     st    44;;4;;;;4;;;;;;:;;;:;;;4;;;;;;;;;;r1   c                    ddl m} m}m}m} 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}}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        |       }|sd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        t        j                  |            d }t        |      }|sd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        t        j                  |            d }y )Nr   ) build_anu_owned_callback_requestlaunch_callbackCALLBACK_KIND_NORMALCALLBACK_KIND_FALLBACKnormalrF   z%(py0)s == %(py3)sr   r9   rm   rn   r   fallbackr   ,assert %(py3)s
{%(py3)s = %(py0)s(%(py1)s)
}callabler   r9   r:   rm   r   )(dispatch.normal_fallback_callback_helperr   r   r   r   rJ   rP   rH   rI   rK   rL   rM   rN   r   )r   r   r   r   rr   rW   rt   rY   s           r/   1test_normal_fallback_callback_helper_import_smoker     s     $,+8++++8++++++++++++8+++++++%//!Z////!Z//////!///!///Z///////45555555585558555555455545555555555O$$$$$$$$8$$$8$$$$$$O$$$O$$$$$$$$$$r1   c                    ddl m} m} 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        |       }|sd	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        t        j                  |            d }y )Nr   ) validate_spawn_callback_contractNO_OP_SPAWN_CONTRACT_FAILEDr   rF   r   r   rn   r   r   r   r   r   )*dispatch.spawn_callback_contract_validatorr   r   rJ   rP   rH   rI   rK   rL   rM   rN   r   )r   r   rr   rW   rt   rY   s         r/   3test_spawn_callback_contract_validator_import_smoker   "  s    
 +HG&*GGGGG&*GGGGGGG&GGG&GGG*GGGGGGGG45555555585558555555455545555555555r1   c                    t        dd      } t        j                         }t        j                  | dd|      \  }}|t        v }|st        j                  d|fd|t        f      d	t        j                         v st        j                  |      rt        j                  |      nd	d
t        j                         v st        j                  t              rt        j                  t              nd
dz  }dd|iz  }t        t        j                  |            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  }d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  }dd|iz  }	t        t        j                  |	            d 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}||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}}y )NdeadbeefdriftedBLOCKED)head_ref_oidmerge_state_statusexpectedhead000
   expected_headelapsed_watcher_secr   in)z%(py0)s in %(py2)sr   r   rc   rd   r;   r   rF   r   r   rn   r   
head_driftz%(py1)s in %(py3)sr   rl   r   )z-%(py2)s
{%(py2)s = %(py0)s.polls
} == %(py5)sr   r?   r@   r   )z3%(py2)s
{%(py2)s = %(py0)s.elapsed_sec
} == %(py5)s)r   r   r   run_oncer   rJ   rP   rH   rI   rK   rL   rM   rN   pollselapsed_sec)snapr   r   r   rW   rp   rV   rr   rt   rY   rq   rX   rU   rZ   s                 r/   )test_run_once_head_drift_returns_terminalr  /  sC    #4SD##%E'00'	 1 NF _,,,,>_,,,,,,>,,,>,,,,,,_,,,_,,,,,,,-->----->------->--->-----------!<6!!!!<6!!!<!!!!!!6!!!6!!!!!!!;;!;!;!55;!""""""""""""5"""5"""""""""""""r1   c                    t        ddd      } t        j                         }t        j                  | 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  }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}}y )Nsamehead000r   r   )r   r   unresolved_thread_count   r   r   rF   r   r   r   rn   r   continuer   )r   r   r   r   rJ   rP   rH   rI   rK   rL   rM   rN   )r   r   r   r   rr   rW   rt   rY   s           r/   (test_run_once_non_terminal_returns_emptyr  A  s    "$ !D
 ##%E'00#	 1 NF  >R>R>>R6Z6Z66Zr1   c                 h   t        dd      } d}| |u }|st        j                  d|fd| |f      dt        j                         v st        j
                  |       rt        j                  |       ndt        j                  |      dz  }dd	|iz  }t        t        j                  |            dx}}y)
u^   HIGH-2: result=None 이면 TypeError 없이 None 을 그대로 반환 (record-only 무손상).NFr5   r<   )z%(py0)s is %(py3)sra   r   rn   r   	r   rJ   rP   rH   rI   rK   rL   rM   rN   )ra   rr   rW   rt   rY   s        r/   0test_annotate_none_returns_original_no_exceptionr
  V  sf    
"4E
BC3$;3$33$r1   c                    g dddfD ]  } t        | dd      }|| u }|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  }dd|iz  }t        t        j                  |            d} y)u`   HIGH-2: result 가 dict 가 아니면(list/str) 원본 객체를 변형 없이 그대로 반환.)notadictzstring-resultr   T)r6   r   r<   r`   ra   badrc   rd   r;   Nr	  )r  ra   rW   rp   rV   s        r/   4test_annotate_non_dict_returns_original_no_exceptionr  \  s    $or: &stDQczscssccr1   c                R   ddl }ddd}|}d }|j                  d      }	 |} ||ddd	      }||u }|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  }	dd|	iz  }
t        t	        j                  |
            d}|d   }d}||k(  }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }
dd|
iz  }t        t	        j                  |            dx}x}}y# t        $ r}|j                  d
|        Y d}~rd}~ww xY w)u   HIGH-1: record-only 게이트 annotate 가 예외를 던져도 dispatch 호출부는 무중단,
    원래 _result 가 보존되어야 한다 (dispatch/__init__.py 호출부 try-except 계약 재현).r   NrB   z	task-2729)r_   r   c                     t        d      )Nzinjected gate failure)RuntimeError)argsr.   s     r/   _boomz?test_gate_call_site_exception_does_not_interrupt.<locals>._boomk  s    233r1   test_gate_call_siteFr   u>   [progress-watcher-gate] record-only annotate 실패 (무시): r<   r`   _resultsentinelrc   rd   r;   r_   rF   ri   rf   rg   rh   )logging	getLogger	ExceptionwarningrJ   rP   rH   rI   rK   rL   rM   rN   )monkeypatchr  r  r  r  loggerannotate_pwg_errrW   rp   rV   rq   rU   rr   rs   s                  r/   0test_gate_call_site_exception_does_not_interruptr!  c  s4    &;?HG4 45Fd7uRW`ef
 h7h77hh8,,,,,,,,,,,,,,,,,,,  dWX`Wabccds   E> >	F&F!!F&c            	     6   ddl } | j                  j                  | j                  j                  | j                  j                  | j                  j                  t                                }| j                  j                  |dd      }t        |d      j                         }|j                  d      }d}| }||k7  }|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}x}}|t#        d|dz
        | }
d}||
v }|st        j                  d|fd||
f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddz  }dd|iz  }t        t        j                   |            dx}}y)uZ   HIGH-1: dispatch/__init__.py annotate_dispatch_result 호출부 직전에 try: 가 존재.r   Nr   z__init__.pyzutf-8)encodingzannotate_dispatch_result(r   )!=)z%(py0)s != -%(py3)sir   rg   rh   i  ztry:r   r   segrl   rn   r   )ospathdirnameabspathr   joinopenreadfindrJ   rP   rH   rI   rK   rL   rM   rN   max)r'  basesrc_pathsr%  rr   rX   rW   rV   rs   r&  rq   rt   rY   s                 r/   ,test_dispatch_call_site_has_try_except_guardr3  {  s-   77??277??277??277??8;T+UVWDww||D*m<HX(--/A	*+ANN17NNN1NNNNNN1NNN1NNNNNNNNNN
C1s7OA
C6S=6S6SSr1   )r$   int)b__doc__
__future__r   builtinsrH   _pytest.assertion.rewrite	assertionrewriterJ   importlib.util	importlibpathlibsysr'   Pathr   resolveparents_ROOTstr	_ROOT_STRr(  removeinsertlistmodules_name
startswith_modgetattr_fdispatch.progress_watcher_gater   r	   r
   r   r   r   r   r   r   r   *utils.pr_watcher_terminal_state_classifierr   r   _RUNNER_PATHutilspec_from_file_locationr   rW   rX   rU   rq   loaderr   @py_assert13r   rP   rI   rK   rL   rY   rZ   append@py_format15@py_format17_format_boolop@py_format18@py_format20rM   rN   module_from_specr   exec_moduler3   r]   ru   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r
  r  r!  r3  r2   r1   r/   <module>r]     s  " #      
  	X&&(003J	388HHOOI 388 9  #++ #E
e..{;{{5!T:t,2}}Y'E"#   y #??../H,W 5D 5uD 5U\\ 5 5\5 5 5 5uD 5 5 5 5 5u 5 5 5u 5 5 5D 5 5 5 5 5 5 5\ 5 5 5 5 5U 5 5 5U 5 5 5\ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5^^,,U3
)3% &    $&;3\?3)(*(?K<%6#$ *-0	r1   