proofbundle 3.8.0__tar.gz → 4.0.0__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 (671) hide show
  1. {proofbundle-3.8.0/src/proofbundle.egg-info → proofbundle-4.0.0}/PKG-INFO +1 -1
  2. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/AUDITOR_OPEN_POINTS.md +4 -3
  3. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/MANIFEST.sha256 +2 -2
  4. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/PROGRESS.md +6 -4
  5. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/proofbundle/readiness_pack.bundle.json +4 -4
  6. proofbundle-4.0.0/docs/readiness_pack/proofbundle/readiness_pack.pub.b64 +1 -0
  7. {proofbundle-3.8.0 → proofbundle-4.0.0}/pyproject.toml +1 -1
  8. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/claims_hygiene_check.py +4 -3
  9. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/__init__.py +1 -1
  10. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_rootcommit.py +15 -2
  11. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/checkpoint.py +229 -26
  12. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/cli.py +18 -2
  13. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/public_transparency.py +15 -1
  14. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/tlogproof.py +28 -8
  15. {proofbundle-3.8.0 → proofbundle-4.0.0/src/proofbundle.egg-info}/PKG-INFO +1 -1
  16. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/SOURCES.txt +3 -0
  17. proofbundle-4.0.0/tests/fixtures/anchors/markovian_log/checkpoint_7397/MANIFEST.json +36 -0
  18. proofbundle-4.0.0/tests/fixtures/anchors/markovian_log/checkpoint_7397/checkpoint_7397.txt +15 -0
  19. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/ERGEBNIS.json +14 -0
  20. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/ERGEBNIS_negativ.json +14 -0
  21. proofbundle-4.0.0/tests/fixtures/anchors/markovian_log/proof_7271/MANIFEST.json +143 -0
  22. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/README.md +28 -14
  23. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/SOURCES.md +20 -8
  24. proofbundle-4.0.0/tests/fixtures/anchors/markovian_log/proof_7271/keys_unabhaengig.txt +20 -0
  25. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_markovian_log.py +102 -45
  26. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_bughunt_361_never_raise.py +1 -1
  27. proofbundle-4.0.0/tests/test_origin_quorum_rule.py +716 -0
  28. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_verify_proof_expected_origin.py +93 -54
  29. proofbundle-3.8.0/docs/readiness_pack/proofbundle/readiness_pack.pub.b64 +0 -1
  30. proofbundle-3.8.0/tests/fixtures/anchors/markovian_log/proof_7271/MANIFEST.json +0 -116
  31. proofbundle-3.8.0/tests/fixtures/anchors/markovian_log/proof_7271/keys_unabhaengig.txt +0 -16
  32. {proofbundle-3.8.0 → proofbundle-4.0.0}/LICENSE +0 -0
  33. {proofbundle-3.8.0 → proofbundle-4.0.0}/MANIFEST.in +0 -0
  34. {proofbundle-3.8.0 → proofbundle-4.0.0}/README.md +0 -0
  35. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/README.md +0 -0
  36. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/coherent-rewrap-fails-expected-root/bundle.json +0 -0
  37. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/coherent-rewrap-fails-expected-root/case.json +0 -0
  38. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/coherent-rewrap-verifies-no-policy/bundle.json +0 -0
  39. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/coherent-rewrap-verifies-no-policy/case.json +0 -0
  40. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/corrupted-signature/bundle.json +0 -0
  41. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/corrupted-signature/case.json +0 -0
  42. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/duplicate-json-key/bundle.json +0 -0
  43. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/duplicate-json-key/case.json +0 -0
  44. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/forged-anchor-own-frozen/bundle.json +0 -0
  45. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/forged-anchor-own-frozen/case.json +0 -0
  46. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/n1-eval-sdjwt-graft-non-eval/bundle.json +0 -0
  47. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/n1-eval-sdjwt-graft-non-eval/case.json +0 -0
  48. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-forged-issuer-identity/bundle.json +0 -0
  49. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-forged-issuer-identity/case.json +0 -0
  50. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-signed-but-unbound/bundle.json +0 -0
  51. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-signed-but-unbound/case.json +0 -0
  52. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-unsigned-unauthenticated/bundle.json +0 -0
  53. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/sd-jwt-unsigned-unauthenticated/case.json +0 -0
  54. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/tampered-payload/bundle.json +0 -0
  55. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/tampered-payload/case.json +0 -0
  56. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/tree-size-expectation-mismatch/bundle.json +0 -0
  57. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/tree-size-expectation-mismatch/case.json +0 -0
  58. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/valid-minimal/bundle.json +0 -0
  59. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/bundle/valid-minimal/case.json +0 -0
  60. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/common_vocabulary.py +0 -0
  61. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/cross_format.py +0 -0
  62. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/MANIFEST.json +0 -0
  63. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/case.json +0 -0
  64. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.jcs +0 -0
  65. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.jcs.ots +0 -0
  66. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/decision_receipt.json +0 -0
  67. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/evidence_eval_result.jcs +0 -0
  68. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/canonicalization-root-binding/evidence_eval_result.json +0 -0
  69. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/MANIFEST.json +0 -0
  70. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/case.json +0 -0
  71. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.jcs +0 -0
  72. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.jcs.ots +0 -0
  73. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/decision_receipt.json +0 -0
  74. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/evidence_eval_result.jcs +0 -0
  75. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/confirmed-anchor-lifecycle/evidence_eval_result.json +0 -0
  76. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/MANIFEST.json +0 -0
  77. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/case.json +0 -0
  78. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/decision_receipt.jcs +0 -0
  79. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/decision_receipt.jcs.ots +0 -0
  80. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/decision_receipt.json +0 -0
  81. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/evidence_eval_result.jcs +0 -0
  82. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/decision/crossimpl/schema-conformant/evidence_eval_result.json +0 -0
  83. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/manifest.json +0 -0
  84. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-supersedes-verified/case.json +0 -0
  85. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-supersedes-verified/pub.b64 +0 -0
  86. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-supersedes-verified/receipt.json +0 -0
  87. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-supersedes-verified/related_b.json +0 -0
  88. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-unresolved/case.json +0 -0
  89. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-unresolved/pub.b64 +0 -0
  90. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/declared-unresolved/receipt.json +0 -0
  91. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/case.json +0 -0
  92. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/policy.json +0 -0
  93. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/pub.b64 +0 -0
  94. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/receipt.json +0 -0
  95. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-accept-path/related_rx.json +0 -0
  96. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/case.json +0 -0
  97. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/policy.json +0 -0
  98. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/pub.b64 +0 -0
  99. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/receipt.json +0 -0
  100. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/related_r0.json +0 -0
  101. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-correct-pass/related_rx.json +0 -0
  102. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/case.json +0 -0
  103. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/policy.json +0 -0
  104. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/pub.b64 +0 -0
  105. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/receipt.json +0 -0
  106. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/related_r0.json +0 -0
  107. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-no-pin-old-behavior/related_rx.json +0 -0
  108. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/case.json +0 -0
  109. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/policy.json +0 -0
  110. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/pub.b64 +0 -0
  111. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/receipt.json +0 -0
  112. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/related_r0.json +0 -0
  113. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/decoy-parent-target-mismatch/related_rx.json +0 -0
  114. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/case.json +0 -0
  115. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/pub.b64 +0 -0
  116. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/receipt.json +0 -0
  117. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_001.json +0 -0
  118. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_002.json +0 -0
  119. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_003.json +0 -0
  120. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_004.json +0 -0
  121. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_005.json +0 -0
  122. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_006.json +0 -0
  123. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_007.json +0 -0
  124. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_008.json +0 -0
  125. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_009.json +0 -0
  126. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_010.json +0 -0
  127. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_011.json +0 -0
  128. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_012.json +0 -0
  129. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_013.json +0 -0
  130. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_014.json +0 -0
  131. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_015.json +0 -0
  132. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_016.json +0 -0
  133. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_017.json +0 -0
  134. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_018.json +0 -0
  135. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_019.json +0 -0
  136. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_020.json +0 -0
  137. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_021.json +0 -0
  138. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_022.json +0 -0
  139. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_023.json +0 -0
  140. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_024.json +0 -0
  141. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_025.json +0 -0
  142. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_026.json +0 -0
  143. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_027.json +0 -0
  144. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_028.json +0 -0
  145. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_029.json +0 -0
  146. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_030.json +0 -0
  147. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_031.json +0 -0
  148. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_032.json +0 -0
  149. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/depth-exceeded/related_033.json +0 -0
  150. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/case.json +0 -0
  151. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/policy.json +0 -0
  152. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/pub.b64 +0 -0
  153. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/receipt.json +0 -0
  154. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/digest-mismatch/related_b.json +0 -0
  155. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/generate_vectors.py +0 -0
  156. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/malformed-digest/case.json +0 -0
  157. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/malformed-digest/pub.b64 +0 -0
  158. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/malformed-digest/receipt.json +0 -0
  159. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-declared-supersedes-verified/case.json +0 -0
  160. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-declared-supersedes-verified/pub.b64 +0 -0
  161. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-declared-supersedes-verified/receipt.json +0 -0
  162. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-declared-supersedes-verified/related_b.json +0 -0
  163. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/case.json +0 -0
  164. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/policy.json +0 -0
  165. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/pub.b64 +0 -0
  166. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/receipt.json +0 -0
  167. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/related_r0.json +0 -0
  168. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-decoy-parent-target-mismatch/related_rx.json +0 -0
  169. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/case.json +0 -0
  170. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/policy.json +0 -0
  171. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/pub.b64 +0 -0
  172. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/receipt.json +0 -0
  173. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-digest-mismatch/related_b.json +0 -0
  174. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/case.json +0 -0
  175. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/policy.json +0 -0
  176. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/pub.b64 +0 -0
  177. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/receipt.json +0 -0
  178. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-relation-signer-unauthorized/related_b.json +0 -0
  179. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-renews/case.json +0 -0
  180. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-renews/pub.b64 +0 -0
  181. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-renews/receipt.json +0 -0
  182. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-renews/related_b.json +0 -0
  183. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-silent-landing/case.json +0 -0
  184. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-silent-landing/pub.b64 +0 -0
  185. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-silent-landing/receipt.json +0 -0
  186. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-valid-baseline/case.json +0 -0
  187. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-valid-baseline/pub.b64 +0 -0
  188. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/outcome-valid-baseline/receipt.json +0 -0
  189. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-amends/case.json +0 -0
  190. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-amends/pub.b64 +0 -0
  191. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-amends/receipt.json +0 -0
  192. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-amends/related_b.json +0 -0
  193. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-corrects/case.json +0 -0
  194. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-corrects/pub.b64 +0 -0
  195. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-corrects/receipt.json +0 -0
  196. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-corrects/related_b.json +0 -0
  197. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-derivedfrom/case.json +0 -0
  198. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-derivedfrom/pub.b64 +0 -0
  199. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-derivedfrom/receipt.json +0 -0
  200. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-derivedfrom/related_b.json +0 -0
  201. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-retracts/case.json +0 -0
  202. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-retracts/pub.b64 +0 -0
  203. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-retracts/receipt.json +0 -0
  204. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-retracts/related_b.json +0 -0
  205. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-revises/case.json +0 -0
  206. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-revises/pub.b64 +0 -0
  207. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-revises/receipt.json +0 -0
  208. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-revises/related_b.json +0 -0
  209. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/case.json +0 -0
  210. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/policy.json +0 -0
  211. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/pub.b64 +0 -0
  212. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/receipt.json +0 -0
  213. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-unauthorized/related_b.json +0 -0
  214. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/case.json +0 -0
  215. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/policy.json +0 -0
  216. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/pub.b64 +0 -0
  217. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/receipt.json +0 -0
  218. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-cross-issuer-verified/related_b.json +0 -0
  219. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/case.json +0 -0
  220. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/policy.json +0 -0
  221. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/pub.b64 +0 -0
  222. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/receipt.json +0 -0
  223. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-same-key-explicit/related_b.json +0 -0
  224. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/case.json +0 -0
  225. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/policy.json +0 -0
  226. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/pub.b64 +0 -0
  227. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/receipt.json +0 -0
  228. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/relation-signer-verified-under-not-claim/related_b.json +0 -0
  229. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/renews-vector/case.json +0 -0
  230. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/renews-vector/pub.b64 +0 -0
  231. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/renews-vector/receipt.json +0 -0
  232. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/renews-vector/related_b.json +0 -0
  233. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/case.json +0 -0
  234. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/policy.json +0 -0
  235. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/pub.b64 +0 -0
  236. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/receipt.json +0 -0
  237. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/retracts-then-use/related_r.json +0 -0
  238. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/silent-landing/case.json +0 -0
  239. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/silent-landing/pub.b64 +0 -0
  240. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/silent-landing/receipt.json +0 -0
  241. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-malformed/case.json +0 -0
  242. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-malformed/pub.b64 +0 -0
  243. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-malformed/receipt.json +0 -0
  244. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-declared-unresolved/case.json +0 -0
  245. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-declared-unresolved/pub.b64 +0 -0
  246. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-declared-unresolved/receipt.json +0 -0
  247. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/case.json +0 -0
  248. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/policy.json +0 -0
  249. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/pub.b64 +0 -0
  250. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/receipt.json +0 -0
  251. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-unauthorized/related_t.json +0 -0
  252. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/case.json +0 -0
  253. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/policy.json +0 -0
  254. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/pub.b64 +0 -0
  255. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/receipt.json +0 -0
  256. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-blocked/related_t.json +0 -0
  257. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-visible/case.json +0 -0
  258. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-visible/pub.b64 +0 -0
  259. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-visible/receipt.json +0 -0
  260. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-retracts-verified-visible/related_t.json +0 -0
  261. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-supersedes-verified/case.json +0 -0
  262. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-supersedes-verified/pub.b64 +0 -0
  263. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-supersedes-verified/receipt.json +0 -0
  264. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/statement-supersedes-verified/related_t.json +0 -0
  265. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/t1-canonical-invalid-signature/case.json +0 -0
  266. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/t1-canonical-invalid-signature/pub.b64 +0 -0
  267. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/t1-canonical-invalid-signature/receipt.json +0 -0
  268. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-ambiguous/case.json +0 -0
  269. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-ambiguous/pub.b64 +0 -0
  270. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-ambiguous/receipt.json +0 -0
  271. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-ambiguous/related_r0.json +0 -0
  272. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-correct-pass/case.json +0 -0
  273. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-correct-pass/pub.b64 +0 -0
  274. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-correct-pass/receipt.json +0 -0
  275. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-correct-pass/related_r0.json +0 -0
  276. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-mismatch/case.json +0 -0
  277. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-mismatch/pub.b64 +0 -0
  278. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-mismatch/receipt.json +0 -0
  279. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-mismatch/related_r0.json +0 -0
  280. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-missing/case.json +0 -0
  281. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-missing/pub.b64 +0 -0
  282. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-missing/receipt.json +0 -0
  283. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/target-subject-missing/related_r0.json +0 -0
  284. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/unauthorized-signer/case.json +0 -0
  285. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/unauthorized-signer/pub.b64 +0 -0
  286. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/unauthorized-signer/receipt.json +0 -0
  287. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/unauthorized-signer/related_b.json +0 -0
  288. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/valid-baseline/case.json +0 -0
  289. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/valid-baseline/pub.b64 +0 -0
  290. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/valid-baseline/receipt.json +0 -0
  291. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/wrong-payloadtype-target/case.json +0 -0
  292. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/wrong-payloadtype-target/pub.b64 +0 -0
  293. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/wrong-payloadtype-target/receipt.json +0 -0
  294. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/relation/wrong-payloadtype-target/related_t.json +0 -0
  295. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/run_conformance.py +0 -0
  296. {proofbundle-3.8.0 → proofbundle-4.0.0}/conformance/vector_schema.json +0 -0
  297. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/adr/renewal_policy.example.json +0 -0
  298. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/OPEN_QUESTIONS.md +0 -0
  299. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/README.md +0 -0
  300. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/REPRODUCTION_RUNBOOK.md +0 -0
  301. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/calendar_independence.md +0 -0
  302. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/differential_matrix.md +0 -0
  303. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/index.json +0 -0
  304. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/rust_parity_scope.md +0 -0
  305. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/tamper_resistance.md +0 -0
  306. {proofbundle-3.8.0 → proofbundle-4.0.0}/docs/readiness_pack/threat_model_delta_360.md +0 -0
  307. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/README.md +0 -0
  308. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/anchors/chia-datalayer-invalid-root.json +0 -0
  309. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/anchors/chia-datalayer-valid.json +0 -0
  310. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/checkpoint_example.py +0 -0
  311. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/decision_receipt_allow.json +0 -0
  312. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/decision_receipt_deny.json +0 -0
  313. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/decision_receipt_escalate.json +0 -0
  314. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/decision_receipt_with_eval_ref.intoto.json +0 -0
  315. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/eee_receipt.py +0 -0
  316. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/example.tlog-proof +0 -0
  317. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/example_bundle.json +0 -0
  318. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/experimental_enclave.py +0 -0
  319. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/inspect_hook_example.py +0 -0
  320. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/inspect_receipt.py +0 -0
  321. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto/private-model-commitment.statement.json +0 -0
  322. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto/public-model.statement.json +0 -0
  323. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto/release-gate.statement.json +0 -0
  324. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto/svr.statement.json +0 -0
  325. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/intoto_dsse_export.py +0 -0
  326. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/lm_eval_receipt.py +0 -0
  327. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/make_example.py +0 -0
  328. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/persample_audit.py +0 -0
  329. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/pytest_plugin_example.py +0 -0
  330. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/rekor_interop.py +0 -0
  331. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/tlog_proof_example.py +0 -0
  332. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/trust_policy_decision_strict.json +0 -0
  333. {proofbundle-3.8.0 → proofbundle-4.0.0}/examples/trust_policy_strict.json +0 -0
  334. {proofbundle-3.8.0 → proofbundle-4.0.0}/formal/README.md +0 -0
  335. {proofbundle-3.8.0 → proofbundle-4.0.0}/formal/model.py +0 -0
  336. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/action-outcome-v0.1.schema.json +0 -0
  337. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/decision-receipt-v0.1.schema.json +0 -0
  338. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/eval_claim_v0_1.schema.json +0 -0
  339. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/in_toto_statement_v1.schema.json +0 -0
  340. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/proofbundle_v0_1.schema.json +0 -0
  341. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/run-ledger-v0.1.schema.json +0 -0
  342. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/trust-pack-v0.1.schema.json +0 -0
  343. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/trust_policy_v0_1.schema.json +0 -0
  344. {proofbundle-3.8.0 → proofbundle-4.0.0}/schemas/verification-summary-v0.1.schema.json +0 -0
  345. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/_build_anchor_fixture.py +0 -0
  346. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/audit_candidate_matrix.py +0 -0
  347. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/branch_base_check.py +0 -0
  348. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/build_reproducible.py +0 -0
  349. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/check_version_and_changelog.py +0 -0
  350. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/demo.sh +0 -0
  351. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/demo_tamper.sh +0 -0
  352. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/doc_link_check.py +0 -0
  353. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/finding_base_drift.py +0 -0
  354. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/findings_register.py +0 -0
  355. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/fork_pr_secret_isolation.py +0 -0
  356. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/fuzz_soak.py +0 -0
  357. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/gen_findings_register.py +0 -0
  358. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/gen_synthetic_ots_fixture.py +0 -0
  359. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/git-hooks/pre-commit +0 -0
  360. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/install_git_hooks.sh +0 -0
  361. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/mutant_signature_guard.py +0 -0
  362. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/mutation_check.py +0 -0
  363. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/pre_tag_attestation.py +0 -0
  364. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/pre_tag_audit_gate.py +0 -0
  365. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/readiness_pack_gate.py +0 -0
  366. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/readiness_pack_manifest.py +0 -0
  367. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/render_demo.py +0 -0
  368. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/rust_parity_gate.py +0 -0
  369. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/rust_parity_registry.json +0 -0
  370. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/test_manifest_gate.py +0 -0
  371. {proofbundle-3.8.0 → proofbundle-4.0.0}/scripts/type_confusion_gate.py +0 -0
  372. {proofbundle-3.8.0 → proofbundle-4.0.0}/setup.cfg +0 -0
  373. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/_inspect_registry.py +0 -0
  374. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/_integration.py +0 -0
  375. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/_strict_json.py +0 -0
  376. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/__init__.py +0 -0
  377. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/_provenance.py +0 -0
  378. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/eee.py +0 -0
  379. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/inspect_ai.py +0 -0
  380. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/lm_eval.py +0 -0
  381. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/promptfoo.py +0 -0
  382. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/adapters/samples.py +0 -0
  383. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors.py +0 -0
  384. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_chia.py +0 -0
  385. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_chia_add.py +0 -0
  386. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_markovian.py +0 -0
  387. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_ots.py +0 -0
  388. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/anchors_rfc3161.py +0 -0
  389. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/assurance.py +0 -0
  390. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/automation_verdict.py +0 -0
  391. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/beacon.py +0 -0
  392. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/budget.py +0 -0
  393. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/bundle.py +0 -0
  394. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/canonical.py +0 -0
  395. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/decision.py +0 -0
  396. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/demo.py +0 -0
  397. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/dsse.py +0 -0
  398. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/eee_eval_schema.json +0 -0
  399. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/emit.py +0 -0
  400. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/errors.py +0 -0
  401. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/evalcard.py +0 -0
  402. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/evalclaim.py +0 -0
  403. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/evidence_pack.py +0 -0
  404. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/experimental/__init__.py +0 -0
  405. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/experimental/enclave.py +0 -0
  406. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/hashalg.py +0 -0
  407. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/hf_evals.py +0 -0
  408. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/inspect_hook.py +0 -0
  409. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/intoto.py +0 -0
  410. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/kbjwt.py +0 -0
  411. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/merkle.py +0 -0
  412. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/outcome.py +0 -0
  413. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/persample.py +0 -0
  414. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/decision-receipt-template-v1.json +0 -0
  415. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/research-preview-v1.json +0 -0
  416. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/strict-eval-authenticated-root-template-v1.json +0 -0
  417. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/strict-eval-template-v1.json +0 -0
  418. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policies/strict-prereg-template-v1.json +0 -0
  419. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policy.py +0 -0
  420. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/policy_profiles.py +0 -0
  421. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/pqsig.py +0 -0
  422. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/prereg.py +0 -0
  423. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/py.typed +0 -0
  424. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/pytest_plugin.py +0 -0
  425. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/relation.py +0 -0
  426. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/relation_statement.py +0 -0
  427. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/renewal.py +0 -0
  428. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/run_ledger.py +0 -0
  429. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/sdjwt.py +0 -0
  430. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/sdjwt_issue.py +0 -0
  431. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/sdjwt_vc.py +0 -0
  432. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/signature.py +0 -0
  433. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/statuslist.py +0 -0
  434. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/subject_binding.py +0 -0
  435. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/trust_pack.py +0 -0
  436. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle/verification_summary.py +0 -0
  437. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/dependency_links.txt +0 -0
  438. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/entry_points.txt +0 -0
  439. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/requires.txt +0 -0
  440. {proofbundle-3.8.0 → proofbundle-4.0.0}/src/proofbundle.egg-info/top_level.txt +0 -0
  441. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/_beinahe_treffer.py +0 -0
  442. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/conftest.py +0 -0
  443. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/chia_datalayer_proof.json +0 -0
  444. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/freetsa_receipt_anchor.json +0 -0
  445. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/leaf_7271.raw +0 -0
  446. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/markovian_log/proof_7271/proof_7271.tlog-proof +0 -0
  447. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/MANIFEST.json +0 -0
  448. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/README.md +0 -0
  449. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/MANIFEST.json +0 -0
  450. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/README.md +0 -0
  451. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/manifest.json +0 -0
  452. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/rootcommit-01-valid.txt +0 -0
  453. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/rootcommit-02-tampered-root.txt +0 -0
  454. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/rootcommit-03-tampered-wallet.txt +0 -0
  455. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors/rootcommit-04-tampered-proof.txt +0 -0
  456. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/manifest.json +0 -0
  457. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-01-valid.txt +0 -0
  458. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-02-tampered-root.txt +0 -0
  459. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-03-tampered-wallet.txt +0 -0
  460. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-04-tampered-sig.txt +0 -0
  461. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/rootcommit/vectors_sig/v2sig-05-tampered-proof.txt +0 -0
  462. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/01-valid.txt +0 -0
  463. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/02-unknown-id.txt +0 -0
  464. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/03-tampered-body.txt +0 -0
  465. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/04-tampered-proof.txt +0 -0
  466. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/anchors/tlog_bitcoin_anchor/vectors/manifest.json +0 -0
  467. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/PROVENANCE.json +0 -0
  468. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/gosumdb_known_keys.go +0 -0
  469. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/rekor_v2_checkpoint.txt +0 -0
  470. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/sumdb_latest.txt +0 -0
  471. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/checkpoint/trusted_root.json +0 -0
  472. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ed25519_speccheck_cases.LICENSE +0 -0
  473. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ed25519_speccheck_cases.README.md +0 -0
  474. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ed25519_speccheck_cases.json +0 -0
  475. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/eee_arc_easy.json +0 -0
  476. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/inspect_logs/safety_refusal_demo.eval +0 -0
  477. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/lm_eval_arc_easy_real.json +0 -0
  478. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/markovian_anchor_confirmed.json +0 -0
  479. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/mldsa_acvp/PROVENANCE.json +0 -0
  480. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/mldsa_acvp/mldsa_sigver_slice.json +0 -0
  481. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/PROVENANCE.json +0 -0
  482. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/block358391.json +0 -0
  483. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/hello-world.txt +0 -0
  484. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/hello-world.txt.ots +0 -0
  485. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/incomplete.txt +0 -0
  486. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/incomplete.txt.ots +0 -0
  487. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/known-and-unknown-notary.txt +0 -0
  488. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/known-and-unknown-notary.txt.ots +0 -0
  489. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/merkle2.txt +0 -0
  490. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/merkle2.txt.ots +0 -0
  491. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/synthetic-upgraded-sha256.block.json +0 -0
  492. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/synthetic-upgraded-sha256.txt +0 -0
  493. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/synthetic-upgraded-sha256.txt.ots +0 -0
  494. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/two-calendars.txt +0 -0
  495. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/ots/two-calendars.txt.ots +0 -0
  496. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/promptfoo_results_v3.json +0 -0
  497. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/rekor_inclusion_25579.json +0 -0
  498. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/rfc6962_vectors.json +0 -0
  499. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwt_disclosure_vector.json +0 -0
  500. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwt_reference_eddsa.json +0 -0
  501. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwtvc/PROVENANCE.json +0 -0
  502. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwtvc/sdjwtvc_examples.txt +0 -0
  503. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/fixtures/sdjwtvc/sdjwtvc_issuer_pubkey.json +0 -0
  504. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_adapters.py +0 -0
  505. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_adversarial.py +0 -0
  506. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchor_hardening_321.py +0 -0
  507. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchor_longevity_property.py +0 -0
  508. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchor_target_trustedtime.py +0 -0
  509. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_chia.py +0 -0
  510. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_chia_add.py +0 -0
  511. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_chia_claims.py +0 -0
  512. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_generic.py +0 -0
  513. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_markovian.py +0 -0
  514. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_ots.py +0 -0
  515. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_rfc3161.py +0 -0
  516. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_rfc3161_type_floor.py +0 -0
  517. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_anchors_rootcommit.py +0 -0
  518. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_assurance.py +0 -0
  519. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_audit_candidate_360.py +0 -0
  520. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_audit_index_zahlen_stimmen.py +0 -0
  521. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_audit_marker_line_wrap.py +0 -0
  522. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_automation_verdict.py +0 -0
  523. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_beacon.py +0 -0
  524. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_branch_base_check.py +0 -0
  525. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_budget.py +0 -0
  526. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_bughunt_361_automation_failopen.py +0 -0
  527. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_bundle.py +0 -0
  528. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_bundle_robustness.py +0 -0
  529. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_canonical.py +0 -0
  530. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_checkpoint.py +0 -0
  531. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_checkpoint_external_vectors.py +0 -0
  532. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_checkpoint_quorum_property.py +0 -0
  533. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_claims_hygiene.py +0 -0
  534. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cli.py +0 -0
  535. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cli_eval.py +0 -0
  536. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cli_require_anchor.py +0 -0
  537. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_conformance.py +0 -0
  538. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_conformance_retention_361.py +0 -0
  539. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_content_root_property.py +0 -0
  540. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cosignature.py +0 -0
  541. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cosignature_mldsa.py +0 -0
  542. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_cross_format_singleton_361.py +0 -0
  543. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_anchors.py +0 -0
  544. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_cli.py +0 -0
  545. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_evidence.py +0 -0
  546. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_fuzz.py +0 -0
  547. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_hardening.py +0 -0
  548. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_policy.py +0 -0
  549. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_schema.py +0 -0
  550. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_validator_api.py +0 -0
  551. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_decision_verify.py +0 -0
  552. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_demo.py +0 -0
  553. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_docs_truth.py +0 -0
  554. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_dsse_adversarial.py +0 -0
  555. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_dup_key_reject.py +0 -0
  556. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_ed25519_semantics.py +0 -0
  557. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_eee.py +0 -0
  558. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_emit.py +0 -0
  559. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_enclave_assurance.py +0 -0
  560. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_erwartungsvergleich_population_guard.py +0 -0
  561. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_eval_claim_schema.py +0 -0
  562. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_eval_evidence_class.py +0 -0
  563. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_evalcard.py +0 -0
  564. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_evalclaim.py +0 -0
  565. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_evidence_pack.py +0 -0
  566. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_examples.py +0 -0
  567. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_experimental_enclave.py +0 -0
  568. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_findings_register_identity_axis.py +0 -0
  569. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_findings_register_rt10.py +0 -0
  570. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_fork_pr_secret_isolation.py +0 -0
  571. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_fuzz_parsers.py +0 -0
  572. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_fuzz_soak_regression.py +0 -0
  573. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_hashalg.py +0 -0
  574. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_hf_entry_verify_eee_digest.py +0 -0
  575. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_hf_evals.py +0 -0
  576. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_inspect_hook.py +0 -0
  577. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto.py +0 -0
  578. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_claims_hygiene.py +0 -0
  579. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_content_root_migration.py +0 -0
  580. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_dsse.py +0 -0
  581. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_eval_result.py +0 -0
  582. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_examples.py +0 -0
  583. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_spec_diff.py +0 -0
  584. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_intoto_svr.py +0 -0
  585. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_jcs_mandatory_361.py +0 -0
  586. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_kbjwt.py +0 -0
  587. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_legacy_assurance_deprecation_361.py +0 -0
  588. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_lens_review_fixes_3_1_3.py +0 -0
  589. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_load_signer_fd_hazard.py +0 -0
  590. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_manifest_lock.json +0 -0
  591. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_merkle.py +0 -0
  592. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_merkle_consistency_property.py +0 -0
  593. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_merkle_property.py +0 -0
  594. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_mldsa_acvp_vectors.py +0 -0
  595. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_mutant_signature_guard.py +0 -0
  596. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_mutation_isolation.py +0 -0
  597. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_361.py +0 -0
  598. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_population_guard.py +0 -0
  599. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_primary_arg_property.py +0 -0
  600. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_recursion_361.py +0 -0
  601. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_never_raise_surface_family_property.py +0 -0
  602. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_official_vectors.py +0 -0
  603. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_ok_semantics.py +0 -0
  604. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_ots_calendar_hardening.py +0 -0
  605. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_ots_external_vectors.py +0 -0
  606. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_outcome_receiver_corroboration.py +0 -0
  607. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_outcome_verify.py +0 -0
  608. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_oversized_int_guard.py +0 -0
  609. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_path_argument_type_floor.py +0 -0
  610. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_persample.py +0 -0
  611. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pinned_key_validation.py +0 -0
  612. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_policy_explain_lint.py +0 -0
  613. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_policy_lifecycle_purpose.py +0 -0
  614. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_policy_profiles.py +0 -0
  615. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_policy_templates.py +0 -0
  616. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pqsig.py +0 -0
  617. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pre_tag_attestation.py +0 -0
  618. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pre_tag_audit_provenance.py +0 -0
  619. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pre_tag_gate_eigenschaften.py +0 -0
  620. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_predicate_type_enforcement.py +0 -0
  621. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_prereg.py +0 -0
  622. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_promptfoo.py +0 -0
  623. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_provenance.py +0 -0
  624. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_public_transparency.py +0 -0
  625. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_pytest_plugin.py +0 -0
  626. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_rekor_interop.py +0 -0
  627. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_gate_distance_invariance.py +0 -0
  628. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_profile.py +0 -0
  629. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_property.py +0 -0
  630. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_same_key_361.py +0 -0
  631. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_signer_target_340.py +0 -0
  632. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_statement.py +0 -0
  633. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_statement_rust_parity.py +0 -0
  634. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_relation_subject_pin_361.py +0 -0
  635. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_release_integrity_gate.py +0 -0
  636. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_renewal.py +0 -0
  637. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_renewal_external_token_glue.py +0 -0
  638. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_renewal_policy.py +0 -0
  639. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_renewal_signed.py +0 -0
  640. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_reproducible_build_361.py +0 -0
  641. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_rfc6962_external_vectors.py +0 -0
  642. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_roadmap_frontload_foundations.py +0 -0
  643. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_root_authenticity.py +0 -0
  644. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_run_ledger.py +0 -0
  645. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_rust_parity_gate.py +0 -0
  646. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_schema.py +0 -0
  647. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_schema_parity.py +0 -0
  648. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdist_packaging_361.py +0 -0
  649. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdist_selftest_derivation.py +0 -0
  650. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_adversarial.py +0 -0
  651. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_duplicate_cnf.py +0 -0
  652. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_issue.py +0 -0
  653. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_reference.py +0 -0
  654. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_resource_budget.py +0 -0
  655. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_vc.py +0 -0
  656. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwt_verify_binding.py +0 -0
  657. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sdjwtvc_external_vectors.py +0 -0
  658. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_sibling_never_raise_361.py +0 -0
  659. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_signature.py +0 -0
  660. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_statuslist.py +0 -0
  661. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_structural_budget_reachability.py +0 -0
  662. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_subject_binding.py +0 -0
  663. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_tlogproof.py +0 -0
  664. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_tree_context_authenticity.py +0 -0
  665. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_pack.py +0 -0
  666. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_pack_crypto_agility.py +0 -0
  667. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_pack_outcome_receivers_role.py +0 -0
  668. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_pack_payloadtype_negatives.py +0 -0
  669. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_trust_policy.py +0 -0
  670. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_verification_summary.py +0 -0
  671. {proofbundle-3.8.0 → proofbundle-4.0.0}/tests/test_verify_matrix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proofbundle
3
- Version: 3.8.0
3
+ Version: 4.0.0
4
4
  Summary: Emit and verify portable cryptographic evidence bundles, offline: Ed25519 + RFC 6962 Merkle + optional SD-JWT.
5
5
  Author: Konrad Gruszka
6
6
  License: MIT
@@ -46,9 +46,10 @@ internal gate (see `REPRODUCTION_RUNBOOK.md`) is a precondition for this review,
46
46
 
47
47
  ## F. The one remaining gate to stable
48
48
 
49
- The single deliberately-open acceptance criterion is "external audit completed". 4.0.0-stable = this
50
- pack + the external audit ABSCHLUSS + findings closed/accepted + relation wire-freeze. Nothing in this
51
- repository can flip that bit; only the external reviewer can.
49
+ The single deliberately-open acceptance criterion is "external audit completed". That trustworthy stable
50
+ state = this pack + the external audit ABSCHLUSS + findings closed/accepted + relation wire-freeze. It is
51
+ defined by those facts, not by a version number — the audit is decoupled from the version line and
52
+ carries no version label. Nothing in this repository can flip that bit; only the external reviewer can.
52
53
 
53
54
  ## G. Known limitations of the audit-candidate matrix instrument itself (No-Fake, self-declared)
54
55
 
@@ -1,6 +1,6 @@
1
- e6e2f1ca00c1798975005315172248db3ee8fefb02b978cd12627c526dd5dc60 AUDITOR_OPEN_POINTS.md
1
+ c9118da583581c150090ddeef9932b8082690a8854320f41a553a3dc60835ed1 AUDITOR_OPEN_POINTS.md
2
2
  3d66a85ff79c0258d794e7c8d8740f8a3b7a62e6ffd9bd7dada158a939964660 OPEN_QUESTIONS.md
3
- f9079c57df7b037f3c4a30137c5305de42c46cb12bf1c620f6ea5ce1b7c42c82 PROGRESS.md
3
+ 90644ce0e08fdecb8f3076b1b0121b490dbb0ba57e03e9dd700c83d3f785e1a5 PROGRESS.md
4
4
  6ccab20c7daef6d71c13e0dcacba24a6a18dd480b5d41418e01b5bf2983ffc9c README.md
5
5
  c9ceb3f92a2f720d901affa8defb47004b58a51029317208db641ce53d90b284 REPRODUCTION_RUNBOOK.md
6
6
  1b4e4316aaea6c962664fc08945c65a048147fdc4ad89a1e694818b934ef6fa2 calendar_independence.md
@@ -1,8 +1,10 @@
1
1
  # Honest progress accounting (No-Overclaim)
2
2
 
3
- The denominator is the full distance from the 3.3.0 baseline (current release: 3.8.0) to "4.0.0-stable, externally audited,
4
- trustworthy". This is a factual progress statement, not a forward promise, and it is deliberately
5
- placed in the readiness pack so an auditor reads our own honest number before forming theirs.
3
+ The denominator is the full distance from the 3.3.0 baseline (current release: 4.0.0) to the externally
4
+ audited, trustworthy state. That state is defined by audit completion and closed findings, not by any
5
+ version number the audit is decoupled from the version line and happens when maturity is reached,
6
+ whatever version is current then. This is a factual progress statement, not a forward promise, and it is
7
+ deliberately placed in the readiness pack so an auditor reads our own honest number before forming theirs.
6
8
 
7
9
  ## Achievable in advance (internal, machine-checkable, no external party): ~85%
8
10
 
@@ -21,7 +23,7 @@ placed in the readiness pack so an auditor reads our own honest number before fo
21
23
  reviewer such as Loek; in-toto maintainer guidance; first outside users). Our side is preparable;
22
24
  the other side is not.
23
25
  - **~2% irreducible ceiling** (a full TEE-attestation path, whole-program verification, side-channel
24
- freedom) — deliberately outside 4.0.0, a permanent external/research remainder.
26
+ freedom) — deliberately outside the audit scope, a permanent external/research remainder.
25
27
 
26
28
  ## Consequence
27
29
 
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "schema": "proofbundle/v0.1",
3
- "payload_b64": "ZTZlMmYxY2EwMGMxNzk4OTc1MDA1MzE1MTcyMjQ4ZGIzZWU4ZmVmYjAyYjk3OGNkMTI2MjdjNTI2ZGQ1ZGM2MCAgQVVESVRPUl9PUEVOX1BPSU5UUy5tZAozZDY2YTg1ZmY3OWMwMjU4ZDc5NGU3YzhkODc0MGY4YTNiN2E2MmU2ZmZkOWJkN2RhZGExNThhOTM5OTY0NjYwICBPUEVOX1FVRVNUSU9OUy5tZApmOTA3OWM1N2RmN2IwMzdmM2M0YTMwMTM3YzUzMDVkZTQyYzQ2Y2IxMmJmMWM2MjBmNmVhNWNlMWI3YzQyYzgyICBQUk9HUkVTUy5tZAo2Y2NhYjIwYzdkYWVmNmQ3MWMxM2UwZGNhY2JhMjRhNmExOGRkNDgwYjVkNDE0MThlMDFiNWJmMjk4M2ZmYzljICBSRUFETUUubWQKYzljZWIzZjkyYTJmNzIwZDkwMWFmZmE4ZGVmYjQ3MDA0YjU4YTUxMDI5MzE3MjA4ZGI2NDFjZTUzZDkwYjI4NCAgUkVQUk9EVUNUSU9OX1JVTkJPT0subWQKMWI0ZTQzMTZhYWVhNmM5NjI2NjRmYzA4OTQ1YzY1YTA0ODE0N2ZkYzRhZDg5YTFlNjk0ODE4YjkzNGVmNmZhMiAgY2FsZW5kYXJfaW5kZXBlbmRlbmNlLm1kCjlhOWE5ZTQ5NTYwNzZjNmMyODdkYWRhNWRlODJlYjY2Y2YyNTljZWM4OWE2ZTc5MTA4OGUxNzMzYTc0YzVlYTMgIGRpZmZlcmVudGlhbF9tYXRyaXgubWQKNDI2YTIyYmQ5MWM3YTc1Mjk3MDBjMDY1NzBhM2U1NWZiNGMxMTI4MTk5MmQ2MjE1ZmMyMzE1YjEyNzMxZjljZCAgaW5kZXguanNvbgpkMWQxZTA0ZTlkMmRlMzg0NDNlYzJiOTUzYzNhOWM5NjhhMzAzZTgxOTc3Y2I3ZTEyODQ2ODk0NTE2MGI1NmQ3ICBydXN0X3Bhcml0eV9zY29wZS5tZApmMmE3N2NhY2Q3ZmVmZTM5NDUwZWRiMTg1N2VjMmZmYzI1YTRkNGMzZDhkNjhlZmEwOTRiYTg0YWI3MzI1NzA4ICB0YW1wZXJfcmVzaXN0YW5jZS5tZAo2ZDZhNDA2NWExZTdlMDcxODE5OTYwY2VmOGUwMTE3YWRhOThlOTMxY2Q2MmZkOTQzNDFiNDVhZjQ4NjU3MTFhICB0aHJlYXRfbW9kZWxfZGVsdGFfMzYwLm1kCg==",
3
+ "payload_b64": "YzkxMThkYTU4MzU4MWMxNTAwOTBkZGVlZjk5MzJiODA4MjY5MGE4ODU0MzIwZjQxYTU1M2EzZGM2MDgzNWVkMSAgQVVESVRPUl9PUEVOX1BPSU5UUy5tZAozZDY2YTg1ZmY3OWMwMjU4ZDc5NGU3YzhkODc0MGY4YTNiN2E2MmU2ZmZkOWJkN2RhZGExNThhOTM5OTY0NjYwICBPUEVOX1FVRVNUSU9OUy5tZAo5MDY0NGNlMGUwOGZkZWNiOGYzMDc2YjFiMDEyMWI0OTBkYmIwYmE1N2UwM2U5ZGQ3MDBjODNkM2Y3ODVlMWE1ICBQUk9HUkVTUy5tZAo2Y2NhYjIwYzdkYWVmNmQ3MWMxM2UwZGNhY2JhMjRhNmExOGRkNDgwYjVkNDE0MThlMDFiNWJmMjk4M2ZmYzljICBSRUFETUUubWQKYzljZWIzZjkyYTJmNzIwZDkwMWFmZmE4ZGVmYjQ3MDA0YjU4YTUxMDI5MzE3MjA4ZGI2NDFjZTUzZDkwYjI4NCAgUkVQUk9EVUNUSU9OX1JVTkJPT0subWQKMWI0ZTQzMTZhYWVhNmM5NjI2NjRmYzA4OTQ1YzY1YTA0ODE0N2ZkYzRhZDg5YTFlNjk0ODE4YjkzNGVmNmZhMiAgY2FsZW5kYXJfaW5kZXBlbmRlbmNlLm1kCjlhOWE5ZTQ5NTYwNzZjNmMyODdkYWRhNWRlODJlYjY2Y2YyNTljZWM4OWE2ZTc5MTA4OGUxNzMzYTc0YzVlYTMgIGRpZmZlcmVudGlhbF9tYXRyaXgubWQKNDI2YTIyYmQ5MWM3YTc1Mjk3MDBjMDY1NzBhM2U1NWZiNGMxMTI4MTk5MmQ2MjE1ZmMyMzE1YjEyNzMxZjljZCAgaW5kZXguanNvbgpkMWQxZTA0ZTlkMmRlMzg0NDNlYzJiOTUzYzNhOWM5NjhhMzAzZTgxOTc3Y2I3ZTEyODQ2ODk0NTE2MGI1NmQ3ICBydXN0X3Bhcml0eV9zY29wZS5tZApmMmE3N2NhY2Q3ZmVmZTM5NDUwZWRiMTg1N2VjMmZmYzI1YTRkNGMzZDhkNjhlZmEwOTRiYTg0YWI3MzI1NzA4ICB0YW1wZXJfcmVzaXN0YW5jZS5tZAo2ZDZhNDA2NWExZTdlMDcxODE5OTYwY2VmOGUwMTE3YWRhOThlOTMxY2Q2MmZkOTQzNDFiNDVhZjQ4NjU3MTFhICB0aHJlYXRfbW9kZWxfZGVsdGFfMzYwLm1kCg==",
4
4
  "signature": {
5
5
  "alg": "ed25519",
6
- "public_key_b64": "GB+LMY2k3nnr1Cm64iVJLLMdiEstoP4DGflIXXN2/2Q=",
7
- "sig_b64": "sgKuvyQ1j477RZ2MARU89S9oiopJkI7yfwRjeyTRj1P6N3N5rCMAEyMwhVvN5vupfwDo/CaJO/dVdZs3VribAA=="
6
+ "public_key_b64": "nw4HE+7lk4peNaNMHeejmVYEANGW9WuR/GernA852JQ=",
7
+ "sig_b64": "HQiW4MHVH14fwTISNergEngB1pQqyQZBSg7O/mhymub0aoqz2Ls/7jKfWtM/piQxiUAd1WxlkgL9UjOwkC2SAQ=="
8
8
  },
9
9
  "merkle": {
10
10
  "hash_alg": "sha256-rfc6962",
11
11
  "leaf_index": 0,
12
12
  "tree_size": 1,
13
13
  "inclusion_proof_b64": [],
14
- "root_b64": "jaW3qlMpoFggIW4V2uP4mdPOw3prJdMP0Mc6BXihy2o="
14
+ "root_b64": "oan5ljNnHVL4j/dVo1B5EIDeqMxF9w7AZmi7eaazKkk="
15
15
  }
16
16
  }
@@ -0,0 +1 @@
1
+ nw4HE+7lk4peNaNMHeejmVYEANGW9WuR/GernA852JQ=
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "proofbundle"
7
- version = "3.8.0"
7
+ version = "4.0.0"
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"
@@ -45,9 +45,10 @@ _DEFAULT_DOCS = [
45
45
  "docs/predicates/README.md", "docs/predicates/action-outcome.md", "docs/predicates/decision-receipt.md",
46
46
  "docs/predicates/run-ledger.md", "docs/predicates/trust-pack.md", "docs/predicates/verification-summary.md",
47
47
  "docs/SDJWT_VC_PROFILE.md", "docs/SUBJECT_BINDING.md",
48
- # 3.6.0 audit-candidate readiness-pack reviewer docs (capability-claim genre, same discipline).
49
- # PROGRESS.md is deliberately NOT here: it QUOTES the future goal "4.0.0-stable, externally audited"
50
- # as an honest denominator, which the audit-candidate forbidden list would false-positive on.
48
+ # Audit-candidate readiness-pack reviewer docs (capability-claim genre, same discipline).
49
+ # PROGRESS.md is deliberately NOT here: it QUOTES the future goal "the externally audited, trustworthy
50
+ # state" as an honest denominator (version-free the audit is decoupled from the version line, Owner
51
+ # 2026-08-17), which the audit-candidate forbidden list would false-positive on.
51
52
  "docs/readiness_pack/AUDITOR_OPEN_POINTS.md", "docs/readiness_pack/threat_model_delta_360.md",
52
53
  "docs/readiness_pack/rust_parity_scope.md", "docs/readiness_pack/differential_matrix.md",
53
54
  "docs/readiness_pack/REPRODUCTION_RUNBOOK.md",
@@ -13,7 +13,7 @@ from __future__ import annotations
13
13
 
14
14
  from typing import TYPE_CHECKING
15
15
 
16
- __version__ = "3.8.0"
16
+ __version__ = "4.0.0"
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
@@ -156,7 +156,14 @@ def verify_rootcommit_v1(checkpoint_text: str, *, frozen: Optional[dict] = None,
156
156
  return {"known_anchors": known, "binding": False, "reject": True, "status": "bad_opaque",
157
157
  "detail": "rootcommit/v1 opaque is not 0x01 || wlen || wallet || ots"}
158
158
  wallet, ots = parsed
159
- commitment = hashlib.sha256(build_preimage(origin, size, root, wallet)).digest()
159
+ # DEEP-GATE re-gate F-8 neighbour: build_preimage encodes attacker-controlled checkpoint fields to
160
+ # UTF-8; a lone-surrogate origin/wallet would raise a raw UnicodeEncodeError out of this "never a raw
161
+ # exception" surface (docstring on _iter helper). Fail closed to the same malformed verdict instead.
162
+ try:
163
+ commitment = hashlib.sha256(build_preimage(origin, size, root, wallet)).digest()
164
+ except (UnicodeError, ValueError, TypeError):
165
+ return {"known_anchors": known, "binding": False, "reject": True, "status": "malformed_checkpoint",
166
+ "detail": "checkpoint field is not UTF-8 encodable (surrogate/non-encodable), fail-closed"}
160
167
  b = _binding_status(ots, commitment, frozen=frozen, rp_trust=rp_trust)
161
168
  bound = b["status"] not in ("unbound", "malformed", "no_lib")
162
169
  return {"known_anchors": known, "binding": bound, "reject": not bound,
@@ -250,7 +257,13 @@ def verify_rootcommit_v2sig(checkpoint_text: str, *, frozen: Optional[dict] = No
250
257
  if parsed is None:
251
258
  return {"known_anchors": known, "binding": False, "sig_ok": None, "reject": True, "status": "bad_opaque"}
252
259
  wallet, sig, ots = parsed
253
- commitment = hashlib.sha256(build_preimage(origin, size, root, wallet, tag=TAG_V1)).digest()
260
+ # DEEP-GATE re-gate F-8 neighbour (as in verify_rootcommit_v1): fail closed on a non-encodable field.
261
+ try:
262
+ commitment = hashlib.sha256(build_preimage(origin, size, root, wallet, tag=TAG_V1)).digest()
263
+ except (UnicodeError, ValueError, TypeError):
264
+ return {"known_anchors": known, "binding": False, "sig_ok": None, "reject": True,
265
+ "status": "malformed_checkpoint",
266
+ "detail": "checkpoint field is not UTF-8 encodable (surrogate/non-encodable), fail-closed"}
254
267
  b = _binding_status(ots, commitment, frozen=frozen, rp_trust=rp_trust)
255
268
  bound = b["status"] not in ("unbound", "malformed", "no_lib")
256
269
  # signature: EIP-191 recover over (tag + '\n' + commitment_hex) must equal the bound wallet (dep-gated)
@@ -49,20 +49,66 @@ def _root_std_b64(root: bytes) -> str:
49
49
  return base64.b64encode(root).decode("ascii")
50
50
 
51
51
 
52
+ def _origin_wellformed(origin: str) -> bool:
53
+ """An origin / note identity safe for the EXACT origin-quorum compare: printable ASCII only, no '+'
54
+ (the vkey separator), no leading/trailing space and no double space. A single internal ASCII space
55
+ is allowed so Go sumdb's `go.sum database tree` verifies; a witness NAME carries no space at all
56
+ (enforced), so a spaced origin still cannot equal one.
57
+
58
+ Printable-ASCII is the POSITIVE, non-enumerated rule that closes the whole invisible/look-alike
59
+ CLASS at once, instead of chasing one Unicode category per round (Deep-Gate F-1 zero-width → re-gate
60
+ NBSP → re-gate variation-selectors/Default-Ignorable/appended-space). None of those can cloak an
61
+ origin into looking like a witness name it then escapes the exclusion under, because none is
62
+ printable ASCII: a zero-width (Cf), a Default_Ignorable letter (Hangul filler, category Lo), a
63
+ variation selector or combining mark (Mn), a NBSP or other non-plain whitespace (Zs), a control char
64
+ (Cc) — all rejected. Measured against every shipped external vector (Go sumdb, Rekor, rootcommit,
65
+ Colin's fixtures): all pass. Honest scope: this also refuses a non-ASCII (IDN/Unicode) origin, a
66
+ deliberate restriction for the verifier's identity compare; no real tlog origin is non-ASCII."""
67
+ # DEEP-GATE 4.0.0 re-gate iter5 (never-raise, caller-contract): a non-str origin (None/int/list from a
68
+ # caller that built it from an upstream JSON field) reached `.isascii()` and raised a raw AttributeError
69
+ # out of every public constructor/cosign surface that routes identity through this helper. Same
70
+ # isinstance(str) guard the parse helpers already carry — validate the TYPE before the content.
71
+ if not isinstance(origin, str):
72
+ return False
73
+ if not origin or "+" in origin:
74
+ return False
75
+ if not (origin.isascii() and origin.isprintable()):
76
+ return False
77
+ return origin == origin.strip() and " " not in origin
78
+
79
+
80
+ def _witness_name_wellformed(name: str) -> bool:
81
+ """A witness NAME safe for the exact compare: non-empty printable ASCII, no '+', no space at all
82
+ (a schemeless identity). Stricter than an origin, which allows internal spaces — the emit path
83
+ (cosign_checkpoint / _mldsa) always required this; :func:`_parse_witness_vkey` now enforces it on
84
+ the verify path too, so a name cloaked with any whitespace or invisible character cannot parse."""
85
+ return (isinstance(name, str) and bool(name) and "+" not in name and " " not in name
86
+ and name.isascii() and name.isprintable())
87
+
88
+
52
89
  def checkpoint_note(origin: str, tree_size: int, root: bytes) -> str:
53
90
  """Build the C2SP checkpoint note text (3 lines + trailing newline). ``root`` is the raw RFC 6962
54
91
  Merkle root bytes at ``tree_size``. ``origin`` must be non-empty with no spaces/'+' (a schemeless URL)."""
55
- if not origin or "+" in origin or any(c.isspace() for c in origin):
56
- raise BundleFormatError("checkpoint origin must be a non-empty schemeless id without whitespace or '+'")
92
+ if not _origin_wellformed(origin):
93
+ raise BundleFormatError("checkpoint origin must be a printable-ASCII schemeless id without "
94
+ "edge/double spaces, invisible characters, or '+'")
57
95
  if isinstance(tree_size, bool) or not isinstance(tree_size, int) or tree_size < 0:
58
96
  raise BundleFormatError("checkpoint tree_size must be a non-negative integer")
97
+ if not isinstance(root, bytes): # iter5 never-raise: a non-bytes root raised raw TypeError from b64encode
98
+ raise BundleFormatError("checkpoint root must be raw bytes")
59
99
  return f"{origin}\n{tree_size}\n{_root_std_b64(root)}\n"
60
100
 
61
101
 
62
102
  def key_id(keyname: str, pubkey: bytes) -> bytes:
63
103
  """C2SP note key ID = first 4 bytes of SHA-256(keyname ‖ 0x0A ‖ 0x01 ‖ 32-byte-Ed25519-pubkey)."""
64
- if len(pubkey) != 32:
104
+ if not isinstance(pubkey, bytes) or len(pubkey) != 32:
65
105
  raise BundleFormatError("Ed25519 public key must be 32 raw bytes")
106
+ # DEEP-GATE re-gate F-8/F-10: the log key name is the third identity slot (with origin and witness
107
+ # name); it is encoded into the keyID, so a surrogate name would raise a raw UnicodeEncodeError
108
+ # out of this public helper, and a zero-width/invisible name would substitute for a real one.
109
+ # Same printable-ASCII rule as origin/witness name — closed at the source that does the encode.
110
+ if not _witness_name_wellformed(keyname):
111
+ raise BundleFormatError("key name must be a printable-ASCII identity without spaces or invisible characters")
66
112
  h = hashlib.sha256(keyname.encode("utf-8") + b"\n" + bytes([_ED25519_SIG_TYPE]) + pubkey).digest()
67
113
  return h[:4]
68
114
 
@@ -79,8 +125,9 @@ def sign_checkpoint(origin: str, tree_size: int, root: bytes, signer, keyname: s
79
125
  """Produce a signed C2SP checkpoint note. ``signer`` is an Ed25519 private key whose public key must
80
126
  correspond to ``keyname``. The signature is over the RAW note-text bytes (including the trailing
81
127
  newline), never over base64 and never PAE-wrapped."""
82
- if not keyname or "+" in keyname or any(c.isspace() for c in keyname):
83
- raise BundleFormatError("checkpoint keyname must be non-empty without whitespace or '+'")
128
+ if not _witness_name_wellformed(keyname):
129
+ raise BundleFormatError("checkpoint keyname must be a printable-ASCII identity "
130
+ "without spaces, invisible characters, or '+'")
84
131
  note = checkpoint_note(origin, tree_size, root)
85
132
  pubkey = signer.public_key().public_bytes(Encoding.Raw, PublicFormat.Raw)
86
133
  sig = signer.sign(note.encode("utf-8"))
@@ -103,6 +150,10 @@ def _parse_vkey(vkey_str: str, sig_type: int = _ED25519_SIG_TYPE) -> tuple[str,
103
150
  if len(parts) != 3:
104
151
  raise BundleFormatError("vkey must have 3 '+'-separated parts (name+hexKeyID+base64KeyMaterial)")
105
152
  name, kid_hex, keymat_b64 = parts
153
+ # DEEP-GATE re-gate F-8: the log vkey NAME is encoded into key_id below; a surrogate name would
154
+ # raise UnicodeEncodeError and an invisible one would substitute — same rule as the witness vkey.
155
+ if not _witness_name_wellformed(name):
156
+ raise BundleFormatError("vkey name must be a printable-ASCII identity without spaces or invisible characters")
106
157
  try:
107
158
  keymat = base64.b64decode(keymat_b64, validate=True)
108
159
  except (ValueError, TypeError) as exc:
@@ -145,17 +196,33 @@ def verify_checkpoint(signed_note: str, vkey_str: str) -> dict:
145
196
  raise BundleFormatError("signed note has no empty-line separator between text and signatures")
146
197
  note_text, sig_block = signed_note.split("\n\n", 1)
147
198
  note_text += "\n" # restore the trailing newline that belongs to the note text
148
- note_bytes = note_text.encode("utf-8")
149
199
  lines = note_text.split("\n")
150
200
  if len(lines) < 4 or not lines[0] or not lines[1] or not lines[2]:
151
201
  raise BundleFormatError("checkpoint note must have at least 3 non-empty lines")
152
202
  origin, size_s, root_b64 = lines[0], lines[1], lines[2]
203
+ # DEEP-GATE F-1 + re-gate (2026-08-17): the origin must be a printable-ASCII identity with no
204
+ # edge/double space, so it cannot cloak a witness name it would then escape the origin-quorum
205
+ # exclusion under (via zero-width, Default-Ignorable, variation selector, NBSP or an appended
206
+ # space). Positive rule = the whole class, not one category per round. Go sumdb / Rekor stay valid.
207
+ if not _origin_wellformed(origin):
208
+ raise BundleFormatError("checkpoint origin must be a printable-ASCII identity without "
209
+ "edge/double spaces, invisible characters, or '+' (malformed)")
153
210
  if len(size_s) > 20 or (size_s != "0" and (size_s.startswith("0") or not (size_s.isascii() and size_s.isdigit()))):
154
211
  raise BundleFormatError("checkpoint tree size must be ASCII decimal with no leading zeros")
155
212
  try:
156
213
  root = base64.b64decode(root_b64, validate=True)
157
214
  except (ValueError, TypeError) as exc:
158
215
  raise BundleFormatError("checkpoint root is not valid standard base64") from exc
216
+ # DEEP-GATE 4.0.0 re-gate (D2/D3): the note-text encode was ABOVE this block, so a lone/unpaired
217
+ # UTF-16 surrogate anywhere in the note (a str survives splitting but is not valid UTF-8) raised a
218
+ # raw UnicodeEncodeError out of verify_witnessed_checkpoint / evaluate_public_transparency — the one
219
+ # verify_checkpoint instance the F-8/F-10 validate-before-encode re-gates missed (verify_tlog_proof
220
+ # already wraps its call; the sibling _note_text_of already validates first). Encode AFTER the string
221
+ # validation, and fail-closed on any residual non-UTF-8 note text (e.g. a surrogate in an extension line).
222
+ try:
223
+ note_bytes = note_text.encode("utf-8")
224
+ except UnicodeEncodeError as exc:
225
+ raise BundleFormatError("checkpoint note text is not valid UTF-8 (malformed, fail-closed)") from exc
159
226
 
160
227
  ok = False
161
228
  # WAR DER SCHLUESSEL UEBERHAUPT DABEI? Diese Unterscheidung entsteht in der Schleife unten und
@@ -228,8 +295,14 @@ def root_bytes_from_b64(root_b64: str) -> Optional[bytes]:
228
295
 
229
296
  def cosign_key_id(witness_name: str, pubkey: bytes) -> bytes:
230
297
  """Cosignature/v1 key ID = SHA-256(name ‖ 0x0A ‖ 0x04 ‖ 32-byte-Ed25519-pubkey)[:4]."""
231
- if len(pubkey) != 32:
298
+ if not isinstance(pubkey, bytes) or len(pubkey) != 32:
232
299
  raise BundleFormatError("Ed25519 public key must be 32 raw bytes")
300
+ # DEEP-GATE re-gate F-8/F-10: the witness name is the third identity slot (with origin and witness
301
+ # name); it is encoded into the keyID, so a surrogate name would raise a raw UnicodeEncodeError
302
+ # out of this public helper, and a zero-width/invisible name would substitute for a real one.
303
+ # Same printable-ASCII rule as origin/witness name — closed at the source that does the encode.
304
+ if not _witness_name_wellformed(witness_name):
305
+ raise BundleFormatError("witness name must be a printable-ASCII identity without spaces or invisible characters")
233
306
  h = hashlib.sha256(witness_name.encode("utf-8") + b"\n"
234
307
  + bytes([_COSIG_V1_SIG_TYPE]) + pubkey).digest()
235
308
  return h[:4]
@@ -255,6 +328,37 @@ def _note_text_of(signed_note: str) -> str:
255
328
  lines = note_text.split("\n")
256
329
  if len(lines) < 4 or not lines[0] or not lines[1] or not lines[2]:
257
330
  raise BundleFormatError("checkpoint note must have at least 3 non-empty lines")
331
+ # DEEP-GATE F-1 + re-gate: reject a cloaked origin here too, so every consumer of the note body
332
+ # (verify_cosignature, witness_quorum's origin extraction) sees an exact-comparable identity.
333
+ if not _origin_wellformed(lines[0]):
334
+ raise BundleFormatError("checkpoint origin must be a printable-ASCII identity without "
335
+ "edge/double spaces, invisible characters, or '+' (malformed)")
336
+ # DEEP-GATE 4.0.0 re-gate (D2/D3 CLASS fix): _origin_wellformed only checks lines[0]. The note body
337
+ # ALSO carries size, root and OPTIONAL C2SP extension lines (lines[3:]) that _cosigned_message encodes
338
+ # WHOLE — a lone/unpaired UTF-16 surrogate anywhere in it raised a raw UnicodeEncodeError out of the
339
+ # public verify_cosignature / evaluate_public_transparency / cosign_checkpoint surfaces. verify_checkpoint
340
+ # fixed the ordering for its OWN copy of the text; this shared cosignature-path parser is the neighbour
341
+ # instance the first cut missed. Validate the whole note body is UTF-8-safe here, once, for every consumer.
342
+ try:
343
+ note_text.encode("utf-8")
344
+ except UnicodeEncodeError as exc:
345
+ raise BundleFormatError("checkpoint note text is not valid UTF-8 (malformed, fail-closed)") from exc
346
+ # DEEP-GATE 4.0.0 re-gate iter4 (D2/D3 CLASS, third neighbour, found by a 4th adversarial pass):
347
+ # _note_text_of guaranteed only origin + UTF-8, NOT that line 1 is a uint64 decimal or line 2 valid
348
+ # base64. cosign_checkpoint_mldsa is the one consumer that does not RE-validate them (verify_checkpoint
349
+ # and verify_cosignature each do their own) — it fed the raw lines into int(size_s).to_bytes(8,"big") and
350
+ # base64.b64decode(validate=True), raising a raw ValueError / binascii.Error / OverflowError (incl. the
351
+ # CVE-2020-10735 integer-string DoS on a 5000-digit size) out of a public witness-signing surface.
352
+ # Validate the note-body fields here, once, for every consumer of the shared parser. The len<=20 test
353
+ # short-circuits before int(size_s), so an over-long digit string never reaches the (bounded) int parse.
354
+ size_s, root_b64 = lines[1], lines[2]
355
+ if len(size_s) > 20 or not (size_s.isascii() and size_s.isdigit()) \
356
+ or (size_s != "0" and size_s.startswith("0")) or int(size_s) >= 2 ** 64:
357
+ raise BundleFormatError("checkpoint tree size must be a uint64 ASCII decimal with no leading zeros")
358
+ try:
359
+ base64.b64decode(root_b64, validate=True)
360
+ except (ValueError, TypeError) as exc:
361
+ raise BundleFormatError("checkpoint root is not valid standard base64") from exc
258
362
  return note_text
259
363
 
260
364
 
@@ -275,8 +379,9 @@ def cosign_checkpoint(signed_note: str, witness_signer, witness_name: str, times
275
379
  if isinstance(timestamp, bool) or not isinstance(timestamp, int) \
276
380
  or not 0 <= timestamp <= _MAX_COSIG_TIMESTAMP:
277
381
  raise BundleFormatError("cosignature timestamp must be an integer in [0, 2^63-1]")
278
- if not witness_name or "+" in witness_name or any(c.isspace() for c in witness_name):
279
- raise BundleFormatError("witness name must be non-empty without spaces or '+'")
382
+ if not _witness_name_wellformed(witness_name):
383
+ raise BundleFormatError("witness name must be a printable-ASCII identity "
384
+ "without spaces, invisible characters, or '+'")
280
385
  note_text = _note_text_of(signed_note)
281
386
  if not signed_note.endswith("\n"):
282
387
  raise BundleFormatError("signed note must end with a newline")
@@ -289,8 +394,14 @@ def cosign_checkpoint(signed_note: str, witness_signer, witness_name: str, times
289
394
 
290
395
  def cosign_key_id_mldsa(witness_name: str, pubkey: bytes) -> bytes:
291
396
  """ML-DSA-44 cosignature key ID = SHA-256(name ‖ 0x0A ‖ 0x06 ‖ 1312-byte pubkey)[:4]."""
292
- if len(pubkey) != _MLDSA44_PUB_LEN:
397
+ if not isinstance(pubkey, bytes) or len(pubkey) != _MLDSA44_PUB_LEN:
293
398
  raise BundleFormatError("ML-DSA-44 public key must be 1312 raw bytes")
399
+ # DEEP-GATE re-gate F-8/F-10: the witness name is the third identity slot (with origin and witness
400
+ # name); it is encoded into the keyID, so a surrogate name would raise a raw UnicodeEncodeError
401
+ # out of this public helper, and a zero-width/invisible name would substitute for a real one.
402
+ # Same printable-ASCII rule as origin/witness name — closed at the source that does the encode.
403
+ if not _witness_name_wellformed(witness_name):
404
+ raise BundleFormatError("witness name must be a printable-ASCII identity without spaces or invisible characters")
294
405
  h = hashlib.sha256(witness_name.encode("utf-8") + b"\n"
295
406
  + bytes([_COSIG_MLDSA_SIG_TYPE]) + pubkey).digest()
296
407
  return h[:4]
@@ -351,8 +462,9 @@ def cosign_checkpoint_mldsa(signed_note: str, witness_signer, witness_name: str,
351
462
  if isinstance(timestamp, bool) or not isinstance(timestamp, int) \
352
463
  or not 0 <= timestamp <= _MAX_COSIG_TIMESTAMP:
353
464
  raise BundleFormatError("cosignature timestamp must be an integer in [0, 2^63-1]")
354
- if not witness_name or "+" in witness_name or any(c.isspace() for c in witness_name):
355
- raise BundleFormatError("witness name must be non-empty without spaces or '+'")
465
+ if not _witness_name_wellformed(witness_name):
466
+ raise BundleFormatError("witness name must be a printable-ASCII identity "
467
+ "without spaces, invisible characters, or '+'")
356
468
  note_text = _note_text_of(signed_note)
357
469
  if not signed_note.endswith("\n"):
358
470
  raise BundleFormatError("signed note must end with a newline")
@@ -379,6 +491,14 @@ def _parse_witness_vkey(vkey_str: str) -> tuple[str, bytes, bytes, int]:
379
491
  if len(parts) != 3:
380
492
  raise BundleFormatError("vkey must have 3 '+'-separated parts (name+hexKeyID+base64KeyMaterial)")
381
493
  name, kid_hex, keymat_b64 = parts
494
+ # DEEP-GATE re-gate (2026-08-17): a witness NAME must be a printable-ASCII identity with no
495
+ # space (the emit path always required this; enforced on the VERIFY path here too). A name
496
+ # cloaked with whitespace, a zero-width, a variation selector or a Default-Ignorable character
497
+ # would parse and verify, look identical to the origin, yet be byte-different, so the
498
+ # origin-quorum name compare would miss it and the log would vote under a cloaked name.
499
+ if not _witness_name_wellformed(name):
500
+ raise BundleFormatError(
501
+ "witness vkey name must be a printable-ASCII identity without spaces or invisible characters")
382
502
  try:
383
503
  keymat = base64.b64decode(keymat_b64, validate=True)
384
504
  except (ValueError, TypeError) as exc:
@@ -487,7 +607,25 @@ def _witness_key_material(vkey: str) -> bytes:
487
607
  return base64.b64decode(vkey.split("+", 2)[2])
488
608
 
489
609
 
490
- def witness_quorum(signed_note: str, witness_vkeys, threshold: int):
610
+ def _log_key_material_of(log_vkey: str) -> "bytes | None":
611
+ """The raw public-key bytes of a LOG vkey (0x01), for the origin-quorum key-material exclusion
612
+ (DEEP-GATE F-2). Compared against a witness vkey's pubkey bytes WITHOUT the alg-type prefix, so a
613
+ log that reuses its 0x01 signing key as a 0x04 cosignature key is caught despite the differing
614
+ prefix. Defensive: a malformed log vkey yields None (the exclusion then falls back to the name
615
+ test), never a raise — on the real path verify_checkpoint already raised on a malformed log vkey."""
616
+ try:
617
+ _name, _kid, pubkey = _parse_vkey(log_vkey)
618
+ return pubkey
619
+ except (BundleFormatError, ValueError, TypeError):
620
+ # DEEP-GATE re-gate F-7: catch the BASE families, not just BundleFormatError — a lone-surrogate
621
+ # log-vkey name reaches key_id -> name.encode("utf-8") and raises UnicodeEncodeError (a
622
+ # ValueError), which would otherwise escape this "never a raise" helper and, through the new
623
+ # public_transparency call site, become a raw traceback out of a documented fail-closed surface.
624
+ return None
625
+
626
+
627
+ def witness_quorum(signed_note: str, witness_vkeys, threshold: int, *,
628
+ log_key_material: "bytes | None"): # DEEP-GATE 4.0.0 D1: REQUIRED keyword (was `= None`)
491
629
  """Shared k-of-n witness quorum (release-review fix): counts DISTINCT witness KEY MATERIAL, not names —
492
630
  C2SP requires operators to use distinct keys per cosigner, so one physical key under N names is ONE witness.
493
631
  Alg-agnostic (Ed25519 0x04 + ML-DSA 0x06). Used by BOTH verify_witnessed_checkpoint AND tlogproof.
@@ -495,26 +633,85 @@ def witness_quorum(signed_note: str, witness_vkeys, threshold: int):
495
633
  (witnesses_ok, witnesses_dict); the dict is keyed by name+keyID so a same-name-different-key entry does not
496
634
  overwrite. Fail-closed: an unparseable witness vkey raises (verify_cosignature); a non-verifying one is
497
635
  False; and a witness whose algorithm this build cannot verify (an ML-DSA vkey without the [pq] extra) also
498
- counts as non-verifying (False), never a raw UnsupportedError out of the batch (adversarial re-audit round 5)."""
636
+ counts as non-verifying (False), never a raw UnsupportedError out of the batch (adversarial re-audit round 5).
637
+
638
+ ORIGIN-QUORUM RULE — a log never votes in its own quorum. A witness cosignature is EXCLUDED from
639
+ the count (``ok=False``, ``origin_excluded=True``, before any signature math) when EITHER holds:
640
+
641
+ * its **key material** equals ``log_key_material`` (the audited log's own signing-key public
642
+ bytes, passed by the caller that knows which log it verifies) — the ROBUST test, algorithm-
643
+ agnostic and independent of the name the line claims; or
644
+ * its **name** equals the note's own origin line — the exact-codepoint name test.
645
+
646
+ Why BOTH, and why the name test alone is not enough (Deep-Gate re-gate 2026-08-17, F-1/F-2):
647
+ the Ed25519 cosignature/v1 signed message does NOT commit to the cosigner name (unlike ML-DSA-44,
648
+ which does), so a line CAN be relabelled under any name without the private key — a name-only rule
649
+ is bypassable for Ed25519, and a zero-width character in the origin line defeats the exact name
650
+ compare outright (closed separately by :func:`_origin_wellformed`). Keying the exclusion on the
651
+ LOG's public bytes uses an operand the log/attacker does not get to choose. HONEST LIMITS that
652
+ remain and are documented at the call sites:
653
+ * a log cosigning with a SEPARATE key (not its signing key) under a non-origin alias that a
654
+ relying party wrongly lists as an independent witness — roster provenance, a deployment
655
+ property no local rule can catch;
656
+ * the name compare is EXACT bytes (no normalisation), so BYTE-DIFFERENT FORMS OF THE SAME
657
+ IDENTITY are not caught by the name prong: an ASCII case variant (`LOG.example.com`, DNS is
658
+ case-insensitive), an FQDN trailing dot (`log.example.com.`), or a path-normalisation form
659
+ (`log.example.com//x`). These are the same owner, not a look-alike; the robust defences for
660
+ them are the key-material prong (when the log reuses its signing key) and `expected_origin`
661
+ (the relying-party pin). Exactness is kept deliberately — the opposite (normalising the
662
+ compare) would loosen `expected_origin` acceptance, whose safe direction is the reverse.
663
+ ``log_key_material=None`` (a direct call with no log context) applies only the name test; the
664
+ public surfaces always pass it (and `public_transparency` fails closed if a supplied log_vkey is
665
+ unusable, rather than silently dropping the key-material prong)."""
499
666
  keys_ok = set()
500
667
  witnesses = {}
668
+ if isinstance(threshold, bool) or not isinstance(threshold, int) or threshold < 0: # iter5 never-raise (defensive)
669
+ raise BundleFormatError("witness quorum threshold must be a non-negative integer")
501
670
  # adversarial re-audit round 4: guard the SHARED SINK, not just one caller — verify_witnessed_checkpoint AND
502
671
  # public_transparency.evaluate_public_transparency both funnel witness_vkeys into this loop; a non-iterable
503
672
  # (int/bool/object) or a str (per-char iteration) crashed it raw. Fail-closed empty quorum, never a raise.
504
673
  if isinstance(witness_vkeys, (str, bytes, bytearray)) or not hasattr(witness_vkeys, "__iter__"):
505
674
  return False, {}
675
+ # The origin is parsed LAZILY and defensively: a malformed note must keep its existing contract
676
+ # (an empty roster returns without raising; a non-empty one raises in verify_cosignature below),
677
+ # so a parse failure here downgrades to origin=None instead of introducing a new raise path.
678
+ # origin=None never equals a str vkey name, and on such a note nothing verifies anyway.
679
+ try:
680
+ origin = _note_text_of(signed_note).split("\n", 1)[0]
681
+ except BundleFormatError:
682
+ origin = None
506
683
  for wv in witness_vkeys:
507
- try:
508
- res = verify_cosignature(signed_note, wv)
509
- except UnsupportedError as exc:
510
- # adversarial re-audit round 5: a BATCH quorum must not crash because ONE witness in the list is an
511
- # ML-DSA (0x06) vkey the current build cannot verify (no FIPS-204). verify_cosignature keeps its
512
- # documented loud raise for a SINGLE explicitly-named witness (a caller config choice, tested), but
513
- # here iterating an attacker-influenceable list an un-verifiable witness counts as non-verifying
514
- # (fail-closed False), never a raw UnsupportedError out of witness_quorum / verify_witnessed_checkpoint.
515
- res = {"ok": False, "alg": "ml-dsa-44", "origin": None, "tree_size": None,
516
- "root": None, "timestamp": None,
517
- "detail": f"witness needs the [pq] extra (FIPS 204) — cannot verify, fail-closed ({exc})"}
684
+ res = None
685
+ if isinstance(wv, str):
686
+ name_hit = origin is not None and wv.split("+", 2)[0] == origin
687
+ if name_hit or log_key_material is not None:
688
+ # Parse to compare key material AND to learn the alg for the report entry. This keeps the
689
+ # documented raise contract: an unparseable vkey raises here (same typed BundleFormatError
690
+ # verify_cosignature would raise one line down), and a 0x01 log key is rejected AS a witness
691
+ # (domain separation) exactly as everywhere else.
692
+ _name, _kid, wv_pk, sig_type = _parse_witness_vkey(wv)
693
+ material_hit = log_key_material is not None and wv_pk == log_key_material
694
+ if name_hit or material_hit:
695
+ reason = ("its name equals the checked log's own origin" if name_hit
696
+ else "its key material equals the audited log's own signing key")
697
+ res = {"ok": False,
698
+ "alg": "ed25519-cosignature/v1" if sig_type == _COSIG_V1_SIG_TYPE else "ml-dsa-44",
699
+ "origin": origin, "tree_size": None, "root": None, "timestamp": None,
700
+ "origin_excluded": True,
701
+ "detail": f"witness excluded — {reason}; a log never counts toward its own "
702
+ "witness quorum (origin-quorum rule, fail-closed)"}
703
+ if res is None:
704
+ try:
705
+ res = verify_cosignature(signed_note, wv)
706
+ except UnsupportedError as exc:
707
+ # adversarial re-audit round 5: a BATCH quorum must not crash because ONE witness in the list is an
708
+ # ML-DSA (0x06) vkey the current build cannot verify (no FIPS-204). verify_cosignature keeps its
709
+ # documented loud raise for a SINGLE explicitly-named witness (a caller config choice, tested), but
710
+ # here — iterating an attacker-influenceable list — an un-verifiable witness counts as non-verifying
711
+ # (fail-closed False), never a raw UnsupportedError out of witness_quorum / verify_witnessed_checkpoint.
712
+ res = {"ok": False, "alg": "ml-dsa-44", "origin": None, "tree_size": None,
713
+ "root": None, "timestamp": None,
714
+ "detail": f"witness needs the [pq] extra (FIPS 204) — cannot verify, fail-closed ({exc})"}
518
715
  witnesses["+".join(wv.split("+")[:2])] = res
519
716
  if res["ok"]:
520
717
  keys_ok.add(_witness_key_material(wv))
@@ -532,6 +729,9 @@ def verify_witnessed_checkpoint(signed_note: str, log_vkey: str, witness_vkeys,
532
729
  result.
533
730
  Fail-closed: an unparseable witness vkey raises; a non-verifying one counts as False; an ML-DSA witness
534
731
  this build cannot verify (no [pq] extra) counts as non-verifying, not a raise (adversarial re-audit round 5).
732
+ Origin-quorum rule (see :func:`witness_quorum`): a cosignature made with the LOG's own signing key,
733
+ or one whose name equals the origin line, never counts — this surface passes ``log_key_material`` so
734
+ the robust key-material test applies, not the name test alone.
535
735
 
536
736
  ``expected_origin`` (3.8.0) is the origin binding this surface was missing. A checkpoint carries
537
737
  the identity of the log that issued it, and a signature proves that SOME log signed — not WHICH
@@ -563,7 +763,10 @@ def verify_witnessed_checkpoint(signed_note: str, log_vkey: str, witness_vkeys,
563
763
  # GESTELLTE Frage, die immer fehlschlaegt, keine abwesende.
564
764
  log_ok = bool(log_res["ok"]) and (expected_origin is None
565
765
  or log_res["origin"] == expected_origin)
566
- witnesses_ok, witnesses = witness_quorum(signed_note, witness_vkeys, threshold)
766
+ # DEEP-GATE F-2: the log's own signing-key public bytes are the operand the log does not choose —
767
+ # pass them so a cosignature made with the log key never counts as a witness, whatever name it wears.
768
+ witnesses_ok, witnesses = witness_quorum(signed_note, witness_vkeys, threshold,
769
+ log_key_material=_log_key_material_of(log_vkey))
567
770
  return {"ok": log_ok and witnesses_ok, "log_ok": log_ok,
568
771
  "witnesses_ok": witnesses_ok, "witnesses": witnesses,
569
772
  "origin": log_res["origin"], "expected_origin": expected_origin,
@@ -1052,8 +1052,16 @@ def _cmd_verify_proof(args: argparse.Namespace) -> int:
1052
1052
  # `signer_present` trennt sie: false heisst "dieser Schluessel hat diese Note nicht
1053
1053
  # signiert", true mit log_ok=false heisst "er hat, aber die Bytes stimmen nicht".
1054
1054
  out["signer_present"] = bool(res.get("signer_present"))
1055
- out["witnesses"] = {n: {"ok": w["ok"], "alg": w["alg"], "timestamp": w["timestamp"]}
1056
- for n, w in res["witnesses"].items()}
1055
+ # DEEP-GATE F-4: carry the REASON a witness did not count, not just ok/alg/timestamp. The
1056
+ # CHANGELOG promises a relying party can tell "excluded by rule" from "signature invalid" —
1057
+ # that only held at the library level; the JSON projection dropped origin_excluded and detail
1058
+ # one layer before output, so an origin-excluded witness and a bad-signature one printed
1059
+ # byte-identically. Both are carried now (origin_excluded only when set; detail may be None).
1060
+ out["witnesses"] = {
1061
+ n: {"ok": w["ok"], "alg": w["alg"], "timestamp": w["timestamp"],
1062
+ **({"origin_excluded": True} if w.get("origin_excluded") else {}),
1063
+ "detail": w.get("detail")}
1064
+ for n, w in res["witnesses"].items()}
1057
1065
  print(json.dumps(out, indent=2))
1058
1066
  else:
1059
1067
  # KONTROLLZEICHEN NEUTRALISIEREN, wie es `_cmd_verify` seit dem 2026-07-09 tut
@@ -1075,6 +1083,14 @@ def _cmd_verify_proof(args: argparse.Namespace) -> int:
1075
1083
  n_ok = sum(1 for w in res["witnesses"].values() if w["ok"])
1076
1084
  print(f"[{'PASS' if res['witnesses_ok'] else 'FAIL'}] witness-quorum: "
1077
1085
  f"{n_ok} valid of {len(res['witnesses'])} known (threshold {args.threshold})")
1086
+ # DEEP-GATE re-gate F-6: the reason a witness did not count belongs on the HUMAN path too,
1087
+ # not only in --json. Without it an origin-excluded witness and a bad-signature one printed
1088
+ # the same "N valid of M known" line — the reader most likely to act is the one who sees
1089
+ # nothing. One indented line per non-verifying witness that carries a detail (name+keyID is
1090
+ # attacker-influenced, so neutralise both).
1091
+ for wname, w in res["witnesses"].items():
1092
+ if not w["ok"] and w.get("detail"):
1093
+ print(f" - {_safe_line(str(wname))}: {_safe_line(str(w['detail']))}")
1078
1094
  print(f"[{'PASS' if res['inclusion_ok'] else 'FAIL'}] merkle-inclusion: "
1079
1095
  f"index {res['index']} of {res['tree_size']}")
1080
1096
  # Der Textpfad ist der, den ein Mensch liest — und er las bisher `[FAIL] log-signature:
@@ -288,9 +288,23 @@ def evaluate_public_transparency(
288
288
  elif not witness_vkeys:
289
289
  statuses["WITNESS_QUORUM"] = "FAIL"
290
290
  errors.append("witnessQuorum required but no witness vkeys supplied (fail-closed)")
291
+ elif log_vkey is not None and cp._log_key_material_of(log_vkey) is None:
292
+ # DEEP-GATE re-gate F-9: THREE states, not two. A log_vkey was supplied but is unusable
293
+ # (malformed / surrogate name) — that is "not measurable", NOT "no log context". Treating it
294
+ # as no-context (log_key_material=None) silently switches the key-material exclusion off and
295
+ # lets the log vote in its own quorum under an alias with errors=[]. A relying party that
296
+ # SUPPLIED log context and had it silently dropped is exactly the hidden fail-open; fail-closed.
297
+ statuses["WITNESS_QUORUM"] = "FAIL"
298
+ errors.append("witnessQuorum: a log_vkey was supplied but is unusable (malformed) — the "
299
+ "self-witness key-material exclusion cannot be applied, fail-closed")
291
300
  else:
292
301
  try:
293
- ok, _ = cp.witness_quorum(signed_note, witness_vkeys, th)
302
+ # DEEP-GATE F-2: when a log_vkey is known, pass its key material so the audited log's own
303
+ # signing key never counts toward the quorum, whatever name a cosignature line claims
304
+ # (origin-quorum rule). log_vkey may be absent here (optional param) — then the name test
305
+ # still applies, and this surface is EXPERIMENTAL/unwired anyway.
306
+ log_km = cp._log_key_material_of(log_vkey) if log_vkey else None
307
+ ok, _ = cp.witness_quorum(signed_note, witness_vkeys, th, log_key_material=log_km)
294
308
  statuses["WITNESS_QUORUM"] = "PASS" if ok else "FAIL"
295
309
  if not ok:
296
310
  errors.append(f"witness quorum not met (need {th} distinct witnesses)")