proofbundle 3.6.1__tar.gz → 3.6.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. proofbundle-3.6.2/PKG-INFO +270 -0
  2. proofbundle-3.6.2/README.md +205 -0
  3. {proofbundle-3.6.1 → proofbundle-3.6.2}/pyproject.toml +1 -1
  4. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/mutation_check.py +1 -1
  5. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/__init__.py +1 -1
  6. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/anchors.py +35 -3
  7. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/assurance.py +10 -4
  8. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/automation_verdict.py +17 -4
  9. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/bundle.py +41 -9
  10. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/canonical.py +7 -0
  11. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/checkpoint.py +27 -3
  12. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/cli.py +120 -51
  13. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/decision.py +27 -4
  14. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/dsse.py +13 -3
  15. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/evalcard.py +32 -5
  16. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/evalclaim.py +36 -7
  17. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/evidence_pack.py +10 -1
  18. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/experimental/enclave.py +5 -2
  19. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/hf_evals.py +15 -3
  20. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/intoto.py +8 -2
  21. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/kbjwt.py +17 -1
  22. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/outcome.py +35 -5
  23. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/persample.py +21 -4
  24. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/policy.py +105 -54
  25. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/policy_profiles.py +15 -6
  26. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/pqsig.py +5 -0
  27. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/prereg.py +11 -0
  28. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/public_transparency.py +6 -1
  29. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/relation.py +18 -5
  30. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/relation_statement.py +11 -2
  31. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/renewal.py +25 -5
  32. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/sdjwt.py +7 -0
  33. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/sdjwt_issue.py +18 -4
  34. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/sdjwt_vc.py +22 -2
  35. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/signature.py +17 -10
  36. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/statuslist.py +7 -0
  37. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/subject_binding.py +34 -13
  38. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/tlogproof.py +35 -20
  39. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/trust_pack.py +34 -12
  40. proofbundle-3.6.2/src/proofbundle.egg-info/PKG-INFO +270 -0
  41. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle.egg-info/SOURCES.txt +4 -0
  42. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_budget.py +9 -3
  43. proofbundle-3.6.2/tests/test_bughunt_361_automation_failopen.py +131 -0
  44. proofbundle-3.6.2/tests/test_bughunt_361_never_raise.py +443 -0
  45. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_hf_entry_verify_eee_digest.py +7 -2
  46. proofbundle-3.6.2/tests/test_never_raise_primary_arg_property.py +79 -0
  47. proofbundle-3.6.2/tests/test_never_raise_surface_family_property.py +285 -0
  48. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sibling_never_raise_361.py +7 -2
  49. proofbundle-3.6.1/PKG-INFO +0 -382
  50. proofbundle-3.6.1/README.md +0 -317
  51. proofbundle-3.6.1/src/proofbundle.egg-info/PKG-INFO +0 -382
  52. {proofbundle-3.6.1 → proofbundle-3.6.2}/LICENSE +0 -0
  53. {proofbundle-3.6.1 → proofbundle-3.6.2}/MANIFEST.in +0 -0
  54. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/README.md +0 -0
  55. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/coherent-rewrap-fails-expected-root/bundle.json +0 -0
  56. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/coherent-rewrap-fails-expected-root/case.json +0 -0
  57. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/coherent-rewrap-verifies-no-policy/bundle.json +0 -0
  58. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/coherent-rewrap-verifies-no-policy/case.json +0 -0
  59. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/corrupted-signature/bundle.json +0 -0
  60. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/corrupted-signature/case.json +0 -0
  61. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/duplicate-json-key/bundle.json +0 -0
  62. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/duplicate-json-key/case.json +0 -0
  63. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/forged-anchor-own-frozen/bundle.json +0 -0
  64. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/forged-anchor-own-frozen/case.json +0 -0
  65. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/n1-eval-sdjwt-graft-non-eval/bundle.json +0 -0
  66. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/n1-eval-sdjwt-graft-non-eval/case.json +0 -0
  67. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/sd-jwt-forged-issuer-identity/bundle.json +0 -0
  68. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/sd-jwt-forged-issuer-identity/case.json +0 -0
  69. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/sd-jwt-signed-but-unbound/bundle.json +0 -0
  70. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/sd-jwt-signed-but-unbound/case.json +0 -0
  71. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/sd-jwt-unsigned-unauthenticated/bundle.json +0 -0
  72. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/sd-jwt-unsigned-unauthenticated/case.json +0 -0
  73. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/tampered-payload/bundle.json +0 -0
  74. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/tampered-payload/case.json +0 -0
  75. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/tree-size-expectation-mismatch/bundle.json +0 -0
  76. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/tree-size-expectation-mismatch/case.json +0 -0
  77. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/valid-minimal/bundle.json +0 -0
  78. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/bundle/valid-minimal/case.json +0 -0
  79. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/common_vocabulary.py +0 -0
  80. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/cross_format.py +0 -0
  81. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/canonicalization-root-binding/MANIFEST.json +0 -0
  82. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/canonicalization-root-binding/case.json +0 -0
  83. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.jcs +0 -0
  84. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.jcs.ots +0 -0
  85. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.json +0 -0
  86. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/canonicalization-root-binding/evidence_eval_result.jcs +0 -0
  87. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/canonicalization-root-binding/evidence_eval_result.json +0 -0
  88. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/MANIFEST.json +0 -0
  89. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/case.json +0 -0
  90. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.jcs +0 -0
  91. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.jcs.ots +0 -0
  92. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.json +0 -0
  93. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/evidence_eval_result.jcs +0 -0
  94. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/evidence_eval_result.json +0 -0
  95. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/manifest.json +0 -0
  96. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/declared-supersedes-verified/case.json +0 -0
  97. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/declared-supersedes-verified/pub.b64 +0 -0
  98. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/declared-supersedes-verified/receipt.json +0 -0
  99. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/declared-supersedes-verified/related_b.json +0 -0
  100. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/declared-unresolved/case.json +0 -0
  101. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/declared-unresolved/pub.b64 +0 -0
  102. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/declared-unresolved/receipt.json +0 -0
  103. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-accept-path/case.json +0 -0
  104. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-accept-path/policy.json +0 -0
  105. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-accept-path/pub.b64 +0 -0
  106. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-accept-path/receipt.json +0 -0
  107. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-accept-path/related_rx.json +0 -0
  108. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-correct-pass/case.json +0 -0
  109. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-correct-pass/policy.json +0 -0
  110. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-correct-pass/pub.b64 +0 -0
  111. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-correct-pass/receipt.json +0 -0
  112. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-correct-pass/related_r0.json +0 -0
  113. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-correct-pass/related_rx.json +0 -0
  114. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-no-pin-old-behavior/case.json +0 -0
  115. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-no-pin-old-behavior/policy.json +0 -0
  116. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-no-pin-old-behavior/pub.b64 +0 -0
  117. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-no-pin-old-behavior/receipt.json +0 -0
  118. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-no-pin-old-behavior/related_r0.json +0 -0
  119. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-no-pin-old-behavior/related_rx.json +0 -0
  120. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-target-mismatch/case.json +0 -0
  121. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-target-mismatch/policy.json +0 -0
  122. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-target-mismatch/pub.b64 +0 -0
  123. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-target-mismatch/receipt.json +0 -0
  124. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-target-mismatch/related_r0.json +0 -0
  125. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/decoy-parent-target-mismatch/related_rx.json +0 -0
  126. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/case.json +0 -0
  127. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/pub.b64 +0 -0
  128. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/receipt.json +0 -0
  129. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_001.json +0 -0
  130. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_002.json +0 -0
  131. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_003.json +0 -0
  132. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_004.json +0 -0
  133. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_005.json +0 -0
  134. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_006.json +0 -0
  135. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_007.json +0 -0
  136. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_008.json +0 -0
  137. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_009.json +0 -0
  138. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_010.json +0 -0
  139. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_011.json +0 -0
  140. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_012.json +0 -0
  141. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_013.json +0 -0
  142. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_014.json +0 -0
  143. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_015.json +0 -0
  144. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_016.json +0 -0
  145. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_017.json +0 -0
  146. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_018.json +0 -0
  147. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_019.json +0 -0
  148. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_020.json +0 -0
  149. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_021.json +0 -0
  150. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_022.json +0 -0
  151. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_023.json +0 -0
  152. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_024.json +0 -0
  153. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_025.json +0 -0
  154. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_026.json +0 -0
  155. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_027.json +0 -0
  156. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_028.json +0 -0
  157. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_029.json +0 -0
  158. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_030.json +0 -0
  159. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_031.json +0 -0
  160. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_032.json +0 -0
  161. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/depth-exceeded/related_033.json +0 -0
  162. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/digest-mismatch/case.json +0 -0
  163. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/digest-mismatch/policy.json +0 -0
  164. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/digest-mismatch/pub.b64 +0 -0
  165. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/digest-mismatch/receipt.json +0 -0
  166. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/digest-mismatch/related_b.json +0 -0
  167. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/generate_vectors.py +0 -0
  168. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/malformed-digest/case.json +0 -0
  169. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/malformed-digest/pub.b64 +0 -0
  170. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/malformed-digest/receipt.json +0 -0
  171. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-declared-supersedes-verified/case.json +0 -0
  172. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-declared-supersedes-verified/pub.b64 +0 -0
  173. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-declared-supersedes-verified/receipt.json +0 -0
  174. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-declared-supersedes-verified/related_b.json +0 -0
  175. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-decoy-parent-target-mismatch/case.json +0 -0
  176. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-decoy-parent-target-mismatch/policy.json +0 -0
  177. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-decoy-parent-target-mismatch/pub.b64 +0 -0
  178. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-decoy-parent-target-mismatch/receipt.json +0 -0
  179. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-decoy-parent-target-mismatch/related_r0.json +0 -0
  180. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-decoy-parent-target-mismatch/related_rx.json +0 -0
  181. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-digest-mismatch/case.json +0 -0
  182. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-digest-mismatch/policy.json +0 -0
  183. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-digest-mismatch/pub.b64 +0 -0
  184. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-digest-mismatch/receipt.json +0 -0
  185. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-digest-mismatch/related_b.json +0 -0
  186. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-relation-signer-unauthorized/case.json +0 -0
  187. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-relation-signer-unauthorized/policy.json +0 -0
  188. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-relation-signer-unauthorized/pub.b64 +0 -0
  189. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-relation-signer-unauthorized/receipt.json +0 -0
  190. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-relation-signer-unauthorized/related_b.json +0 -0
  191. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-renews/case.json +0 -0
  192. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-renews/pub.b64 +0 -0
  193. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-renews/receipt.json +0 -0
  194. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-renews/related_b.json +0 -0
  195. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-silent-landing/case.json +0 -0
  196. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-silent-landing/pub.b64 +0 -0
  197. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-silent-landing/receipt.json +0 -0
  198. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-valid-baseline/case.json +0 -0
  199. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-valid-baseline/pub.b64 +0 -0
  200. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/outcome-valid-baseline/receipt.json +0 -0
  201. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-amends/case.json +0 -0
  202. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-amends/pub.b64 +0 -0
  203. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-amends/receipt.json +0 -0
  204. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-amends/related_b.json +0 -0
  205. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-corrects/case.json +0 -0
  206. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-corrects/pub.b64 +0 -0
  207. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-corrects/receipt.json +0 -0
  208. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-corrects/related_b.json +0 -0
  209. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-derivedfrom/case.json +0 -0
  210. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-derivedfrom/pub.b64 +0 -0
  211. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-derivedfrom/receipt.json +0 -0
  212. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-derivedfrom/related_b.json +0 -0
  213. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-retracts/case.json +0 -0
  214. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-retracts/pub.b64 +0 -0
  215. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-retracts/receipt.json +0 -0
  216. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-retracts/related_b.json +0 -0
  217. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-revises/case.json +0 -0
  218. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-revises/pub.b64 +0 -0
  219. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-revises/receipt.json +0 -0
  220. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-revises/related_b.json +0 -0
  221. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-unauthorized/case.json +0 -0
  222. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-unauthorized/policy.json +0 -0
  223. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-unauthorized/pub.b64 +0 -0
  224. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-unauthorized/receipt.json +0 -0
  225. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-unauthorized/related_b.json +0 -0
  226. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-verified/case.json +0 -0
  227. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-verified/policy.json +0 -0
  228. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-verified/pub.b64 +0 -0
  229. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-verified/receipt.json +0 -0
  230. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-cross-issuer-verified/related_b.json +0 -0
  231. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-same-key-explicit/case.json +0 -0
  232. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-same-key-explicit/policy.json +0 -0
  233. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-same-key-explicit/pub.b64 +0 -0
  234. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-same-key-explicit/receipt.json +0 -0
  235. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-same-key-explicit/related_b.json +0 -0
  236. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-verified-under-not-claim/case.json +0 -0
  237. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-verified-under-not-claim/policy.json +0 -0
  238. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-verified-under-not-claim/pub.b64 +0 -0
  239. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-verified-under-not-claim/receipt.json +0 -0
  240. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/relation-signer-verified-under-not-claim/related_b.json +0 -0
  241. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/renews-vector/case.json +0 -0
  242. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/renews-vector/pub.b64 +0 -0
  243. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/renews-vector/receipt.json +0 -0
  244. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/renews-vector/related_b.json +0 -0
  245. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/retracts-then-use/case.json +0 -0
  246. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/retracts-then-use/policy.json +0 -0
  247. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/retracts-then-use/pub.b64 +0 -0
  248. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/retracts-then-use/receipt.json +0 -0
  249. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/retracts-then-use/related_r.json +0 -0
  250. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/silent-landing/case.json +0 -0
  251. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/silent-landing/pub.b64 +0 -0
  252. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/silent-landing/receipt.json +0 -0
  253. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-malformed/case.json +0 -0
  254. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-malformed/pub.b64 +0 -0
  255. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-malformed/receipt.json +0 -0
  256. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-declared-unresolved/case.json +0 -0
  257. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-declared-unresolved/pub.b64 +0 -0
  258. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-declared-unresolved/receipt.json +0 -0
  259. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-unauthorized/case.json +0 -0
  260. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-unauthorized/policy.json +0 -0
  261. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-unauthorized/pub.b64 +0 -0
  262. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-unauthorized/receipt.json +0 -0
  263. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-unauthorized/related_t.json +0 -0
  264. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-blocked/case.json +0 -0
  265. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-blocked/policy.json +0 -0
  266. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-blocked/pub.b64 +0 -0
  267. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-blocked/receipt.json +0 -0
  268. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-blocked/related_t.json +0 -0
  269. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-visible/case.json +0 -0
  270. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-visible/pub.b64 +0 -0
  271. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-visible/receipt.json +0 -0
  272. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-retracts-verified-visible/related_t.json +0 -0
  273. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-supersedes-verified/case.json +0 -0
  274. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-supersedes-verified/pub.b64 +0 -0
  275. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-supersedes-verified/receipt.json +0 -0
  276. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/statement-supersedes-verified/related_t.json +0 -0
  277. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/t1-canonical-invalid-signature/case.json +0 -0
  278. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/t1-canonical-invalid-signature/pub.b64 +0 -0
  279. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/t1-canonical-invalid-signature/receipt.json +0 -0
  280. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-ambiguous/case.json +0 -0
  281. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-ambiguous/pub.b64 +0 -0
  282. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-ambiguous/receipt.json +0 -0
  283. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-ambiguous/related_r0.json +0 -0
  284. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-correct-pass/case.json +0 -0
  285. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-correct-pass/pub.b64 +0 -0
  286. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-correct-pass/receipt.json +0 -0
  287. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-correct-pass/related_r0.json +0 -0
  288. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-mismatch/case.json +0 -0
  289. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-mismatch/pub.b64 +0 -0
  290. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-mismatch/receipt.json +0 -0
  291. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-mismatch/related_r0.json +0 -0
  292. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-missing/case.json +0 -0
  293. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-missing/pub.b64 +0 -0
  294. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-missing/receipt.json +0 -0
  295. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/target-subject-missing/related_r0.json +0 -0
  296. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/unauthorized-signer/case.json +0 -0
  297. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/unauthorized-signer/pub.b64 +0 -0
  298. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/unauthorized-signer/receipt.json +0 -0
  299. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/unauthorized-signer/related_b.json +0 -0
  300. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/valid-baseline/case.json +0 -0
  301. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/valid-baseline/pub.b64 +0 -0
  302. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/valid-baseline/receipt.json +0 -0
  303. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/wrong-payloadtype-target/case.json +0 -0
  304. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/wrong-payloadtype-target/pub.b64 +0 -0
  305. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/wrong-payloadtype-target/receipt.json +0 -0
  306. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/relation/wrong-payloadtype-target/related_t.json +0 -0
  307. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/run_conformance.py +0 -0
  308. {proofbundle-3.6.1 → proofbundle-3.6.2}/conformance/vector_schema.json +0 -0
  309. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/adr/renewal_policy.example.json +0 -0
  310. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/AUDITOR_OPEN_POINTS.md +0 -0
  311. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/MANIFEST.sha256 +0 -0
  312. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/OPEN_QUESTIONS.md +0 -0
  313. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/PROGRESS.md +0 -0
  314. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/README.md +0 -0
  315. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/REPRODUCTION_RUNBOOK.md +0 -0
  316. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/calendar_independence.md +0 -0
  317. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/differential_matrix.md +0 -0
  318. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/index.json +0 -0
  319. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/proofbundle/readiness_pack.bundle.json +0 -0
  320. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/proofbundle/readiness_pack.pub.b64 +0 -0
  321. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/rust_parity_scope.md +0 -0
  322. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/tamper_resistance.md +0 -0
  323. {proofbundle-3.6.1 → proofbundle-3.6.2}/docs/readiness_pack/threat_model_delta_360.md +0 -0
  324. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/README.md +0 -0
  325. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/anchors/chia-datalayer-invalid-root.json +0 -0
  326. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/anchors/chia-datalayer-valid.json +0 -0
  327. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/checkpoint_example.py +0 -0
  328. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/decision_receipt_allow.json +0 -0
  329. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/decision_receipt_deny.json +0 -0
  330. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/decision_receipt_escalate.json +0 -0
  331. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/decision_receipt_with_eval_ref.intoto.json +0 -0
  332. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/eee_receipt.py +0 -0
  333. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/example.tlog-proof +0 -0
  334. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/example_bundle.json +0 -0
  335. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/experimental_enclave.py +0 -0
  336. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/inspect_hook_example.py +0 -0
  337. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/inspect_receipt.py +0 -0
  338. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/intoto/private-model-commitment.statement.json +0 -0
  339. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/intoto/public-model.statement.json +0 -0
  340. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/intoto/release-gate.statement.json +0 -0
  341. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/intoto/svr.statement.json +0 -0
  342. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/intoto_dsse_export.py +0 -0
  343. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/lm_eval_receipt.py +0 -0
  344. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/make_example.py +0 -0
  345. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/persample_audit.py +0 -0
  346. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/pytest_plugin_example.py +0 -0
  347. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/rekor_interop.py +0 -0
  348. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/tlog_proof_example.py +0 -0
  349. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/trust_policy_decision_strict.json +0 -0
  350. {proofbundle-3.6.1 → proofbundle-3.6.2}/examples/trust_policy_strict.json +0 -0
  351. {proofbundle-3.6.1 → proofbundle-3.6.2}/formal/README.md +0 -0
  352. {proofbundle-3.6.1 → proofbundle-3.6.2}/formal/model.py +0 -0
  353. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/action-outcome-v0.1.schema.json +0 -0
  354. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/decision-receipt-v0.1.schema.json +0 -0
  355. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/eval_claim_v0_1.schema.json +0 -0
  356. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/in_toto_statement_v1.schema.json +0 -0
  357. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/proofbundle_v0_1.schema.json +0 -0
  358. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/run-ledger-v0.1.schema.json +0 -0
  359. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/trust-pack-v0.1.schema.json +0 -0
  360. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/trust_policy_v0_1.schema.json +0 -0
  361. {proofbundle-3.6.1 → proofbundle-3.6.2}/schemas/verification-summary-v0.1.schema.json +0 -0
  362. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/_build_anchor_fixture.py +0 -0
  363. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/audit_candidate_matrix.py +0 -0
  364. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/branch_base_check.py +0 -0
  365. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/build_reproducible.py +0 -0
  366. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/check_version_and_changelog.py +0 -0
  367. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/claims_hygiene_check.py +0 -0
  368. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/demo.sh +0 -0
  369. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/demo_tamper.sh +0 -0
  370. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/doc_link_check.py +0 -0
  371. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/findings_register.py +0 -0
  372. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/fork_pr_secret_isolation.py +0 -0
  373. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/fuzz_soak.py +0 -0
  374. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/gen_findings_register.py +0 -0
  375. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/gen_synthetic_ots_fixture.py +0 -0
  376. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/pre_tag_audit_gate.py +0 -0
  377. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/readiness_pack_gate.py +0 -0
  378. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/readiness_pack_manifest.py +0 -0
  379. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/render_demo.py +0 -0
  380. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/rust_parity_gate.py +0 -0
  381. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/rust_parity_registry.json +0 -0
  382. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/test_manifest_gate.py +0 -0
  383. {proofbundle-3.6.1 → proofbundle-3.6.2}/scripts/type_confusion_gate.py +0 -0
  384. {proofbundle-3.6.1 → proofbundle-3.6.2}/setup.cfg +0 -0
  385. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/_inspect_registry.py +0 -0
  386. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/_integration.py +0 -0
  387. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/_strict_json.py +0 -0
  388. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/adapters/__init__.py +0 -0
  389. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/adapters/_provenance.py +0 -0
  390. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/adapters/eee.py +0 -0
  391. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/adapters/inspect_ai.py +0 -0
  392. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/adapters/lm_eval.py +0 -0
  393. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/adapters/promptfoo.py +0 -0
  394. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/adapters/samples.py +0 -0
  395. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/anchors_chia.py +0 -0
  396. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/anchors_chia_add.py +0 -0
  397. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/anchors_markovian.py +0 -0
  398. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/anchors_ots.py +0 -0
  399. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/anchors_rfc3161.py +0 -0
  400. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/beacon.py +0 -0
  401. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/budget.py +0 -0
  402. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/demo.py +0 -0
  403. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/eee_eval_schema.json +0 -0
  404. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/emit.py +0 -0
  405. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/errors.py +0 -0
  406. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/experimental/__init__.py +0 -0
  407. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/hashalg.py +0 -0
  408. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/inspect_hook.py +0 -0
  409. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/merkle.py +0 -0
  410. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/policies/decision-receipt-template-v1.json +0 -0
  411. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/policies/research-preview-v1.json +0 -0
  412. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/policies/strict-eval-authenticated-root-template-v1.json +0 -0
  413. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/policies/strict-eval-template-v1.json +0 -0
  414. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/policies/strict-prereg-template-v1.json +0 -0
  415. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/py.typed +0 -0
  416. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/pytest_plugin.py +0 -0
  417. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/run_ledger.py +0 -0
  418. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle/verification_summary.py +0 -0
  419. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle.egg-info/dependency_links.txt +0 -0
  420. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle.egg-info/entry_points.txt +0 -0
  421. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle.egg-info/requires.txt +0 -0
  422. {proofbundle-3.6.1 → proofbundle-3.6.2}/src/proofbundle.egg-info/top_level.txt +0 -0
  423. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/conftest.py +0 -0
  424. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/anchors/chia_datalayer_proof.json +0 -0
  425. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/anchors/freetsa_receipt_anchor.json +0 -0
  426. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/checkpoint/PROVENANCE.json +0 -0
  427. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/checkpoint/gosumdb_known_keys.go +0 -0
  428. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/checkpoint/rekor_v2_checkpoint.txt +0 -0
  429. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/checkpoint/sumdb_latest.txt +0 -0
  430. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/checkpoint/trusted_root.json +0 -0
  431. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ed25519_speccheck_cases.LICENSE +0 -0
  432. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ed25519_speccheck_cases.README.md +0 -0
  433. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ed25519_speccheck_cases.json +0 -0
  434. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/eee_arc_easy.json +0 -0
  435. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/inspect_logs/safety_refusal_demo.eval +0 -0
  436. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/lm_eval_arc_easy_real.json +0 -0
  437. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/markovian_anchor_confirmed.json +0 -0
  438. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/mldsa_acvp/PROVENANCE.json +0 -0
  439. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/mldsa_acvp/mldsa_sigver_slice.json +0 -0
  440. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/PROVENANCE.json +0 -0
  441. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/block358391.json +0 -0
  442. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/hello-world.txt +0 -0
  443. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/hello-world.txt.ots +0 -0
  444. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/incomplete.txt +0 -0
  445. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/incomplete.txt.ots +0 -0
  446. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/known-and-unknown-notary.txt +0 -0
  447. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/known-and-unknown-notary.txt.ots +0 -0
  448. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/merkle2.txt +0 -0
  449. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/merkle2.txt.ots +0 -0
  450. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/synthetic-upgraded-sha256.block.json +0 -0
  451. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/synthetic-upgraded-sha256.txt +0 -0
  452. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/synthetic-upgraded-sha256.txt.ots +0 -0
  453. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/two-calendars.txt +0 -0
  454. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/ots/two-calendars.txt.ots +0 -0
  455. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/promptfoo_results_v3.json +0 -0
  456. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/rekor_inclusion_25579.json +0 -0
  457. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/rfc6962_vectors.json +0 -0
  458. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/sdjwt_disclosure_vector.json +0 -0
  459. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/sdjwt_reference_eddsa.json +0 -0
  460. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/sdjwtvc/PROVENANCE.json +0 -0
  461. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/sdjwtvc/sdjwtvc_examples.txt +0 -0
  462. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/fixtures/sdjwtvc/sdjwtvc_issuer_pubkey.json +0 -0
  463. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_adapters.py +0 -0
  464. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_adversarial.py +0 -0
  465. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchor_hardening_321.py +0 -0
  466. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchor_longevity_property.py +0 -0
  467. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchor_target_trustedtime.py +0 -0
  468. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchors_chia.py +0 -0
  469. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchors_chia_add.py +0 -0
  470. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchors_chia_claims.py +0 -0
  471. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchors_generic.py +0 -0
  472. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchors_markovian.py +0 -0
  473. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchors_ots.py +0 -0
  474. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_anchors_rfc3161.py +0 -0
  475. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_assurance.py +0 -0
  476. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_audit_candidate_360.py +0 -0
  477. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_automation_verdict.py +0 -0
  478. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_beacon.py +0 -0
  479. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_branch_base_check.py +0 -0
  480. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_bundle.py +0 -0
  481. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_bundle_robustness.py +0 -0
  482. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_canonical.py +0 -0
  483. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_checkpoint.py +0 -0
  484. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_checkpoint_external_vectors.py +0 -0
  485. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_checkpoint_quorum_property.py +0 -0
  486. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_claims_hygiene.py +0 -0
  487. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_cli.py +0 -0
  488. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_cli_eval.py +0 -0
  489. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_cli_require_anchor.py +0 -0
  490. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_conformance.py +0 -0
  491. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_conformance_retention_361.py +0 -0
  492. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_content_root_property.py +0 -0
  493. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_cosignature.py +0 -0
  494. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_cosignature_mldsa.py +0 -0
  495. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_cross_format_singleton_361.py +0 -0
  496. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_anchors.py +0 -0
  497. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_cli.py +0 -0
  498. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_evidence.py +0 -0
  499. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_fuzz.py +0 -0
  500. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_hardening.py +0 -0
  501. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_policy.py +0 -0
  502. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_schema.py +0 -0
  503. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_validator_api.py +0 -0
  504. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_decision_verify.py +0 -0
  505. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_demo.py +0 -0
  506. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_docs_truth.py +0 -0
  507. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_dsse_adversarial.py +0 -0
  508. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_dup_key_reject.py +0 -0
  509. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_ed25519_semantics.py +0 -0
  510. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_eee.py +0 -0
  511. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_emit.py +0 -0
  512. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_enclave_assurance.py +0 -0
  513. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_eval_claim_schema.py +0 -0
  514. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_eval_evidence_class.py +0 -0
  515. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_evalcard.py +0 -0
  516. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_evalclaim.py +0 -0
  517. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_evidence_pack.py +0 -0
  518. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_examples.py +0 -0
  519. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_experimental_enclave.py +0 -0
  520. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_findings_register_rt10.py +0 -0
  521. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_fork_pr_secret_isolation.py +0 -0
  522. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_fuzz_parsers.py +0 -0
  523. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_fuzz_soak_regression.py +0 -0
  524. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_hashalg.py +0 -0
  525. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_hf_evals.py +0 -0
  526. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_inspect_hook.py +0 -0
  527. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_intoto.py +0 -0
  528. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_intoto_claims_hygiene.py +0 -0
  529. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_intoto_content_root_migration.py +0 -0
  530. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_intoto_dsse.py +0 -0
  531. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_intoto_eval_result.py +0 -0
  532. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_intoto_examples.py +0 -0
  533. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_intoto_spec_diff.py +0 -0
  534. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_intoto_svr.py +0 -0
  535. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_jcs_mandatory_361.py +0 -0
  536. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_kbjwt.py +0 -0
  537. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_legacy_assurance_deprecation_361.py +0 -0
  538. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_lens_review_fixes_3_1_3.py +0 -0
  539. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_manifest_lock.json +0 -0
  540. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_merkle.py +0 -0
  541. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_merkle_consistency_property.py +0 -0
  542. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_merkle_property.py +0 -0
  543. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_mldsa_acvp_vectors.py +0 -0
  544. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_never_raise_361.py +0 -0
  545. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_never_raise_recursion_361.py +0 -0
  546. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_official_vectors.py +0 -0
  547. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_ok_semantics.py +0 -0
  548. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_ots_calendar_hardening.py +0 -0
  549. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_ots_external_vectors.py +0 -0
  550. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_outcome_receiver_corroboration.py +0 -0
  551. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_outcome_verify.py +0 -0
  552. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_oversized_int_guard.py +0 -0
  553. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_persample.py +0 -0
  554. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_pinned_key_validation.py +0 -0
  555. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_policy_explain_lint.py +0 -0
  556. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_policy_lifecycle_purpose.py +0 -0
  557. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_policy_profiles.py +0 -0
  558. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_policy_templates.py +0 -0
  559. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_pqsig.py +0 -0
  560. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_predicate_type_enforcement.py +0 -0
  561. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_prereg.py +0 -0
  562. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_promptfoo.py +0 -0
  563. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_provenance.py +0 -0
  564. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_public_transparency.py +0 -0
  565. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_pytest_plugin.py +0 -0
  566. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_rekor_interop.py +0 -0
  567. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_relation_profile.py +0 -0
  568. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_relation_property.py +0 -0
  569. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_relation_same_key_361.py +0 -0
  570. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_relation_signer_target_340.py +0 -0
  571. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_relation_statement.py +0 -0
  572. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_relation_statement_rust_parity.py +0 -0
  573. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_relation_subject_pin_361.py +0 -0
  574. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_release_integrity_gate.py +0 -0
  575. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_renewal.py +0 -0
  576. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_renewal_external_token_glue.py +0 -0
  577. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_renewal_policy.py +0 -0
  578. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_renewal_signed.py +0 -0
  579. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_reproducible_build_361.py +0 -0
  580. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_rfc6962_external_vectors.py +0 -0
  581. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_roadmap_frontload_foundations.py +0 -0
  582. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_root_authenticity.py +0 -0
  583. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_run_ledger.py +0 -0
  584. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_rust_parity_gate.py +0 -0
  585. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_schema.py +0 -0
  586. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_schema_parity.py +0 -0
  587. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdist_packaging_361.py +0 -0
  588. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdjwt_adversarial.py +0 -0
  589. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdjwt_duplicate_cnf.py +0 -0
  590. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdjwt_issue.py +0 -0
  591. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdjwt_reference.py +0 -0
  592. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdjwt_resource_budget.py +0 -0
  593. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdjwt_vc.py +0 -0
  594. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdjwt_verify_binding.py +0 -0
  595. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_sdjwtvc_external_vectors.py +0 -0
  596. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_signature.py +0 -0
  597. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_statuslist.py +0 -0
  598. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_subject_binding.py +0 -0
  599. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_tlogproof.py +0 -0
  600. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_tree_context_authenticity.py +0 -0
  601. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_trust_pack.py +0 -0
  602. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_trust_pack_crypto_agility.py +0 -0
  603. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_trust_pack_outcome_receivers_role.py +0 -0
  604. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_trust_pack_payloadtype_negatives.py +0 -0
  605. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_trust_policy.py +0 -0
  606. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_verification_summary.py +0 -0
  607. {proofbundle-3.6.1 → proofbundle-3.6.2}/tests/test_verify_matrix.py +0 -0
@@ -0,0 +1,270 @@
1
+ Metadata-Version: 2.4
2
+ Name: proofbundle
3
+ Version: 3.6.2
4
+ Summary: Emit and verify portable cryptographic evidence bundles, offline: Ed25519 + RFC 6962 Merkle + optional SD-JWT.
5
+ Author: Konrad Gruszka
6
+ License: MIT
7
+ Project-URL: Homepage, https://b7n0de.com
8
+ Project-URL: Repository, https://github.com/b7n0de/proofbundle
9
+ Project-URL: Issues, https://github.com/b7n0de/proofbundle/issues
10
+ Project-URL: Changelog, https://github.com/b7n0de/proofbundle/blob/main/CHANGELOG.md
11
+ Project-URL: Documentation, https://github.com/b7n0de/proofbundle#readme
12
+ Keywords: cryptography,merkle,transparency-log,ed25519,sd-jwt,verifiable-credentials,attestation,provenance,rfc6962
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Topic :: Security :: Cryptography
23
+ Requires-Python: >=3.10
24
+ Description-Content-Type: text/markdown
25
+ License-File: LICENSE
26
+ Requires-Dist: cryptography>=42
27
+ Requires-Dist: rfc8785>=0.1.4
28
+ Provides-Extra: sdjwt
29
+ Provides-Extra: eval
30
+ Requires-Dist: rfc8785>=0.1.4; extra == "eval"
31
+ Provides-Extra: anchors
32
+ Requires-Dist: rfc3161-client>=1.0.6; extra == "anchors"
33
+ Requires-Dist: opentimestamps<0.5,>=0.4.5; extra == "anchors"
34
+ Requires-Dist: rfc8785>=0.1.4; extra == "anchors"
35
+ Provides-Extra: adapters
36
+ Provides-Extra: chia
37
+ Provides-Extra: experimental
38
+ Provides-Extra: pq
39
+ Requires-Dist: cryptography>=48; extra == "pq"
40
+ Provides-Extra: formal
41
+ Requires-Dist: z3-solver>=4.12; extra == "formal"
42
+ Provides-Extra: pytest
43
+ Requires-Dist: pytest>=7; extra == "pytest"
44
+ Provides-Extra: test
45
+ Requires-Dist: pytest>=7; extra == "test"
46
+ Requires-Dist: hypothesis>=6; extra == "test"
47
+ Requires-Dist: PyYAML>=6; extra == "test"
48
+ Requires-Dist: jsonschema>=4; extra == "test"
49
+ Requires-Dist: sd-jwt>=0.10; extra == "test"
50
+ Requires-Dist: rfc8785>=0.1.4; extra == "test"
51
+ Provides-Extra: inspect
52
+ Requires-Dist: inspect_ai<0.4,>=0.3.112; extra == "inspect"
53
+ Provides-Extra: dev
54
+ Requires-Dist: pytest>=7; extra == "dev"
55
+ Requires-Dist: ruff>=0.5; extra == "dev"
56
+ Requires-Dist: jsonschema>=4; extra == "dev"
57
+ Requires-Dist: mypy>=1.8; extra == "dev"
58
+ Requires-Dist: build>=1; extra == "dev"
59
+ Requires-Dist: hypothesis>=6; extra == "dev"
60
+ Requires-Dist: rfc8785>=0.1.4; extra == "dev"
61
+ Requires-Dist: sd-jwt>=0.10; extra == "dev"
62
+ Requires-Dist: PyYAML>=6; extra == "dev"
63
+ Requires-Dist: inspect_ai<0.4,>=0.3.112; extra == "dev"
64
+ Dynamic: license-file
65
+
66
+ <div align="center">
67
+
68
+ <picture>
69
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/b7n0de/proofbundle/main/assets/b7n0de-hase-logo-dark.png">
70
+ <img alt="b7n0de, Verified AI Work, pink rabbit mascot over the B7N0DE wordmark" src="https://raw.githubusercontent.com/b7n0de/proofbundle/main/assets/b7n0de-hase-logo.png" width="200">
71
+ </picture>
72
+
73
+ <h1>proofbundle</h1>
74
+
75
+ **AI eval results need receipts.**
76
+
77
+ Turn an AI evaluation result into one portable, offline-verifiable receipt. It proves *who signed
78
+ these exact bytes* and *that nothing changed since* — not that the number is true. Ed25519 + RFC 6962
79
+ Merkle, one file, no server, no network.
80
+
81
+ [![CI](https://github.com/b7n0de/proofbundle/actions/workflows/ci.yml/badge.svg)](https://github.com/b7n0de/proofbundle/actions/workflows/ci.yml)
82
+ [![demo reproducible](https://github.com/b7n0de/proofbundle/actions/workflows/demo-reproducible.yml/badge.svg)](https://github.com/b7n0de/proofbundle/actions/workflows/demo-reproducible.yml)
83
+ [![PyPI](https://img.shields.io/pypi/v/proofbundle.svg)](https://pypi.org/project/proofbundle/)
84
+ [![Python](https://img.shields.io/pypi/pyversions/proofbundle.svg)](https://pypi.org/project/proofbundle/)
85
+ [![License: MIT](https://img.shields.io/badge/license-MIT-D6248A.svg)](https://github.com/b7n0de/proofbundle/blob/main/LICENSE)
86
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21110642.svg)](https://doi.org/10.5281/zenodo.21110642)
87
+
88
+ **Reviewing this for adoption?** Start with the 30-minute adversarial audit path: **[docs/REVIEWERS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/REVIEWERS.md)**.
89
+
90
+ </div>
91
+
92
+ ## 60-second try (offline)
93
+
94
+ ```bash
95
+ pip install "proofbundle[eval]"
96
+ proofbundle demo # honest receipt => OK, six tampers each => FAILED, sample swap caught
97
+ ```
98
+
99
+ The demo runs entirely in memory and exits non-zero if any tamper slips through, so it doubles as a
100
+ self-test.
101
+
102
+ ```bash
103
+ # verify a real hosted receipt without writing any code — the verify runs fully offline:
104
+ curl -fsSL https://raw.githubusercontent.com/b7n0de/proofbundle/main/examples/example_bundle.json -o receipt.json
105
+ proofbundle verify receipt.json # CRYPTO: OK (exit 0 ok · 1 fail · 2 malformed · 3 policy)
106
+ ```
107
+
108
+ Emit your own receipt, apply a trust policy, start from a shipped template, or run the Inspect-native
109
+ path (METR Task Standard / UK-AISI ecosystem, mockllm, no API key): **[docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md)** ·
110
+ Inspect walkthrough **[docs/INSPECT_HAPPY_PATH.md](https://github.com/b7n0de/proofbundle/blob/main/docs/INSPECT_HAPPY_PATH.md)**.
111
+
112
+ ## The problem
113
+
114
+ Every AI eval number you read — a safety benchmark, a capability score, a leaderboard entry — is an
115
+ **unverifiable claim**. You trust the lab. There is no portable way to check, offline, that a result
116
+ was signed by a stated party, has not been altered, and covers the samples it claims.
117
+
118
+ proofbundle is that check: a small MIT-licensed Python tool (a compact, auditable trusted core that
119
+ depends only on [`cryptography`](https://cryptography.io)) that turns a result into a signed receipt
120
+ anyone can verify from a single file. In plain terms it is the cash-register receipt of an AI test
121
+ result: it shows who claimed the number and that nobody quietly changed it, not that the test was
122
+ good. Without a receipt there is nothing to check at all.
123
+
124
+ ## What a receipt proves, and what it doesn't
125
+
126
+ | ✅ It proves | ❌ It does **not** prove |
127
+ |---|---|
128
+ | These exact bytes were signed by this key (**authorship**) | That the number is **true** |
129
+ | Nothing changed since signing (**integrity**, Ed25519 + RFC 6962) | That the **issuer is honest** |
130
+ | The result is attributable to a stated issuer | That the **eval was well-designed** |
131
+ | A threshold was met while hiding the model/dataset (salted commitments) | That there was **no cherry-picking** — unless pre-registered |
132
+ | Optionally: individual samples, offline-auditable (per-sample Merkle) | That the **computation was correct** — that needs a TEE or independent reproduction |
133
+
134
+ This boundary is the point, not a weakness. A receipt makes a claim **attributable, tamper-evident,
135
+ and — with pre-registration and per-sample auditing — bounded and spot-checkable**. Full detail:
136
+ **[THREAT_MODEL.md](https://github.com/b7n0de/proofbundle/blob/main/THREAT_MODEL.md)**.
137
+
138
+ ## How it fits together
139
+
140
+ *(diagram renders on GitHub — [view it there](https://github.com/b7n0de/proofbundle#how-it-fits-together); PyPI shows the source)*
141
+
142
+ ```mermaid
143
+ flowchart LR
144
+ H["eval harness<br/>inspect_ai · lm-eval · promptfoo · pytest"] --> A["adapter → signed claim<br/>salted commitments · provenance · samples root"]
145
+ A --> R["receipt<br/>one portable file"]
146
+ R --> V{{"proofbundle verify — offline"}}
147
+ V --> C["signature · Merkle inclusion · SD-JWT/KB ·<br/>witness quorum · status list · sample openings"]
148
+ C --> OK(["CRYPTO: OK / FAILED"])
149
+ style V fill:#D6248A,stroke:#D6248A,color:#fff
150
+ style OK fill:#D6248A,stroke:#D6248A,color:#fff
151
+ ```
152
+
153
+ proofbundle is a **practical, released, offline verifier — complementary to TEE and zero-knowledge
154
+ approaches**, not a replacement for any of them. The neighbourhood, honest about the line each one
155
+ crosses that a receipt does not (maturity labels stated so nothing reads as a settled standard):
156
+
157
+ | Neighbour | What it contributes that a receipt does not | Maturity |
158
+ |---|---|---|
159
+ | **K-Veritas** ([arXiv 2605.08586](https://arxiv.org/abs/2605.08586)) | the academic case for tamper-evident, execution-bound experiment reports | preprint |
160
+ | **Attestable Audits** ([arXiv 2506.23706](https://arxiv.org/abs/2506.23706)) | that the computation actually ran, inside a trusted enclave | preprint |
161
+ | **BenchJack** ([arXiv 2605.12673](https://arxiv.org/abs/2605.12673)) | whether the benchmark itself is gameable (reward-hacking) | preprint |
162
+ | **Evaluation Cards** ([arXiv 2606.09809](https://arxiv.org/abs/2606.09809)) | a structured, human-facing account of what a result means | preprint |
163
+ | in-toto / Sigstore, SCITT / Rekor v2, OpenSSF Model Signing | artifact-provenance, public transparency, model-artifact signing | stable |
164
+
165
+ Tool-by-tool comparison: **[INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md)**.
166
+
167
+ ## What's in the box
168
+
169
+ Each line is a one-sentence summary; the linked doc carries the exact flags, exit codes and
170
+ version history (see also [CHANGELOG.md](https://github.com/b7n0de/proofbundle/blob/main/CHANGELOG.md)).
171
+
172
+ - **Core** — Ed25519 signature + RFC 6962 / 9162 Merkle inclusion, verified fully offline against a
173
+ real [Sigstore Rekor](https://docs.sigstore.dev/) proof, so correctness is not self-referential.
174
+ - **Eval receipts** — a signed claim (`metric ⋈ threshold`, `n`, salted model/dataset commitments,
175
+ assurance level, provenance) from your run. [EVAL_CLAIM.md](https://github.com/b7n0de/proofbundle/blob/main/EVAL_CLAIM.md)
176
+ - **Selective disclosure** — SD-JWT ([RFC 9901](https://datatracker.ietf.org/doc/rfc9901/)) with Key
177
+ Binding: prove a threshold while withholding the exact score (unsigned or unbound disclosures fail closed).
178
+ - **Transparency-log interop** — C2SP `tlog-checkpoint` / cosignature / `.tlog-proof`, with
179
+ post-quantum **ML-DSA-44** witness cosignatures and optional Token-Status-List revocation.
180
+ - **Per-sample audit** — an auditor challenges random indices (fresh nonce or **public randomness
181
+ beacon**); 300 samples catch 1% sample-doctoring at 95% confidence, regardless of run size — a
182
+ challenge the issuer chose itself does not give this guarantee.
183
+ - **Pre-registration** — `proofbundle prereg <plan>` commits to the protocol before the run, so
184
+ best-of-many publishing becomes visible.
185
+ - **Integrations** — opt-in inspect_ai end-of-task hook, pytest plugin, and a Hugging Face Community
186
+ Evals bridge. [INTEGRATIONS.md](https://github.com/b7n0de/proofbundle/blob/main/INTEGRATIONS.md)
187
+ - **External time anchors** *(beta, `[anchors]` extra)* — optional evidence of *when* a receipt
188
+ existed, from a party the producer does not control; RFC 3161 and OpenTimestamps built in, plus a
189
+ bring-your-own-type interface. Trust comes only from the relying party. [docs/ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/ANCHORS.md)
190
+ - **Universal content root** *(`jcs-sha256-v1`)* — SHA-256 over the RFC 8785 (JCS) canonical bytes of
191
+ the full pre-signature statement, so a content root survives counter-signing and key rotation;
192
+ cross-implementation interop proven. [ADR 0002](https://github.com/b7n0de/proofbundle/blob/main/docs/adr/0002-universal-content-root.md)
193
+ - **Decision & action-outcome receipts** — a signed *decision* (verdict, policy boundary,
194
+ digest-bound evidence, and what was *not* checked) and a separately signed *outcome* with role
195
+ separation (executor ≠ decision maker) — never a claim that the decision was correct.
196
+ [decision-receipt.md](https://github.com/b7n0de/proofbundle/blob/main/docs/predicates/decision-receipt.md) · [action-outcome.md](https://github.com/b7n0de/proofbundle/blob/main/docs/predicates/action-outcome.md)
197
+
198
+ ## Install
199
+
200
+ ```bash
201
+ pip install proofbundle # core: offline verify + plain emit (dependency-free)
202
+ pip install "proofbundle[eval]" # + eval receipts, prereg, and the demo (RFC 8785 JCS canonicalizer)
203
+ pip install "proofbundle[inspect]" # inspect_ai adapter + hook
204
+ pip install "proofbundle[pq]" # verify ML-DSA-44 (post-quantum) witness cosignatures
205
+ ```
206
+
207
+ Requires Python 3.10+. The verify path never rolls its own crypto — Ed25519 comes from
208
+ `cryptography`; Merkle hashing is RFC 6962.
209
+
210
+ ## Post-quantum posture (honest)
211
+
212
+ proofbundle is **not** "quantum-safe" as a whole. Its hash-based layers (SHA-256, RFC 6962 / 9162
213
+ Merkle, RFC 8785 canonicalization, and the OpenTimestamps / `chia-datalayer` anchors) stay secure —
214
+ Grover only halves SHA-256's effective strength, leaving a ~128-bit quantum margin. The Ed25519
215
+ receipt signature (and the RFC 3161 anchor's classical TSA certificate) are quantum-vulnerable to
216
+ Shor. The attack that matters is **back-dated forgery**, and the defense is a hash-based time anchor:
217
+ it proves the original receipt existed *before* any such capability, so a forged receipt has no
218
+ matching anchor. The witness side already carries post-quantum **ML-DSA-44** (FIPS 204) cosignatures;
219
+ a post-quantum *payload* signature is on the roadmap. Detail: [docs/ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/ANCHORS.md).
220
+
221
+ ## Cite this work
222
+
223
+ If proofbundle helped your evaluation pipeline, please cite it. Machine-readable metadata is in
224
+ [`CITATION.cff`](https://github.com/b7n0de/proofbundle/blob/main/CITATION.cff). The archival software record is on Zenodo under concept
225
+ DOI [10.5281/zenodo.21110642](https://doi.org/10.5281/zenodo.21110642); the Technical Note (design write-up) under concept DOI
226
+ [10.5281/zenodo.21230466](https://doi.org/10.5281/zenodo.21230466), also linked from [b7n0de.com/proofbundle](https://b7n0de.com/proofbundle).
227
+
228
+ ## Docs
229
+
230
+ | For… | Read |
231
+ |---|---|
232
+ | Skeptics (why not SHA-256 / Sigstore / trust the issuer) | [docs/FAQ.md](https://github.com/b7n0de/proofbundle/blob/main/docs/FAQ.md) |
233
+ | New to this? plain-terms glossary | [docs/GLOSSARY.md](https://github.com/b7n0de/proofbundle/blob/main/docs/GLOSSARY.md) |
234
+ | Reviewers (30-minute adversarial audit path) | [docs/REVIEWERS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/REVIEWERS.md) |
235
+ | Where every trust anchor comes from | [docs/TRUST_ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/TRUST_ANCHORS.md) |
236
+ | The demos, tier by tier | [docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md) |
237
+ | The normative format + verification order | [SPEC.md](https://github.com/b7n0de/proofbundle/blob/main/SPEC.md) |
238
+ | Honest comparison to Rekor / in-toto / OMS / ValiChord | [INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md) |
239
+ | Regulatory mapping (and what to never claim) | [COMPLIANCE.md](https://github.com/b7n0de/proofbundle/blob/main/COMPLIANCE.md) |
240
+ | Funders / role fit | [docs/PROJECT_BRIEF.md](https://github.com/b7n0de/proofbundle/blob/main/docs/PROJECT_BRIEF.md) |
241
+ | **Preview:** TEE-attestation bridge (RATS/EAT, `[experimental]`) | [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md) |
242
+
243
+ ## Status, scope and roadmap
244
+
245
+ Beta, SemVer-committed, with a CI test suite behind a mutation gate + property-based parser fuzzing.
246
+ Correctness is anchored to external RFC 6962 vectors and a real Rekor proof, not just its own
247
+ bundles; releases carry PEP 740 / SLSA build provenance. It is **not** a log service, a full in-toto
248
+ client, a TEE, a consensus network, or a compliance product by itself — it is the small, offline,
249
+ standards-native receipt layer between them. Security policy: [SECURITY.md](https://github.com/b7n0de/proofbundle/blob/main/SECURITY.md).
250
+
251
+ **Roadmap (stated honestly, not yet built):** a post-quantum *payload* signature (today the
252
+ post-quantum coverage is witness-side ML-DSA-44 only), and a CLI flag to select the content-root
253
+ algorithm (`jcs-sha256-v1` is the signed default). **Already shipped at preview/experimental
254
+ maturity** (install extra `[experimental]`, API/wire-format may still change): a TEE-attestation
255
+ bridge (RATS/EAT, RFC 9334 + RFC 9711) making `assurance_level = enclave_attested` independently
256
+ verifiable — [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md).
257
+
258
+ ## Contributing
259
+
260
+ See [CONTRIBUTING.md](https://github.com/b7n0de/proofbundle/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/b7n0de/proofbundle/blob/main/CODE_OF_CONDUCT.md). Good first issues are labeled
261
+ [`good-first-issue`](https://github.com/b7n0de/proofbundle/labels/good-first-issue); security findings go through [SECURITY.md](https://github.com/b7n0de/proofbundle/blob/main/SECURITY.md).
262
+ The verifier core aims to stay small, dependency-light, and correct.
263
+
264
+ ## License
265
+
266
+ MIT — see [LICENSE](https://github.com/b7n0de/proofbundle/blob/main/LICENSE).
267
+
268
+ ---
269
+
270
+ <p align="center"><sub>proofbundle is part of <b>b7n0de</b>, Verified AI Work · <a href="https://b7n0de.com">b7n0de.com</a></sub></p>
@@ -0,0 +1,205 @@
1
+ <div align="center">
2
+
3
+ <picture>
4
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/b7n0de/proofbundle/main/assets/b7n0de-hase-logo-dark.png">
5
+ <img alt="b7n0de, Verified AI Work, pink rabbit mascot over the B7N0DE wordmark" src="https://raw.githubusercontent.com/b7n0de/proofbundle/main/assets/b7n0de-hase-logo.png" width="200">
6
+ </picture>
7
+
8
+ <h1>proofbundle</h1>
9
+
10
+ **AI eval results need receipts.**
11
+
12
+ Turn an AI evaluation result into one portable, offline-verifiable receipt. It proves *who signed
13
+ these exact bytes* and *that nothing changed since* — not that the number is true. Ed25519 + RFC 6962
14
+ Merkle, one file, no server, no network.
15
+
16
+ [![CI](https://github.com/b7n0de/proofbundle/actions/workflows/ci.yml/badge.svg)](https://github.com/b7n0de/proofbundle/actions/workflows/ci.yml)
17
+ [![demo reproducible](https://github.com/b7n0de/proofbundle/actions/workflows/demo-reproducible.yml/badge.svg)](https://github.com/b7n0de/proofbundle/actions/workflows/demo-reproducible.yml)
18
+ [![PyPI](https://img.shields.io/pypi/v/proofbundle.svg)](https://pypi.org/project/proofbundle/)
19
+ [![Python](https://img.shields.io/pypi/pyversions/proofbundle.svg)](https://pypi.org/project/proofbundle/)
20
+ [![License: MIT](https://img.shields.io/badge/license-MIT-D6248A.svg)](https://github.com/b7n0de/proofbundle/blob/main/LICENSE)
21
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.21110642.svg)](https://doi.org/10.5281/zenodo.21110642)
22
+
23
+ **Reviewing this for adoption?** Start with the 30-minute adversarial audit path: **[docs/REVIEWERS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/REVIEWERS.md)**.
24
+
25
+ </div>
26
+
27
+ ## 60-second try (offline)
28
+
29
+ ```bash
30
+ pip install "proofbundle[eval]"
31
+ proofbundle demo # honest receipt => OK, six tampers each => FAILED, sample swap caught
32
+ ```
33
+
34
+ The demo runs entirely in memory and exits non-zero if any tamper slips through, so it doubles as a
35
+ self-test.
36
+
37
+ ```bash
38
+ # verify a real hosted receipt without writing any code — the verify runs fully offline:
39
+ curl -fsSL https://raw.githubusercontent.com/b7n0de/proofbundle/main/examples/example_bundle.json -o receipt.json
40
+ proofbundle verify receipt.json # CRYPTO: OK (exit 0 ok · 1 fail · 2 malformed · 3 policy)
41
+ ```
42
+
43
+ Emit your own receipt, apply a trust policy, start from a shipped template, or run the Inspect-native
44
+ path (METR Task Standard / UK-AISI ecosystem, mockllm, no API key): **[docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md)** ·
45
+ Inspect walkthrough **[docs/INSPECT_HAPPY_PATH.md](https://github.com/b7n0de/proofbundle/blob/main/docs/INSPECT_HAPPY_PATH.md)**.
46
+
47
+ ## The problem
48
+
49
+ Every AI eval number you read — a safety benchmark, a capability score, a leaderboard entry — is an
50
+ **unverifiable claim**. You trust the lab. There is no portable way to check, offline, that a result
51
+ was signed by a stated party, has not been altered, and covers the samples it claims.
52
+
53
+ proofbundle is that check: a small MIT-licensed Python tool (a compact, auditable trusted core that
54
+ depends only on [`cryptography`](https://cryptography.io)) that turns a result into a signed receipt
55
+ anyone can verify from a single file. In plain terms it is the cash-register receipt of an AI test
56
+ result: it shows who claimed the number and that nobody quietly changed it, not that the test was
57
+ good. Without a receipt there is nothing to check at all.
58
+
59
+ ## What a receipt proves, and what it doesn't
60
+
61
+ | ✅ It proves | ❌ It does **not** prove |
62
+ |---|---|
63
+ | These exact bytes were signed by this key (**authorship**) | That the number is **true** |
64
+ | Nothing changed since signing (**integrity**, Ed25519 + RFC 6962) | That the **issuer is honest** |
65
+ | The result is attributable to a stated issuer | That the **eval was well-designed** |
66
+ | A threshold was met while hiding the model/dataset (salted commitments) | That there was **no cherry-picking** — unless pre-registered |
67
+ | Optionally: individual samples, offline-auditable (per-sample Merkle) | That the **computation was correct** — that needs a TEE or independent reproduction |
68
+
69
+ This boundary is the point, not a weakness. A receipt makes a claim **attributable, tamper-evident,
70
+ and — with pre-registration and per-sample auditing — bounded and spot-checkable**. Full detail:
71
+ **[THREAT_MODEL.md](https://github.com/b7n0de/proofbundle/blob/main/THREAT_MODEL.md)**.
72
+
73
+ ## How it fits together
74
+
75
+ *(diagram renders on GitHub — [view it there](https://github.com/b7n0de/proofbundle#how-it-fits-together); PyPI shows the source)*
76
+
77
+ ```mermaid
78
+ flowchart LR
79
+ H["eval harness<br/>inspect_ai · lm-eval · promptfoo · pytest"] --> A["adapter → signed claim<br/>salted commitments · provenance · samples root"]
80
+ A --> R["receipt<br/>one portable file"]
81
+ R --> V{{"proofbundle verify — offline"}}
82
+ V --> C["signature · Merkle inclusion · SD-JWT/KB ·<br/>witness quorum · status list · sample openings"]
83
+ C --> OK(["CRYPTO: OK / FAILED"])
84
+ style V fill:#D6248A,stroke:#D6248A,color:#fff
85
+ style OK fill:#D6248A,stroke:#D6248A,color:#fff
86
+ ```
87
+
88
+ proofbundle is a **practical, released, offline verifier — complementary to TEE and zero-knowledge
89
+ approaches**, not a replacement for any of them. The neighbourhood, honest about the line each one
90
+ crosses that a receipt does not (maturity labels stated so nothing reads as a settled standard):
91
+
92
+ | Neighbour | What it contributes that a receipt does not | Maturity |
93
+ |---|---|---|
94
+ | **K-Veritas** ([arXiv 2605.08586](https://arxiv.org/abs/2605.08586)) | the academic case for tamper-evident, execution-bound experiment reports | preprint |
95
+ | **Attestable Audits** ([arXiv 2506.23706](https://arxiv.org/abs/2506.23706)) | that the computation actually ran, inside a trusted enclave | preprint |
96
+ | **BenchJack** ([arXiv 2605.12673](https://arxiv.org/abs/2605.12673)) | whether the benchmark itself is gameable (reward-hacking) | preprint |
97
+ | **Evaluation Cards** ([arXiv 2606.09809](https://arxiv.org/abs/2606.09809)) | a structured, human-facing account of what a result means | preprint |
98
+ | in-toto / Sigstore, SCITT / Rekor v2, OpenSSF Model Signing | artifact-provenance, public transparency, model-artifact signing | stable |
99
+
100
+ Tool-by-tool comparison: **[INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md)**.
101
+
102
+ ## What's in the box
103
+
104
+ Each line is a one-sentence summary; the linked doc carries the exact flags, exit codes and
105
+ version history (see also [CHANGELOG.md](https://github.com/b7n0de/proofbundle/blob/main/CHANGELOG.md)).
106
+
107
+ - **Core** — Ed25519 signature + RFC 6962 / 9162 Merkle inclusion, verified fully offline against a
108
+ real [Sigstore Rekor](https://docs.sigstore.dev/) proof, so correctness is not self-referential.
109
+ - **Eval receipts** — a signed claim (`metric ⋈ threshold`, `n`, salted model/dataset commitments,
110
+ assurance level, provenance) from your run. [EVAL_CLAIM.md](https://github.com/b7n0de/proofbundle/blob/main/EVAL_CLAIM.md)
111
+ - **Selective disclosure** — SD-JWT ([RFC 9901](https://datatracker.ietf.org/doc/rfc9901/)) with Key
112
+ Binding: prove a threshold while withholding the exact score (unsigned or unbound disclosures fail closed).
113
+ - **Transparency-log interop** — C2SP `tlog-checkpoint` / cosignature / `.tlog-proof`, with
114
+ post-quantum **ML-DSA-44** witness cosignatures and optional Token-Status-List revocation.
115
+ - **Per-sample audit** — an auditor challenges random indices (fresh nonce or **public randomness
116
+ beacon**); 300 samples catch 1% sample-doctoring at 95% confidence, regardless of run size — a
117
+ challenge the issuer chose itself does not give this guarantee.
118
+ - **Pre-registration** — `proofbundle prereg <plan>` commits to the protocol before the run, so
119
+ best-of-many publishing becomes visible.
120
+ - **Integrations** — opt-in inspect_ai end-of-task hook, pytest plugin, and a Hugging Face Community
121
+ Evals bridge. [INTEGRATIONS.md](https://github.com/b7n0de/proofbundle/blob/main/INTEGRATIONS.md)
122
+ - **External time anchors** *(beta, `[anchors]` extra)* — optional evidence of *when* a receipt
123
+ existed, from a party the producer does not control; RFC 3161 and OpenTimestamps built in, plus a
124
+ bring-your-own-type interface. Trust comes only from the relying party. [docs/ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/ANCHORS.md)
125
+ - **Universal content root** *(`jcs-sha256-v1`)* — SHA-256 over the RFC 8785 (JCS) canonical bytes of
126
+ the full pre-signature statement, so a content root survives counter-signing and key rotation;
127
+ cross-implementation interop proven. [ADR 0002](https://github.com/b7n0de/proofbundle/blob/main/docs/adr/0002-universal-content-root.md)
128
+ - **Decision & action-outcome receipts** — a signed *decision* (verdict, policy boundary,
129
+ digest-bound evidence, and what was *not* checked) and a separately signed *outcome* with role
130
+ separation (executor ≠ decision maker) — never a claim that the decision was correct.
131
+ [decision-receipt.md](https://github.com/b7n0de/proofbundle/blob/main/docs/predicates/decision-receipt.md) · [action-outcome.md](https://github.com/b7n0de/proofbundle/blob/main/docs/predicates/action-outcome.md)
132
+
133
+ ## Install
134
+
135
+ ```bash
136
+ pip install proofbundle # core: offline verify + plain emit (dependency-free)
137
+ pip install "proofbundle[eval]" # + eval receipts, prereg, and the demo (RFC 8785 JCS canonicalizer)
138
+ pip install "proofbundle[inspect]" # inspect_ai adapter + hook
139
+ pip install "proofbundle[pq]" # verify ML-DSA-44 (post-quantum) witness cosignatures
140
+ ```
141
+
142
+ Requires Python 3.10+. The verify path never rolls its own crypto — Ed25519 comes from
143
+ `cryptography`; Merkle hashing is RFC 6962.
144
+
145
+ ## Post-quantum posture (honest)
146
+
147
+ proofbundle is **not** "quantum-safe" as a whole. Its hash-based layers (SHA-256, RFC 6962 / 9162
148
+ Merkle, RFC 8785 canonicalization, and the OpenTimestamps / `chia-datalayer` anchors) stay secure —
149
+ Grover only halves SHA-256's effective strength, leaving a ~128-bit quantum margin. The Ed25519
150
+ receipt signature (and the RFC 3161 anchor's classical TSA certificate) are quantum-vulnerable to
151
+ Shor. The attack that matters is **back-dated forgery**, and the defense is a hash-based time anchor:
152
+ it proves the original receipt existed *before* any such capability, so a forged receipt has no
153
+ matching anchor. The witness side already carries post-quantum **ML-DSA-44** (FIPS 204) cosignatures;
154
+ a post-quantum *payload* signature is on the roadmap. Detail: [docs/ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/ANCHORS.md).
155
+
156
+ ## Cite this work
157
+
158
+ If proofbundle helped your evaluation pipeline, please cite it. Machine-readable metadata is in
159
+ [`CITATION.cff`](https://github.com/b7n0de/proofbundle/blob/main/CITATION.cff). The archival software record is on Zenodo under concept
160
+ DOI [10.5281/zenodo.21110642](https://doi.org/10.5281/zenodo.21110642); the Technical Note (design write-up) under concept DOI
161
+ [10.5281/zenodo.21230466](https://doi.org/10.5281/zenodo.21230466), also linked from [b7n0de.com/proofbundle](https://b7n0de.com/proofbundle).
162
+
163
+ ## Docs
164
+
165
+ | For… | Read |
166
+ |---|---|
167
+ | Skeptics (why not SHA-256 / Sigstore / trust the issuer) | [docs/FAQ.md](https://github.com/b7n0de/proofbundle/blob/main/docs/FAQ.md) |
168
+ | New to this? plain-terms glossary | [docs/GLOSSARY.md](https://github.com/b7n0de/proofbundle/blob/main/docs/GLOSSARY.md) |
169
+ | Reviewers (30-minute adversarial audit path) | [docs/REVIEWERS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/REVIEWERS.md) |
170
+ | Where every trust anchor comes from | [docs/TRUST_ANCHORS.md](https://github.com/b7n0de/proofbundle/blob/main/docs/TRUST_ANCHORS.md) |
171
+ | The demos, tier by tier | [docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md) |
172
+ | The normative format + verification order | [SPEC.md](https://github.com/b7n0de/proofbundle/blob/main/SPEC.md) |
173
+ | Honest comparison to Rekor / in-toto / OMS / ValiChord | [INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md) |
174
+ | Regulatory mapping (and what to never claim) | [COMPLIANCE.md](https://github.com/b7n0de/proofbundle/blob/main/COMPLIANCE.md) |
175
+ | Funders / role fit | [docs/PROJECT_BRIEF.md](https://github.com/b7n0de/proofbundle/blob/main/docs/PROJECT_BRIEF.md) |
176
+ | **Preview:** TEE-attestation bridge (RATS/EAT, `[experimental]`) | [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md) |
177
+
178
+ ## Status, scope and roadmap
179
+
180
+ Beta, SemVer-committed, with a CI test suite behind a mutation gate + property-based parser fuzzing.
181
+ Correctness is anchored to external RFC 6962 vectors and a real Rekor proof, not just its own
182
+ bundles; releases carry PEP 740 / SLSA build provenance. It is **not** a log service, a full in-toto
183
+ client, a TEE, a consensus network, or a compliance product by itself — it is the small, offline,
184
+ standards-native receipt layer between them. Security policy: [SECURITY.md](https://github.com/b7n0de/proofbundle/blob/main/SECURITY.md).
185
+
186
+ **Roadmap (stated honestly, not yet built):** a post-quantum *payload* signature (today the
187
+ post-quantum coverage is witness-side ML-DSA-44 only), and a CLI flag to select the content-root
188
+ algorithm (`jcs-sha256-v1` is the signed default). **Already shipped at preview/experimental
189
+ maturity** (install extra `[experimental]`, API/wire-format may still change): a TEE-attestation
190
+ bridge (RATS/EAT, RFC 9334 + RFC 9711) making `assurance_level = enclave_attested` independently
191
+ verifiable — [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md).
192
+
193
+ ## Contributing
194
+
195
+ See [CONTRIBUTING.md](https://github.com/b7n0de/proofbundle/blob/main/CONTRIBUTING.md) and the [Code of Conduct](https://github.com/b7n0de/proofbundle/blob/main/CODE_OF_CONDUCT.md). Good first issues are labeled
196
+ [`good-first-issue`](https://github.com/b7n0de/proofbundle/labels/good-first-issue); security findings go through [SECURITY.md](https://github.com/b7n0de/proofbundle/blob/main/SECURITY.md).
197
+ The verifier core aims to stay small, dependency-light, and correct.
198
+
199
+ ## License
200
+
201
+ MIT — see [LICENSE](https://github.com/b7n0de/proofbundle/blob/main/LICENSE).
202
+
203
+ ---
204
+
205
+ <p align="center"><sub>proofbundle is part of <b>b7n0de</b>, Verified AI Work · <a href="https://b7n0de.com">b7n0de.com</a></sub></p>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "proofbundle"
7
- version = "3.6.1"
7
+ version = "3.6.2"
8
8
  description = "Emit and verify portable cryptographic evidence bundles, offline: Ed25519 + RFC 6962 Merkle + optional SD-JWT."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -285,7 +285,7 @@ MUTATIONS = [
285
285
  # returning True would let ANY wrong key/tampered message/tampered signature "verify" — killed by
286
286
  # tests/test_signature.py's TestVerifyEcdsaP256 (wrong key / tampered message / tampered signature).
287
287
  ("src/proofbundle/signature.py",
288
- " pub.verify(der_sig, message, ec.ECDSA(hashes.SHA256()))\n return True",
288
+ " pub.verify(der_sig, bytes(message), ec.ECDSA(hashes.SHA256()))\n return True",
289
289
  " return True",
290
290
  "signature: ES256 verify_ecdsa_p256 crypto check bypassed (fail-open)", True),
291
291
  # bundle.py sd-jwt-issuer-identity fingerprint reverted to hardcoded "ed25519:" regardless of the
@@ -13,7 +13,7 @@ from __future__ import annotations
13
13
 
14
14
  from typing import TYPE_CHECKING
15
15
 
16
- __version__ = "3.6.1"
16
+ __version__ = "3.6.2"
17
17
 
18
18
  # The `proofbundle/v0.1` normative spec revision this build implements — kept in sync with the
19
19
  # `Revision:` line at the top of SPEC.md by tests/test_docs_truth.py (WP-B1, closes #28). Bump
@@ -53,6 +53,15 @@ _ANCHOR_KEYS = {"type", "target", "canonicalRoot", "proof", "anchoredAt", "froze
53
53
  _VERIFIERS: dict[str, Callable] = {}
54
54
 
55
55
 
56
+ def _as_dict(v):
57
+ """Berkeley r5 class-fix: Config-Sub-Feld als dict, sonst {} (schliesst das ``_as_dict(x.get(k))``-Loch)."""
58
+ return v if isinstance(v, dict) else {}
59
+
60
+
61
+ def _as_list(v):
62
+ return v if isinstance(v, (list, tuple)) else []
63
+
64
+
56
65
  def register_anchor_type(type_name: str, verifier: Callable) -> None:
57
66
  """Register a verifier for an anchor ``type``. A third party ships its own type this way (see
58
67
  docs/ANCHORS.md). The verifier MUST be fail-closed: return ``{"ok": False, ...}`` on any doubt,
@@ -111,7 +120,23 @@ def receipt_canonical_root(bundle: dict) -> bytes:
111
120
  except ImportError as exc: # pragma: no cover - guarded by the extra
112
121
  raise BundleFormatError(
113
122
  "receipt anchoring needs the RFC 8785 canonicalizer — install proofbundle[anchors]") from exc
114
- return hashlib.sha256(rfc8785.dumps(bundle)).digest()
123
+ from ._strict_json import enforce_structural_budget # noqa: PLC0415 - local import avoids an import cycle
124
+ from .errors import ProofBundleError # noqa: PLC0415
125
+ try:
126
+ # Berkeley re-gate round 7: bound depth (<=64) / node count BEFORE rfc8785.dumps recurses — a deeply
127
+ # nested bundle made rfc8785.dumps raise a raw RecursionError (a RuntimeError, NOT the ValueError arm
128
+ # below, NOT a ProofBundleError, so it escaped this public verify-path primitive). This mirrors the
129
+ # round-5 fix on the peer canonical.canonicalize_statement / statement_content_root.
130
+ enforce_structural_budget(bundle)
131
+ return hashlib.sha256(rfc8785.dumps(bundle)).digest()
132
+ except BundleFormatError:
133
+ raise
134
+ except (ProofBundleError, ValueError, RecursionError) as exc:
135
+ # loads_strict admits NaN/Infinity and ints >= 2^53, but rfc8785.dumps rejects them (FloatDomainError /
136
+ # IntegerDomainError, both ValueError); over-width trips BudgetExceeded (a ProofBundleError); a deep dict
137
+ # that slips past the budget could still recurse. All map to the documented BundleFormatError, never raw.
138
+ raise BundleFormatError(
139
+ f"receipt is not RFC 8785 canonicalizable (fail-closed): {exc}") from exc
115
140
 
116
141
 
117
142
  def prereg_canonical_root(prereg_sha256_hex: str) -> bytes:
@@ -191,7 +216,7 @@ def verify_anchor(anchor: dict, *, target_roots: dict, now: Optional[int] = None
191
216
  out["detail"] = (f"no verifier registered for anchor type {atype!r} "
192
217
  "(install proofbundle[anchors] or register the extension type)")
193
218
  return out
194
- expected_root = target_roots.get(target)
219
+ expected_root = _as_dict(target_roots).get(target) # Berkeley r5: target_roots kwarg (None/int) fail-closed
195
220
  if expected_root is None:
196
221
  out["detail"] = f"the receipt has no {target} target to anchor against"
197
222
  return out
@@ -201,9 +226,16 @@ def verify_anchor(anchor: dict, *, target_roots: dict, now: Optional[int] = None
201
226
  out["detail"] = f"canonicalRoot does not match the {target} root (cross-target or tampered)"
202
227
  return out
203
228
  proof = _b64d(anchor.get("proof"), "proof")
229
+ # Berkeley re-gate round 6 (defensive): `_as_dict(anchor.get("frozen"))` only replaces a FALSY non-dict; a
230
+ # TRUTHY non-dict from an attacker bundle ("frozen":"x" / [...]) would reach a verifier's frozen.get(...).
231
+ # The `except Exception` below already fail-closes that, but normalize any non-dict to {} up front so the
232
+ # verifiers never see a wrong type.
233
+ _frozen = anchor.get("frozen")
234
+ if not isinstance(_frozen, dict):
235
+ _frozen = {}
204
236
  try:
205
237
  res = _call_verifier(_VERIFIERS[atype], proof, canonical_root,
206
- frozen=anchor.get("frozen") or {}, now=now, rp_trust=rp_trust)
238
+ frozen=_frozen, now=now, rp_trust=rp_trust)
207
239
  except Exception as exc: # a verifier must be fail-closed; if it raises, treat as FAIL, never pass
208
240
  out["detail"] = f"anchor verifier error (fail-closed): {exc}"
209
241
  return out
@@ -181,11 +181,14 @@ def evidence_ladder_summary(*fields: dict) -> dict:
181
181
  (``level=None``) fields are ignored, never silently counted as CLAIMED. When no field is applicable,
182
182
  returns ``level=None`` (mirrors the existing ``evidence_bound=None`` "nothing to bind" convention —
183
183
  never a vacuous strong verdict over an empty set)."""
184
- applicable = [f for f in fields if f.get("level") is not None]
184
+ # Berkeley re-gate: a non-dict ``*fields`` entry (int) crashed ``f.get('level')`` with a raw AttributeError
185
+ # out of these package-top-level surfaces; a non-Mapping field is simply not-applicable (skipped), never a raise.
186
+ applicable = [f for f in fields
187
+ if isinstance(f, dict) and isinstance(f.get("level"), int) and not isinstance(f.get("level"), bool)]
185
188
  if not applicable:
186
189
  return {"level": None, "level_name": None, "fields": list(fields)}
187
190
  weakest = min(applicable, key=lambda f: f["level"])
188
- return {"level": weakest["level"], "level_name": weakest["level_name"], "fields": list(fields)}
191
+ return {"level": weakest.get("level"), "level_name": weakest.get("level_name"), "fields": list(fields)}
189
192
 
190
193
 
191
194
  def evidence_ladder_best(*fields: dict) -> dict:
@@ -194,8 +197,11 @@ def evidence_ladder_best(*fields: dict) -> dict:
194
197
  ``outcome.py``'s ``effectDigest`` OR ``actualActionDigest`` — the existing boolean
195
198
  ``outcome_execution_proven`` is exactly this OR). Picks the STRONGEST applicable field. When no field
196
199
  is applicable, returns ``level=None``."""
197
- applicable = [f for f in fields if f.get("level") is not None]
200
+ # Berkeley re-gate: a non-dict ``*fields`` entry (int) crashed ``f.get('level')`` with a raw AttributeError
201
+ # out of these package-top-level surfaces; a non-Mapping field is simply not-applicable (skipped), never a raise.
202
+ applicable = [f for f in fields
203
+ if isinstance(f, dict) and isinstance(f.get("level"), int) and not isinstance(f.get("level"), bool)]
198
204
  if not applicable:
199
205
  return {"level": None, "level_name": None, "fields": list(fields)}
200
206
  strongest = max(applicable, key=lambda f: f["level"])
201
- return {"level": strongest["level"], "level_name": strongest["level_name"], "fields": list(fields)}
207
+ return {"level": strongest.get("level"), "level_name": strongest.get("level_name"), "fields": list(fields)}