
    4j3g                     z   d 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
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 edz  dz  Ze	j2                  j5                  d      Ze eedd      xs d ee      k7  r ee	j2                        D  cg c]  } | dk(  s| j=                  d	      s|  c} D ]  Ze	j2                  e=   ej@                  de eedz        g
      Z!g Z"dZ#e!e#uZ$e$Z%e$re!jL                  Z'dZ(e'e(uZ)e)Z%e%sB ejT                  de$fde!e#f      d ejV                         v s ejX                  e!      r ejZ                  e!      nd ejZ                  e#      dz  Z.dde.iz  Z/e"ja                  e/       e$r ejT                  de)fde'e(f      d ejV                         v s ejX                  e!      r ejZ                  e!      nd ejZ                  e'       ejZ                  e(      dz  Z1dde1iz  Z2e"ja                  e2        ejf                  e"d      i z  Z4dde4iz  Z5 e6 ejn                  e5            dxZ%xZ"xZ$xZ#xZ'xZ)Z( ejp                  e!      Z9e9e	j2                  d<   e!jL                  ju                  e9       ddl;m<Z= d Z>d Z? G d d      Z@ G d d      ZAd%dZBd&dZCd  ZDd! ZE G d" d#ej                        ZGeHd$k(  r ej                          yyc c} w )'u	  tests/regression/test_p0b_event_strategy_2760.py

task-2760+2 — P0B event strategy move-first 최소 replacement PR regression.

설계근거: memory/plans/pr242_hold_ledger_axis_split_required_packet_260617.md (회장 승인).
상태: P0B_EVENT_STRATEGY_MOVE_FIRST_MINIMAL_REPLACEMENT_PR_CREATED_ACTIVE_FALSE · ACTIVE=false.

★ 범위 축소 replacement: PR #242 의 ledger compaction/robustness 축(whack-a-mole)을
  추가 bounded fix 가 아니라 **들어내어**(제거) 범위를 좁힌다. 본 PR 은 "ledger 완벽 수정"이
  아니라 "move-first 불변식만 안전 보존"한다. ledger compaction/self-healing/robustness 는
  event strategy PR 범위에서 분리(DESIGN_BACKLOG).

검증 대상은 dispatch.anu_pickup_driver.scan_live_inbox_once 의 "신규 이벤트(live inbox)"
감시 전략이다. PathExistsGlob 가 retained legacy result.json 의 "파일 존재"만으로 반복
발화(retrigger)하던 문제를, 전용 LIVE_INBOX 만 scan + (task_id, source_result_sha256)
processed ledger idempotency + move-first 로 구조적으로 제거한다.

★ 본 테스트는 fixture(tmp dir) regression 전용이다 — real callback/wake/systemd 실행 0·
  production activation 0·ACTIVE=true 0·canary 실행 0. callback 은 in-memory spy 로만 관측.

기타(task-2760 기본 불변식, 각각 1 테스트):
  1. retained legacy result 가 scan 안 됨
  2. live inbox 신규 result 1개만 감지
  3. processed ledger 중복 방지
  4. 동일 (task_id, source_result_sha256) 재처리 0
  5. busy 시 skip 아닌 delayed/pending 잔존
  6. self-collector 차단(ANU key 만 fire, executor self-key 차단)
  7. ACTIVE=false 유지
  8. 기존 task-2758 non-matching thin gate 상태 불변(import/동작)
  9. matching_axis DESIGN_REVIEW_REQUIRED 유지(matching 재도입 0)

move-first 핵심 불변식(HIGH 1, task-2760+2):
  10. move 성공 시 완료 ledger 기록(완료 entry 존재 ⟺ move 성공)
  11. move 실패 시 완료 ledger 미기록
  12. move 실패 시 VERDICT_LIVE_PENDING_MOVE
  13. move 실패 시 원본 inbox 잔존(retry pending)
  14. move 실패가 stuck-complete dedupe-skip 되지 않음 + 복구 시 재시도 완료

compaction/robustness 제거 검증(범위 축소 replacement):
  15. LIVE_LEDGER_MAX_ENTRIES 상수 없음
  16. _rewrite_ledger 함수 없음
  17. _load_processed_ledger compaction trim 없음(헬퍼 자체 부재)
  18. ledger robustness 신규 방어 로직 없음(단순 append-only 읽기/쓰기만)
    N)Path   dispatchz__init__.py__file__ z	dispatch.)submodule_search_locations)is not)z%(py2)s is not %(py5)s_spec)py2py5z%(py7)spy7)z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)s)py9py11py14z%(py16)spy16zassert %(py19)spy19)anu_pickup_driverc                  "    t         j                  S )u\   activation flag_reader: ACTIVE 활성 모사(ACTIVE=true 실파일 미생성 — 주입만).)drvACTIVATION_ENABLED     D/home/jay/workspace/tests/regression/test_p0b_event_strategy_2760.py_enabledr   P   s    !!!r   c                       y)u,   activation flag_reader: ACTIVE=false 모사.r   r   r   r   r   	_disabledr   U   s    r   c                       e Zd ZdZd Zy)_Gateu   기존 owner_proof gate 결과 모사(신규 gate 구현 아님 — owner_gate_fn 주입 인터페이스만
    재현). ready=True → ANU owner proof 통과. ready=False → self/foreign(차단).c                 P    || _         |rt        j                  | _        y d| _        y )NOWNER_PICKUP_BLOCKED)readyr   GATE_READY_STATUSstatus)selfr!   s     r   __init__z_Gate.__init__]   s    
/4c++:Pr   N)__name__
__module____qualname____doc__r%   r   r   r   r   r   Z   s    ]Qr   r   c                   (    e Zd ZdZd ZddddddZy)_Spyu   callback_launch_fn in-memory spy — 실 callback/wake 발사 0.
    task-2763: 실 build_callback_launch_fn 반환 _fn 계약 시그니처
    (result_json_path positional + task_id/sha256 keyword-only)에 정합.c                     g | _         y N)callsr$   s    r   r%   z_Spy.__init__f   s	    
r   r   F)executor_keyschedule_idterminal_intentrelay_requiredc          
      J    | j                   j                  |||||||d       y )N)result_json_pathtask_idsha256r0   r1   r2   r3   )r.   append)r$   r5   r6   r7   r0   r1   r2   r3   s           r   __call__z_Spy.__call__i   s0     	

 0(&.,
 	r   N)r&   r'   r(   r)   r%   r9   r   r   r   r+   r+   b   s    N !b" %r   r+   c                    t        j                  j                  | gt        j                  j                  d       }t        j                  |d       t         j                  j                  || d      }t        |dd      5 }|j                  t        j                  ||dd	
             ddd       |S # 1 sw Y   |S xY w)u4   LIVE_INBOX 에 task-<id>.result.json (final) 작성./Texist_ok.result.jsonwutf-8encodingr6   bodyFensure_asciiN)ospathjoinr   LIVE_INBOX_DIR_RELsplitmakedirsopenwritejsondumpsrootr6   rD   dpfhs         r   _write_live_resultrV   w   s    
T>C2288=>AKKD!
Q7)<01A	aw	' U2
>USTUHUHs   *B::Cc                 V   t         j                  j                  | dd      }t        j                  |d       t         j                  j                  || d      }t	        |dd      5 }|j                  t        j                  ||d	d
             ddd       |S # 1 sw Y   |S xY w)u?   memory/events 직속(legacy) result.json — 감시 경로 밖.memoryeventsTr<   r>   r?   r@   rA   rC   FrE   N)rG   rH   rI   rL   rM   rN   rO   rP   rQ   s         r   _write_legacy_resultrZ      s    
T8X.AKKD!
Q7)<01A	aw	' U2
>USTUHUHs   **BB(c                 x   t        j                  j                  | gt        j                  j                  d       }t         j                  j                  |      sg S t        |dd      5 }|D cg c](  }|j                         st        j                  |      * c}cd d d        S c c}w # 1 sw Y   y xY w)Nr;   rr@   rA   )rG   rH   rI   r   LIVE_LEDGER_RELrK   isfilerM   striprO   loads)rR   lprU   xs       r   _ledger_linesrc      s    	d	<S0066s;	<B77>>"		b#	( 8B')7!QWWY

178 878 8s$   -B02B+B+B0+B00B9c                 @    | D cg c]  }|j                    c}S c c}w r-   )verdict)recordsr\   s     r   	_verdictsrg      s    &'!AII'''s   c                   x    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)P0BEventStrategy2760c                 l    t        j                         | _        | j                  j                  | _        y r-   )tempfileTemporaryDirectory_tmpnamerR   r/   s    r   setUpzP0BEventStrategy2760.setUp   s!    //1	IINN	r   c                 8    | j                   j                          y r-   )rm   cleanupr/   s    r   tearDownzP0BEventStrategy2760.tearDown   s    		r   c                    t        | j                  d      }t        j                  | j                  t        d       }| j                  |g d       | j                  t        j                  j                  |      d       | j                  t        | j                        g d       | j                  ||D cg c]  }|j                   c}       y c c}w )Nz	task-2553c                      t        d      S NTr   aks     r   <lambda>zEP0BEventStrategy2760.test_legacy_result_not_scanned.<locals>.<lambda>       5QU; r   flag_readerowner_gate_fnu6   live inbox 가 비면 처리 record 0 이어야 한다u,   legacy result 는 무변경(이동/삭제 0)zledger entry 0)rZ   rR   r   scan_live_inbox_oncer   assertEqual
assertTruerG   rH   r^   rc   assertNotInresult_path)r$   legacyrecsr\   s       r   test_legacy_result_not_scannedz3P0BEventStrategy2760.test_legacy_result_not_scanned   s    %dii=''II8;V
 	r#[\v.0^_tyy127GH!>A!--!>?!>s   6C
c                    t        | j                  d      }t        | j                  d       t               }t	        j
                  | j                  t        d |      }|D cg c]"  }|j                  t        j                  k(  s!|$ }}| j                  t        |      dd       | j                  t        j                  j                  |d   j                        d       | j                  t        j                  j!                  |      d	       t        j                  j"                  | j                  gt        j$                  j'                  d
      d }| j)                  t        j                  j!                  |      d       | j                  t        t+        | j                              dd       | j                  t        |j,                        dd       y c c}w )N	task-2760z	task-9999c                      t        d      S ru   rv   rw   s     r   rz   zJP0BEventStrategy2760.test_live_inbox_single_new_detected.<locals>.<lambda>   
    %+ r   r}   r~   callback_launch_fn   u+   신규 live result 정확히 1개만 처리r   task-2760.result.jsonu7   성공 시 원본은 processed 로 이동(inbox 비움)r;   "   원본은 p0b_processed 로 이동u   ledger append 1건u%   ANU gate ready → callback 1회 fire)rV   rR   rZ   r+   r   r   r   re   VERDICT_LIVE_PROCESSEDr   lenrG   rH   basenamer   assertFalser^   rI   LIVE_PROCESSED_DIR_RELrK   r   rc   r.   )r$   livespyr   r\   	processedmoveds          r   #test_live_inbox_single_new_detectedz8P0BEventStrategy2760.test_live_inbox_single_new_detected   s`   !$))[9TYY4f''II85#
 !%P1		S5O5O(OQP	PY,YZ)))A,*B*BCE\]-/hiTYY 6)C)C)I)I#)N 646u-/ST]49956;OPSYY,ST Qs   #"G!G!c                    t        | j                  dd       t        j                  | j                  t        d       }| j                  t        j                  t        |             | j                  t        t        | j                              d       t        | j                  dd       t               }t        j                  | j                  t        d |      }| j                  t        |      t        j                  gd	       | j                  t        t        | j                              dd
       | j                  t        |j                        dd       y )Nr   XrD   c                      t        d      S ru   rv   rw   s     r   rz   zCP0BEventStrategy2760.test_processed_ledger_dedupe.<locals>.<lambda>   r{   r   r|   r   c                      t        d      S ru   rv   rw   s     r   rz   zCP0BEventStrategy2760.test_processed_ledger_dedupe.<locals>.<lambda>   r   r   r   u,   ledger 존재 → SKIP_DEDUPE(중복 방지)u   ledger 중복 append 0r   u   dedupe 시 fire 0)rV   rR   r   r   r   assertInr   rg   r   r   rc   r+   VERDICT_LIVE_SKIP_DEDUPEr.   )r$   recs1r   recs2s       r   test_processed_ledger_dedupez1P0BEventStrategy2760.test_processed_ledger_dedupe   s    499k<((II8;V
 	c00)E2BC]49956:499k<f((II85#
 	5)C,H,H+IG	I]49956;STSYY,?@r   c                    t        | j                  dd      }t        j                  |      }t	        j
                  j                  | j                  gt        j                  j                  d       }t	        j                  t        j
                  j                  |      d       t        |dd	      5 }|j                  t        j                  d|d
t        j                  t        j                   d      dz          d d d        t#               }t        j$                  | j                  t&        d |      }| j)                  t+        |      t        j,                  g       | j)                  t/        |j0                        dd       | j)                  t/        t3        | j                              dd       | j5                  t        j
                  j7                  |      d       y # 1 sw Y   xY w)Nr   payloadr   r;   Tr<   r?   r@   rA   seed)r6   source_result_sha256processed_at	runner_idoutcome
c                      t        d      S ru   rv   rw   s     r   rz   zHP0BEventStrategy2760.test_same_task_sha_reprocess_zero.<locals>.<lambda>   r   r   r   r   u5   (task_id,sha256) ledger hit → 재처리/재발사 0r   u   ledger entry 증가 0u$   재처리 0 → 원본 이동 없음)rV   rR   r   _sha256_filerG   rH   rI   r]   rK   rL   dirnamerM   rN   rO   rP   LIVE_RUNNER_IDr   r+   r   r   r   rg   r   r   r.   rc   r   r^   )r$   r   shara   rU   r   r   s          r   !test_same_task_sha_reprocess_zeroz6P0BEventStrategy2760.test_same_task_sha_reprocess_zero   sk   !$))[yIt$WW\\$))Ec&9&9&?&?&DE
BGGOOB'$7"cG, 	HHTZZ& &S5G5G55!  	 	 f''II85#
 	43+G+G*HISYY,cd]49956;RSt,.TU	 	s   7A
G**G3c                    t        | j                  d      }t               }t        j                  | j                  t
        d d |      }| j                  t        |      t        j                  gd       | j                  t        j                  j                  |      d       | j                  t        | j                        g d       | j                  t        |j                        dd	       y )
Nr   c                       yru   r   r   r   r   rz   zHP0BEventStrategy2760.test_busy_yields_pending_not_skip.<locals>.<lambda>       r   c                      t        d      S ru   rv   rw   s     r   rz   zHP0BEventStrategy2760.test_busy_yields_pending_not_skip.<locals>.<lambda>   r   r   )r}   busy_fnr~   r   u2   busy 는 누락(skip)이 아니라 지연(PENDING)u2   busy → inbox 잔존(다음 idle cycle 재감지)u   busy → ledger append 0r   u   busy → fire 0)rV   rR   r+   r   r   r   r   rg   VERDICT_LIVE_PENDING_BUSYr   rG   rH   r^   rc   r   r.   )r$   r   r   r   s       r   !test_busy_yields_pending_not_skipz6P0BEventStrategy2760.test_busy_yields_pending_not_skip   s    !$))[9f''II8\5#
 	43+H+H*IM	Ot,.bctyy127QRSYY,=>r   c                 R   t        | j                  dd      }t               }t        j                  | j                  t
        d |      }| j                  t        |      t        j                  gd       | j                  t        |j                        dd       | j                  t        j                  j                  |      d	       t               }t        j                  | j                  t
        d
 |      }| j                  t        j                   t        |             | j                  t        |j                        dd       |j                  d   }| j                  |d   d       | j                  |d   j#                  d             | j                  |d   d       y )Nr   r$   r   c                      t        d      S )NFrv   rw   s     r   rz   zQP0BEventStrategy2760.test_self_collector_blocked_only_anu_fires.<locals>.<lambda>  s
    %, r   r   u1   self/foreign → owner_proof gate 차단(PENDING)r   u   self-collector → fire 0u   차단 시 inbox 잔존(move 0)c                      t        d      S ru   rv   rw   s     r   rz   zQP0BEventStrategy2760.test_self_collector_blocked_only_anu_fires.<locals>.<lambda>  r   r   r   u   ANU owner proof 만 firer6   r5   r   r7   u/   canonical sha256 이 비어있지 않게 전달)rV   rR   r+   r   r   r   r   rg   VERDICT_LIVE_PENDING_OWNERr   r.   r   rG   rH   r^   r   r   endswith)r$   	live_selfspy_self	recs_selfspy_anurecs_anucall0s          r   *test_self_collector_blocked_only_anu_firesz?P0BEventStrategy2760.test_self_collector_blocked_only_anu_fires   sK   &tyy+FK	6,,II868
	 	9-0N0N/OL	NX^^,a1LMy13TU &++II85'
 	c00)H2EFW]]+Q0JK a y);701::;RSTh)Z[r   c                    t        | j                  d      }t               }t        j                  | j                  t
        d |      }| j                  t        |      t        j                  gd       | j                  |d   j                  t        j                         | j                  t        j                  j                  |      d       | j                  t        | j                        g d       | j                  t!        |j"                        dd       t        j                  | j                        }| j                  t        |      t        j                  g       y )	Nr   c                      t        d      S ru   rv   rw   s     r   rz   zBP0BEventStrategy2760.test_active_false_full_noop.<locals>.<lambda>  r   r   r   u   ACTIVE=false → 전면 no-opr   u    ACTIVE=false → 수거/이동 0u   ACTIVE=false → ledger 0u   ACTIVE=false → fire 0)rV   rR   r+   r   r   r   r   rg   VERDICT_NOOP_DISABLED
activationACTIVATION_DISABLEDr   rG   rH   r^   rc   r   r.   )r$   r   r   r   recs_defaults        r   test_active_false_full_noopz0P0BEventStrategy2760.test_active_false_full_noop  s    !$))[9f''II95#
 	43+D+D*E8	:a++S-D-DEt,.PQtyy127RSSYY,EF//		:<033L3L2MNr   c                 x   dd l m} | j                  t        |d             | j                  t        |d             | j	                  t        |d      d       dddg d	gg g di d
dd}|j                  |dg i       }| j                  |d   g d       | j                  |d   |j                  j                         y )Nr   classify_gateGateVerdictdetect_allowlist_axisuB   matching 축 검출기는 task-2758 에서 제거된 상태 불변g-2760narrowLOWzdispatch/anu_pickup_driver.pyz
tests passchair_injectedgoal_idscopeblast_radiusallowed_capability_deltaexpected_filesallowed_runtime_changesforbidden_operationsrollback_floorbudgetexit_criteria
provenancedifftouched_axesu*   matching 제거 → touched_axes 항상 []re   )
dispatch.v2_13_gate
v2_13_gater   hasattrr   r   r   assertNotEqualr   ALLOWLIST_AXIS_CHAIR_REQUIRED)r$   gatecontractress       r   !test_task2758_thin_gate_unchangedz6P0BEventStrategy2760.test_task2758_thin_gate_unchanged+  s    *o67m45'>?]	_  (E(*?^>_')2#rL*
   62r:^,b2^_C	ND,<,<,Z,Z[r   c                    dd l m} | j                  t        |d             dddg g g g di ddd}d	}d
ddg}|j	                  |||i       }| j                  |d   g d       | j                  |d   |j                  j                  d       y )Nr   r   r   r   r   rb   strict_templater   zFtouch deploy/systemd/anu-pickup.path; forbidden allowlist axis matchedEditzdeploy/systemd/anu-pickup.path)rn   rH   r   uU   matching 축 보류(DESIGN_REVIEW_REQUIRED) → diff 텍스트 무관 touched_axes []re   uD   ALLOWLIST_AXIS_CHAIR_REQUIRED 는 dead trigger(matching 재도입 0))	r   r   r   r   r   r   r   r   r   )r$   r   r   r   
tool_callsr   s         r   #test_matching_axis_not_reintroducedz8P0BEventStrategy2760.test_matching_axis_not_reintroduced>  s    *'>?@(E(*b')2#rC+
 X%/OPQ
  4R@^,bp	rC	ND,<,<,Z,Zb	dr   c                     t        | j                  d      }t        j                  | j                  t        d       }| j                  t        |      t        j                  gd       | j                  t        j                  j                  |      d       t        j                  j                  | j                  gt        j                  j                  d      d }| j                  t        j                  j                  |      d       t!        | j                        }| j                  t#        |      d	d
       | j                  |d   d   d       | j                  |d   d   t        j                         y )Nr   c                      t        d      S ru   rv   rw   s     r   rz   zPP0BEventStrategy2760.test_move_success_records_complete_ledger.<locals>.<lambda>[  r   r   r|   u!   move 성공 → 완료(PROCESSED)u5   move 성공 → 원본 processed 이동(inbox 비움)r;   r   r   r   u/   move 성공 시에만 완료 ledger 1건 기록r   r6   r   )rV   rR   r   r   r   r   rg   r   r   rG   rH   r^   rI   r   rK   r   rc   r   )r$   r   r   r   liness        r   )test_move_success_records_complete_ledgerz>P0BEventStrategy2760.test_move_success_records_complete_ledgerW  s!   !$))[9''II85
 	43+E+E*F<	>-/fgTYY 6)C)C)I)I#)N 646u-/STdii(UQ(YZq),k:q),c.H.HIr   c                 B   t        | j                  d      }t               }t        j                  }	 d t        _        t        j
                  | j                  t        d |      }|t        _        | j                  t        |      t        j                  gd       | j                  t        | j                        g d       | j                  t        j                  j                  |      d       | j                  |d   j                  d	       y # |t        _        w xY w)
Nr   c                       yN    processed move 실패: simulatedr   rw   s     r   rz   zWP0BEventStrategy2760.test_move_failure_no_complete_ledger_and_pending.<locals>.<lambda>n  r   r   c                      t        d      S ru   rv   rw   s     r   rz   zWP0BEventStrategy2760.test_move_failure_no_complete_ledger_and_pending.<locals>.<lambda>q  
    eDk r   r   u+   move 실패 → 완료 아님(PENDING_MOVE)u>   move 실패 시 완료 ledger entry 0 (완료 ⟺ move 성공)u+   move 실패 → inbox 잔존(retry pending)r   r   )rV   rR   r+   r   _move_processedr   r   r   rg   VERDICT_LIVE_PENDING_MOVErc   r   rG   rH   r^   error)r$   r   r   origr   s        r   0test_move_failure_no_complete_ledger_and_pendingzEP0BEventStrategy2760.test_move_failure_no_complete_ledger_and_pendingi  s    !$))[9f""	'"TC++		x9cD
 #'C43+H+H*IF	H 	tyy12Y	[ 	t,.[\a(JK #'Cs   4D Dc                    t        | j                  d      }t        j                  }	 d t        _        t        j                  | j                  t
        d       }| j                  t        |      t        j                  g       t        j                  | j                  t
        d       }| j                  t        j                  t        |      d       | j                  t        |      t        j                  g       | j                  t        | j                        g d       |t        _        t        j                  | j                  t
        d       }| j                  t        j                  t        |      d	       | j                  t        j                   j#                  |      d
       | j                  t%        t        | j                              dd       y # |t        _        w xY w)Nr   c                       yr   r   rw   s     r   rz   zPP0BEventStrategy2760.test_move_failure_not_stuck_then_recovers.<locals>.<lambda>  r   r   c                      t        d      S ru   rv   rw   s     r   rz   zPP0BEventStrategy2760.test_move_failure_not_stuck_then_recovers.<locals>.<lambda>  r   r   r|   c                      t        d      S ru   rv   rw   s     r   rz   zPP0BEventStrategy2760.test_move_failure_not_stuck_then_recovers.<locals>.<lambda>  r   r   uO   move 실패 파일이 완료로 dedupe-skip 되면 안 됨(영구 stuck 금지)u   pending 동안 완료 ledger 0c                      t        d      S ru   rv   rw   s     r   rz   zPP0BEventStrategy2760.test_move_failure_not_stuck_then_recovers.<locals>.<lambda>  r   r   u;   move 복구 시 pending → 정상 완료(재시도 가능)u"   복구 후 원본 processed 이동r   u   복구 후 완료 ledger 1건)rV   rR   r   r   r   r   r   rg   r   r   r   rc   r   r   r   rG   rH   r^   r   )r$   r   r   r   r   recs3s         r   )test_move_failure_not_stuck_then_recoversz>P0BEventStrategy2760.test_move_failure_not_stuck_then_recovers  sq   !$))[9""	'"TC,,		x9E Yu-0M0M/NO ,,		x9E S999U;KnpYu-0M0M/NO]4995r;[\"&C((II85
 	c00)E2BS	U-/ST]49956;Z[ #'Cs   C>G! !G.c                     | j                  t        t        d      d       | j                  dt	        t        dg       d       y )NLIVE_LEDGER_MAX_ENTRIESu?   compaction 상한 상수는 본 PR 에서 제거(범위 분리)__all__u   __all__ 에서도 노출 0)r   r   r   r   getattrr/   s    r   test_no_live_ledger_max_entriesz4P0BEventStrategy2760.test_no_live_ledger_max_entries  s=    &?@Z	\2GCB4O5	7r   c                 D    | j                  t        t        d      d       y )N_rewrite_ledgeru;   atomic 재기록(compaction) 함수는 본 PR 에서 제거)r   r   r   r/   s    r   test_no_rewrite_ledgerz+P0BEventStrategy2760.test_no_rewrite_ledger  s    &78V	Xr   c                     | j                  t        t        d      d       dd l}|j	                  t        j
                        }dD ]  }| j                  ||d|        y )N_load_processed_ledgeruQ   compaction trim 헬퍼는 본 PR 에서 제거(단순 인라인 읽기로 대체)r   )max_entrieszorder[-r  kept.compact.tmpu&   compaction trim 잔재 토큰 없음: )r   r   r   inspect	getsourcer   r   r$   r  srctokens       r   .test_no_load_processed_ledger_helper_with_trimzCP0BEventStrategy2760.test_no_load_processed_ledger_helper_with_trim  se    &>?l	n 8 89Z 	QEUCEeYOQ	Qr   c                     dd l }|j                  t              }dD ]  }| j                  ||d|        | j	                  t        t        d      d       | j                  dt        j                         y )Nr   )zglob.escaper  r  r  r  u/   ledger robustness 신규 방어 잔재 없음: r   u'   move-first 불변식 verdict 는 유지)r  r  r   r   r   r   r   r  r  s       r   test_no_new_ledger_robustnessz2P0BEventStrategy2760.test_no_new_ledger_robustness  su    $
@ 	ZEUCNuiXZ	Z
 	%@AA	C13;;?r   N)r&   r'   r(   ro   rr   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  r  r  r   r   r   ri   ri      sk    #@U&A*V.?\:O$\&d2J$L.\N7X
Q@r   ri   __main__)ok)r   )Jr)   builtins@py_builtins_pytest.assertion.rewrite	assertionrewrite
@pytest_arrO   rG   sysrk   unittestpathlibr   r   resolveparents_ROOTstrrH   insertimportlib.utilutil_ilu
_real_initmodulesget_cachedr	  list
startswith_kspec_from_file_locationr
   @py_assert1@py_assert4@py_assert3@py_assert0loader@py_assert10@py_assert13@py_assert12_call_reprcomparelocals_should_repr_global_name	_saferepr@py_format6@py_format8r8   @py_format15@py_format17_format_boolop@py_format18@py_format20AssertionError_format_explanationmodule_from_spec_pkgexec_moduler   r   r   r   r   r   r+   rV   rZ   rc   rg   TestCaseri   r&   main)ry   s   0r   <module>rP     s|  +Z   	 
    	X ((+u:SXXHHOOAs5z" Z-/

++//*
%
?ww
B7=2#j/Qs{{+\QqJ!,,{B[q\ KKO(D((JC
@R<S;TE :9599T9T!9999599999599959999999999T9999999999999T9999999999999 4  'D"CKK
	LLT" -"

Q Q *8(t@8,, t@n	 zHMMO Y ]s   L86L8