
    j(                       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
mZ e	j                  j                  d e ee      j!                         j"                  d                ddlZddlmZmZmZmZ d Zd Zd	 Zd
 Zd Zy)u   task-2673 RS-2670-A — LOOP_BOUNDARY elapsed-only 우선순위 보정.

수정 목표 5: elapsed >= max_watch 도달 시 unresolved/BLOCKED 잔재가 있으면
HOLD_FOR_CHAIR 로 격상; 잔재 없으면 LOOP_BOUNDARY 정상.
    )annotationsN)Path   )HOLD_FOR_CHAIRLOOP_BOUNDARY
PRSnapshotclassifyc                   t        |       }|g|d<   t        j                  ||      }t        |d|d      \  }}|t        k(  }|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}||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}}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)u   RS-2670-A — poll #30 박제 시점 unresolved=3, BLOCKED 잔재 → HOLD.

    fresh-evidence HOLD 분기가 LOOP_BOUNDARY 보다 먼저 발화하므로,
    본 케이스는 gemini stale 시나리오로 LOOP_BOUNDARY-residual 분기 발화 확인.
    reviews  elapsed_watcher_secexpected_headmax_watch_seconds==z%(py0)s == %(py2)sstater   py0py2assert %(py4)spy4Nloop_boundary_with_residualinz%(py1)s in %(py3)sreasonpy1py3assert %(py5)spy5zunresolved=3zmss=BLOCKED)dictr   from_ghr	   r   
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanation)poll_12_pr_datapoll_12_th_datar   stale_gemini_reviewprsnapr   r   @py_assert1@py_format3@py_format5@py_assert0@py_assert2@py_format4@py_format6s                  ]/home/jay/workspace/tests/pr_watcher_terminal_state_classifier/test_classify_loop_boundary.py4test_loop_boundary_with_unresolved_escalates_to_holdr;      s    
o	B()ByMb/2D #!	ME6 N""""5N""""""5"""5""""""N"""N"""""""(2(F2222(F222(222222F222F2222222#>V####>V###>######V###V#######"=F""""=F"""=""""""F"""F"""""""    c                \   t        j                  | |      }t        |d|d      \  }}|t        k(  }|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}	|	|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
)u8  fresh-evidence HOLD 분기는 LOOP_BOUNDARY 도달 시점에도 먼저 발화한다.

    이는 사고 박제 (dev7 watcher poll #12 silent fall-through) 의 결정적
    재발 방지 — fresh evidence 가 있으면 max_watch 까지 굳이 기다리지 않고
    즉시 HOLD_FOR_CHAIR 로 격상한다.
    r   r   r   r   r   r   r   r   r   Nfresh_gemini_head_matchr   r   r   r   r"   r#   r   r%   r	   r   r&   r'   r(   r)   r*   r+   r,   r-   )r.   r/   r   r2   r   r   r3   r4   r5   r6   r7   r8   r9   s                r:   /test_fresh_evidence_priority_over_loop_boundaryr@   /   s     o?D #!	ME6 N""""5N""""""5"""5""""""N"""N"""""""$.$....$...$................r<   c                t   | dddddgg d}t        j                  ||      }t        |d| d	      \  }}|t        k(  }|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}	|	|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)u\   잔재 없는 max_watch 도달은 정상 LOOP_BOUNDARY (회장 보고는 별 의미 없음).BEHIND cancel-kill-switchSUCCESSname
conclusion
headRefOidmergeStateStatusreviewDecisionstatusCheckRollupr   it  r   r   r   r   r   r   r   r   r   Nzno residualr   r   r   r   r"   r#   )r   r%   r	   r   r&   r'   r(   r)   r*   r+   r,   r-   )r   empty_th_datar1   r2   r   r   r3   r4   r5   r6   r7   r8   r9   s                r:   :test_loop_boundary_clean_no_residual_returns_loop_boundaryrO   C   s   
 $$)C
 
B b-0D #!	ME6 M!!!!5M!!!!!!5!!!5!!!!!!M!!!M!!!!!!!"=F""""=F"""=""""""F"""F"""""""r<   c                (   | dddddgg d}t        j                  ||      }t        |d|       \  }}|t        k(  }|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}y)uC   unresolved=0 이지만 BLOCKED 잔재만 있어도 HOLD 로 격상.BLOCKEDrC   rD   rE   rF   rI   r   r   r   r   r   r   r   r   r   r   Nr?   )	r   rN   r1   r2   r   _r3   r4   r5   s	            r:   )test_loop_boundary_blocked_only_escalatesrT   [   s     $%)C
 
B b-0D #HE1
 N""""5N""""""5"""5""""""N"""N"""""""r<   c                   | ddg g d}t        j                  ||      }t        |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)uI   elapsed < max_watch 이면 LOOP_BOUNDARY 분기 자체가 발화 안 함.rB   rC   rI   x   rR   r   )z%(py0)s == %(py3)sr   )r   r!   r"   r#   Ncontinuer   )r   r%   r	   r&   r'   r(   r)   r*   r+   r,   r-   )
r   rN   r1   r2   r   r   r7   r3   r8   r9   s
             r:    test_below_max_watch_no_terminalrX   o   s     $$
B b-0D#ME6
 5B;5B55B6Z6Z66Zr<   )__doc__
__future__r   builtinsr(   _pytest.assertion.rewrite	assertionrewriter&   syspathlibr   pathinsertstr__file__resolveparentspytest*utils.pr_watcher_terminal_state_classifierr   r   r   r	   r;   r@   rO   rT   rX    r<   r:   <module>rj      sn   
 #   
  3tH~--/77:; <  #./(#0#( r<   