
    $jy=                    .   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ZddlmZ ddlZ ed      Zedz  Zedz  Z ed      Zd	Zd
Zeez   ZdddZ ej.                  d      dd       ZddZddZddZddZddZddZddZddZ ddZ!ddZ"y)u  test_post186_callback_finalize_dogfood_2729p11.py

PR#186 audit 하니스 회귀 테스트.
테스터: 하누만 (개발4팀)
task: 2729+11

대상 하니스:
    scripts/harness/v36/post186_callback_finalize_dogfood_audit.py

규칙:
    - 읽기 전용 + 부작용 0 (g4-fix-loop-count 쓰기 금지, .done 생성 금지,
      canonical write 금지)
    - raw ANU key 출력 금지 (분할 상수로만 참조)
    )annotationsN)Pathz0/home/jay/workspace/.worktrees/task-2729+11-dev4z>scripts/harness/v36/post186_callback_finalize_dogfood_audit.pyzscripts/start_task_guard.pyz/home/jay/workspacec119085addb0f8b7c                j   t        j                  t        j                  t	        t
              dgt	        t              dd|       }|j                  |j                  |j                  |j                  dk(  r;|j                  j                         r!t        j                  |j                        dS i dS )uA   하니스를 --json 모드로 실행하고 파싱된 dict 반환.--jsonTcwdcapture_outputtexttimeoutr   )
returncodestdoutstderrdata)
subprocessrunsys
executablestrHARNESSWORKTREEr   r   r   stripjsonloads)r   procs     V/home/jay/workspace/tests/regression/test_post186_callback_finalize_dogfood_2729p11.py_run_harness_jsonr   ,   s    >>	Wx0MD oo+++++/??a+?DKKDUDUDW

4;;'	  ^`	     session)scopec                     t               S )u6   하니스 --json 실행 결과 (세션 전체 공유).)r    r   r   harness_resultr$   A   s     r   c                   | d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j                  d| d    d| d   d	d
        dz   d|iz  }t	        t        j
                  |            d	x}x}}| d   }|s{t        j                  d      dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t	        t        j
                  |            |j                  }d} ||      }	d}
|	|
k(  }|st        j                  d|fd|	|
f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |	      t        j                  |
      dz  }t        j                  d|j                  d             dz   d|iz  }t	        t        j
                  |            d	x}x}x}	x}}
y	)uH   하니스를 subprocess --json 실행 → exit 0 + final_verdict 확인.r   r   ==)z%(py1)s == %(py4)s)py1py4u   하니스 exit code != 0 (code=z
)
stderr: r   Ni  z
>assert %(py6)spy6r   u/   --json stdout이 비어 있거나 파싱 불가
>assert %(py0)spy0final_verdict+CALLBACK_FINALIZE_DOGFOOD_PASS_ACTIVE_FALSEzI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} == %(py9)sr,   py2r)   r*   py9u   final_verdict 불일치: 
>assert %(py11)spy11)

@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanation@py_builtinslocals_should_repr_global_nameget)r$   @py_assert0@py_assert3@py_assert2@py_format5@py_format7r   @py_format1@py_assert1@py_assert5@py_assert8@py_assert7@py_format10@py_format12s                 r   "test_harness_runs_and_verdict_passrK   K   s   ,' 1 '1,  '1    (    ,-    *.*F)G H!(+DS12	4     &!DBBBBBBBBB4BBB4BBBBB88 O 8O$ (U $(UU  $(U                  $    %    )V    $DHH_$=#>?     r   c                   | d   }|j                  di       }|j                  d      }|j                  di       j                  dd      }d}||v }|st        j                  d|fd	||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      d
z  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}}|j                  di       j                  dd      }	g }|	}
|	s|}
|
sdddt        j                         v st        j
                  |	      rt        j                  |	      ndiz  }|j                  |       |	sXdddt        j                         v st        j
                  |      rt        j                  |      ndiz  }|j                  |       t        j                  |d      i z  }t        j                  d|	 d| d      dz   d|iz  }t        t        j                  |            dx}
}y)u   check_a1 결과가 PASS 또는 STATIC_VERIFIED 여야 함.

    canonical parked 하에서 worktree-root #7이 정상 통과함을 확인.
    동적 PASS 또는 static_ok=True 중 하나 이상 충족해야 한다.
    r   check_a1verdictstatic	static_okF)PASSSTATIC_VERIFIEDin)z%(py0)s in %(py3)sr,   py3u   A1 verdict 불일치: 
>assert %(py5)spy5Ndynamicpassed_check7z%(py2)sr1   dynamic_passz%(py4)sr)      u   A1: 동적 PASS (u   ) 및 static_ok (u   ) 모두 Falsez
>assert %(py7)spy7)r>   r5   r6   r;   r<   r=   r7   r8   r9   r:   append_format_boolop)r$   r   a1rN   rP   rA   rE   @py_format4@py_format6r[   r?   @py_format3rB   @py_format8s                 r   test_a1_worktree_root_passre   \   s    &!D	*b	!BffYGx$((e<I1 711  71              2    !	*     66)R(,,_eDL< <9                   %    %       L>):9+^T    r   c                 *
   t         j                  }  |        }|st        j                  dt                dz   dt	        j
                         v st        j                  t               rt        j                  t               ndt        j                  |       t        j                  |      dz  }t        t        j                  |            dx} }t         j                  d      }d}||v }|st        j                  d	|fd
||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d	|fd
||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}d}||v }|st        j                  d	|fd
||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}d}||v}|st        j                  d|fd||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}d|v xs d|v }|s{t        j                  d      dz   ddt	        j
                         v st        j                  |      rt        j                  |      ndiz  }	t        t        j                  |	            d}||v }|st        j                  d	|fd
||f      t        j                  |      dt	        j
                         v st        j                  |      rt        j                  |      nddz  }t        j                  d      dz   d|iz  }t        t        j                  |            dx}}y) u&  GUARD_186 소스에 #7 섹션이 cwd=cwd 기반 origin/main·HEAD 비교를 쓰고
    'main_current_branch != "main"' 패턴이 없음을 직접 검증.

    이것이 PR#186의 핵심 하드닝: canonical branch 상태와 무관하게
    worktree cwd 기준으로만 #7을 판단한다.
    u   GUARD_186 미존재: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}	GUARD_186)r,   r1   r)   Nutf-8encodingz["rev-parse", "origin/main"]rS   z%(py1)s in %(py3)ssourcer(   rV   u)   #7 섹션에 origin/main rev-parse 없음rW   rX   zcwd=cwdu>   cwd=cwd 패턴 없음 — worktree cwd 기준 실행이 아님u	   검증 #7u   검증 #7 섹션 주석 없음zmain_current_branch != "main"not in)z%(py1)s not in %(py3)su   구버전 canonical branch 체크 패턴('main_current_branch != "main"')이 GUARD_186 소스에 잔존 — PR#186 하드닝 미적용zhead_sha == origin_main_shaz
merge-baseuD   #7 섹션에 HEAD SHA vs origin/main 비교 또는 merge-base 없음r+   r,   has_sha_comparezos.environ.get("WORKSPACE_ROOT"u0   WORKSPACE_ROOT env 기반 오버라이드 없음)rg   existsr5   r8   r;   r<   r=   r7   r9   r:   	read_textr6   )
rE   r@   rB   rl   r?   rA   ra   rb   rp   rD   s
             r   &test_a1_no_canonical_branch_assumptionrs   v   s    BBBB!6ykBBBBBBB9BBB9BBBBBBBBBBBB  ' 2F * )V3  )V    *      .4    .4    	4      9  9                  	I      ;&   ;&          !    !    	)    
 + *&8  *&    +      39    39   	D     	&/ 	"6!     	O              
 - ,6  ,    -      17    17    	;    r   c                :	   | d   }|j                  di       }|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d	|j                  d       d
|j                  d             dz   d|iz  }	t        t        j                  |	            dx}x}x}x}}|j                  di       }
|
j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}x}x}}|
j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}x}x}}|
j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d      dz   d|iz  }	t        t        j                  |	            dx}x}x}x}}y)u   check_a2 nullglob_safe 결과 PASS assert.

    - worktree 디렉토리 부재 시 _WT_ISOLATED=0(fail-closed)
    - 존재 시 _WT_ISOLATED=1
    r   check_a2check_a2_nullglob_saferQ   r&   r/   a2r0   zA2 nullglob_safe != PASS: z
nullglob_results: nullglob_resultsr3   r4   Nwt_exists_isolated_is_1TiszI%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
} is %(py9)snru)   worktree 존재 시 _WT_ISOLATED=1 아님wt_absent_isolated_is_0_defaultu6   worktree 부재 시 _WT_ISOLATED=0(fail-closed) 아님#wt_absent_nullglob_on_isolated_is_0u;   nullglob ON에서 worktree 부재 시 _WT_ISOLATED=0 아님
r>   r5   r6   r;   r<   r=   r7   r8   r9   r:   )r$   r   rw   rE   r@   rF   rG   rH   rI   rJ   r}   s              r   test_a2_nullglob_safer      sG    &!D	*b	!B66 * 6*+ v +v5   +v                  +    ,    06    %RVV,D%E$F GVV$678	:     
 
"B	'B66 + 6+,  ,4  ,                  ,    -    15    	4      66 3 634  4<  4                  4    5    9=    	A      66 7 678 D 8D@  8D                  8    9    =A    	F     r   c           	     r   | d   }|j                  di       }|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d	|j                  d             d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}|j                  dg       }
|
D cg c],  }|j                  d      dk(  r|j                  d      dk(  r|. }}|s{t        j                  d      dz   ddt        j                         v st        j
                  |      rt        j                  |      ndiz  }t        t        j                  |            |D ])  }|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}, yc c}w )uB   EXTERNAL_DIRTY + worktree 격리(WT_ISOLATED=1) → EXEMPT 확인.r   ru   check_a2_external_exemptrQ   r&   r/   rw   r0   zA2 external_exempt != PASS: r3   r4   Nmatrixdirty_classEXTERNAL_DIRTY_BLOCKERwt_isolatedr\   u<   EXTERNAL_DIRTY + WT_ISOLATED=1 매트릭스 케이스 없음r+   r,   exempt_casesactualEXEMPTcaseu:   EXTERNAL_DIRTY + WT_ISOLATED=1 → 기대 EXEMPT, 실제: r   )r$   r   rw   rE   r@   rF   rG   rH   rI   rJ   r   mr   rD   r   s                  r   test_a2_external_dirty_exemptr      s   &!D	*b	!B66 , 6,-  -7  -                  -    .    28    'rvv.H'I&JK      VVHb!F55#;;m@TXY@Y 	
L  WWWWWWWWW<WWW<WWWWW 
xx 	
 	
x! 	
X 	
!X- 	
 	
!X 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 ! 	
 	
 		 " 	
 	
 		 &. 	
 	
  IRZI[H\]	
 	
 	
 	
 	
 	

s   1L4c           	     J   | d   }|j                  di       }|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d	|j                  d             d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}|j                  dg       }
|
D cg c]  }|j                  d      dk(  r| }}|s{t        j                  d      dz   ddt        j                         v st        j
                  |      rt        j                  |      ndiz  }t        t        j                  |            |D ])  }|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}, yc c}w )uC   OWN_DIRTY(expected_files dirty) → BLOCKED assert (면제 불가).r   ru   check_a2_own_failclosedrQ   r&   r/   rw   r0   zA2 own_failclosed != PASS: r3   r4   Nr   r   OWN_DIRTY_FAILu,   OWN_DIRTY_FAIL 매트릭스 케이스 없음r+   r,   	own_casesr   BLOCKEDr   u6   OWN_DIRTY → 기대 BLOCKED (면제 불가), 실제: r   )r$   r   rw   rE   r@   rF   rG   rH   rI   rJ   r   r   r   rD   r   s                  r   test_a2_own_dirty_failclosedr      s   &!D	*b	!B66 + 6+,  ,6  ,                  ,    -    17    &bff-F&G%HI      VVHb!F55#33 	
I  DDDDDDDDD9DDD9DDDDD 
xx 	
 	
x! 	
Y 	
!Y. 	
 	
!Y 	
 	
	6	
 	
   	
 	
 		  	
 	
 		  	
 	
 		 ! 	
 	
 		 " 	
 	
 		 &/ 	
 	
  ETXXhEWDXY	
 	
 	
 	
 	
 	

s   L c           	     
   | d   }|j                  di       }|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d	|j                  d       d
|j                  dd      dd        dz   d|iz  }	t        t        j                  |	            dx}x}x}x}}|j                  di       }
|
j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|
j                  d             dz   d|iz  }	t        t        j                  |	            dx}x}x}x}}|
j                  dd      }d}||v }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  |      rt        j                  |      nddz  }t        j                  d|       dz   d|iz  }t        t        j                  |            dx}}|j                   }d} ||      }d }||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d!      dz   d|iz  }	t        t        j                  |	            dx}x}x}x}}t        d"z  d#z  d$z  }|j                         r|j                  d%&      j                         }d}||k7  }|st        j                  d'|fd(||f      d)t        j                         v st        j
                  |      rt        j                  |      nd)t        j                  |      d*z  }t        j                  d+      dz   d|iz  }t        t        j                  |            dx}}yy),u   check_b verdict == STALE_RESIDUE + 증거 확인.

    - cap_before_pr186_merge == True
    - precedent에 'task-2729+1' 포함
    - counter reset 0 확인 (테스트가 g4-fix-loop-count 파일 절대 쓰지 않음)
    r   check_bcheck_b_g4_verdictSTALE_RESIDUEr&   r/   br0   u   B verdict 불일치: z	
reason: verdict_reason Ni,  r3   r4   evidencecap_before_pr186_mergeTrz   r|   z cap_before_pr186_merge != True: 	precedentztask-2729+1rS   rk   rm   u#   precedent에 'task-2729+1' 없음: rW   rX   counter_resetFuT   check_b.counter_reset이 False가 아님 — 하니스가 카운터를 초기화함!memoryeventsztask-2729+10.g4-fix-loop-countrh   ri   )!=)z%(py0)s != %(py3)s	count_valrU   u5   g4-fix-loop-count 파일이 비어있음 (예상 외))r>   r5   r6   r;   r<   r=   r7   r8   r9   r:   	WORKSPACErq   rr   r   )r$   r   r   rE   r@   rF   rG   rH   rI   rJ   r   r   r?   rA   ra   rb   
count_filer   s                     r   test_b_g4_stale_residuer      s    &!DBA55 % 5%& / &/9   &/                  &    '    +:     &: ;< =55)2.t45	7     
 uuZ$H << 0 <01 T 1T9  1T                  1    2    6:    +8<<8P+Q*RS     
 ["-I =I%  =I          &    &    .i[9    
 55  5! U !U*  !U                  !    "    &+    	_      X%03SSJ(('(:@@B	WyBWWWyBWWWWWWyWWWyWWWBWWW WWWWWWW r   c                   | d   }|j                  di       }|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d	|j                  d             d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}|j                  di       }
|j                  di       }|
j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|
j                  d             d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}|
j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d      d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}|
j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}x}x}}|
j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}x}x}}|
j                   }d } ||      }d!}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |
      rt        j                  |
      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d"} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d#      d
z   d|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d$} ||      }d%}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d&} ||      }d%}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }dd|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d'} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      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)(u8   check_c separation_verdict=="SEPARATED" + 분류 검증.r   check_cseparation_verdict	SEPARATEDr&   r/   cr0   u    C separation_verdict 불일치: r3   r4   Ncheck_c_seedcheck_c_robustclassificationSEED_PLACEHOLDERseedu   seed classification 불일치: %ROBUST_FRAMEWORK_REGISTRATION_REQUESTrobustu!   robust classification 불일치: is_seed_placeholderTrz   r|   z seed.is_seed_placeholder != Trueregistration_result_status
REGISTEREDzassert %(py11)scallback_delivery_statusPENDINGcollector_receipt_statusUNCONFIRMEDis_robust_frameworkz"robust.is_robust_framework != TruerN   rQ   enforcement_verdictowner_is_anu_keyr   )r$   r   r   rE   r@   rF   rG   rH   rI   rJ   r   r   s               r   test_c_seed_vs_robust_separatedr     sB   &!DBA55 % 5%& + &+5  &+                  &    '    +6    +1551E+F*GH      55$DUU#R(F88 $ 8$% ); %);;  %);                  %    &    *<    *$((3C*D)EF      :: & :&' +R '+RR  '+R                  '    (    ,S    ,FJJ7G,H+IJ     
 88V)V8)*VdV*d2VVV*dVVVVVV4VVV4VVV8VVV)VVV*VVVdVVV4VVVVVVVV88A0A801A\A1\AAAA1\AAAAAA4AAA4AAA8AAA0AAA1AAA\AAAAAAA88<.<8./<9</9<<<</9<<<<<<4<<<4<<<8<<<.<<</<<<9<<<<<<<88@.@8./@=@/=@@@@/=@@@@@@4@@@4@@@8@@@.@@@/@@@=@@@@@@@ ::Z+Z:+,ZZ,4ZZZ,ZZZZZZ6ZZZ6ZZZ:ZZZ+ZZZ,ZZZZZZ6ZZZZZZZZ::*i*:i *F* F**** F******6***6***:***i*** ***F*******::6+6:+,66,6666,66666666666666:666+666,6666666666::1(1:()1T1)T1111)T11111161116111:111(111)111T11111111r   c                    t        j                  t        j                  t	        t
              dgt	        t              ddd      } | j                  }t        |v}|st        j                  d|fdt        |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d	z  }t        j                  d
      dz   d|iz  }t!        t        j"                  |            d}| j$                  }t        |v}|st        j                  d|fdt        |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d	z  }t        j                  d      dz   d|iz  }t!        t        j"                  |            d}y)u   하니스 --json stdout 전체에 raw ANU key가 나타나지 않음을 확인.

    REDACTED/마스킹만 허용. _ANU_KEY_PATTERN 분할 상수로 매칭.
    r   Tx   r	   rn   )z%(py0)s not in %(py2)s_ANU_KEY_PATTERNr   )r,   r1   uO   하니스 --json stdout에 raw ANU key 패턴이 노출됨 — 마스킹 누락z
>assert %(py4)sr)   Nr   u:   하니스 --json stderr에 raw ANU key 패턴이 노출됨)r   r   r   r   r   r   r   r   r   r5   r6   r;   r<   r=   r7   r8   r9   r:   r   )r   r   rE   rc   rB   r   s         r   test_no_anu_key_raw_leakr   C  s   
 >>	Wx0MD [[F 6)  6                $*    $*    	Z    
 [[F6)  6                $*    $*    	E    r   c                    | d   }|j                  di       }|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}|j                   }d} ||      }d}||u }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      t        j                  |      dz  }t        j                  d|j                  d             d	z   d
|iz  }	t        t        j                  |	            dx}x}x}x}}y) u   하니스 footer에 부작용 0 assert.

    - manual_done_created == 0
    - canonical_write == 0
    - production_activation == 0
    - real_ANU_spawn == 0
    - ACTIVE == "false"
    r   footermanual_done_createdr   r&   r/   r0   z!footer.manual_done_created != 0: r3   r4   Ncanonical_writezfooter.canonical_write != 0: production_activationz#footer.production_activation != 0: real_ANU_spawnzfooter.real_ANU_spawn != 0: ACTIVEfalsezfooter.ACTIVE != 'false': activeFrz   r|   zdata.active != False: zdata.canonical_write != False: done_createdzdata.done_created != False: anu_spawnedzdata.anu_spawned != False: z%data.production_activation != False: r   )
r$   r   r   rE   r@   rF   rG   rH   rI   rJ   s
             r   &test_no_canonical_or_done_side_effectsr   b  s
    &!DXXh#F:: + :+,  ,1  ,                  ,    -    12    ,FJJ7L,M+NO      :: ' :'( A (A-  (A                  (    )    -.    (

3D(E'FG      :: - :-. ! .!3  .!                  .    /    34    .fjj9P.Q-RS      :: & :&' 1 '1,  '1                  '    (    ,-    'vzz2B'C&DE      :: h :h 7 7*  7                           $+    %VZZ%9$:;     
 88 H 8H  &                            "'    !(!3 45     
 88 % 8%& % &%/  &%                  &    '    +0    *$((3D*E)FG      88 N 8N# u #u,  #u                  #    $    (-    'txx'?&@A      88 M 8M" e "e+  "e                  "    #    ',    &dhh}&=%>?      88 + 8+,  ,5  ,                  ,    -    16    09P0Q/RS     r   )r   )r   intreturndict)r   r   )r$   r   r   None)r   r   )#__doc__
__future__r   builtinsr;   _pytest.assertion.rewrite	assertionrewriter5   r   r   r   pathlibr   pytestr   r   rg   r   _ANU_KEY_PART_A_ANU_KEY_PART_Br   r   fixturer$   rK   re   rs   r   r   r   r   r   r   r   r#   r   r   <module>r      s    #     
   BC
U
U44	&'	 "_4 * i  !
"4'\:
0
0'X\2H>-r   