
    %jB                     T   d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
ZddlZddlZddlmZ ddlZ ee      j%                         j&                  d   Z ee      ej,                  vr"ej,                  j/                  d ee             ddlmZmZ ddlmZ ddlmZmZm Z  edz  d	z  d
z  Z!dZ" e#h d      Z$de%fdZ&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4dede5e   fdZ6d Z7d  Z8d! Z9d" Z:d# Z;d$ Z<d% Z=e>d&k(  r e? ej                  ed'g            y)(u3  test_pre_authorized_executor_binding.py — task-2553+5 binding regression.

§7 완료조건 + 9-R.1 하드배리어 + 9-R.4 + 9-R.7 adversarial + 9-R.8 precondition
+ 회장 필수 검증(§12) 4·5·6·10·11·12·13.

검증:
  - gate ALLOW → dry-run plan only (실 write 0)
  - decision != ALLOW → HOLD packet
  - spoofed decision(schema/gate_module mismatch) → reject
  - raw-packet 유래 ALLOW (provenance 부재) → binding reject (9-R.8)
  - evidence_bundle_sha256 불일치(치환된 번들) → HOLD
  - dry-run flag 부재 → reject
  - callback marker 부재 / authority escalation → HOLD
  - decision 이 contract 산출물 아님(spoofed) → reject
  - binding 모듈 network/GitHub/subprocess/실executor import 0건 정적 증명
  - gate 본체 sha 불변 / forbidden_write_targets 불변
    N)Path   )DECISION_ALLOWevaluate)derive)STATUS_DRY_RUN_PLANSTATUS_HOLDbindmemoryfixturesz-task-2553+1.auto-derived-evidence-bundle.json@f34e2445452cd84f22a378ece0cd922d0ff952fa545cc02268923a5f9fc46532>   osptysslhttpghapihttpshttpxftplibgithubpoplibsocketurllibxmlrpcaiohttpasyncioimaplibpexpectsmtplibparamikorequests	telnetlib
subprocess
webbrowsermultiprocessingreturnc                  T    t        j                  t        j                  d            S )Nutf-8encoding)jsonloadsFIXTURE	read_text     L/home/jay/workspace/tests/regression/test_pre_authorized_executor_binding.py_bundler2   U   s    ::g'''9::r0   c                  ,   t               } t        |       }|d   }d}||k(  }|st        j                  d|fd||f      t        j                  |      t        j                  |      dz  }t        j
                  |d         dz   d|iz  }t        t        j                  |            d	x}x}}|d
   }t        |      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }	t        j
                  |d         dz   d|	iz  }
t        t        j                  |
            d	x}}||| fS )u<   fixture → DERIVED contract + gate ALLOW decision + bundle.statusDERIVED==z%(py1)s == %(py4)spy1py4hold_reasons
>assert %(py6)spy6Ncontractdecisionz%(py1)s == %(py3)sr   r:   py3reasons
>assert %(py5)spy5)r2   r   
@pytest_ar_call_reprcompare	_saferepr_format_assertmsgAssertionError_format_explanationr   r   @py_builtinslocals_should_repr_global_name)bres@py_assert0@py_assert3@py_assert2@py_format5@py_format7r?   r@   @py_format4@py_format6s              r1   _allow_tripletrY   Y   s   	A
)Cx=:I:=I%:::=I:::=:::I:::s>':::::::::H!HJF>1FFF>FFFFFFFFF>FFF>FFFF8I3FFFFFFFXq  r0   c                  <   t               \  } }}t        | ||d      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              nddz  }t        j                  |j                  d            d	z   d
|iz  }t        t        j                  |            d x}}|d   }d}||u }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }d}||u }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }ddddd}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }d}|d   }||v }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}d}|d   }||v }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }g }|d   }d}||u }|}|r|d    }d}||u }|}|st        j                  d|fd!||f      t        j
                  |      t        j
                  |      d"z  }
d#d$|
iz  }|j                  |       |r_t        j                  dfd%f      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}x}}|d,   }d-}||k(  }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}g }|d.   }|}|r|d/   }|}|r|d0   }|}|sd1d2t        j
                  |      iz  }|j                  |       |rXd3dt        j
                  |      iz  }
|j                  |
       |r+d4d5t        j
                        iz  }|j                  |       t        j                  |d)      i z  }d6d7|iz  }t        t        j                  |            d x}x}x}x}}y )8NTr@   r?   evidence_bundledry_runr4   r6   rA   r   rB   r<   rE   rF   r]   isz%(py1)s is %(py4)sr9   assert %(py6)sr>   no_github_write_performedno_network_performedno_subprocess_performedprecondition_9R8)provenance_stamp_presentevidence_bundle_sha256_match%decision_bound_to_provenance_contractcontract_matches_deriver_outputr8   dry_run_executor_planzNOT INVOKEDexecutor)in)z%(py1)s in %(py4)sBLOCKEDreal_pr_opencallback_injectionnormalfallback)z%(py3)s is %(py6)s)rC   r>   z%(py8)spy8)z%(py11)s is %(py14)s)py11py14z%(py16)spy16r   zassert %(py19)spy19	authoritycollector_onlyno_writeno_dev_reactivationno_closeoutz%(py3)srC   z%(py6)sz%(py9)spy9zassert %(py12)spy12)rY   r
   r   rG   rH   rI   rM   rN   rO   rJ   getrK   rL   append_format_boolop)r@   r?   rP   outrR   rT   rW   rX   rS   rU   rV   plancb@py_assert1@py_assert5@py_assert4@py_assert10@py_assert13@py_assert12@py_format9@py_format15@py_format17@py_format18@py_format20@py_assert8@py_format10@py_format11@py_format13s                               r1   #test_allow_yields_dry_run_plan_onlyr   f   s   *,Hh
8QPT
UCx=H=//HHH=/HHH=HHHHHH/HHH/HHHH1HHHHHHHy>!T!>T!!!!>T!!!>!!!T!!!!!!!*+3t3+t3333+t333+333t3333333%&.$.&$....&$...&...$.......()1T1)T1111)T111)111T1111111!" $((,15+/	' " '  
 " '  
  #  
 '    
   &'D,D,,=,,,,,=,,,,=,,,,,,,,,,,,^,,9,,,,,9,,,,9,,,,,,,,,,,	!	"B:2h<:4:<4:BzN:d:Nd$::::<4:::<:::4:::::::Nd:::N:::d::::::::::::::k?...?.....?....?...........M2j>M>M>b!67M7M7B}<MM<MMMM>MMMM>MMM7MMMM7MMM<MMMMMMMMMMMMMMr0   c                  h   t               \  } }}t        j                  |      }d|d<   t        |      }|d   }|t        k7  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            d x}}t        |||d
      }	|	d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd	|iz  }t        t        j                  |            d x}}|	d   }d }
||
u }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
|	d   }d}
||
u }|slt        j                  d|fd||
f      t        j                  |      t        j                  |
      dz  }dd|iz  }t        t        j                  |            d x}x}}
y )NTmerge_requiredr@   )!=)z%(py1)s != %(py3)sr   rB   assert %(py5)srF   r[   r4   r6   rA   r	   rj   r^   r`   r9   ra   r>   report_to_chair)rY   copydeepcopyr   r   rG   rH   rI   rM   rN   rO   rK   rL   r
   r	   )_r?   rP   chold_decrR   rT   rW   rX   r   rS   rU   rV   s                r1   test_non_allow_decision_holdsr      s   #%NAxhAA{HJ1>1111>111111111>111>1111111
1a
NCx='=K''''=K'''=''''''K'''K'''''''&'/4/'4////'4///'///4/////// !)T)!T))))!T)))!)))T)))))))r0   c                  H   t               \  } }}t        j                  |       }d|d<   t        |||d      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}d |d   D        }	t        |	      }
|
sd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}	}
y )Nzevil.fake.decision.v1schemaTr[   r4   r6   rA   r	   rB   r   rF   c              3   $   K   | ]  }d |v  
 yw)u   schema 위조Nr/   .0rs     r1   	<genexpr>z8test_spoofed_decision_schema_rejected.<locals>.<genexpr>   s     A!#A   r<   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anypy0py2r;   rY   r   r   r
   r	   rG   rH   rI   rM   rN   rO   rK   rL   r   r@   r?   rP   spoofr   rR   rT   rW   rX   r   rS   rU   s               r1   %test_spoofed_decision_schema_rejectedr      s    *,HhMM(#E-E(O
!T
RCx='=K''''=K'''=''''''K'''K'''''''AS-@AA3AAAAAAAAA3AAA3AAAAAAAAAAAAAAr0   c                  H   t               \  } }}t        j                  |       }d|d<   t        |||d      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}d |d   D        }	t        |	      }
|
sd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}	}
y )Nz	evil.gategate_moduleTr[   r4   r6   rA   r	   rB   r   rF   c              3   $   K   | ]  }d |v  
 yw)u   gate_module 위조Nr/   r   s     r1   r   z4test_spoofed_gate_module_rejected.<locals>.<genexpr>        FQ#q(Fr   r<   r   r   r   r   r   s               r1   !test_spoofed_gate_module_rejectedr      s    *,HhMM(#E&E-
!T
RCx='=K''''=K'''=''''''K'''K'''''''F#n2EFF3FFFFFFFFF3FFF3FFFFFFFFFFFFFFr0   c                  8   t               \  } }}t        j                  |      }d|d<   t        j                  |       }t        |||d      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }d	d
|iz  }	t        t        j                  |	            dx}}g }
d |d   D        }t        |      }|}|sd |d   D        }t        |      }|}|sPddt        j                         v st        j                  t              rt        j                  t              ndt        j                  |      t        j                  |      dz  }|
j                  |       |sddt        j                         v st        j                  t              rt        j                  t              ndt        j                        t        j                        dz  }|
j                  |       t        j                  |
d      i z  }dd|iz  }t        t        j                  |            dx}x}
x}x}x}}y)uW   contract 는 gate HOLD 인데 ALLOW decision 위조 → 재평가 불일치 → reject.T
critical_7r[   r4   r6   rA   r	   rB   r   rF   Nc              3   $   K   | ]  }d |v  
 yw)u   contract 산출물 아님Nr/   r   s     r1   r   zAtest_forged_allow_on_holding_contract_rejected.<locals>.<genexpr>   s     MA*a/Mr   r<   c              3   $   K   | ]  }d |v  
 yw)z!= ALLOWNr/   r   s     r1   r   zAtest_forged_allow_on_holding_contract_rejected.<locals>.<genexpr>   s      U
aUr   z%%(py6)s
{%(py6)s = %(py2)s(%(py4)s)
}r   )r   r;   r>   z(%(py12)s
{%(py12)s = %(py8)s(%(py10)s)
})rr   py10r}      zassert %(py15)spy15)rY   r   r   r
   r	   rG   rH   rI   rM   rN   rO   rK   rL   r   r   r   )r@   r?   rP   r   forgedr   rR   rT   rW   rX   r   rS   r   @py_assert9@py_assert11rV   r   @py_format14@py_format16s                      r1   .test_forged_allow_on_holding_contract_rejectedr      s   *,HhhAAlO]]8$F
At
LCx='=K''''=K'''=''''''K'''K'''''''M^9LM 3MM M M U!$^!4U QT U R  R              N    N    N     RU    RU   U   R          r0   c                     t               \  } }}t        j                  |      }|j                  d       t	        |      }|d   }|t
        k(  }|st        j                  d|fd|t
        f      t        j                  |      dt        j                         v st        j                  t
              rt        j                  t
              nddz  }dd|iz  }t        t        j                  |            d	x}}t        |||d
      }	|	d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              nddz  }dd|iz  }t        t        j                  |            d	x}}d |	d   D        }
t!        |
      }|sd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}
}y	)uU   provenance stamp 없는 (raw packet/수동) contract → ALLOW 라도 binding 거부._provenancer@   r6   rA   r   rB   r   rF   NTr[   r4   r	   c              3   $   K   | ]  }d |v  
 yw)u   _provenance 부재Nr/   r   s     r1   r   zTtest_raw_packet_derived_allow_rejected_by_provenance_precondition.<locals>.<genexpr>   r   r   r<   r   r   r   )rY   r   r   popr   r   rG   rH   rI   rM   rN   rO   rK   rL   r
   r	   r   )r   r?   rP   rawraw_decrR   rT   rW   rX   r   r   rS   rU   s                r1   Atest_raw_packet_derived_allow_rejected_by_provenance_preconditionr      se   #%NAx
--
!CGGMsmG:0.0000.000000000.000.0000000
#q$
OCx='=K''''=K'''=''''''K'''K'''''''F#n2EFF3FFFFFFFFF3FFF3FFFFFFFFFFFFFFr0   c                  h   t               \  } }}t        j                  |      }d|d<   d|d<   t        |      }t	        |||d      }|d   }|t
        k(  }|st        j                  d|fd	|t
        f      t        j                  |      d
t        j                         v st        j                  t
              rt        j                  t
              nd
dz  }dd|iz  }	t        t        j                  |	            dx}}d |d   D        }
t        |
      }|sd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}
}y)u   Codex Finding 1: 손으로 만든 self-assert contract 에 위조 _provenance
    (실 bundle sha 포함)를 붙이고 gate ALLOW 가 나와도, binding 이
    deriver(evidence_bundle) 재도출과 exact-match 검사 → 차단.ztask-2553+1task_idz#tampered-but-gate-would-still-allowbase_shaTr[   r4   r6   rA   r	   rB   r   rF   Nc              3   $   K   | ]  }d |v  
 yw)u/   deriver(evidence_bundle) 산출물과 불일치Nr/   r   s     r1   r   zWtest_forged_provenance_with_real_bundle_sha_rejected_by_rederivation.<locals>.<genexpr>   s      CD9Q>r   r<   r   r   r   )rY   r   r   r   r
   r	   rG   rH   rI   rM   rN   rO   rK   rL   r   )r   r?   rP   r   
forged_decr   rR   rT   rW   rX   r   rS   rU   s                r1   Dtest_forged_provenance_with_real_bundle_sha_rejected_by_rederivationr      sM    $%NAx]]8$F &F9>F:&!J

VQPT
UCx='=K''''=K'''=''''''K'''K'''''''HKNH[ 3                        r0   c                     t               \  } }}t        j                  |      }d|d   d   d   d<   t        | ||d      }|d   }|t        k(  }|st        j                  d|fd	|t        f      t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dz  }dd|iz  }t        t        j                  |            dx}}y)uH   evidence 가 HOLD 면 (deriver 재도출 != DERIVED) binding 도 거부.Tevidencecritical_7_markerobserved_valuer   r[   r4   r6   rA   r	   rB   r   rF   NrY   r   r   r
   r	   rG   rH   rI   rM   rN   rO   rK   rL   )	r@   r?   rP   brokenr   rR   rT   rW   rX   s	            r1   4test_provenance_authenticity_requires_derived_statusr      s    *,Hh]]1FNRF:*+,<=lK
8VUY
ZCx='=K''''=K'''=''''''K'''K'''''''r0   c                  N   t               \  } }}t        j                  |      }d|d   d<   t        | ||d      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	d
z  }dd|iz  }t        t        j                  |            d x}}d |d   D        }	t        |	      }
|
sd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}	}
y )Nzevil.deriverr   
derived_byTr[   r4   r6   rA   r	   rB   r   rF   c              3   $   K   | ]  }d |v  
 yw)u   derived_by 위조Nr/   r   s     r1   r   z=test_forged_provenance_derived_by_rejected.<locals>.<genexpr>   s     EA"a'Er   r<   r   r   r   r   )r@   r?   rP   r   r   rR   rT   rW   rX   r   rS   rU   s               r1   *test_forged_provenance_derived_by_rejectedr      s    *,HhhA%3Am\"
1a
NCx='=K''''=K'''=''''''K'''K'''''''E^1DEE3EEEEEEEEE3EEE3EEEEEEEEEEEEEEr0   c                  Z   t               \  } }}t        j                  |      }d|d   d   d   d<   t        | ||d      }|d   }|t        k(  }|st        j                  d|fd	|t        f      t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dz  }dd|iz  }t        t        j                  |            dx}}d |d   D        }	t        |	      }
|
sd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}	}
y)uO   stamped sha != 실 evidence 번들 재해시 → 치환/위조 검출 → HOLD.Tr   r   r   r   r[   r4   r6   rA   r	   rB   r   rF   Nc              3   $   K   | ]  }d |v  
 yw)u    evidence_bundle_sha256 불일치Nr/   r   s     r1   r   z=test_evidence_bundle_substitution_rejected.<locals>.<genexpr>   s     T11Q6Tr   r<   r   r   r   r   )r@   r?   rP   tamperedr   rR   rT   rW   rX   r   rS   rU   s               r1   *test_evidence_bundle_substitution_rejectedr      s   *,Hh}}QHPTHZ,-.>?M
HhPTC x='=K''''=K'''=''''''K'''K'''''''TN@STT3TTTTTTTTT3TTT3TTTTTTTTTTTTTTr0   c                     t               \  } }}t        | ||d      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j
                  |      dt        j                         v st        j                  t              rt        j
                  t              nddz  }dd	|iz  }t        t        j                  |            d x}}d
 |d   D        }t        |      }	|	sd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}}	y )NFr[   r4   r6   rA   r	   rB   r   rF   c              3   $   K   | ]  }d |v  
 yw)zdry-run flagNr/   r   s     r1   r   z0test_no_dry_run_flag_rejected.<locals>.<genexpr>   s     @q~"@r   r<   r   r   r   )rY   r
   r	   rG   rH   rI   rM   rN   rO   rK   rL   r   )r@   r?   rP   r   rR   rT   rW   rX   r   rS   rU   s              r1   test_no_dry_run_flag_rejectedr      s    *,Hh
8QPU
VCx='=K''''=K'''=''''''K'''K'''''''@C,?@@3@@@@@@@@@3@@@3@@@@@@@@@@@@@@r0   c                     t               \  } }}t        j                  |      }|d   d= t        | ||d      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      dt        j                         v st        j                  t              rt        j                  t              ndd	z  }d
d|iz  }t        t        j                  |            d x}}y )Nr   callback_policy_markerTr[   r4   r6   rA   r	   rB   r   rF   r   )	r@   r?   rP   r   r   rR   rT   rW   rX   s	            r1   !test_callback_marker_absent_holdsr      s    *,Hh}}QH56
HhPTC x='=K''''=K'''=''''''K'''K'''''''r0   c                  ~   t               \  } }}t        j                  |      }d|d   d   d   d<   t        |      }|d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	d
z  }dd|iz  }t        t        j                  |            d x}}t        | ||d      }	|	d   }|t        k(  }|st        j                  d|fd|t        f      t        j                  |      d	t        j                         v st        j                  t              rt        j                  t              nd	d
z  }dd|iz  }t        t        j                  |            d x}}y )Ndev_reactivation_and_writer   r   r   rw   r4   r6   rA   r	   rB   r   rF   Tr[   )rY   r   r   r   r	   rG   rH   rI   rM   rN   rO   rK   rL   r
   )
r@   r?   rP   r   res2rR   rT   rW   rX   r   s
             r1   (test_callback_authority_escalation_holdsr     s   *,Hh}}QH 	% Z123CD (D>(>[((((>[(((>(((((([((([(((((((
HhPTC x='=K''''=K'''=''''''K'''K'''''''r0   pathc                    t        j                  | j                  d            }t               }t        j                  |      D ]  }t        |t         j                        r?|j                  D ]/  }|j                  |j                  j                  d      d          1 \t        |t         j                        sw|j                  s|j                  dk(  s|j                  |j                  j                  d      d           |S )Nr(   r)   .r   )astparser.   setwalk
isinstanceImportnamesaddnamesplit
ImportFrommodulelevel)r   treerootsnodeas        r1   _imported_rootsr     s    99T^^W^56DeE 5dCJJ'ZZ 0		!&&,,s+A./0cnn-{{tzzQ		$++++C0345 Lr0   c                     t         dz  dz  } t        |       }|t        z  }| }|st        j                  dt        |             dz   ddt        j                         v st        j                  |      rt        j                  |      ndiz  }t        t        j                  |            d }h d}||k  }|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t        |             dz   d|iz  }t        t        j                  |            d x}}y )Nanu_v3"pre_authorized_executor_binding.pyu   binding 모듈 금지 import: z
>assert not %(py0)sr   bad>   r+   r   typinghashlibpathlibdatetime
__future__)<=)z%(py0)s <= %(py3)sr   r   rC   u   예상 밖 import: rE   rF   )	WORKSPACEr   FORBIDDEN_IMPORT_ROOTSrG   rJ   sortedrM   rN   rO   rI   rK   rL   rH   )modr   r   r   @py_format2rT   rW   rX   s           r1   .test_binding_module_has_zero_forbidden_importsr  !  s:   
h
!E
ECC E
(
(C7B7BB4VC[MBBBBBBBsBBBsBBBBBB -5   - -,-5  - - '-f- - -,  - - $-9  - - $-9 - - -,	VE]O,- - - -,- -r0   c                     t         dz  dz  } t        |       }|t        z  }| }|st        j                  t        |t        z              dz   dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t              rt        j                  t              nddz  }t        t        j                  |            d x}}y )Nr   z"pre_authorized_contract_deriver.pyz 
>assert not (%(py0)s & %(py1)s)r   r	  )r   r:   )r  r   r	  rG   rJ   r
  rM   rN   rO   rI   rK   rL   )r  r   rT   rS   rW   s        r1   .test_deriver_module_has_zero_forbidden_importsr  2  s    
h
!E
ECC E.. ./ /   28&&2                /    /     r0   c                     t         dz  dz  j                  d      } t        j                  |       }t        j                  |      D ]
  }t        |t        j                        r=t        |j                  t        j                        r|j                  }|j                  }h d}||v}|st        j                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }t        j                   d
|j                  j                         dz   d|iz  }t#        t        j$                  |            dx}x}x}}t        |t        j                        sxt        |j                  t        j&                        s|j                  j(                  }	t        |	t        j                        s|	j                  }|t*        v}|s t        j                  d|fd|t*        f      dt        j                         v st        j                  |	      rt        j                  |	      ndt        j                  |      dt        j                         v st        j                  t*              rt        j                  t*              nddz  }
t        j                   d|	j                   d|j                  j,                         dz   d|
iz  }t#        t        j$                  |            dx}} y)uK   실 PR open executor 호출 / eval / exec / __import__ 정적 부재 (AST).r   r   r(   r)   >   evalexeccompile
__import__)not in)zH%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.func
}.id
} not in %(py7)sr   )r   r   r;   py7u   금지 호출: z
>assert %(py9)sr|   N)z.%(py2)s
{%(py2)s = %(py0)s.id
} not in %(py4)sbaser	  r   u'   금지 네트워크/subprocess 호출: r   r=   r>   )r  r.   r   r   r   r   CallfuncNameidrG   rH   rM   rN   rO   rI   rJ   rK   rL   	Attributevaluer	  attr)srcr   r   r   rS   @py_assert6r   @py_format8r   r  rU   rV   s               r1   0test_binding_module_has_no_real_executor_or_evalr"  :  s   x"FF
Q
Q R C 99S>D dCHH%*TYY*I99 09<< 0 ( 0< (  0
 0/0< ( 0 0
 *00 0
 0/  0 0
 '0i  0 0
 '0i  0 0
 '0i   0 0
 '0i( 0 0
 0//0 0 0
 0/0 0 0 dCHH%*TYY*N99??D$)ww w&<<    w&<  6     	   	   6   '=  	 '=     >dggYa		GWX    r0   c                  n   t         dz  dz  } t        j                  | j                               j	                         }|t
        k(  }|st        j                  d|fd|t
        f      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  t
              rt        j                  t
              nddz  }t        j                  d|       d	z   d
|iz  }t        t        j                  |            d }y )Nr   zpre_authorized_action_gate.pyr6   )z%(py0)s == %(py2)sshaGATE_BODY_SHA256_INVARIANT)r   r   u   gate 본체 수정됨: z
>assert %(py4)sr;   )r  r  sha256
read_bytes	hexdigestr%  rG   rH   rM   rN   rO   rI   rJ   rK   rL   )gater$  r   @py_format3rU   s        r1    test_gate_body_sha256_unmodifiedr+  T  s    x"AAD
..*
+
5
5
7C,,MMM3,MMMMMM3MMM3MMMMMM,MMM,MMMM0Gu.MMMMMMMr0   c                     t         dz  dz  } t         dz  dz  }t         dz  dz  dz  }t         dz  dz  }| |||fD ]  }|j                  } |       }|st        j                  d	|       d
z   dt	        j
                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      dz  }t        t        j                  |            dx}} t        j                  }| j                  } |       }	 ||	      }
|
j                  } |       }d}||k(  }|sZt        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                  |       rt        j                  |       ndt        j                  |      t        j                  |	      t        j                  |
      t        j                  |      t        j                  |      t        j                  |      d	z  }dd|iz  }t        t        j                  |            dx}x}x}	x}
x}x}x}}t        j                  }|j                  } |       }	 ||	      }
|
j                  } |       }d}||k(  }|sZt        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                  |      rt        j                  |      ndt        j                  |      t        j                  |	      t        j                  |
      t        j                  |      t        j                  |      t        j                  |      d	z  }dd|iz  }t        t        j                  |            dx}x}x}	x}
x}x}x}}y)uR   forbidden_write_targets 핵심 파일이 존재하고 게이트 schema sha 불변.schemasz*pre_authorized_action_contract.schema.jsonz*pre_authorized_action_decision.schema.jsontests
regressionz"test_pre_authorized_action_gate.pyutilsz%anu_delegation_completion_callback.pyu   forbidden_write_target 누락: zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}pr   N@bb83a689ac5c18d75261f5bda4bd1ce386d861314ce5fda94166f380f8f4d577r6   )z%(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py2)s
{%(py2)s = %(py0)s.sha256
}(%(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.read_bytes
}()
})
}.hexdigest
}()
} == %(py16)sr  contract_schema)	r   r   rC   rF   r  r|   rs   py13ru   zassert %(py18)spy18@a80ab6092f12ded84810573c552c835590dc017466cba266ca57c03a983c6b86decision_schema)r  existsrG   rJ   rM   rN   rO   rI   rK   rL   r  r&  r'  r(  rH   )r3  r7  	gate_testcallbackr1  r   rS   rU   r   r   r   r   r   @py_assert15@py_assert14r   @py_format19s                    r1   2test_forbidden_write_targets_present_and_untouchedr>  Z  s    	I LL  	I LL  	Gl*-QQ  7"%LLH	8D Axx@xz@z@@<QC@@@@@@@q@@@q@@@x@@@z@@@@@@A 	&1113344>>>@M@M	N  @M     	   	   	     '   '   2   4   	5   	?   	A   N       
 	&1113344>>>@M@M	N  @M     	   	   	     '   '   2   4   	5   	?   	A   N       r0   c                 
   t         dz  dz  }t        j                  j                  d|      }g }|}|r|j                  }|}|sdddt        j                         v st        j                  |      rt        j                  |      ndiz  }|j                  |       |rlddt        j                         v st        j                  |      rt        j                  |      ndt        j                        dz  }|j                  |       t        j                  |d	      i z  }d
d|iz  }	t        t        j                  |	            d x}x}}t        j                  j                  |      }
|j                  j                  |
       t!               \  }}}| dz  }| dz  }|j#                  t%        j&                  |      d       |j#                  t%        j&                  |      d       | dz  }|
j)                  dt+        |      dt+        |      dt+        t,              dt+        |      g      }d	}||k(  }|st        j.                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}t%        j0                  |j3                               d   }|t4        k(  }|st        j.                  d|fd|t4        f      t        j                  |      dt        j                         v st        j                  t4              rt        j                  t4              nddz  }dd|iz  }t        t        j                  |            d x}}| dz  }|
j)                  dt+        |      dt+        |      dt+        t,              dt+        |      d g	      }d!}||k(  }|st        j.                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}}t%        j0                  |j3                               d   }|t6        k(  }|st        j.                  d|fd|t6        f      t        j                  |      d"t        j                         v st        j                  t6              rt        j                  t6              nd"dz  }dd|iz  }t        t        j                  |            d x}}y )#Nscripts&run_pre_authorized_executor_binding.pyrpaeb%(py2)sr   spec#%(py6)s
{%(py6)s = %(py4)s.loader
}r;   r>   r   assert %(py9)sr|   zdecision.jsonzcontract.jsonr(   r)   zbinding.json
--decision
--contract
--evidence--outr6   z%(py0)s == %(py3)srcr  r   rF   r4   rA   r   rB   zbinding-nodry.jsonz--no-dry-runr   r	   )r  	importlibutilspec_from_file_locationloaderrM   rN   rG   rO   rI   r   r   rK   rL   module_from_specexec_modulerY   
write_textr+   dumpsmainstrr-   rH   r,   r.   r   r	   )tmp_pathrunnerrD  r   rR   r   r*  rV   r!  r   r  r@   r?   r   dec_pcon_pr   rM  rT   rW   rX   out2s                         r1   test_cli_binding_exit_codesr]  t  s1   "%MMF>>11'6BD44DKKK444DDK
..
)
)$
/CKKC *,Hh&E&E	TZZ)G<	TZZ)G<
^
#C	JJLH		

B N27NNN2NNNNNN2NNN2NNNNNNNNNN::cmmo&x0G04GGGGG04GGGG0GGGGGG4GGGG4GGGGGGGG **D	JJLI
	

B N27NNN2NNNNNN2NNN2NNNNNNNNNN::dnn&'1@1[@@@@1[@@@1@@@@@@[@@@[@@@@@@@r0   c                    t         dz  dz  }t        j                  j                  d|      }g }|}|r|j                  }|}|sdddt        j                         v st        j                  |      rt        j                  |      ndiz  }|j                  |       |rlddt        j                         v st        j                  |      rt        j                  |      ndt        j                        dz  }|j                  |       t        j                  |d	      i z  }d
d|iz  }	t        t        j                  |	            dx}x}}t        j                  j                  |      }
|j                  j                  |
       t!        t#                     }t%        |d         }| dz  }| dz  }|j'                  t)        j*                  |      d       |j'                  t)        j*                  |      d       | dz  }|
j-                  dt/        |      dt/        |      dt/        t0              dt/        |      g      }d	}||k(  }|st        j2                  d|fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }dd|iz  }t        t        j                  |            dx}}t)        j4                  |j7                               d   }|t8        k(  }|st        j2                  d|fd|t8        f      t        j                  |      dt        j                         v st        j                  t8              rt        j                  t8              ndd z  }dd|iz  }t        t        j                  |            dx}}y)!uN   --contract 가 derivation result(status/contract wrapper)여도 내부 추출.r@  rA  rpaeb2rC  r   rD  rE  rF  r   rG  r|   Nr?   zd.jsonzr.jsonr(   r)   zb.jsonrH  rI  rJ  rK  r6   rL  rM  r  r   rF   r4   rA   r   rB   )r  rN  rO  rP  rQ  rM   rN   rG   rO   rI   r   r   rK   rL   rR  rS  r   r2   r   rT  r+   rU  rV  rW  r-   rH   r,   r.   r   )rX  rY  rD  r   rR   r   r*  rV   r!  r   r  rQ   r@   rZ  res_pr   rM  rT   rW   rX   s                       r1   *test_cli_accepts_derivation_result_wrapperra    s<   "%MMF>>11(FCD44DKKK444DDK
..
)
)$
/CKKC 

CJ(HxExE	TZZ)G<	TZZ_w7
X
C	JJLH		

B N27NNN2NNNNNN2NNN2NNNNNNNNNN::cmmo&x0G04GGGGG04GGGG0GGGGGG4GGGG4GGGGGGGGr0   __main__z-q)A__doc__builtinsrM   _pytest.assertion.rewrite	assertionrewriterG   r   r   r  importlib.utilrN  r+   sysr  r   pytest__file__resolveparentsr  rW  r   insert!anu_v3.pre_authorized_action_gater   r   &anu_v3.pre_authorized_contract_deriverr   &anu_v3.pre_authorized_executor_bindingr   r	   r
   r-   r%  	frozensetr	  dictr2   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r+  r>  r]  ra  __name__
SystemExitrV  r/   r0   r1   <module>rv     s  "  
     
  N""$,,Q/	y>!HHOOAs9~& :   66  G 
 # <; ;!N4	*BG
	G$(F	UA(($
$ 
3s8 
-"4N4-A`H> z
[V[[(D!12
33 r0   