
    H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
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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! ddl"m#Z# dd	l$m%Z% dd
l&m'Z'm(Z( ddl)m*Z*  ee      j                         j                  d   dz  dz  Z+ddZ,ddZ-ddZ.dd	 	 	 	 	 	 	 ddZ/d Z0d Z1d Z2d Z3d Z4d Z5d Z6y) u$  task-2560 FUC-4 per-PR exception isolation 회귀 테스트.

회장 §명시 2026-05-12 Track A 1순위 본질 1:1:
  ExecutorScheduler._handle_single_diagnosis 에서 한 PR 예외가 전체 cycle 을
  중단하지 않게 한다. per-PR try/except isolation + non-critical exception 시
  cycle 유지.

회장 §명시 필수 테스트 6 (작업 지시서 1:1):
  1. PR A diagnosis raises exception
  2. PR B diagnosis still processed
  3. failed PR marker 생성
  4. next PR owner_trigger path 정상 유지
  5. whole cycle crash 0
  6. long polling 0

추가 critical 분류 회귀:
  7. PR C critical exception (PermissionError) → ESCALATED marker 박제
  8. exception summary 가 decision/audit JSONL 양쪽에 기록
  9. BotSessionExitRequired 는 isolation 으로 삼키지 않고 전파
    )annotationsN)Path   )
ACTION_OWNER_TRIGGER_DISPATCHED&ACTION_PR_EXCEPTION_CRITICAL_ESCALATEDACTION_PR_EXCEPTION_ISOLATEDExecutorSchedulerPR_EXCEPTION_AUDIT_SCHEMASCHEDULER_AUDIT_REL_PATHSchedulerCycleResult_CRITICAL_EXCEPTIONS_is_critical_exception_summarize_exception)GeminiReviewMetaIdlePRSnapshotMergeQueueExecutor)OwnerTriggerAudit)OwnerTriggerOnlyTokenBoundaryViolationBotSessionExitRequired   fixturesz(executor_per_pr_exception_isolation.jsonc                 T    t        j                  t        j                  d            S )Nutf-8encoding)jsonloadsFIXTURE_PATH	read_text     L/home/jay/workspace/anu_v2/tests/test_executor_scheduler_per_pr_isolation.py_load_fixturer&   C   s    ::l,,g,>??r$   c                    t        d | j                  dg       D              }t        | d   | d   | d   | d   || d   | j                  dd	      | j                  d
d            S )Nc              3  B   K   | ]  }t        |d    |d           yw)	commit_idsubmitted_at)r)   r*   N)r   ).0rs     r%   	<genexpr>z"_build_snapshot.<locals>.<genexpr>H   s+       	1[>.@QRRs   gemini_reviewsnumberhead_shahead_ref
created_atci_required_all_successstateOPENauthor_is_botT)r/   r0   r1   r2   r.   r3   r4   r6   )tuplegetr   )snapshot_dictreviewss     r%   _build_snapshotr;   G   s     ""#3R8 G X&z*z* . -.G H0#''>	 	r$   c                *    t        d d d d |       S )Nc                    i S Nr#   )argsenvs     r%   <lambda>z'_build_merge_executor.<locals>.<lambda>Z   s    B r$   c                     y)N r#   )r?   s    r%   rA   z'_build_merge_executor.<locals>.<lambda>[       r$   c                     y)Nr   r#   )pathss    r%   rA   z'_build_merge_executor.<locals>.<lambda>\   rD   r$   c                     y r>   r#   )payloads    r%   rA   z'_build_merge_executor.<locals>.<lambda>]   rD   r$   )	gh_runner
git_runnerpytest_runneraudit_writertask_md_rootr   )tmp_paths    r%   _build_merge_executorrO   X   s    &"%) r$   %ghp_owner_test_token_xxxxxxxxxxxxxxxxtokenc               J    fd}t        |       }t        | |fd|      S )Nc                8    j                  | ||d       dddS )N)methodpathbodyr   zhttps://example/comments/1)idhtml_url)append)rU   rV   rW   headers
http_callss       r%   	http_postz'_build_owner_trigger.<locals>.http_posth   s$    VT4HI%ABBr$   c                      S r>   r#   rQ   s   r%   rA   z&_build_owner_trigger.<locals>.<lambda>p   s    u r$   )workspace_rootr]   token_provideraudit)r   r   )rN   r\   rR   r]   ra   s    ``  r%   _build_owner_triggerrb   b   s.    C h'E$	 r$   c           	         t               }t        |d   d         t        |d   d         g }t        |       }t        | |      }| dz  dz  }t	        | |fd||dd	
      }|j
                  fd}||_        |j                  ddi|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$                  }t'        |      }d}||k(  }|s
t        j"                  d|fd||f      dt        j                         v st        j                  t&              rt        j                  t&              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d z  }d!d"|iz  }t        t        j                  |            dx}x}x}}t)        d# |j$                  D              }|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}}	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}}d.}|j0                  }||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}}|d0z  }|d1z  }|j2                  } |       }	|	sd2d3t        j                         v st        j                  |      rt        j                  |      nd3t        j                  |      t        j                  |	      d'z  }
t        t        j                  |
            dx}}	|j2                  } |       }	|	sd2d4t        j                         v st        j                  |      rt        j                  |      nd4t        j                  |      t        j                  |	      d'z  }
t        t        j                  |
            dx}}	t5        j6                  |j9                  d56            }|d7   }|t:        k(  }|st        j"                  d|fd8|t:        f      t        j                  |      d9t        j                         v st        j                  t:              rt        j                  t:              nd9d: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}}	|dA   }d}	||	u }|slt        j"                  d|fdB||	f      t        j                  |      t        j                  |	      d@z  }
d(d)|
iz  }t        t        j                  |            dx}x}}	|dC   dD   }d*}	||	k(  }|slt        j"                  d|fd?||	f      t        j                  |      t        j                  |	      d@z  }
d(d)|
iz  }t        t        j                  |            dx}x}}	|dE   }d}	||	k(  }|slt        j"                  d|fd?||	f      t        j                  |      t        j                  |	      d@z  }
d(d)|
iz  }t        t        j                  |            dx}x}}	t)        dF |j$                  D              }|j*                  }|t<        k(  }	|	st        j"                  d|	fd$|t<        f      dGt        j                         v st        j                  |      rt        j                  |      ndGt        j                  |      dHt        j                         v st        j                  t<              rt        j                  t<              ndHd'z  }
d(d)|
iz  }t        t        j                  |            dx}}	|j.                  }dI}||k(  }	|	st        j"                  d|	fdJ||f      dGt        j                         v st        j                  |      rt        j                  |      ndGt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}	}t'        |      }d}||k(  }|st        j"                  d|fdK||f      dt        j                         v st        j                  t&              rt        j                  t&              nddLt        j                         v st        j                  |      rt        j                  |      ndLt        j                  |      t        j                  |      dMz  }dNdO|iz  }t        t        j                  |            dx}x}}|d   dP   }dQ}	||	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}||k(  }	|	st        j"                  d|	fdR||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dS||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}	}|jB                  }d}||k(  }	|	st        j"                  d|	fdT||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)Uu  필수 1+2+3+4+5: PR A raise / PR B 정상 처리 / failed marker / cycle 유지.

    회장 §명시 본질 1~5 1:1 박제:
      - PR A: snapshot_provider 가 정상 반환하지만, 내부에서 owner trigger 가
        runner 호출 시 RuntimeError raise. PR A 만 PR_EXCEPTION_ISOLATED + failed marker.
      - PR B: 정상 owner trigger 경로 진행 (DISPATCHED + posted marker).
      - cycle 전체 중단 0, 다음 PR 진행 유지.
    	snapshotsr   r   r\   memoryeventsc                      gS r>   r#   )snap_asnap_bs   r%   rA   z<test_pr_a_exception_isolated_pr_b_proceeds.<locals>.<lambda>       66"2 r$   
test-owner	test-repor_   decision_dirsnapshot_providerowner_triggermerge_executorownerrepoc                L    | j                   dk(  rt        d       | |      S )N)#  simulated PR A runner failurediagsnapshot)	pr_numberRuntimeErrorry   rz   originals     r%   faulty_dispatchzCtest_pr_a_exception_isolated_pr_b_proceeds.<locals>.faulty_dispatch   s(    >>T!>??TH55r$   OWNER_GEMINI_TRIGGER_TOKENrP   nowr@   r   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}
isinstanceresultr   )py0py1py2py4NFisz5%(py2)s
{%(py2)s = %(py0)s.cycle_crashed
} is %(py5)sr   r   py5assert %(py7)spy7r   ==zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.pr_actions
})
} == %(py8)slenr   r   py3r   py8assert %(py10)spy10c              3  @   K   | ]  }|j                   d k(  s|  yw)rv   Nr{   r+   as     r%   r-   z=test_pr_a_exception_isolated_pr_b_proceeds.<locals>.<genexpr>        H!AKK44GAH   z.%(py2)s
{%(py2)s = %(py0)s.action
} == %(py4)saction_ar   r   r   r   assert %(py6)spy6r|   in)z5%(py1)s in %(py5)s
{%(py5)s = %(py3)s.runner_result
})r   r   r   rw   )z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.reason
}ztask-9001.pr-9001.failedz task-9001.pr-9001.exception.jsonAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}failed_markersummary_pathr   r   schemaz%(py1)s == %(py3)sr
   r   r   assert %(py5)sr   r{   rv   z%(py1)s == %(py4)sr   r   criticalz%(py1)s is %(py4)sexception_summarytypechat_notificationsc              3  @   K   | ]  }|j                   d k(  s|  yw*#  Nr   r   s     r%   r-   z=test_pr_a_exception_isolated_pr_b_proceeds.<locals>.<genexpr>   r   r   action_br   POSTEDz5%(py2)s
{%(py2)s = %(py0)s.runner_result
} == %(py5)sz0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr\   r   r   r   r   assert %(py8)sr   rV   z0/repos/test-owner/test-repo/issues/9002/commentsz:%(py2)s
{%(py2)s = %(py0)s.chat_notifications
} == %(py5)sz>%(py2)s
{%(py2)s = %(py0)s.pr_exceptions_isolated
} == %(py5)szH%(py2)s
{%(py2)s = %(py0)s.pr_exceptions_critical_escalated
} == %(py5)s)"r&   r;   rO   rb   r	   _dispatch_owner_triggerrun_one_cycler   r   @py_builtinslocals
@pytest_ar_should_repr_global_name	_safereprAssertionError_format_explanationcycle_crashed_call_reprcompare
pr_actionsr   nextactionr   runner_resultreasonexistsr   r    r"   r
   r   r   pr_exceptions_isolated pr_exceptions_critical_escalated) rN   fixturer\   rr   rq   ro   	schedulerr   r   @py_assert3@py_format5@py_assert1@py_assert4@py_format6@py_format8@py_assert2@py_assert7@py_assert6@py_format9@py_format11r   @py_format7@py_assert0r   r   summary@py_format4r   @py_assert5r~   ri   rj   s                                 @@@r%   *test_pr_a_exception_isolated_pr_b_proceedsr   x   s	    oGW[1!45FW[1!45FJ*84N(jIMh&1L!!2#%I 00H6
 )8I%$$)+RSEN % F f233333333:333:333333f333f333333233323333333333(5(5((((5((((((6(((6((((((5(((((((  &3 !&Q&!Q&&&&!Q&&&&&&3&&&3&&&&&&v&&&v&&& &&&!&&&Q&&&&&&& Hv00HHH??:?:::::?:::::::8:::8:::?::::::::::::::::::3X333>33333>3333>333333X333X33333333333*=hoo=*o====*o===*======h===h===o======= !#==M"DDL!!!!!!!!!=!!!=!!!!!!!!!!!!!         <   <             jj///ABG89 99999 9999999999 9999 99999999;'4'4''''4''''''4''''''':'%'%''''%''''''%'''''''&'/A>A/>AAAA/>AAA/AAA>AAAAAAA'(-A-(A----(A---(---A------- Hv00HHH??=?=====?=======8===8===?==================!!-X-!X----!X------8---8---!---X-------z?a?a?a33zz?aa= V$VV $VVVVV $VVVV VVV$VVVVVVVV $$))$))))$))))))6)))6)))$))))))))))((-A-(A----(A------6---6---(---A-------227a72a77772a777777677767772777a7777777r$   c           	     J   t               }t        |d   d         t        |d   d         g }t        |       }t        | |      }| dz  dz  }t	        | |fd||dd	
      }|j
                  fd}||_        |j                  ddi|d         }t        d |j                  D              }	|	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}}|dz  }|dz  }|j(                  }
 |
       }|sd d!t        j                         v st        j                  |      rt        j                   |      nd!t        j                   |
      t        j                   |      dz  }t#        t        j$                  |            dx}
}|j(                  }
 |
       }|sd d"t        j                         v st        j                  |      rt        j                   |      nd"t        j                   |
      t        j                   |      dz  }t#        t        j$                  |            dx}
}t+        j,                  |j/                  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}}|j0                  }
d/}|
|u }|st        j                  d'|fd0|
|f      d1t        j                         v st        j                  |      rt        j                   |      nd1t        j                   |
      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}
x}}t        d2 |j                  D              }|j                  }
|
t2        k(  }|st        j                  d|fd|
t2        f      d3t        j                         v st        j                  |      rt        j                   |      nd3t        j                   |
      d4t        j                         v st        j                  t2              rt        j                   t2              nd4dz  }dd|iz  }t#        t        j$                  |            dx}
}|j4                  }
d}|
|k(  }|st        j                  d|fd5|
|f      d1t        j                         v st        j                  |      rt        j                   |      nd1t        j                   |
      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}
x}}|j6                  }
d6}|
|k(  }|st        j                  d|fd7|
|f      d1t        j                         v st        j                  |      rt        j                   |      nd1t        j                   |
      t        j                   |      dz  }dd|iz  }t#        t        j$                  |            dx}
x}}y)8uM   PR C critical exception (PermissionError) → ESCALATED marker, cycle 유지.rd   r   r   re   rf   rg   c                      gS r>   r#   )rj   snap_cs   r%   rA   z:test_critical_exception_escalated_marker.<locals>.<lambda>   rk   r$   rl   rm   rn   c                L    | j                   dk(  rt        d       | |      S )N+#  z"simulated critical disk permissionrx   )r{   PermissionErrorr}   s     r%   r   zAtest_critical_exception_escalated_marker.<locals>.faulty_dispatch   s(    >>T!!"FGGTH55r$   r   rP   r   r   c              3  @   K   | ]  }|j                   d k(  s|  yw)r   Nr   r   s     r%   r-   z;test_critical_exception_escalated_marker.<locals>.<genexpr>   r   r   r   r   action_cr   r   r   r   Nr   r   r   r   r   z$task-9003.pr-9003.critical-escalatedz task-9003.pr-9003.exception.jsonr   crit_markerr   r   r   r   Tr   r   r   r   r   r   r   r   Fr   r   c              3  @   K   | ]  }|j                   d k(  s|  ywr   r   r   s     r%   r-   z;test_critical_exception_escalated_marker.<locals>.<genexpr>   r   r   r   r   r   r   r   )r&   r;   rO   rb   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r"   r   r   r   r   )rN   r   r\   rr   rq   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r~   rj   r   s                           @@@r%   (test_critical_exception_escalated_markerr      s]   oGW[1!45FW[1!45FJ*84N(jIMh&1L!!2#%I 00H6
 )8I%$$)+RSEN % F
 Hv00HHH??D?DDDDD?DDDDDDD8DDD8DDD?DDDDDDDDDDDDDDDDDD!!6%66!%66666!%666666686668666!666%66666666!GGK"DDL;;         <   <             jj///ABG:&$&$&&&&$&&&&&&$&&&&&&&8F FFFFF FFFFFFFFFF FFFF FFFFFFFF (5(5((((5((((((6(((6((((((5(((((((Hv00HHH??=?=====?=======8===8===?==================227a72a77772a777777677767772777a7777777((-A-(A----(A------6---6---(---A-------r$   c           	         t               }|d   D cg c]  }t        |       c} g }t        |       }t        | |      }| dz  dz  }t	        | | fd||dd      }|j
                  fd	}||_        |j                  d
di|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   }||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}}|	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&                  }t)        |      }|
d   }||k(  }|s
t        j                  d|fd||f      d t        j                         v st        j                  t(              rt        j                  t(              nd dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |      t        j                  |      t        j                  |      d!z  }d"d#|iz  }t        t        j                  |            dx}x}x}}|	j*                  }d$}||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}}| t,        z  }|j/                  d&'      j1                         D cg c]  }|rt3        j4                  |       }}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}}|D ci c]  }|d.   |d/    }}|d0   }|t6        k(  }|st        j                  d|fd1|t6        f      t        j                  |      d2t        j                         v st        j                  t6              rt        j                  t6              nd2d3z  }d4d5|iz  }t        t        j                  |            dx}}|d6   }|t8        k(  }|st        j                  d|fd1|t8        f      t        j                  |      d7t        j                         v st        j                  t8              rt        j                  t8              nd7d3z  }d4d5|iz  }t        t        j                  |            dx}}|d8   }|t:        k(  }|st        j                  d|fd1|t:        f      t        j                  |      d9t        j                         v st        j                  t:              rt        j                  t:              nd9d3z  }d4d5|iz  }t        t        j                  |            dx}}|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c c}w c c}w c c}w )>uS   필수 1~6 종합: PR A isolated / PR B clean / PR C critical 한 cycle 에 공존.rd   re   rf   rg   c                      S r>   r#   )rd   s   r%   rA   zAtest_three_prs_one_each_outcome_cycle_completes.<locals>.<lambda>  s    ) r$   rl   rm   rn   c                    | j                   dk(  rt        d      | j                   dk(  rt        d       | |      S )Nrv   zsimulated non-criticalr   zsimulated disk fullrx   )r{   r|   OSErrorr}   s     r%   r   zHtest_three_prs_one_each_outcome_cycle_completes.<locals>.faulty_dispatch  s@    >>T!788>>T!/00TH55r$   r   rP   r   r   expected_invariantsr   r   r   r   r   r   r   Nr   r   r   r   r   r   r   pr_actions_countr   r   r   r   r   r   z5%(py2)s
{%(py2)s = %(py0)s.rechecks_done
} == %(py5)sr   r      r   audit_linesr   r   r   r{   r   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   )r&   r;   rO   rb   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rechecks_doner   r"   
splitlinesr   r    r   r   r   )!rN   r   sr\   rr   rq   ro   r   r   r   expectedr   r   r   r   r   r   r   r   r   r   
audit_pathlnr   r   r   recaudit_actionsr   r   r   r~   rd   s!                                  @@r%   /test_three_prs_one_each_outcome_cycle_completesr     sp   oG-4[-AB#BIJ*84N(jIMh&1L!!+#%I 00H6 )8I%$$)+RSEN % F
 ,-H<8O#<<#<<<<<#<<<<<<<6<<<6<<<<<<#<<<<<<<<$$F1E(FF$(FFFFF$(FFFFFFF6FFF6FFF$FFF(FFFFFFFF((NH5M,NN(,NNNNN(,NNNNNNN6NNN6NNN(NNN,NNNNNNNN22bh?a6bb26bbbbb26bbbbbbb6bbb6bbb2bbb6bbbbbbbb  A3 !AX.@%AA!%AAAAA!%AAAAAAA3AAA3AAAAAAvAAAvAAA AAA!AAA%AAAAAAAA $1$1$$$$1$$$$$$6$$$6$$$$$$1$$$$$$$ 44J &&&8CCE 	

2K 
 { q q    q      3   3      {   {      q       @KLS%s8}4LML>">>>>>">>>>>>>>>>">>>>">>>>>>>>A"AAAAA"AAAAAAAAAA"AAAA"AAAAAAAA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 .'(-A-(A----(A---(---A-------.s C\ Ms   g")g'g,c           	        t               }t        |d   d         t        |       }t        | g       }t	        | | dz  dz  fd||dd	      }d
dl}|j                         }|j                  ddi|d         }|j                         |z
  }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}
}	|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"                  }	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t        j                  |	      dt        j                         v st        j                  t&              rt        j                  t&              ndt        j                  |      d z  }t        t        j                  |            dx}	}y)!u   필수 6: long polling 0 — run_one_cycle 은 단일 scan 후 즉시 반환.

    본 모듈에 sleep loop / while True 가 없다는 사실을 동작 단위로 검증.
    rd   r   re   rf   rg   c                 
     gS r>   r#   rj   s   r%   rA   zBtest_long_polling_zero_cycle_returns_immediately.<locals>.<lambda>N  	    6( r$   rl   rm   rn   r   Nr   rP   r   r   g      @)<)z%(py0)s < %(py3)selapsed)r   r   r   r   r   r   r   r   r   r   zZassert %(py6)s
{%(py6)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.bot_should_exit
}, %(py4)s)
}r   bool)r   r   r   r   r   )r&   r;   rO   rb   r	   time	monotonicr   r   r   r   r   r   r   r   r   r   bot_should_exitr   r	  )rN   r   rr   rq   r   r
  startedr   r  r   r   r   r   r   r   r   r   r   rj   s                     @r%   0test_long_polling_zero_cycle_returns_immediatelyr  B  s   
 oGW[1!45F*84N(bAM!(83*#%I nnG$$)+RSEN % F nn(G7S=7S77S$1$1$$$$1$$$$$$6$$$6$$$$$$1$$$$$$$,,3:,d33333333:333:333333f333f333,333333d333d3333333333r$   c           	     B   ddl }t               }t        |d   d         t        |       }t	        | g       }t        | | dz  dz  fd||d	d
      }d }||_        |j                  t              5  |j                  ddi|d          ddd       y# 1 sw Y   yxY w)u   BotSessionExitRequired 는 per-PR isolation 으로 삼키지 않고 전파.

    회장 §9: polling 정책상 exit 신호는 cycle 정상 종료의 표현. per-PR
    isolation 으로 catch 하면 봇이 영원히 안 죽음 → 정책 위반.
    r   Nrd   r   re   rf   rg   c                 
     gS r>   r#   r  s   r%   rA   z>test_bot_session_exit_required_not_swallowed.<locals>.<lambda>r  r  r$   rl   rm   rn   c                    t        d      )Nzpolling MAX_RECHECKS exceededr   rx   s     r%   exit_dispatchzCtest_bot_session_exit_required_not_swallowed.<locals>.exit_dispatchy  s    $%DEEr$   r   rP   r   r   )
pytestr&   r;   rO   rb   r	   r   raisesr   r   )rN   r  r   rr   rq   r   r  rj   s          @r%   ,test_bot_session_exit_required_not_swallowedr  c  s     oGW[1!45F*84N(bAM!(83*#%IF )6I%	-	. 
-/VW 	  	

 
 
s   3BBc            	        t         t        v } | st        j                  d| fdt         t        f      dt	        j
                         v st        j                  t               rt        j                  t               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} t        t        v } | st        j                  d| fdt        t        f      d	t	        j
                         v st        j                  t              rt        j                  t              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} t        t        v } | st        j                  d| fdt        t        f      d
t	        j
                         v st        j                  t              rt        j                  t              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} t        t        v } | st        j                  d| fdt        t        f      dt	        j
                         v st        j                  t              rt        j                  t              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} t        t        v } | st        j                  d| fdt        t        f      dt	        j
                         v st        j                  t              rt        j                  t              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} t        t        v } | st        j                  d| fdt        t        f      dt	        j
                         v st        j                  t              rt        j                  t              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} t        t        v } | st        j                  d| fdt        t        f      dt	        j
                         v st        j                  t              rt        j                  t              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} t!        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                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}}d}t        |      }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                  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}
}	d}t        |      }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                  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}
}	d}t%        |      }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                  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}
}	d}t'        |      }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                  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)!u5   Critical 7 분류 표 (회장 §명시 본질 6) 1:1.r   )z%(py0)s in %(py2)sr   r   )r   r   zassert %(py4)sr   Nr   r   MemoryErrorNotImplementedError	TypeErrorAttributeError   r   r   r   r   r   r   xTr   )zO%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
})
} is %(py10)sr   )r   r   r   r   r   r   zassert %(py12)spy12Fr|   
ValueError)r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r|   r  )r   @py_format3r   r   r   r   r   r   r   @py_assert9@py_assert8r   @py_format13s                r%   0test_critical_exception_classification_matches_7r#    st   !%99999!%9999999!999!999999%9999%9999999922222?2222222?222?222222222222222222*****7*******7***7******************.....;.......;...;.................."66666"6666666666666666"6666"66666666,,,,,9,,,,,,,9,,,9,,,,,,,,,,,,,,,,,,11111>1111111>111>111111111111111111#$))$))))$))))))3)))3))))))#)))#)))$))))))))))25?/#"6?!"67?4?74????74??????!???!??????/???/???#???"6???7???4???????*-7'#,7!,/747/47777/4777777!777!777777'777'777#777,777/77747777777/2=,s"3=!"34==4====4======!===!======,===,===s==="3===4==========-0;*S/;!/2;e;2e;;;;2e;;;;;;!;;;!;;;;;;*;;;*;;;S;;;/;;;2;;;e;;;;;;;;r$   c                    d } i }	  |         |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}}|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   }|j                  }d} ||      }	|	stdt        j                  |      t        j                  |      t        j                  |      t        j                  |	      dz  }
t        t        j                  |
            dx}x}x}}	d}|d   }||v}|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}t        |      }Y d}~d}~ww xY w)uI   ``_summarize_exception`` 은 type/message/origin filename 박제 (PII 0).c                     t        d      )Nsimulated for summary test)r|   r#   r$   r%   _raiserz7test_exception_summary_origin_recorded.<locals>._raiser  s    788r$   Nr   r|   r   r   r   r   r   messager&  origin_functionr'  origin_filenamez.pyzJassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.endswith
}(%(py5)s)
})r   r   r   r   /)not in)z%(py1)s not in %(py4)s)r|   r   r   r   r   r   r   endswith)r'  r   excr   r   r   r   r   r   r   r   s              r%   &test_exception_summary_origin_recordedr/    s   9 G,	 6?,n,?n,,,,?n,,,?,,,n,,,,,,,9=!==!=====!=======!========$%22%2222%222%2222222222$%5%..5u5.u55555%555.555u55555555550g/0030000030000300000000000  ,&s+,s   J' '	K0KK)returndict)r9   r1  r0  r   )rN   r   r0  r   )rN   r   r\   listrR   strr0  r   )7__doc__
__future__r   builtinsr   _pytest.assertion.rewrite	assertionrewriter   r   syspathlibr   __file__resolveparentsWORKSPACE_ROOTr3  rV   insertanu_v2.executor_schedulerr   r   r   r	   r
   r   r   r   r   r   anu_v2.idle_pr_diagnoserr   r   anu_v2.merge_queue_executorr   anu_v2.owner_trigger_auditr   anu_v2.owner_trigger_onlyr   r   anu_v2.polling_policyr   r!   r&   r;   rO   rb   r   r   r  r  r  r#  r/  r#   r$   r%   <module>rG     s$  * #    
  h'')11!4~chh&HHOOAs>*+   ; 8 	N$$Q'01 @" 9	  	
 ,M8`4.n=.F4B
J<"1r$   