
    ȸ#jlN                       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 ddl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 ddlZ ee      j1                         j2                  d   Z ee      ej8                  vr"ej8                  j;                  d ee             edz  dz  Zej>                  jA                  d      Z!e! e"e!dd	      xs d	 ee      k7  r e#ej>                        D  cg c]  } | dk(  s| jI                  d
      s|  c} D ]  Z%ej>                  e%=   ejL                  de eedz        g      Z'g Z(dZ)e'e)uZ*e*Z+e*re'jX                  Z-dZ.e-e.uZ/e/Z+e+sB ej`                  de*fde'e)f      d ejb                         v s ejd                  e'      r ejf                  e'      nd ejf                  e)      dz  Z4dde4iz  Z5e(jm                  e5       e*r ej`                  de/fde-e.f      d ejb                         v s ejd                  e'      r ejf                  e'      nd ejf                  e-       ejf                  e.      dz  Z7dde7iz  Z8e(jm                  e8        ejr                  e(d      i z  Z:dde:iz  Z; e< ejz                  e;            dxZ+xZ(xZ*xZ)xZ-xZ/Z. ej|                  e'      Z?e?ej>                  d<   e'jX                  j                  e?       ddlAmBZC d?dZD eDdd        eDdd        eDdd      ZE eDd d!      ZFeEj                  ZHd"ZId#d$d#d%d&d'd(d)ZJd@d*ZKdAd+ZLdBdCd,ZMdDd-ZNdEdFd.ZOd/ ZPdGdHd0ZQdIdHd1ZRd2 ZSdJd3ZTd4 ZUd5 ZVd6 ZWd7 ZXd8 ZYd9 ZZd: Z[d; Z\d< Z]d= Z^d> Z_yc c} w )Ku'  task-2729+7 P0-b pickup activation hardening — regression (10).

대상:
  - dispatch.anu_pickup_driver  : D1(MAX_FILES bounded scan) + D2(legacy cutoff)
  - dispatch.anu_result_pickup_runner : D3(ledger/marker write 실패 fail-closed/관측)

절대 제약 (test_anu_pickup_driver_2721 / test_anu_result_pickup_runner_2720 동일):
  - ANU key literal 'c119085...' 를 테스트 코드에 절대 쓰지 않는다 (완성 literal 0건).
    검증용으로만 분할 조합("c119085" + "addb0f8b7") 사용.
  - pickup_once 실호출은 mock(pickup_fn/verify_fn) 주입 또는 sealed_key_loader fake + gh_probe 미주입.
    실제 wake/cron/spawn 0.
  - canonical memory(/home/jay/workspace/memory/**) 쓰기 0 — tmp_path / tempfile 만.

회장 verbatim 검증 10항목 + 핵심 시나리오 커버.
    )annotationsN)Path   dispatchz__init__.py__file__ z	dispatch.)submodule_search_locationsis notz%(py2)s is not %(py5)s_specpy2py5%(py7)spy7z5%(py11)s
{%(py11)s = %(py9)s.loader
} is not %(py14)spy9py11py14%(py16)spy16assert %(py19)spy19)anu_pickup_driverc                J   | t         j                  v rt         j                  |    S t        j                  | t        |z        }g }d}||u}|}|r|j
                  }d}||u}	|	}|slt        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  }|j                  |       |rt        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  }|j                  |       t        j                  |d      i z  }dd|iz  }t        t        j                  |            dx}x}x}x}x}x}	}t        j                   |      }|t         j                  | <   |j
                  j#                  |       |S )uE   runner 테스트(2720) 의 _load 패턴 — 의존 모듈 실 로드.Nr
   r   specr   r   r   r   r   r   r   r   r   r   )sysmodules_iluspec_from_file_location_ROOTloader
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprappend_format_boolopAssertionError_format_explanationmodule_from_specexec_module)modnamerelpathr   @py_assert1@py_assert4@py_assert3@py_assert0@py_assert10@py_assert13@py_assert12@py_format6@py_format8@py_format15@py_format17@py_format18@py_format20mods                    o/home/jay/workspace/.worktrees/task-2729p8-dev5/tests/regression/test_anu_pickup_activation_hardening_2729p7.py_loadrB   6   sA   #++{{7##''AD7t74t77474 777774t77777747774777t77777774777777777777777477777777777777



%CCKKKKC J    z dispatch.callback_owner_enforcerz#dispatch/callback_owner_enforcer.pyz(dispatch.normal_fallback_callback_helperz+dispatch/normal_fallback_callback_helper.pyz'dispatch.anu_owned_callback_enforcementz*dispatch/anu_owned_callback_enforcement.pyz!dispatch.anu_result_pickup_runnerz$dispatch/anu_result_pickup_runner.py7943afbe12c12f7dtask-999EXECUTOR_RESULT_WRITTENsch-1task_idschedule_idzr.mdabc)rI   completion_signalcollector_envelopereport_pathsha256c                j    | dz  dz  j                  dd       | dz  dz  j                  dd       | S )NmemoryeventsTparentsexist_okstate)mkdir)tmp_paths    rA   
_make_dirsrY   \   sA    8#**4$*G7"))$)FOrC   c                    | dz  dz  S )NrQ   rR    )roots    rA   _events_dirr]   b   s    (?X%%rC   c                ~    t        |       |z  }|t        }|j                  t        j                  |      d       |S )Nutf-8encoding)r]   VALID_PAYLOAD
write_textjsondumps)r\   namepayloadps       rA   _write_resultri   f   s9    DD ALLG$wL7HrC   c                    | dz  dz  dz  }|j                   j                  dd       |j                  t        j                  dz   d       y )	NrQ   rV   p0b_driver_enabledTrS   
r_   r`   )parentrW   rc   drvACTIVATION_ENABLED)r\   flags     rA   _enable_activationrq   n   sH    (?W$';;DKKdT2OOC**T1GODrC   c                t    t        j                         |z
  }t        j                  t	        |       ||f       y)u[   mtime/atime 을 과거로 설정 — readiness aged 게이트 통과 + legacy mtime 모사.N)_timetimeosutimestr)pathsecondspasts      rA   _ager{   t   s(    ::<'!DHHSYt%rC   c                      y Nr[   aks     rA   <lambda>r   z       rC   c                (     g  fd}|_         |S )u?   pickup_fn mock — 호출 인자 calls 기록, 실 wake/cron 0.c                 f    j                  | |f       t        j                  dk(  dgdg       S )N
WAKE_BUILTxrE   )verdictokargvrI   reasonsr+   typesSimpleNamespaceargskwargscallsr   s     rA   _pickupz!make_pickup_mock.<locals>._pickup   s<    dF^$$$<'
 	
rC   r   )r   r   r   s   ` @rA   make_pickup_mockr   }   s    E
 GMNrC   c                (     g  fd}|_         |S )Nc                 b    j                  | |f       t        j                  dk(  dg       S )NAUTHORITATIVEr   )r   r   classificationr   r   r   s     rA   _verifyz!make_verify_mock.<locals>._verify   s7    dF^$$$?*	
 	
rC   r   )r   r   r   s   ` @rA   make_verify_mockr      s    E
 GMNrC   c                     t         S )uC   ANU key fake 로더 — literal 노출 없이 모듈 상수 반환.)_ANU_KEYr[   rC   rA   _sealed_key_loaderr      s    OrC   c                    |ddd}t         j                  j                  | | d      }t        |dd      5 }t	        j
                  ||d	       d
d
d
       |S # 1 sw Y   |S xY w)uJ   runner 용 정상 result.json (collector_envelope 없음 → verify skip).donedeadbeef)rI   summaryrO   .result.jsonwr_   r`   F)ensure_asciiN)ru   rx   joinopenrd   dump)
result_dirrI   rg   rx   fhs        rA   _write_runner_resultr      sa    !f
KG77<<
wi|$<=D	dC'	* 3b		'2E23K3Ks   AA%c           	        t        |       }t        |       t               }t               }t	        |      }t        |d       t        j                         }t        j                  t        |      |||d|t              }|j                  }t        j                  }||k(  }	|	st        j                  d|	fd||f      dt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      dt!        j"                         v st        j$                  t              rt        j&                  t              nd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}||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}	}|j0                  }t3        |      }d}||k(  }|s
t        j                  d|fd||f      dt!        j"                         v st        j$                  t2              rt        j&                  t2              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}}|j0                  }t3        |      }d}||k(  }|s
t        j                  d|fd||f      dt!        j"                         v st        j$                  t2              rt        j&                  t2              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}}|j4                  } |       }	|	sddt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      t        j&                  |	      dz  }t)        t        j*                  |            dx}}	d }||z  }	d!}|	|z  }d"}||z  }|j4                  } |       }| }|sd#d$t!        j"                         v st        j$                  |      rt        j&                  |      nd$t        j&                  |      t        j&                  |      t        j&                  |      t        j&                  |      t        j&                  |      d%z  }t)        t        j*                  |            dx}x}	x}x}x}x}x}x}}d }||z  }	d!}|	|z  }d&}||z  }|j4                  } |       }| }|sd#d$t!        j"                         v st        j$                  |      rt        j&                  |      nd$t        j&                  |      t        j&                  |      t        j&                  |      t        j&                  |      t        j&                  |      d%z  }t)        t        j*                  |            dx}x}	x}x}x}x}x}x}}y)'u   activation 활성 + epoch=now, result mtime 이 epoch 보다 과거(10s 전) →
    NOOP_LEGACY_SKIP("pre_activation_epoch"). pickup/verify 미호출, 파일 잔류,
    quarantine/processed 디렉토리 미생성.
   ry   Tr\   	pickup_fn	verify_fnlegacy_cutoffactivation_epochsleep_fn==z]%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_NOOP_LEGACY_SKIP
}recrn   py0r   py4py6assert %(py8)spy8Npre_activation_epochz9%(py2)s
{%(py2)s = %(py0)s.quarantine_reason
} == %(py5)sr   r   r   assert %(py7)sr   Fis)z3%(py2)s
{%(py2)s = %(py0)s.quarantined
} is %(py5)sr   zK%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.calls
})
} == %(py8)slenpickupr   py1py3r   r   assert %(py10)spy10verifyAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}rh   r   r   r   rQ   	p0b_state
quarantinemassert not %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = (((%(py0)s / %(py2)s) / %(py5)s) / %(py8)s).exists
}()
}r\   r   r   r   r   r   py13	processed)rY   rq   r   r   ri   r{   rs   rt   rn   process_onerw   	_NO_SLEEPr   VERDICT_NOOP_LEGACY_SKIPr%   r&   r'   r(   r)   r*   r-   r.   quarantine_reasonquarantinedr   r   exists)rX   r\   r   r   rh   epochr   r3   @py_assert5r5   @py_format7@py_format9r4   r:   r;   @py_assert2@py_assert7@py_assert6@py_format11@py_format5@py_assert9r7   r9   @py_assert14r<   s                            rA   test_legacy_skip_before_epochr      s    hDtFFdABJJLE
//ATFU	C ;;6#666;66666;666666636663666;666666#666#66666666666  :$:: $::::: $:::::::3:::3::: :::$::::::::??#e#?e####?e######3###3###?###e#######||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!888::118:FxF+F+-FF-<F<DDFDFFFFFFFFFFFFFFFFFxFFF+FFFFFFDFFFFFFFFFFFFExE+E+-EE-;E;CCECEEEEEEEEEEEEEEEEExEEE+EEEEEECEEEEEEEEEEEErC   c           	        t        |       }t        |       t        d      }t        d      }t	        |      }t        |d       t        j                         dz
  }t        j                  t        |      |||d|t              }|j                  }t        j                  }||k(  }	|	st        j                  d	|	fd
||f      dt!        j"                         v st        j$                  |      rt        j&                  |      ndt        j&                  |      dt!        j"                         v st        j$                  t              rt        j&                  t              nd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}}y)u   epoch 을 충분히 과거(now-100s)로 두고 파일은 aged(now-10s) → mtime >= epoch.
    legacy_cutoff=True 라도 정상 decision path 진입 → WAKE_BUILT, pickup 1회.r   r   r   r   r   d   Tr   r   zW%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.VERDICT_WAKE_BUILT
}r   rn   r   r   r   N   r   r   r   r   r   r   )rY   rq   r   r   ri   r{   rs   rt   rn   r   rw   r   r   VERDICT_WAKE_BUILTr%   r&   r'   r(   r)   r*   r-   r.   r   r   )rX   r\   r   r   rh   r   r   r3   r   r5   r   r   r   r4   r   r   r   s                    rA   test_post_epoch_proceeds_waker      s    hDtl3Fo6FdABJJL3E
//ATFU	C ;;0#000;00000;000000030003000;000000#000#00000000000||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!rC   c           	     
   t        |       }t        |       t               }t               }t	        |      }t        |d       t        j                  t        |      |||ddt              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      dt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      d	t        j                         v st        j                   t              rt        j"                  t              nd	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*                  }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.                  } |       }|sddt        j                         v st        j                   |      rt        j"                  |      ndt        j"                  |      t        j"                  |      dz  }t%        t        j&                  |            dx}}y)u   legacy_cutoff=True + activation_epoch=None → NOOP_LEGACY_SKIP("epoch_absent").
    fail-open 금지 입증 — pickup 미호출.r   r   TNr   r   r   r   rn   r   r   r   epoch_absentr   r   r   r   r   r   r   r   r   r   r   r   r   rh   r   )rY   rq   r   r   ri   r{   rn   r   rw   r   r   r   r%   r&   r'   r(   r)   r*   r-   r.   r   r   r   r   )rX   r\   r   r   rh   r   r3   r   r5   r   r   r4   r:   r;   r   r   r   r   r   s                      rA   test_epoch_absent_fail_closedr      s    hDtFFdAB
//ATFT	C ;;6#666;66666;666666636663666;666666#666#66666666666  2N2 N2222 N22222232223222 222N2222222||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!888::118:rC   c                Z   t        |       }|dz  dz  dz  }d}|j                  t        |      d       t        j                  }t        |      } ||      }t
        j                  } ||      }||k(  }	|	st        j                  d|	fd||f      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              nd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}x}x}	x}}|j                  dd       t        j                  }t        |      } ||      }d}||u }	|	sgt        j                  d|	fd||f      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}	}|j                          t        j                  }t        |      } ||      }d}||u }	|	sgt        j                  d|	fd||f      d	t        j                         v st        j                  t              rt        j                  t              nd	t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}	}t        j                  }t        |      }d } |||      }	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                  |      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t        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }t        t        j                  |            dx}x}x}x}	x}x}x}}y)u   epoch 마커(memory/state/p0b_activation_epoch) str(float) → float 반환.
    부재 → None. invalid("abc") → None. epoch_reader 주입 → 파싱값.rQ   rV   p0b_activation_epochg   2Ar_   r`   r   )z%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.read_activation_epoch
}(%(py6)s
{%(py6)s = %(py3)s(%(py4)s)
})
} == %(py15)s
{%(py15)s = %(py12)s
{%(py12)s = %(py10)s.approx
}(%(py13)s)
}rn   rw   r\   pytestval)
r   r   r   r   r   r   r   py12r   py15zassert %(py17)spy17NrK   r   )zz%(py8)s
{%(py8)s = %(py2)s
{%(py2)s = %(py0)s.read_activation_epoch
}(%(py6)s
{%(py6)s = %(py3)s(%(py4)s)
})
} is %(py11)s)r   r   r   r   r   r   r   zassert %(py13)sr   c                      y)Nz123.5r[   r[   rC   rA   r   z2test_read_activation_epoch_parse.<locals>.<lambda>  r   rC   )epoch_readerg     ^@)z%(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.read_activation_epoch
}(%(py6)s
{%(py6)s = %(py3)s(%(py4)s)
}, epoch_reader=%(py8)s)
} == %(py18)s
{%(py18)s = %(py14)s
{%(py14)s = %(py12)s.approx
}(%(py16)s)
})r   r   r   r   r   r   r   r   r   r   py18zassert %(py20)spy20)rY   rc   rw   rn   read_activation_epochr   approxr%   r&   r'   r(   r)   r*   r-   r.   unlink)rX   r\   
epoch_pathr   r3   r   r   @py_assert11r   r   @py_format16r>   r7   @py_format12@py_format14r8   @py_assert15@py_assert17@py_format19@py_format21s                       rA    test_read_activation_epoch_parser     s    hD7*-CCJ C#c(W5$$ESYE$Y/E6==E=3EE/3EEEEE/3EEEEEEE3EEE3EEE$EEEEEESEEESEEEEEEEEEEEEYEEE/EEEEEE6EEE6EEE=EEEEEEEEEEEE3EEEEEEEEE %'2$$7SY7$Y/747/47777/477777737773777$777777S777S777777777777Y777/77747777777 $$7SY7$Y/747/47777/477777737773777$777777S777S777777777777Y777/77747777777 $$eSYe_e$Y_MeQWQ^Q^e_deQ^_dQeeMQeeeeeMQeeeeeee3eee3eee$eeeeeeSeeeSeeeeeeeeeeeeYeee_eeeMeeeeeeQWeeeQWeeeQ^eee_deeeQeeeeeeeeerC   c                   t        |       }t        |       t        d      }t        d      }t	        |      }t        |d       t        j                  t        |      |||t              }|j                  }t        j                  }||k(  }|st        j                  d|fd||f      d	t        j                         v st        j                   |      rt        j"                  |      nd	t        j"                  |      d
t        j                         v st        j                   t              rt        j"                  t              nd
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}}y)u]   legacy_cutoff 기본 False(미지정) → 기존 동작(WAKE_BUILT) 유지. 회귀 무영향.r   r   r   r   r   )r\   r   r   r   r   r   r   rn   r   r   r   Nr   r   r   r   r   r   r   )rY   rq   r   r   ri   r{   rn   r   rw   r   r   r   r%   r&   r'   r(   r)   r*   r-   r.   r   r   )rX   r\   r   r   rh   r   r3   r   r5   r   r   r   r4   r   r   r   s                   rA   !test_legacy_cutoff_off_unaffectedr
    s   hDtl3Fo6FdAB
//ATFC
 ;;0#000;00000;000000030003000;000000#000#00000000000||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!rC   c           	        t        |       }t        |       t        d      }t        d      }g }t	        d      D ]]  }t        t              }d| |d<   d| dd|d	<   t        |d| d
|      }t        |d       |j                  t        |             _ t        j                  ||d||dt              }|D 	cg c]"  }	|	j                  t        j                  k(  s!|	$ }
}	|D 	cg c]"  }	|	j                  t        j                  k7  s!|	$ }}	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#        j0                  |            dx}x}}|
d   }|j2                  }d}||k(  }|st#        j$                  d|fd||f      t#        j,                  |      t#        j,                  |      t#        j,                  |      dz  }dd|iz  }t/        t#        j0                  |            dx}x}x}}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#        j0                  |            dx}x}}yc c}	w c c}	w )u   result 60개 + max_files=50 → process_one 50건 처리 + defer record 정확히 1건
    (quarantine_reason=="max_files_defer:10"). legacy_cutoff 미지정 → 정상 경로.r   r   r   <   task-rI   rG   rH   rM   r   rf   rg   r   r   2   Fpaths	max_filesr   r   write_evidencer   r   r   z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   deferr   r   r   r   r   r   Nr   zmax_files_defer:10)z9%(py3)s
{%(py3)s = %(py1)s.quarantine_reason
} == %(py6)s)r   r   r   r   )rY   rq   r   r   rangedictrb   ri   r{   r+   rw   rn   	scan_oncer   r   VERDICT_NOOP_MAX_FILES_DEFERr   r%   r&   r'   r(   r)   r*   r-   r.   r   )rX   r\   r   r   r  irg   rh   recordsrr  r   r   r   r4   r   r   r6   s                     rA   test_max_files_boundedr  +  s    hDtl3Fo6FE2Y }%$QC[	6;A3KPW(X$%$uQC|%<gNQSV mmEFy	G  Q11990P0P#PQQEQ#UqqyyC4T4T'TUIUu::?:33uu:8=8%%=)==%)=====%)====8===%===)========y>R>R>R33yy>R	 RUs    "O#O-"OOc           	        t        |       }t        |       t        d      }t        d      }g }t	        d      D ]]  }t        t              }d| |d<   d| dd|d	<   t        |d| d
|      }t        |d       |j                  t        |             _ t        j                  ||d||dt              }|D 	cg c]"  }	|	j                  t        j                  k(  s!|	$ }
}	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#        j0                  |            dx}x}}yc c}	w )u1   파일 3개 + max_files=50 → defer record 0건.r   r   r      r  rI   rG   rH   rM   r   r  r   r   r  Fr  r   r   r  r   r  r  r   r   N)rY   rq   r   r   r  r  rb   ri   r{   r+   rw   rn   r  r   r   r  r   r%   r&   r'   r(   r)   r*   r-   r.   )rX   r\   r   r   r  r  rg   rh   r  r  r  r   r   r4   r   r   s                   rA   #test_max_files_under_limit_no_deferr!  J  s{   hDtl3Fo6FE1X }%$QC[	6;A3KPW(X$%$uQC|%<gNQSV mmEFy	G  Q11990P0P#PQQEQu::?:33uu: Rs    "G:#G:c                   t        j                  dt        |             }t        j                  j                  t        |       d      }t        |d      }d }|j                  t        j                  d|       t        j                  |t        d |      }|j                  }t        j                  }||k(  }	|	st        j                  d	|	fd
||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      dt        j                          v st        j"                  t              rt        j$                  t              nd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,                  }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}	}d |j.                  D        }t1        |      }	|	sddt        j                          v st        j"                  t0              rt        j$                  t0              ndt        j$                  |      t        j$                  |	      dz  }t'        t        j(                  |            dx}}	y)u   정상 WAKE_BUILT 직전까지 진행 + ledger write(Step8 os.makedirs) 만 실패시킴 →
    PICKUP_LEDGER_WRITE_FAILED, wake_built False, argv None, reasons 에 LEDGER_WRITE_FAILED.zt2729p7-led-prefixdirzledger_led.jsonlztask-2729ledc                     t        d      )Nz!simulated ledger makedirs failureOSErrorr~   s     rA   boomz2test_ledger_write_failed_fail_closed.<locals>.boomn  s    9::rC   makedirsc                 "    t         j                  S r}   M_enfANU_KEYr[   rC   rA   r   z6test_ledger_write_failed_fail_closed.<locals>.<lambda>v  
    %-- rC   executor_keysealed_key_loaderledger_pathr   )z_%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.PICKUP_LEDGER_WRITE_FAILED
}resMr   r   r   NFr   z2%(py2)s
{%(py2)s = %(py0)s.wake_built
} is %(py5)sr   r   r   )z,%(py2)s
{%(py2)s = %(py0)s.argv
} is %(py5)sc              3  $   K   | ]  }d |v  
 yw)LEDGER_WRITE_FAILEDNr[   .0r  s     rA   	<genexpr>z7test_ledger_write_failed_fail_closed.<locals>.<genexpr>|       ?a$)?   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr   )tempfilemkdtemprw   ru   rx   r   r   setattrr5  pickup_once_DEV_KEYr   PICKUP_LEDGER_WRITE_FAILEDr%   r&   r'   r(   r)   r*   r-   r.   
wake_builtr   r   r?  )rX   monkeypatchrdirledgerrx   r)  r4  r3   r   r5   r   r   r4   r:   r;   r   s                   rA   $test_ledger_write_failed_fail_closedrJ  g  sO    >s8}EDWW\\#h-);<Fn5D; j$/
--/	  C ;;6!666;66666;666666636663666;666666!666!66666666666>>"U">U"""">U""""""3"""3""">"""U"""""""88t8t8t338t?3;;??3?????????3???3??????????????rC   c                &   t        j                  dt        |             }t        j                  j                  t        |       d      }t        |d      }d }|j                  t        j                  d|       t        j                  |t        d |      }|j                  }t        j                  }||k(  }	|	st        j                  d	|	fd
||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      dt        j                          v st        j"                  t              rt        j$                  t              nd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,                  }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}	}d |j.                  D        }t1        |      }	|	sddt        j                          v st        j"                  t0              rt        j$                  t0              ndt        j$                  |      t        j$                  |	      dz  }t'        t        j(                  |            dx}}	|j3                          t        j                  |t        d |      }|j                  }t        j4                  }||k(  }	|	st        j                  d	|	fd||f      dt        j                          v st        j"                  |      rt        j$                  |      ndt        j$                  |      dt        j                          v st        j"                  t              rt        j$                  t              nd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) u   ledger 정상 + done marker(os.replace) 만 실패 → PICKUP_WAKE_BUILT, wake_built True,
    marker_path None, reasons 에 MARKER_WRITE_FAILED. ledger 기록됨 → 2회차 SKIP_DEDUPE.zt2729p7-mrk-r#  zledger_mrk.jsonlztask-2729mrkc                     t        d      )Nz#simulated marker os.replace failurer'  r~   s     rA   boom_oserrorz8test_marker_write_failed_wake_kept.<locals>.boom_oserror  s    ;<<rC   replacec                 "    t         j                  S r}   r,  r[   rC   rA   r   z4test_marker_write_failed_wake_kept.<locals>.<lambda>  r/  rC   r0  r   )zV%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.PICKUP_WAKE_BUILT
}r4  r5  r   r   r   NTr   r6  r   r   r   )z3%(py2)s
{%(py2)s = %(py0)s.marker_path
} is %(py5)sc              3  $   K   | ]  }d |v  
 yw)MARKER_WRITE_FAILEDNr[   r9  s     rA   r;  z5test_marker_write_failed_wake_kept.<locals>.<genexpr>  r<  r=  r>  r?  r   c                 "    t         j                  S r}   r,  r[   rC   rA   r   z4test_marker_write_failed_wake_kept.<locals>.<lambda>  r/  rC   )zW%(py2)s
{%(py2)s = %(py0)s.verdict
} == %(py6)s
{%(py6)s = %(py4)s.PICKUP_SKIP_DEDUPE
}res2F)r@  rA  rw   ru   rx   r   r   rB  r5  rC  rD  r   PICKUP_WAKE_BUILTr%   r&   r'   r(   r)   r*   r-   r.   rF  marker_pathr   r?  undoPICKUP_SKIP_DEDUPE)rX   rG  rH  rI  rx   rM  r4  r3   r   r5   r   r   r4   r:   r;   r   rS  s                    rA   "test_marker_write_failed_wake_keptrX    s    >s8}EDWW\\#h-);<Fn5D= i6
--/	  C ;;-!---;-----;-------3---3---;------!---!----------->>!T!>T!!!!>T!!!!!!3!!!3!!!>!!!T!!!!!!!??"d"?d""""?d""""""3"""3"""?"""d"""""""?3;;??3?????????3???3?????????????? ==/	  D <</1///</////<///////4///4///<//////1///1///////////??#e#?e####?e######4###4###?###e#######rC   c           
     <   t        |       }t        |       t        d      }t        d      }d}t	        |      D ]C  }t        t              }d| |d<   d| dd|d	<   t        |d| d
|      }t        |d       E t        j                         }t        j                  |d|d||dt              }	|	D 
cg c]"  }
|
j                  t        j                  k(  s!|
$ }}
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#        j0                  |            dx}x}}|	D 
cg c]"  }
|
j                  t        j                  k7  s!|
$ }}
t!        |      }||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,                  |      dt'        j(                         v st#        j*                  |      rt#        j,                  |      nddz  }dd |iz  }t/        t#        j0                  |            dx}}d! |D        }t3        |      }|sd"d#t'        j(                         v st#        j*                  t2              rt#        j,                  t2              nd#t#        j,                  |      t#        j,                  |      d$z  }t/        t#        j0                  |            dx}}d% |D        }t3        |      }|sd"d#t'        j(                         v st#        j*                  t2              rt#        j,                  t2              nd#t#        j,                  |      t#        j,                  |      d$z  }t/        t#        j0                  |            dx}}|j4                  }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#        j0                  |            dx}x}x}}|j4                  }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#        j0                  |            dx}x}x}}t7        j6                  t9        t;        |      d,z              }t!        |      }||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,                  |      dt'        j(                         v st#        j*                  |      rt#        j,                  |      nddz  }dd |iz  }t/        t#        j0                  |            dx}}d.}||z  }d/}||z  }d0}||z  }|j<                  } |       }| }|sd1d2t'        j(                         v st#        j*                  |      rt#        j,                  |      nd2t#        j,                  |      t#        j,                  |      t#        j,                  |      t#        j,                  |      t#        j,                  |      d3z  }t/        t#        j0                  |            dx}x}x}x}x}x}x}x}}d.}||z  }d/}||z  }d}||z  }|j<                  } |       }| }|sd1d2t'        j(                         v st#        j*                  |      rt#        j,                  |      nd2t#        j,                  |      t#        j,                  |      t#        j,                  |      t#        j,                  |      t#        j,                  |      d3z  }t/        t#        j0                  |            dx}x}x}x}x}x}x}x}}yc c}
w c c}
w )4u  isolated tmp root 에 126개 legacy result.json(terminal marker 0, 고유 task_id,
    모두 aged mtime). activation 활성, epoch=now → 모든 파일 mtime < epoch.
    scan_once(legacy_cutoff=True, max_files=200):
      - 모든 처리 record verdict == NOOP_LEGACY_SKIP (126/126)
      - pickup_fn/verify_fn 호출 0
      - canonical delta 0: events 126 파일 잔류, quarantine 미생성, processed 미생성
      - max_files=200 → defer record 없음 (순수 legacy skip).r   r   r   ~   ztask-legacy-rI   rG   rH   rM   r   r     r   T   F)r   r   r  r   r   r  r   r   r   r  r   r  r  r   r   N)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sr   N)r   r   r   r   r   r   c              3  V   K   | ]!  }|j                   t        j                  k(   # y wr}   )r   rn   r   r9  s     rA   r;  zDtest_126_legacy_isolated_sim_canonical_delta_zero.<locals>.<genexpr>  s     LQqyyC888Ls   ')r>  allr   c              3  :   K   | ]  }|j                   d k(    yw)r   N)r   r9  s     rA   r;  zDtest_126_legacy_isolated_sim_canonical_delta_zero.<locals>.<genexpr>  s     Pq""&<<Ps   r   r   r   r   r   r   ztask-*.result.json	remainingrQ   r   r   r   r\   r   )rY   rq   r   r   r  r  rb   ri   r{   rs   rt   rn   r  r   r   r  r   r%   r&   r'   r(   r)   r*   r-   r.   r_  r   globrw   r]   r   ) rX   r\   r   r   r]  r  rg   rh   r   r  r  r  r   r   r4   r   r   r   r:   r;   r3   r5   r   r   r   r   ra  r   r7   r9   r   r<   s                                    rA   1test_126_legacy_isolated_sim_canonical_delta_zerorc    s    hDtl3Fo6FA1X }%+A3/	6B1#4FW^(_$%$|A3l%CWUQ JJLEmmUFyG  Q11990P0P#PQQEQu::?:33uu: $UqqyyC4T4T'TUIUy>>Q>Q33yy>QQL)LL3LLLLLLLLL3LLL3LLLLLLLLLLLLLLPiPP3PPPPPPPPP3PPP3PPPPPPPPPPPPPP ||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!!||!3|!!!!!!!!!!!!3!!!3!!!!!!v!!!v!!!|!!!!!!!!!!!!! 		#k$/2FFGHIy>>Q>Q33yy>QQFxF+F+-FF-<F<DDFDFFFFFFFFFFFFFFFFFxFFF+FFFFFFDFFFFFFFFFFFFExE+E+-EE-;E;CCECEEEEEEEEEEEEEEEEExEEE+EEEEEECEEEEEEEEEEEE# R Vs   ;"jj8"jjc                    t        t              j                  d      } d}| j                  } ||      }d}||k(  }|st	        j
                  d|fd||f      dt        j                         v st	        j                  |       rt	        j                  |       ndt	        j                  |      dt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      t	        j                  |      d	z  }d
d|iz  }t        t	        j                  |            dx}x}x}}y)u;   이 테스트 파일 소스에 완성 ANU key literal 0건.r_   r`   c119085addb0f8b7r   r   )zK%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.count
}(%(py3)s)
} == %(py8)ssrc	forbidden)r   r   r   r   r   r   r   N)r   r   	read_textcountr%   r&   r'   r(   r)   r*   r-   r.   )rf  rg  r3   r4   r   r   r   r   s           rA   $test_no_anu_key_literal_in_this_filerj    s    
x.
"
"G
"
4C'I99$9Y$1$1$$$$1$$$$$$3$$$3$$$9$$$$$$Y$$$Y$$$$$$1$$$$$$$rC   )r1   rw   r2   rw   )rX   r   returnr   )r\   r   rk  r   )ztask-999.result.jsonN)r\   r   rf   rw   rk  r   )r\   r   rk  None)g      $@)ry   floatrk  rl  )r   )r   rw   )r   )r   rw   rI   rw   rk  rw   )`__doc__
__future__r   builtinsr'   _pytest.assertion.rewrite	assertionrewriter%   rb  importlib.utilutilr!   rd   ru   r   r@  rt   rs   r   pathlibr   r   r   resolverT   r#   rw   rx   insert
_real_initr    get_cachedgetattrlist
startswith_kr"   r   r3   r4   r5   r6   r$   r7   r8   r9   r&   r(   r)   r*   r:   r;   r+   r<   r=   r,   r>   r?   r-   r.   r/   _pkgr0   r   r   rn   rB   r-  r5  r.  r   rD  rb   rY   r]   ri   rq   r{   r   r   r   r   r   r   r   r   r  r
  r  r!  rJ  rX  rc  rj  )r   s   0rA   <module>r     s   #      	 
      	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" -	 (*O P 0357:	<	
-
02 == 2&0I&E& !	$"
F>",0f.", >:@0 $L1Fn%g ]s   ,NN