
    i                        d Z ddlZddlZddlmZ ddlZej                  j                  d e ee	      j                         j                  d                ej                  j                  d e ee	      j                         j                  d   dz               ddlZej                  j                  d e ee	      j                         j                  d   dz  dz              Zeej"                  J ej                  j%                  e      Zej"                  j)                  e       ej*                  d        Zdd	Zdd
Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!y)uW   tests/dev7/test_tier_classifier.py — Tier 분류 + audit log 테스트 (task-2367 P1)    N)Path   scripts
auto_mergezauto_merge.pyc                 ,   | dz  dz  j                  d       | dz  dz  j                  d       | dz  dz  j                  d       | dz  dz  j                  d       | dz  dz  j                  d       |j                  d	t        |              | S )
u   격리된 임시 workspace.memoryeventsT)parentscapabilitiesaudittasksreportsWORKSPACE_ROOT)mkdirsetenvstr)tmp_pathmonkeypatchs     P/home/jay/workspace/.worktrees/task-2464-dev6/tests/dev7/test_tier_classifier.pytmp_workspacer      s     8#**4*8>)000>7"))$)77"))$)79$++D+9'X7O    c           
          |dd| dd|xs g |xs g g |ddd}| dz  d	z  | d
z  }|j                  t        j                  |      d       |S )u   capability snapshot 생성.z2026-05-02T00:00:00zmemory/tasks/.mdabc1230   )pathsforbidden_pathscommandsmerge_policy	ttl_hours)task_idcaptured_atsourcesource_sha256allowed_resourcesr   r   z.jsonutf-8encoding)
write_textjsondumps)	workspacer!   r   	forbiddenr   cap	snap_files          r   _make_capabilityr0   !   sz     ,!'#.![b(B(
C H$~57)58IIIC7;r   c                 V    d| d| d| d}| dz  dz  | dz  j                  |       y)	u*   task md 파일 생성 (frontmatter level).z---
task_id: z
level: z
---

# 
r   r   r   N)r)   )r,   r!   levelcontents       r   _make_task_filer5   5   s?    wiy{7)2NGG#	o5AA'Jr   c                     d}t        | |d       t        | |dg       t        j                  t	        |       d      }|j                  |dgd	d	
      }|dk(  sJ y)u5   Tier 1: Lv.0 + 작은 diff + 보호 경로 미포함.ztask-test-tier1r   r3   scripts/task-scope-guard.shr-   Tworkspace_pathdry_runsrc/utils/helper.py project_pathbranchtier1Nr5   r0   r   
AutoMergerr   classify_tierr   r!   mergertiers       r   test_tier1_lv0_small_diffrI   ;   sg    GM7!4]G8U7VW""#m2Dd"SF*?)@rZ\]D7??r   c                     d}t        | |d       t        | |       t        j                  t	        |       d      }|j                  |dgdd      }|d	k(  sJ y
)u)   Tier 3: Lv.3 task → 자동으로 tier3.ztask-test-tier3-lv   r7   Tr:   r=   r>   r?   tier3NrC   rF   s       r   test_tier3_lv3rM   F   a    "GM7!4]G,""#m2Dd"SF*?)@rZ\]D7??r   c                     d}t        | |d       t        | |dg       t        j                  t	        |       d      }|j                  |dgdd	      }|d
k(  sJ y)u9   Tier 3: forbidden_paths에 매칭되는 변경 → tier3.ztask-test-tier3-fp   r7   r8   r9   Tr:   r>   r?   rL   NrC   rF   s       r   test_tier3_protected_pathrQ   Q   sh    "GM7!4]G8U7VW""#m2Dd"SF*G)HWYbdeD7??r   c                     d}t        | |d       t        j                  t        |       d      }|j	                  |dgdd      }|d	k(  sJ y
)uV   Tier 3: 글로벌 보호 경로(CLAUDE.md, .github/) → tier3 (capability 없어도).ztask-test-tier3-globalr   r7   Tr:   z	CLAUDE.mdr>   r?   rL   N)r5   r   rD   r   rE   rF   s       r   test_tier3_global_protectedrS   ]   sW    &GM7!4 ""#m2Dd"SF+RPRSD7??r   c                     d}t        | |d       t        | |       t        j                  t	        |       d      }t        d      D cg c]  }d| d
 }}|j                  ||d	d	
      }|dk(  sJ yc c}w )u   Tier 2: 다중 파일(>5).ztask-test-tier2-multirP   r7   Tr:      zsrc/filez.pyr>   r?   tier2N)r5   r0   r   rD   r   rangerE   )r   r!   rG   idiffrH   s         r   test_tier2_multifilerZ   h   s    %GM7!4]G,""#m2Dd"SF',Qx0!hqc0D0BrJD7?? 1s   
A6c                     d}t        | |d       t        | |       t        j                  t	        |       d      }|j                  |dgdd      }|d	k(  sJ y
)u1   Tier 2: package.json 변경 → 의존성 변경.ztask-test-tier2-deprP   r7   Tr:   zpackage.jsonr>   r?   rV   NrC   rF   s       r   test_tier2_dependency_changer\   t   s`    #GM7!4]G,""#m2Dd"SF.)9SUVD7??r   c                     d}t        | |d       t        | |       t        j                  t	        |       d      }|j                  |dgdd      }|d	k(  sJ y
)zTier 2: Lv.2 task.ztask-test-tier2-lvr   r7   Tr:   r=   r>   r?   rV   NrC   rF   s       r   test_tier2_lv2r^      rN   r   c                     d}t        | |d       t        | |ddg       t        j                  t	        |       d      }|j                  |d	gd
d
      }|dk(  sJ d       y)u_   ★ 본 task-2367 자체가 Tier 3로 분류되는지 (auto_merge.py 변경 — 보호 경로).z	task-2367rK   r7   r8   zmemory/capabilities/**r9   Tr:   zscripts/auto_merge.pyr>   r?   rL   uI   본 task가 자기 자신을 Tier 1으로 머지하면 self-bypass 사고NrC   rF   s       r   test_self_bypass_preventionr`      sw    GM7!402JK ""#m2Dd"SF*A)BQS\^_D7?ggg?r   c                     t         j                  t        |       d      }|j                  dddddddg d	d
dd       |j                  dddddddg d	d
dd       | dz  dz  dz  }|j	                         sJ |j                  d      j                         j                  d      }t        |      dk(  sJ t        j                  |d	         }t        j                  |d         }|d   dk(  sJ |d   dk(  sJ |d   dk(  sJ |d   dk(  sJ y
)u<   audit log JSONL append-only 동작 + sequence 단조 증가.Tr:   t1mergedrB   passautoabcr   Nr>   )r!   outcomerH   	qc_resultscope_guardrG   	merge_sha
diff_filesdiff_loc	pr_numbercapability_shat2	escalatedrL   skippedr   r   zauto-merge.logr&   r'   r2   r   rP   sequencer!   )r   rD   r   _append_auditexists	read_textstripsplitlenr*   loads)r   rG   log_filelinesr1r2s         r   test_audit_log_appendr~      sF   ""#m2Dd"SF
Th'-fPV',BA'+rC D Tk7'0V\')'+rC D
 x''14DDH??0668>>tDEu:??	E!H	B	E!H	Bj>Qj>Qi=D   i=D   r   )NNtiered)r   )"__doc__r*   syspathlibr   pytestpathinsertr   __file__resolver
   importlib.util	importlibutilspec_from_file_locationSPECloadermodule_from_specr   exec_modulefixturer   r0   r5   rI   rM   rQ   rS   rZ   r\   r^   r`   r~    r   r   <module>r      sI   ]  
   3tH~--/77:; < 3tH~--/77:YFG H ~~--X ((+i7/IJ DKK3 33^^,,T2
   
 #  (K		h!r   