
    Z'j2                     P   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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mZmZmZmZ edz  dz  d	z  Zd
e fdZ!d Z"d Z#d Z$d Z%ejL                  jO                  de      d        Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d  Z7d! Z8e9d"k(  r e: ejv                  ed#g            y)$uR  test_pre_authorized_contract_derivation.py — task-2553+5 deriver regression.

§7 완료조건 + 9-R.2 matrix + 9-R.3 self-assert 차단 + 9-R.7 adversarial.

검증:
  - auto-derive DERIVED → gate ALLOW (fixture)
  - self-assertion-only input → HOLD (독립 evidence 부재)
  - missing evidence (각 kind) → HOLD
  - packet/evidence mismatch → HOLD (packet=비권위)
  - negative bool 증명불가 → HOLD
  - evidence 충돌(원본 보존 깨짐 등) → HOLD
  - provenance stamp / evidence_bundle_sha256 결정성
  - bundle schema 불일치 → HOLD
  - CLI runner exit codes
    N)Path   )DECISION_ALLOWevaluate)REQUIRED_EVIDENCE_KINDSSTATUS_DERIVEDSTATUS_HOLDcanonical_evidence_sha256derivememoryfixturesz-task-2553+1.auto-derived-evidence-bundle.jsonreturnc                  T    t        j                  t        j                  d            S )Nutf-8encoding)jsonloadsFIXTURE	read_text     O/home/jay/workspace/tests/regression/test_pre_authorized_contract_derivation.py_bundler   0   s    ::g'''9::r   c                  
   t        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}}| d	   }d }||u}|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}}|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}||u }|slt        j                  d|fd||f      t        j
                  |      t        j
                  |      dz  }	dd|	iz  }
t        t        j                  |
            d x}x}}|d   }t        |      }d}||k(  }|st        j                  d|fd||f      dt        j                         v st        j                  t              rt        j
                  t              ndt        j
                  |      t        j
                  |      t        j
                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}}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}}| d#   }g }||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%   }|j                  }d&} ||      }|std't        j
                  |      t        j
                  |      t        j
                  |      t        j
                  |      d(z  }t        t        j                  |            d x}x}x}}y ))Nstatus==z%(py1)s == %(py3)sr   py1py3hold_reasons
>assert %(py5)spy5contract)is not)z%(py0)s is not %(py3)spy0r"   assert %(py5)s_provenance
derived_byz&anu_v3.pre_authorized_contract_deriver)z%(py1)s == %(py4)sr!   py4assert %(py6)spy6recomputed_all_gate_booleansTisz%(py1)s is %(py4)sevidence_bundle_sha256@   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)slen)r)   py2r.   py7assert %(py9)spy9decisionr   reasonspacket_evidence_mismatchesfield_provenancetask_idz9-R.2/task_idzLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})r!   r"   r%   r9   )r   r   r   
@pytest_ar_call_reprcompare	_saferepr@py_builtinslocals_should_repr_global_name_format_assertmsgAssertionError_format_explanationr7   r   r   
startswith)res@py_assert0@py_assert2@py_format4@py_format6r&   @py_assert1prov@py_assert3@py_format5@py_format7@py_assert6@py_assert5@py_format8@py_format10dec@py_assert4s                    r   )test_fixture_auto_derives_and_gate_allowsr[   6   sP   

Cx=?=N*???=N???=??????N???N????C,???????:H8484884M"DI!II!IIIII!IIIIIII!IIIIIIII./747/47777/4777/77747777777,-43-.4"4."4444."44444434443444-444.444"4444444
8
Cz?<?n,<<<?n<<<?<<<<<<n<<<n<<<<c)n<<<<<<+,22,2222,222,2222222222!"9-I-88II8IIIII-III8IIIIIIIIIIIIIr   c                     t               } t        |       }|d   }t        |       }||k(  }|s#t        j                  d|fd||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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        j                  |       }|j                  d
d        t        |      }||k(  }|s#t        j                  d|fd||f      dt        j                         v st        j                  t              rt        j                  t              nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddz  }dd	|iz  }t        t        j                  |            d x}}|d   d
   d   }	|	|k(  }|st        j                  d|fd|	|f      t        j                  |	      dt        j                         v st        j                  |      rt        j                  |      nddz  }
dd|
iz  }t        t        j                  |            d x}	}y )Nr5   r   )z0%(py0)s == %(py5)s
{%(py5)s = %(py2)s(%(py3)s)
}shar
   b)r)   r8   r"   r%   zassert %(py7)sr9   r+   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py5)sb2)r)   r!   r"   r%   r&   r   r    r*   r%   )r   r   r
   rA   rB   rD   rE   rF   rC   rH   rI   copydeepcopypop)r^   rK   r]   rZ   rP   rO   rW   r_   rM   rL   rN   s              r   Ftest_evidence_bundle_sha256_is_deterministic_and_provenance_consistentrc   G   s   	A
)C
&
'C+A..3.....3.......3...3......+...+......A...A...........	q	BFF=$$R(/(C////(C//////$///$//////R///R///(//////C///C///////z?=)*BCJCsJJJJCsJJJCJJJJJJsJJJsJJJJJJJr   c                      t               } | d   d   }d|i| 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}}|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        }
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   packet self-assert(claimed_booleans)만 있고 독립 evidence 부재 → HOLD.evidencego_ready_packet_claimsr   r   r   r	   r    r*   r%   Nr&   r2   r4   r-   r/   r0   c              3   $   K   | ]  }d |v  
 yw)u   evidence 부재Nr   .0rs     r   	<genexpr>z7test_self_assertion_only_input_holds.<locals>.<genexpr>]   s     C! A%C   r#   ,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}anyr)   r8   r.   r   r   r	   rA   rB   rC   rD   rE   rF   rH   rI   rn   )r^   claimsrK   rL   rM   rN   rO   rR   rS   rT   rP   s              r   $test_self_assertion_only_input_holdsrr   U   s>   	Az]34F-v6AjM
)Cx='=K''''=K'''=''''''K'''K'''''''z?"d"?d""""?d"""?"""d"""""""Cs>/BCC3CCCCCCCCC3CCC3CCCCCCCCCCCCCCr   c                  &   t               } d| 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}}|d   }|s8ddt        j
                  |      iz  }t        t        j                  |            d}|d   D ch c]  }|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  }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c c}w )uV   packet=비권위. claimed_booleans 가 독립 재계산과 모순 → HOLD + mismatch.Tre   rf   observed_valueclaimed_booleans
critical_7r   r   r   r	   r    r*   r%   Nr>   zassert %(py1)sr!   fieldin)z%(py1)s in %(py3)sfieldsc              3   $   K   | ]  }d |v  
 yw)zpacket-evidence mismatchNr   rh   s     r   rk   zMtest_packet_claim_contradicting_independent_evidence_holds.<locals>.<genexpr>k        L1)Q.Lrl   r#   rm   rn   ro   rp   )r^   rK   rL   rM   rN   rO   @py_format2mrz   rP   rR   rS   s               r   :test_packet_claim_contradicting_independent_evidence_holdsr   `   s   	A 	 jM*+,<=>PQ )Cx='=K''''=K'''=''''''K'''K'''''''+,,,,,,,,,,,,"%&B"CDQajDFD!<6!!!!<6!!!<!!!!!!6!!!6!!!!!!!LN8KLL3LLLLLLLLL3LLL3LLLLLLLLLLLLLL Es   (Jkindc                    t               }|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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}}y )Nre   r   r   r   r	   r    r$   r%   r&   r2   r4   r-   r/   r0   )r   r   r	   rA   rB   rC   rD   rE   rF   rG   rH   rI   )
r   r^   rK   rL   rM   rN   rO   rR   rS   rT   s
             r   )test_missing_each_required_evidence_holdsr   p   s    	A	*d
)Cx=-=K'---=K---=------K---K----------z?"d"?d""""?d"""?"""d"""""""r   c                     t               } | 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}}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 )Nre   critical_7_markerrt   r   r   r   r	   r    r*   r%   c              3   $   K   | ]  }d |v  
 yw)rv   Nr   rh   s     r   rk   zNtest_evidence_object_missing_required_key_treated_as_absent.<locals>.<genexpr>~   s     >Q|q >rl   r#   rm   rn   ro   rp   	r^   rK   rL   rM   rN   rO   rP   rR   rS   s	            r   ;test_evidence_object_missing_required_key_treated_as_absentr   y   s    	A	*)*+;<
)Cx='=K''''=K'''=''''''K'''K'''''''>#n*=>>3>>>>>>>>>3>>>3>>>>>>>>>>>>>>r   c                      t               } 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}}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 )NFre   credential_scanrt   scannedr   r   r   r	   r    r*   r%   c              3   $   K   | ]  }d |v  
 yw)u   negative bool 증명불가Nr   rh   s     r   rk   z6test_negative_bool_unprovable_holds.<locals>.<genexpr>   s     NQ+q0Nrl   r#   rm   rn   ro   rp   r   s	            r   #test_negative_bool_unprovable_holdsr      s    	ADIAjM#$%56yA
)Cx='=K''''=K'''=''''''K'''K'''''''N#n:MNN3NNNNNNNNN3NNN3NNNNNNNNNNNNNNr   c                  h   t               } dg| d   d   d   d<   t        |       }|d   t        k(  rH|d   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}}t        |d         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}}y |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 )Nzopen(...,'w')re   real_write_scanrt   hitsr   r&   real_write_requiredTr2   r4   r-   r/   r0   r<   !=z%(py1)s != %(py3)sr   r    r*   r%   r   r   r	   )r   r   r   rA   rB   rC   rH   rI   r   r   rD   rE   rF   r	   )	r^   rK   rL   rR   rM   rS   rT   rN   rO   s	            r   ,test_scan_hit_propagates_true_and_gate_holdsr      sY   	ABQARAjM#$%56v>
)C
8}&:45==5====5===5==========J(4F4FFFF4FFF4FFFFFFFFFFFFFFFF8}+}++++}+++}++++++++++++++++r   c                      t               } 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}}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 )N(0000000000000000000000000000000000000000re   source_pr_preservationrt   recomputed_head_shar   r   r   r	   r    r*   r%   c              3   $   K   | ]  }d |v  
 yw)u   source PR 원본 변경Nr   rh   s     r   rk   z;test_source_pr_preservation_broken_holds.<locals>.<genexpr>   s     K!(A-Krl   r#   rm   rn   ro   rp   r   s	            r   (test_source_pr_preservation_broken_holdsr      s    	A 	3 jM*+,<= )Cx='=K''''=K'''=''''''K'''K'''''''Ks>7JKK3KKKKKKKKK3KKK3KKKKKKKKKKKKKKr   c                      t               } 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}}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 )N(ffffffffffffffffffffffffffffffffffffffffre   
fresh_basert   current_origin_main_shar   r   r   r	   r    r*   r%   c              3   $   K   | ]  }d |v  
 yw)u   fresh_base 미충족Nr   rh   s     r   rk   z3test_fresh_base_divergence_holds.<locals>.<genexpr>   s     Hq%*Hrl   r#   rm   rn   ro   rp   r   s	            r    test_fresh_base_divergence_holdsr      s    	A2 jM, 012KL )Cx='=K''''=K'''=''''''K'''K'''''''HC4GHH3HHHHHHHHH3HHH3HHHHHHHHHHHHHHr   c                      t               } 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}}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	task-9999re   task_identityrt   dispatch_marker_task_idr   r   r   r	   r    r*   r%   c              3   $   K   | ]  }d |v  
 yw)u   task_id 3자 불일치Nr   rh   s     r   rk   z3test_task_id_3way_mismatch_holds.<locals>.<genexpr>   s     J'1,Jrl   r#   rm   rn   ro   rp   r   s	            r    test_task_id_3way_mismatch_holdsr      s    	A 	 jM/"#34! )Cx='=K''''=K'''=''''''K'''K'''''''Jc.6IJJ3JJJJJJJJJ3JJJ3JJJJJJJJJJJJJJr   c                  Z   dD ]  } t               }|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  }t        j                  |       d
z   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)uK   9-R.2: source_pr.{number,branch} 부재 → HOLD (식별자 권위 필수).)numberbranchre   	source_prrt   r   r   r   r	   r    r$   r%   Nc              3   $   K   | ]  }d |v  
 yw)z
source_pr.Nr   rh   s     r   rk   z:test_source_pr_identifier_missing_holds.<locals>.<genexpr>   s     B<1$Brl   r#   rm   rn   ro   )r   r   r	   rA   rB   rC   rD   rE   rF   rG   rH   rI   rn   )
missingr^   rK   rL   rM   rN   rO   rP   rR   rS   s
             r   'test_source_pr_identifier_missing_holdsr      s   ' CIjM+&'78AQi8}4}+444}444}4444444444444W444444Bc..ABBsBBBBBBBBBsBBBsBBBBBBBBBBBBBBCr   c                      t               } 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}}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 )Nmerge_prre   action_method_markerrt   methodr   r   r   r	   r    r*   r%   c              3   $   K   | ]  }d |v  
 yw)zaction_type UNDETERMINEDNr   rh   s     r   rk   z?test_action_type_not_clean_replacement_holds.<locals>.<genexpr>   r|   rl   r#   rm   rn   ro   rp   r   s	            r   ,test_action_type_not_clean_replacement_holdsr      s    	AHRAjM()*:;HE
)Cx='=K''''=K'''=''''''K'''K'''''''LN8KLL3LLLLLLLLL3LLL3LLLLLLLLLLLLLLr   c                     t               } | d   d   d   d   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}}|d   D ch c]  }|d   	 }}ddh}||z  }	|	syddt        j                         v st	        j                  |      rt	        j                  |      ndt	        j                  |      dz  }t        t	        j                  |            dx}}	yc c}w )u   effective diff 오염 → 독립 재계산이 contamination/scope_expansion True.
    packet 은 false 주장 → 9-R.3 mismatch → deriver HOLD (gate 도달 전 차단).re   git_effective_diffrt   filesdispatch.pyr   r   r   r	   r    r*   r%   Nr>   rw   effective_diff_contaminationscope_expansionzassert (%(py0)s & %(py2)s)rz   )r)   r8   )r   appendr   r	   rA   rB   rC   rD   rE   rF   rH   rI   )
r^   rK   rL   rM   rN   rO   r~   rz   rP   rR   s
             r   <test_effective_diff_contamination_caught_via_packet_mismatchr      s    		AjM&'(89'BII )Cx='=K''''=K'''=''''''K'''K'''''''"%&B"CDQajDFD35FGG6GGGGGGGGG6GGG6GGGGGGGGGG Es   3F
c                     t               } | d   d   d   d   j                  d       | d   d   d   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  }t	        j                  |d         dz   d|iz  }t        t	        j                  |            dx}}|d   }|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   }||v }|slt	        j
                  d|fd||f      t	        j                  |      t	        j                  |      dz  }	dd|	iz  }
t        t	        j                  |
            dx}x}}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}}y)"uP   packet claim 까지 일치시키면 deriver DERIVED, gate 단에서 오염 HOLD.re   r   rt   r   r   rf   ru   Tr   r   r   r   r   r   r    r#   r$   r%   Nr&   r2   r4   r-   r/   r0   forbidden_paths_touchedrx   )z%(py1)s in %(py4)sr<   r   r   r   r*   )r   r   r   r   rA   rB   rC   rD   rE   rF   rG   rH   rI   r   r   )r^   cbrK   rL   rM   rN   rO   crR   rS   rT   s              r   Htest_effective_diff_contamination_makes_gate_hold_when_packet_consistentr      s   	AjM&'(89'BII 
:/	01A	B
B *.B%& B
)Cx=?=N*???=N???=??????N???N????C,???????JA+,44,4444,444,44444444448A788=88888=8888=88888888888A;z"4"n4444"n444"444444n444n4444444r   c                      t               } 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}}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 )NFre   callback_policy_markerrt   no_writer   r   r   r	   r    r*   r%   c              3   $   K   | ]  }d |v  
 yw)u   callback 광의권위Nr   rh   s     r   rk   z;test_callback_authority_escalation_holds.<locals>.<genexpr>   s     I&!+Irl   r#   rm   rn   ro   rp   r   s	            r   (test_callback_authority_escalation_holdsr      s    	ALQAjM*+,<=jI
)Cx='=K''''=K'''=''''''K'''K'''''''IS5HII3IIIIIIIII3III3IIIIIIIIIIIIIIr   c                     t               } 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}}y )NTre   scope_declarationrt   requires_real_writer   r   r   r	   r    r*   r%   )r   r   r	   rA   rB   rC   rD   rE   rF   rH   rI   )r^   rK   rL   rM   rN   rO   s         r   0test_scope_declaration_requires_real_write_holdsr      s    	A 	 jM%&'78 )Cx='=K''''=K'''=''''''K'''K'''''''r   c                     t        dd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} }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} }t        ddg      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wrongx)schemar@   r   r   r   r	   r    r*   r%      r   )
r   r	   rA   rB   rC   rD   rE   rF   rH   rI   )rL   rM   rN   rO   s       r   !test_bundle_schema_mismatch_holdsr      s;   W56x@O@KOOOO@KOOO@OOOOOOKOOOKOOOOOOO$<!0![0000![000!000000[000[00000001a&>(#2#{2222#{222#222222{222{2222222r   c                  	   t        j                  t        dz  dz  j                  d            } | d   d   }|d   }t	        |      }t	        t
              }||k(  }|s[t        j                  d|fd	||f      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}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   }|j                  } |       }t	        |      }t	        t
              }||k(  }|st        j                  d|fd||f      d
t        j                         v st        j                  t              rt        j                  t              nd
t        j                  |      t        j                  |      t        j                  |      t        j                  |      d
t        j                         v st        j                  t              rt        j                  t              nd
dt        j                         v st        j                  t
              rt        j                  t
              ndt        j                  |      dz  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}y )Nschemas*pre_authorized_evidence_bundle.schema.jsonr   r   
propertiesre   requiredr   )zN%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py9)s
{%(py9)s = %(py6)s(%(py7)s)
}sortedr   )r)   r8   r.   r0   r9   r;   zassert %(py11)spy11additionalPropertiesFr2   r4   r-   r/   r0   )z%(py8)s
{%(py8)s = %(py0)s(%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.keys
}()
})
} == %(py13)s
{%(py13)s = %(py10)s(%(py11)s)
})r)   r8   r.   r0   py8py10r   py13zassert %(py15)spy15)r   r   	WORKSPACEr   r   r   rA   rB   rD   rE   rF   rC   rH   rI   keys)r   evrP   rR   @py_assert8rV   rX   @py_format12rL   rM   rS   rT   @py_assert7@py_assert12@py_assert9@py_format14@py_format16s                    r   <test_evidence_bundle_schema_file_required_kinds_match_moduler     s   ZZ	!$PP
)W)
%F
 
	j	)BZ.D6.!DV,C%DD!%DDDDD!%DDDDDDD6DDD6DDD.DDD!DDDDDDVDDDVDDDDDD,CDDD,CDDD%DDDDDDDD$%..%....%...%..........()2U2)U2222)U222)222U2222222\"M"''M')M6)*Mf5L.MM*.MMMMM*.MMMMMMM6MMM6MMM"MMM'MMM)MMM*MMMMMMfMMMfMMMMMM5LMMM5LMMM.MMMMMMMMMr   c                     t        j                  d      } t        j                  t        dz  dz  j                  d            }t               }| j                  ||       t        j                  |      }|d   d   |d   d<   t        j                  | j                        5  | j                  ||       d	d	d	       t        j                  |      }|d   d   d
   d= t        j                  | j                        5  | j                  ||       d	d	d	       t        j                  |      }d|d<   t        j                  | j                        5  | j                  ||       d	d	d	       t        j                  |      }|d   d   d
   d= t        j                  | j                        5  | j                  ||       d	d	d	       t        j                  |      }d|d   d   d
   d   d<   t        j                  | j                        5  | j                  ||       d	d	d	       y	# 1 sw Y   uxY w# 1 sw Y   'xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y	xY w)uJ   tightened schema: 추가 evidence kind / observed_value 누락 키 거부.
jsonschemar   r   r   r   re   r   evil_extra_kindNrt   rv   r   sneakyr   r   Trf   ru   evil_backdoor)pytestimportorskipr   r   r   r   r   validater`   ra   raisesValidationError)r   r   goodspoof	malformed	extra_topno_numsneaky_claims           r   9test_schema_closure_rejects_spoofed_and_malformed_bundlesr     s<   $$\2JZZ	!$PP
)W)
%F
 9Df%MM$E+/
+;<O+PE*'(	z11	2 +E6*+ d#I*123CD\R	z11	2 /Iv./ d#IIh	z11	2 /Iv./ ]]4 Fz;'(89(C	z11	2 ,FF+, ==&L  567GH 
z11	2 2L&12 21+ +
/ /
/ /, ,2 2s<   #H)>H6I-II)H36I III$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                  |
       | dz  }|
j!                  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)        j*                  |j-                               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z  }t1               }|d   d= |j3                  t)        j4                  |      d       | dz  }|
j!                  d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)        j*                  |j-                               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scriptsz)run_pre_authorized_contract_derivation.pyrpacdz%(py2)sr8   specz#%(py6)s
{%(py6)s = %(py4)s.loader
})r.   r0   r   r:   r;   zderived.jsonz
--evidencez--outr   )z%(py0)s == %(py3)srcr(   r*   r%   r   r   r   r    zbad.jsonre   codex_verdict_markerr   r   z	hold.jsonr   r	   )r   	importlibutilspec_from_file_locationloaderrD   rE   rA   rF   rC   r   _format_booloprH   rI   module_from_specexec_modulemainstrr   rB   r   r   r   r   r   
write_textdumpsr	   )tmp_pathrunnerr   rP   rL   rV   @py_format3rT   rW   rX   modoutr   rM   rN   rO   badr^   out2s                      r   test_cli_derivation_exit_codesr  ;  s   "%PPF>>11'6BD44DKKK444DDK
..
)
)$
/CKKC 
^
#C	<WwCA	BBN27NNN2NNNNNN2NNN2NNNNNNNNNN::cmmo&x0B0NBBBB0NBBB0BBBBBBNBBBNBBBBBBB
Z
C	A	*,-NN4::a=7N3k!D	<S7CI>	?BN27NNN2NNNNNN2NNN2NNNNNNNNNN::dnn&'1@1[@@@@1[@@@1@@@@@@[@@@[@@@@@@@r   __main__z-q)<__doc__builtinsrD   _pytest.assertion.rewrite	assertionrewriterA   r`   importlib.utilr   r   syspathlibr   r   __file__resolveparentsr   r  pathinsert!anu_v3.pre_authorized_action_gater   r   &anu_v3.pre_authorized_contract_deriverr   r   r	   r
   r   r   dictr   r[   rc   rr   r   markparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  __name__
SystemExitr  r   r   r   <module>r%     sg       
  N""$,,Q/	y>!HHOOAs9~&   66 ; ;J"	KDM  !89# :#?O	,LIKCM
H5&J(3N&2VA, z
[V[[(D!12
33 r   