ca2a-runtime 0.3.1__tar.gz → 0.4.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 (278) hide show
  1. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/codeql.yml +3 -3
  2. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/scorecard.yml +1 -1
  3. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/CHANGELOG.md +26 -1
  4. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/Dockerfile +2 -2
  5. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/PKG-INFO +3 -3
  6. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/attestation.md +8 -1
  7. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/mutual-attestation.md +40 -1
  8. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/transport.md +7 -2
  9. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/index.md +2 -2
  10. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/pyproject.toml +3 -3
  11. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/dev.in +2 -2
  12. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/dev.txt +56 -56
  13. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/docs.txt +37 -18
  14. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/release.txt +3 -3
  15. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/runtime.in +1 -1
  16. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/runtime.txt +31 -31
  17. ca2a_runtime-0.4.0/src/ca2a_runtime/attestation.py +383 -0
  18. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/hardware_acceptance.py +7 -2
  19. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/node.py +9 -2
  20. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/peer.py +65 -2
  21. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/tee/base.py +15 -2
  22. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/tee/binding.py +46 -0
  23. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/tee/sev_snp.py +14 -5
  24. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/tee/software.py +5 -1
  25. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/tee/tdx.py +14 -5
  26. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/tee/tpm.py +10 -7
  27. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/transport/a2a_adapter.py +17 -2
  28. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/transport/client.py +34 -7
  29. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/transport/constants.py +6 -0
  30. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/transport/wire.py +13 -1
  31. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_verify/sev_snp.py +2 -1
  32. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_verify/tpm.py +5 -1
  33. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/conftest.py +58 -0
  34. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_a2a_sdk_bridge.py +6 -11
  35. ca2a_runtime-0.4.0/tests/unit/test_caller_offer_relay.py +449 -0
  36. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_container_release.py +1 -1
  37. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_holder_binding.py +16 -11
  38. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_live_call.py +3 -1
  39. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_mutual_attestation.py +19 -15
  40. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_release_artifacts.py +1 -1
  41. ca2a_runtime-0.3.1/src/ca2a_runtime/attestation.py +0 -163
  42. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.clusterfuzzlite/Dockerfile +0 -0
  43. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.clusterfuzzlite/README.md +0 -0
  44. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.clusterfuzzlite/build.sh +0 -0
  45. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.clusterfuzzlite/fuzz_attestation_parsers.py +0 -0
  46. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.clusterfuzzlite/fuzz_canonical_json.py +0 -0
  47. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.clusterfuzzlite/fuzz_wire_documents.py +0 -0
  48. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.dockerignore +0 -0
  49. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/CODEOWNERS +0 -0
  50. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  51. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  52. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  53. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  54. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/dependabot.yml +0 -0
  55. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/actionlint.yml +0 -0
  56. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/cflite_batch.yml +0 -0
  57. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/cflite_pr.yml +0 -0
  58. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/ci.yml +0 -0
  59. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/contributor-check.yml +0 -0
  60. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/docker.yml +0 -0
  61. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/docs.yml +0 -0
  62. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/limitations-parity.yml +0 -0
  63. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/release-drafter.yml +0 -0
  64. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/release.yml +0 -0
  65. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/require-maintainer-approval.yml +0 -0
  66. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/sbom.yml +0 -0
  67. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/vouch-check.yml +0 -0
  68. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.github/workflows/vouch-command.yml +0 -0
  69. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/.gitignore +0 -0
  70. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/ADOPTERS.md +0 -0
  71. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/CHARTER.md +0 -0
  72. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/CNAME +0 -0
  73. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/CODE_OF_CONDUCT.md +0 -0
  74. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/CONTRIBUTING.md +0 -0
  75. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/GOVERNANCE.md +0 -0
  76. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/LICENSE +0 -0
  77. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/LIMITATIONS.md +0 -0
  78. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/MAINTAINERS.md +0 -0
  79. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/NOTICE +0 -0
  80. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/PRIVACY.md +0 -0
  81. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/README.md +0 -0
  82. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/ROADMAP.md +0 -0
  83. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/SECURITY.md +0 -0
  84. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/SPONSORS.md +0 -0
  85. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/benchmarks/.gitkeep +0 -0
  86. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/SPEC.md +0 -0
  87. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/assets/icon.svg +0 -0
  88. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/assets/og.png +0 -0
  89. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/concepts.md +0 -0
  90. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/configuration.md +0 -0
  91. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/hardware-validation.md +0 -0
  92. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/mutual-hardware-acceptance.md +0 -0
  93. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/quickstart.md +0 -0
  94. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/call-graph.md +0 -0
  95. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/cedar-policy.md +0 -0
  96. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/component-model.md +0 -0
  97. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/conformance.md +0 -0
  98. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/delegation-chain.md +0 -0
  99. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/error-codes.md +0 -0
  100. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/failure-modes.md +0 -0
  101. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/profile.md +0 -0
  102. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/provenance-dag.md +0 -0
  103. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/response-authentication.md +0 -0
  104. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/response-binding-requirements.md +0 -0
  105. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/sealed-channel.md +0 -0
  106. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/threat-model.md +0 -0
  107. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/trace-a2a-profile.md +0 -0
  108. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/spec/verification-library.md +0 -0
  109. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/tutorials/authoring-a-delegation-credential.md +0 -0
  110. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/tutorials/emit-and-verify-provenance.md +0 -0
  111. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/tutorials/integrating-with-a2a.md +0 -0
  112. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/tutorials/reproducing-the-claims.md +0 -0
  113. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/docs/tutorials/verify-a-delegation-chain.md +0 -0
  114. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/a2a-sdk/loopback.py +0 -0
  115. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/a2a-sdk/requirements.txt +0 -0
  116. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/cross-operator-delegation/README.md +0 -0
  117. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/cross-operator-delegation/ca2a-config.yaml +0 -0
  118. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/cross-operator-delegation/chain.json +0 -0
  119. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/cross-operator-delegation/dag.json +0 -0
  120. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/cross-operator-delegation/demo.py +0 -0
  121. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/cross-operator-delegation/policy.cedar +0 -0
  122. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/minimal/README.md +0 -0
  123. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/minimal/ca2a-config.yaml +0 -0
  124. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/minimal/chain.json +0 -0
  125. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/rejection-with-proof/README.md +0 -0
  126. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/rejection-with-proof/chain.json +0 -0
  127. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/rejection-with-proof/dag.json +0 -0
  128. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/rejection-with-proof/demo.py +0 -0
  129. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/trace-dag/README.md +0 -0
  130. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/examples/trace-dag/demo.py +0 -0
  131. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/README.md +0 -0
  132. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim1-attenuation-soundness/README.md +0 -0
  133. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim1-attenuation-soundness/run.py +0 -0
  134. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim2-cross-chain-replay/README.md +0 -0
  135. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim2-cross-chain-replay/run.py +0 -0
  136. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim3-scope-policy-intersection/README.md +0 -0
  137. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim3-scope-policy-intersection/run.py +0 -0
  138. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim4-sealed-payload-confidentiality/README.md +0 -0
  139. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim4-sealed-payload-confidentiality/run.py +0 -0
  140. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim5-provenance-dag-integrity/README.md +0 -0
  141. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim5-provenance-dag-integrity/run.py +0 -0
  142. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim6-cross-operator-attestation/README.md +0 -0
  143. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/claim6-cross-operator-attestation/run.py +0 -0
  144. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/README.md +0 -0
  145. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/ca2a-attested-peer-azure-2026-07-27/bridge.py +0 -0
  146. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/ca2a-attested-peer-azure-2026-07-27/transcript.json +0 -0
  147. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/ca2a-cross-tee-2026-07-27/snp_client.py +0 -0
  148. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/ca2a-cross-tee-2026-07-27/tdx_peer.py +0 -0
  149. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/ca2a-cross-tee-2026-07-27/transcript.json +0 -0
  150. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/mutual-snp-2026-09-17/README.md +0 -0
  151. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/mutual-snp-2026-09-17/a-to-b.json +0 -0
  152. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/mutual-snp-2026-09-17/b-to-a.json +0 -0
  153. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/experiments/hardware-validation/mutual-snp-2026-09-17/controls.py +0 -0
  154. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/governance/ca2a-enforcement.yaml +0 -0
  155. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/hooks/seo.py +0 -0
  156. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/mkdocs.yml +0 -0
  157. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/overrides/main.html +0 -0
  158. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/agt-overrides.txt +0 -0
  159. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/agt.in +0 -0
  160. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/agt.txt +0 -0
  161. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/build.in +0 -0
  162. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/build.txt +0 -0
  163. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements/release.in +0 -0
  164. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/requirements-docs.txt +0 -0
  165. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/robots.txt +0 -0
  166. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/scripts/gen_action_fixtures.py +0 -0
  167. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/scripts/gen_agt_evidence.py +0 -0
  168. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/scripts/gen_example_chain.py +0 -0
  169. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/__init__.py +0 -0
  170. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/agent_manifest.py +0 -0
  171. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/benchmarks.py +0 -0
  172. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/bootstrap.py +0 -0
  173. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/canonical.py +0 -0
  174. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/cedar.py +0 -0
  175. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/challenge.py +0 -0
  176. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/channel/__init__.py +0 -0
  177. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/channel/sealed.py +0 -0
  178. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/cli.py +0 -0
  179. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/config.py +0 -0
  180. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/delegation/__init__.py +0 -0
  181. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/delegation/credential.py +0 -0
  182. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/delegation/holder.py +0 -0
  183. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/delegation/revocation.py +0 -0
  184. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/errors.py +0 -0
  185. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/policy.py +0 -0
  186. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/provenance.py +0 -0
  187. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/response.py +0 -0
  188. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/tee/__init__.py +0 -0
  189. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/tee/tsm.py +0 -0
  190. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/trace_binding.py +0 -0
  191. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/transport/__init__.py +0 -0
  192. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/transport/_b64url.py +0 -0
  193. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/transport/a2a_sdk.py +0 -0
  194. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_runtime/transport/server.py +0 -0
  195. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_verify/__init__.py +0 -0
  196. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_verify/dag.py +0 -0
  197. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_verify/tdx.py +0 -0
  198. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_verify/tpm_roots.py +0 -0
  199. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/src/ca2a_verify/verify.py +0 -0
  200. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/__init__.py +0 -0
  201. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/committed_blobs.py +0 -0
  202. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/conformance/README.md +0 -0
  203. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/conformance/__init__.py +0 -0
  204. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/conformance/conftest.py +0 -0
  205. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/conformance/test_action_fixture_bundles.py +0 -0
  206. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/conformance/test_profile_conformance.py +0 -0
  207. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/conftest.py +0 -0
  208. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/a2a/send_message_ca2a.json +0 -0
  209. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/README.md +0 -0
  210. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-001-verified/chain.json +0 -0
  211. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-001-verified/dag.json +0 -0
  212. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-001-verified/expected.json +0 -0
  213. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-002-parent-hash-mismatch/chain.json +0 -0
  214. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-002-parent-hash-mismatch/dag.json +0 -0
  215. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-002-parent-hash-mismatch/expected.json +0 -0
  216. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-006-policy-denial/chain.json +0 -0
  217. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-006-policy-denial/dag.json +0 -0
  218. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-006-policy-denial/expected.json +0 -0
  219. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-010-scope-escalation/chain.json +0 -0
  220. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-010-scope-escalation/dag.json +0 -0
  221. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-010-scope-escalation/expected.json +0 -0
  222. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-012-credential-expired/chain.json +0 -0
  223. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-012-credential-expired/dag.json +0 -0
  224. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/action/action-012-credential-expired/expected.json +0 -0
  225. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/hardware/azure-vtpm-2026-07-27/README.md +0 -0
  226. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/hardware/azure-vtpm-2026-07-27/ak.pub +0 -0
  227. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/hardware/azure-vtpm-2026-07-27/akcert_0x01C101D0.der +0 -0
  228. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/hardware/azure-vtpm-2026-07-27/nonce.hex +0 -0
  229. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/hardware/azure-vtpm-2026-07-27/pcrs.bin +0 -0
  230. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/hardware/azure-vtpm-2026-07-27/quote.msg +0 -0
  231. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/hardware/azure-vtpm-2026-07-27/quote.sig +0 -0
  232. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/response-mac-v1.json +0 -0
  233. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/sev_snp/amd_milan_cert_chain.pem +0 -0
  234. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/tdx/intel_sgx_root_ca.pem +0 -0
  235. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/tpm/bare-rsa-prefix-0016/README.md +0 -0
  236. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/tpm/bare-rsa-prefix-0016/ak-chain.pem +0 -0
  237. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/tpm/bare-rsa-prefix-0016/attest.hex +0 -0
  238. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/tpm/bare-rsa-prefix-0016/signature.hex +0 -0
  239. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/fixtures/tpm/bare-rsa-prefix-0016/trusted-root.pem +0 -0
  240. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/__init__.py +0 -0
  241. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_a2a_adapter.py +0 -0
  242. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_a2a_sdk_loopback.py +0 -0
  243. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_agent_manifest_cose.py +0 -0
  244. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_bootstrap.py +0 -0
  245. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_canonical.py +0 -0
  246. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_cedar.py +0 -0
  247. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_challenge.py +0 -0
  248. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_channel_and_tee.py +0 -0
  249. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_claim1_attenuation.py +0 -0
  250. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_claim2_replay.py +0 -0
  251. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_claim3_scope_policy.py +0 -0
  252. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_claim4_sealed.py +0 -0
  253. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_claim5_provenance.py +0 -0
  254. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_claim6_cross_operator.py +0 -0
  255. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_cli_start.py +0 -0
  256. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_committed_examples_verify.py +0 -0
  257. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_config.py +0 -0
  258. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_delegation.py +0 -0
  259. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_dependency_security_floors.py +0 -0
  260. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_docs_quickstart.py +0 -0
  261. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_documented_experiments.py +0 -0
  262. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_errors.py +0 -0
  263. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_example_rejection_with_proof.py +0 -0
  264. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_hardware_acceptance.py +0 -0
  265. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_lineage_cli.py +0 -0
  266. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_peer.py +0 -0
  267. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_peer_request.py +0 -0
  268. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_provenance.py +0 -0
  269. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_response_authentication.py +0 -0
  270. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_revocation.py +0 -0
  271. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_sealed_channel.py +0 -0
  272. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_sev_snp.py +0 -0
  273. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_snp_tdx_attest.py +0 -0
  274. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_tdx.py +0 -0
  275. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_tpm.py +0 -0
  276. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_tpm_attest.py +0 -0
  277. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_trace_binding.py +0 -0
  278. {ca2a_runtime-0.3.1 → ca2a_runtime-0.4.0}/tests/unit/test_verify.py +0 -0
@@ -28,16 +28,16 @@ jobs:
28
28
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
29
29
 
30
30
  - name: Initialize CodeQL
31
- uses: github/codeql-action/init@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
31
+ uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
32
32
  with:
33
33
  languages: python
34
34
  queries: +security-extended
35
35
 
36
36
  - name: Autobuild
37
- uses: github/codeql-action/autobuild@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
37
+ uses: github/codeql-action/autobuild@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
38
38
 
39
39
  - name: Perform CodeQL Analysis
40
- uses: github/codeql-action/analyze@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
40
+ uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
41
41
  continue-on-error: true
42
42
  with:
43
43
  category: /language:python
@@ -38,6 +38,6 @@ jobs:
38
38
  publish_results: true
39
39
 
40
40
  - name: Upload SARIF
41
- uses: github/codeql-action/upload-sarif@1c5b675653bb5c22dbe9b12b556ec555138e09fd # v4.38.1
41
+ uses: github/codeql-action/upload-sarif@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
42
42
  with:
43
43
  sarif_file: scorecard-results.sarif
@@ -7,6 +7,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.0] - 2026-09-30
11
+
12
+ ### Security
13
+
14
+ - A delegate with no enclave could be recorded as `caller_attestation="hardware"`
15
+ by relaying an honest hardware peer's attestation: it asked that peer's public
16
+ `/.well-known/ca2a/channel` endpoint to attest under the target's challenge and
17
+ presented the result as its `caller_offer`. Caller offers are now minted in a
18
+ separate role, signed under their own binding prefixes (`ca2a-*-caller-v2|`),
19
+ and the handshake endpoint only mints callee-role offers. The caller must also
20
+ send `caller_possession`, a MAC over the request transcript keyed from X25519
21
+ between its attested channel key and the callee's, which the callee verifies
22
+ before recording any outcome.
23
+
24
+ ### Changed
25
+
26
+ - **Breaking for callers that send `caller_offer`** (`ca2a-caller-offer-v2`). A
27
+ pre-v2 caller offer has no `role` and no `caller_possession` and is refused with
28
+ `ATTESTATION_FAILED`. Callers that send no offer, and the handshake response,
29
+ are unchanged on the wire. `BaseProvider.attest` and the binding helpers
30
+ (`tpm_qualifying_data`, `snp_report_data`, `tdx_report_data`) take a keyword
31
+ `role`, defaulting to the callee role; a custom `Verifier` must derive the
32
+ binding under `report.role`.
33
+
10
34
  ## [0.3.1] - 2026-09-26
11
35
 
12
36
  ### Fixed
@@ -410,7 +434,8 @@ built/stubbed boundary.
410
434
  - The sealed channel does not by itself establish the enclave-held-private-key property; that is a hardware attestation guarantee that lands with real-hardware validation.
411
435
  - Alpha schemas: the delegation credential and TRACE link schemas are not yet stable or versioned, and peer attestation evidence is not yet RATS/EAT conformant.
412
436
 
413
- [Unreleased]: https://github.com/agentrust-io/ca2a/compare/v0.3.1...main
437
+ [Unreleased]: https://github.com/agentrust-io/ca2a/compare/v0.4.0...main
438
+ [0.4.0]: https://github.com/agentrust-io/ca2a/compare/v0.3.1...v0.4.0
414
439
  [0.3.1]: https://github.com/agentrust-io/ca2a/compare/v0.3.0...v0.3.1
415
440
  [0.3.0]: https://github.com/agentrust-io/ca2a/compare/v0.2.0...v0.3.0
416
441
  [0.2.0]: https://github.com/agentrust-io/ca2a/compare/v0.1.0a1...v0.2.0
@@ -1,6 +1,6 @@
1
1
  # Base image pinned by its multi-arch index digest, so a re-pushed tag cannot
2
2
  # change what is built. Refresh the digest and the tag together.
3
- FROM python:3.11.15-slim-bookworm@sha256:d29f48a31a8b408ed19272ca1e7b10ebae13b240a27e862d3d4217c528e2e0c3 AS builder
3
+ FROM python:3.11.16-slim-bookworm@sha256:a36c24f9cbdf4fd0f52d67f0823eeac19c2028c637cecc392d97f980d4fec56b AS builder
4
4
 
5
5
  ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \
6
6
  PIP_NO_CACHE_DIR=1
@@ -14,7 +14,7 @@ COPY pyproject.toml README.md LICENSE NOTICE ./
14
14
  COPY src ./src
15
15
  RUN python -m pip wheel --no-deps --no-build-isolation --wheel-dir /wheels .
16
16
 
17
- FROM python:3.11.15-slim-bookworm@sha256:d29f48a31a8b408ed19272ca1e7b10ebae13b240a27e862d3d4217c528e2e0c3 AS runtime
17
+ FROM python:3.11.16-slim-bookworm@sha256:a36c24f9cbdf4fd0f52d67f0823eeac19c2028c637cecc392d97f980d4fec56b AS runtime
18
18
 
19
19
  ENV PIP_DISABLE_PIP_VERSION_CHECK=1 \
20
20
  PIP_NO_CACHE_DIR=1 \
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ca2a-runtime
3
- Version: 0.3.1
3
+ Version: 0.4.0
4
4
  Summary: Confidential agent-to-agent runtime: attested, attenuated delegation and sealed peer channels for A2A
5
5
  Project-URL: Homepage, https://github.com/agentrust-io/ca2a
6
6
  Project-URL: Repository, https://github.com/agentrust-io/ca2a
@@ -22,7 +22,7 @@ Classifier: Topic :: Security
22
22
  Requires-Python: >=3.11
23
23
  Requires-Dist: agent-manifest>=0.11.1
24
24
  Requires-Dist: agentrust-trace>=0.5
25
- Requires-Dist: cedarpy==4.8.7
25
+ Requires-Dist: cedarpy==4.12.1
26
26
  Requires-Dist: cryptography>=50.0
27
27
  Requires-Dist: pyyaml>=6.0
28
28
  Requires-Dist: rfc8785>=0.1
@@ -30,7 +30,7 @@ Provides-Extra: a2a-sdk
30
30
  Requires-Dist: a2a-sdk<2,>=1.1; extra == 'a2a-sdk'
31
31
  Requires-Dist: aiohttp>=3.14.3; extra == 'a2a-sdk'
32
32
  Provides-Extra: dev
33
- Requires-Dist: a2a-sdk[http-server]==1.1.4; extra == 'dev'
33
+ Requires-Dist: a2a-sdk[http-server]==1.1.5; extra == 'dev'
34
34
  Requires-Dist: agentrust-trace-tests<0.6,>=0.4; extra == 'dev'
35
35
  Requires-Dist: aiohttp>=3.14.3; extra == 'dev'
36
36
  Requires-Dist: bandit[toml]>=1.7; extra == 'dev'
@@ -23,13 +23,20 @@ binding = sha256(prefix || len32(public_key) || public_key || len32(nonce) || no
23
23
  | AMD SEV-SNP | `ca2a-snp-v1\|` | `REPORT_DATA` (64 bytes) | the binding, zero-padded on the right |
24
24
  | Intel TDX | `ca2a-tdx-v1\|` | `REPORTDATA` (64 bytes) | the binding, zero-padded on the right |
25
25
 
26
+ Those are the **callee-role** prefixes: what the handshake endpoint signs. A caller
27
+ offer (see [mutual attestation](mutual-attestation.md)) is signed under its own
28
+ prefix per platform, `ca2a-tpm-caller-v2|`, `ca2a-snp-caller-v2|` and
29
+ `ca2a-tdx-caller-v2|`, selected by the report's `role`. A verifier MUST derive the
30
+ binding under the report's role, so an offer relabelled from one role to the other
31
+ recomputes different bytes and is rejected.
32
+
26
33
  Committing the nonce alone would sign for freshness only, leaving `public_key` an unsigned assertion, so sealing a payload "to a key from a verified report" would not actually be rooted in hardware. A verifier re-derives this value from the report's own fields and requires equality, which is what promotes `public_key` and `nonce` from claim to signed fact. A report whose key was substituted after collection is rejected.
27
34
 
28
35
  Three encoding details are load-bearing, and each prefix is versioned because this is wire format: a peer and its verifier MUST derive identical bytes.
29
36
 
30
37
  - **Hashed, not raw.** `TPM2B_DATA` is capped below 64 bytes on some platforms (Azure returns `TPM_RC_SIZE`), and 32 bytes always fits. SEV-SNP and TDX reserve 64, so the digest is left-aligned and zero-padded, which is the convention the kernel's own callers and `agent-manifest` use; a report collected by either runtime is then byte-comparable.
31
38
  - **Length-prefixed, not delimiter-joined.** With a delimiter a value containing it shifts the split without changing the digest, so `("a|b", "c")` and `("a", "b|c")` would commit identical bytes and a peer could bind a key other than the one it appears to offer. `nonce` is an arbitrary caller-supplied string, so that is reachable rather than theoretical.
32
- - **Domain-separated per platform.** The three prefixes differ so a report collected on one platform cannot be replayed as another's evidence.
39
+ - **Domain-separated per platform and per role.** The prefixes differ so a report collected on one platform cannot be replayed as another's evidence, and so a callee offer, which anybody can obtain from the public handshake endpoint under a nonce of their choosing, cannot be presented as a caller offer.
33
40
 
34
41
  `ca2a_runtime.tee.binding` holds the single derivation the three providers share.
35
42
 
@@ -71,6 +71,43 @@ property. An earlier draft of this document claimed the key would be ceremonial
71
71
  unless the response were sealed to it; see the withdrawn decision below for why
72
72
  that was wrong in this protocol.
73
73
 
74
+ **The caller must prove it holds that key (`ca2a-caller-offer-v2`).** An
75
+ appraised offer shows that *some* enclave holds the offered key, not that the
76
+ party presenting it is that enclave. Before v2 nothing joined the two: the handshake
77
+ endpoint attests its node's key under any nonce anybody sends, and callee and
78
+ caller offers were signed over the same binding, so a delegate with no enclave
79
+ could take challenge C from target T, fetch honest hardware peer V's
80
+ `/channel?nonce=C` offer, present it as its own, and be recorded as
81
+ `caller_attestation="hardware"`. Two changes close that, each sufficient against
82
+ that relay on its own:
83
+
84
+ - *Role separation.* Every offer is minted for a role, carried as
85
+ `attestation.role` and folded into the signed binding prefix
86
+ ([attestation.md](attestation.md#the-signed-key-and-nonce-binding)). The handshake
87
+ endpoint only ever mints `callee` offers; a callee accepts only `caller` offers
88
+ as `caller_offer`, and a caller accepts only `callee` offers from a handshake. A
89
+ node mints a caller offer only for its own outbound call.
90
+ - *Proof of possession.* With every `caller_offer` the caller sends
91
+ `caller_possession = {"version": "ca2a-caller-offer-v2", "mac": <hex>}`. The
92
+ MAC is HMAC-SHA256 over the JCS-canonical transcript (version, challenge, callee
93
+ channel key, caller channel key, `credential_id`, `subject`,
94
+ `requested_capability`, `record_id`, `payload_sha256`, `parent_record_hash`, the
95
+ holder proof's signature), keyed by HKDF-SHA256 (info
96
+ `ca2a/caller-possession/v2/key`) over caller key, callee key and
97
+ X25519(caller channel private key, callee channel public key). The callee
98
+ recomputes it with its own channel private key and the key the caller's report
99
+ attests, and compares in constant time. A relayed offer, even a genuine
100
+ caller-role one, fails because the presenter lacks that private key; a captured
101
+ offer and proof fail on any other request or callee because the transcript and
102
+ the key differ.
103
+
104
+ A missing, malformed, wrong-version or non-verifying proof is refused whenever a
105
+ `caller_offer` is present, at every rung including `"none"`, with the denial
106
+ record stating `failed`. This is a breaking change for callers that send
107
+ `caller_offer`: a pre-v2 offer has no `role` and no `caller_possession`, parses as
108
+ a callee offer, and is refused with an error naming `ca2a-caller-offer-v2`. Callers
109
+ that send no offer, and handshake responses, are unchanged on the wire.
110
+
74
111
  ## Decisions taken 2026-08-09
75
112
 
76
113
  1. **Stateless HMAC challenge** (option B below). Works across instances with no
@@ -181,9 +218,11 @@ The same rung is reachable from a config file. `ca2a start` reads
181
218
  |---|---|
182
219
  | Stateless challenge (`v1.<expiry>.<random>.<mac>`) | `ca2a_runtime.challenge` |
183
220
  | Callee-side appraisal, challenge then offer | `attestation.appraise_caller` |
221
+ | Role-separated binding prefixes | `tee.binding.role_prefix` |
222
+ | Caller proof of possession | `attestation.prove_caller_possession`, `attestation.verify_caller_possession` |
184
223
  | Requirement ladder and the refusal records | `peer.appraise_caller_runtime` |
185
224
  | Ordering: appraise before `open_sealed` | `peer.handle_peer_request` |
186
- | `caller_offer` on the wire | `transport.constants`, `transport.a2a_adapter` |
225
+ | `caller_offer` and `caller_possession` on the wire | `transport.constants`, `transport.a2a_adapter` |
187
226
  | Challenge on the handshake response | `transport.server`, `transport.wire` |
188
227
  | Caller-side opt-in | `transport.client.send_task(caller_provider=...)` |
189
228
 
@@ -97,13 +97,18 @@ Namespaced keys on A2A `metadata` (message and/or params):
97
97
  | `https://agentrust-io.com/extensions/ca2a/v0.1/record_id` | string | Provenance record id for this hop |
98
98
  | `https://agentrust-io.com/extensions/ca2a/v0.1/parent_record_hash` | string or `null` | Parent TRACE/provenance hash; `null` for a root hop |
99
99
  | `https://agentrust-io.com/extensions/ca2a/v0.1/sealed_payload` | string (base64url) or omitted | Opaque sealed ciphertext only, not a verified measurement binding |
100
- | `https://agentrust-io.com/extensions/ca2a/v0.1/caller_offer` | channel-offer object or omitted | The caller's own attested channel key, bound to a challenge the callee issued ([mutual attestation](mutual-attestation.md)) |
100
+ | `https://agentrust-io.com/extensions/ca2a/v0.1/caller_offer` | channel-offer object or omitted | The caller's own attested channel key, bound to a challenge the callee issued, with `attestation.role` set to `"caller"` ([mutual attestation](mutual-attestation.md)) |
101
+ | `https://agentrust-io.com/extensions/ca2a/v0.1/caller_possession` | `{"version": "ca2a-caller-offer-v2", "mac": <hex>}` or omitted | The caller's proof that it holds the private half of `caller_offer`'s channel key. Required whenever `caller_offer` is present |
101
102
 
102
103
  `caller_offer` is **optional**, unlike `parent_record_hash`: a caller that cannot
103
104
  attest omits the key entirely rather than sending `null`, and a callee serves it
104
105
  by default. A key that is present but is not a well-formed offer is malformed and
105
106
  fails closed, so a caller cannot get itself treated as unattested by sending
106
- rubbish. Its object shape is the same one the handshake endpoint returns.
107
+ rubbish. Its object shape is the same one the handshake endpoint returns, plus
108
+ `attestation.role: "caller"`. The handshake endpoint omits `role`, which reads as
109
+ `"callee"`, and a callee refuses a callee-role offer presented as `caller_offer`.
110
+ An offer without `caller_possession`, or whose proof does not verify, is refused
111
+ ([mutual attestation](mutual-attestation.md)).
107
112
 
108
113
  Constants and helpers live in `ca2a_runtime.transport`.
109
114
 
@@ -16,7 +16,7 @@ cA2A is a profile on A2A that adds signed attenuated delegation, peer appraisal,
16
16
  [What this proves, and what it does not](LIMITATIONS.md){ .md-button }
17
17
 
18
18
  !!! tip "TL;DR"
19
- [ca2a-runtime](https://pypi.org/project/ca2a-runtime/) 0.3.1 (MIT developer preview; the PyPI name `ca2a` belongs to an unrelated project) rejects scope escalation offline with no hardware or running peer. SEV-SNP and TDX appraisal ran on real Azure and GCP evidence, including an Azure SEV-SNP peer calling a GCP TDX peer on 2026-07-27, but peer appraisal is one-directional so far and binding the seal to a verified measurement on a live call is on the roadmap.
19
+ [ca2a-runtime](https://pypi.org/project/ca2a-runtime/) 0.4.0 (MIT developer preview; the PyPI name `ca2a` belongs to an unrelated project) rejects scope escalation offline with no hardware or running peer. SEV-SNP and TDX appraisal ran on real Azure and GCP evidence, including an Azure SEV-SNP peer calling a GCP TDX peer on 2026-07-27, but peer appraisal is one-directional so far and binding the seal to a verified measurement on a live call is on the roadmap.
20
20
 
21
21
  <div class="grid cards" markdown>
22
22
 
@@ -71,4 +71,4 @@ Software and hardware modes provide different assurance. Peer appraisal has been
71
71
 
72
72
  For the architecture and trust boundaries, read [How It Works](docs/concepts.md). The normative profile, with the delegation chain, sealed channel, and conformance rules, is in [Profile](docs/spec/profile.md).
73
73
 
74
- **Status:** ca2a-runtime 0.3.1 developer preview · MIT · hosting at the Agentic AI Foundation proposed, not accepted · Sponsored by OPAQUE, which funds the engineering, infrastructure and confidential-computing work behind these projects.
74
+ **Status:** ca2a-runtime 0.4.0 developer preview · MIT · hosting at the Agentic AI Foundation proposed, not accepted · Sponsored by OPAQUE, which funds the engineering, infrastructure and confidential-computing work behind these projects.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ca2a-runtime"
7
- version = "0.3.1"
7
+ version = "0.4.0"
8
8
  description = "Confidential agent-to-agent runtime: attested, attenuated delegation and sealed peer channels for A2A"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -26,7 +26,7 @@ requires-python = ">=3.11"
26
26
  dependencies = [
27
27
  "cryptography>=50.0",
28
28
  "pyyaml>=6.0",
29
- "cedarpy==4.8.7",
29
+ "cedarpy==4.12.1",
30
30
  # TRACE record models + RFC 8785 signing, reused rather than reimplemented
31
31
  # (see ROADMAP Tier 0). Pin a compatible minor; cross-repo skew is a known
32
32
  # risk documented in LIMITATIONS.md.
@@ -63,7 +63,7 @@ dev = [
63
63
  "agentrust-trace-tests>=0.4,<0.6",
64
64
  # The bridge and real HTTP loopback run in the normal CI matrix. Pin the
65
65
  # tested SDK/server surface here; the public a2a-sdk extra remains a range.
66
- "a2a-sdk[http-server]==1.1.4",
66
+ "a2a-sdk[http-server]==1.1.5",
67
67
  "uvicorn==0.53.0",
68
68
  "aiohttp>=3.14.3",
69
69
  ]
@@ -8,7 +8,7 @@
8
8
  # --python-version 3.11 -o requirements/dev.txt
9
9
  cryptography>=50.0
10
10
  pyyaml>=6.0
11
- cedarpy==4.8.7
11
+ cedarpy==4.12.1
12
12
  agentrust-trace>=0.5
13
13
  agent-manifest>=0.11.1
14
14
  rfc8785>=0.1
@@ -21,7 +21,7 @@ types-pyyaml
21
21
  bandit[toml]>=1.7
22
22
  pip-audit>=2.6
23
23
  agentrust-trace-tests>=0.4,<0.6
24
- a2a-sdk[http-server]==1.1.4
24
+ a2a-sdk[http-server]==1.1.5
25
25
  uvicorn==0.53.0
26
26
  aiohttp>=3.14.3
27
27
  setuptools>=83.0.0
@@ -1,8 +1,8 @@
1
1
  # This file was autogenerated by uv via the following command:
2
2
  # uv pip compile requirements/dev.in --generate-hashes --universal --python-version 3.11 -o requirements/dev.txt
3
- a2a-sdk==1.1.4 \
4
- --hash=sha256:a77d7234d25e4b480626c09580c8cf4967d6beb0433ae139ac0eb15055fef128 \
5
- --hash=sha256:b91b0350e1b1a3ef996b76766244523890d6b31b5aaf3f9d69c145fa97c5e0cf
3
+ a2a-sdk==1.1.5 \
4
+ --hash=sha256:c1d63d36b79a097c62dd9be001fce21d5939f5a811a9c5afd0ba8082f13f68bf \
5
+ --hash=sha256:f81837f86a9bbb3ed4909539be642d61e8539ce8300a6578fa71dc901ee65b97
6
6
  # via -r requirements/dev.in
7
7
  agent-manifest==0.12.0 \
8
8
  --hash=sha256:ad8380f39d906054ff07852386bb5caeb3525c82126ccc6b5d463656ba41a8e1 \
@@ -289,37 +289,37 @@ cbor2==6.1.4 \
289
289
  --hash=sha256:e8097e8259b78c8feb5dd5b833b23f83ed588e821ef44cf1455082cfc9434440 \
290
290
  --hash=sha256:f3fc7d15cba4174373df2496070faa4a927fe3ed772130d281808120aec7b61c
291
291
  # via agent-manifest
292
- cedarpy==4.8.7 \
293
- --hash=sha256:07690aac1f5fd0632fd3bde119c67f39f729cb88329be95b5ab43733bfa18c3c \
294
- --hash=sha256:081f2881ae4f439c6505dc14c3223d24a147cae0b16bf19f1cde9b9179669bdc \
295
- --hash=sha256:110cea54ca558996b19599cdca329a3fb59df41a08c86bd06c591e75d9f24d70 \
296
- --hash=sha256:149a89f910a937bec3835de1f0ccb5f96c955434b6eeb8c357d159bf9da81fcf \
297
- --hash=sha256:1e3cfb91738795500d2123cbdf389830253899231e34c03bd685e88a0f105474 \
298
- --hash=sha256:3039ff7905cd97be6504961bbe97abab8ce5eebd23b0811378406bdcab1fe9ea \
299
- --hash=sha256:31e63b4dff33ddbf9d9f1630c4c46561e78a28776aa43b9c9ba85c5d9483114f \
300
- --hash=sha256:365e07e108cd5b99bf2777d2ddbe803ab52594a899ab4d1fd1802a4ab27baf75 \
301
- --hash=sha256:366a9e1b24a5c98e009b1233ec415d843e4b81b0f8d0959626832091d1918147 \
302
- --hash=sha256:3a4f06417374e66b93a582340d7c8e0c4f88a370387ee3364ad7a8f563c3711c \
303
- --hash=sha256:3ff337cc540775ef7c043cd01a127b145a47e7565f9e50bc8557ea5fcd8097b5 \
304
- --hash=sha256:464f93d86e02c6212ee2112862b1c0aa023b65069f9fcd1e4137b523510827d4 \
305
- --hash=sha256:4998a9aea8e481d122940c87615a0bf3efe574f9e50b7c0efa82c88fab832e48 \
306
- --hash=sha256:51fec10645fc6a2a8f6c038e791d05297f3afcd3d9513a9c5685e50724debf1b \
307
- --hash=sha256:5bba28c91c2232f91354f135c1c08c4af8caa609ae1c02ebee970d86cc21ea13 \
308
- --hash=sha256:73d2209602c424251722cbd62f69dc0f4542fc6dd8ff4b3d29fb856d6145fa7a \
309
- --hash=sha256:7b2623226b9aaf2b21f988e93f92dc82d7ebfe18806867dbb1f75ab1e4e2acff \
310
- --hash=sha256:8302a606fd8ab197175e4dd76ae8b6749909c0cbe85ce2235e6878d58ecc477c \
311
- --hash=sha256:90eda3406daa817c243a0b2499b8b512f47e1c41656302795f9800357650ecde \
312
- --hash=sha256:9763dd6cdbebb2df6e12d94fcfc07ce0b6c7e77d7cc9da3cf94c9fd05da0a1cd \
313
- --hash=sha256:995883175655d4a328558ba7eaf1b4f6603cab0e79c543d4bf229777c78e1fb7 \
314
- --hash=sha256:9ae10446842fa81246315257d470c01cc3b0ccd64b86dece4a87ce2ace5966e1 \
315
- --hash=sha256:bba2a522c508379f796cd00ab32dea4047ad9d5d0d3091af2b6440a4c64faf99 \
316
- --hash=sha256:bc6f911e210502c1572a861ebbfe3533885e2738f1e4f492bd6067132a11d2e0 \
317
- --hash=sha256:bcce86f71a0071d3af5631d4d9e311b4cc66b131d19d1be018810799fc577171 \
318
- --hash=sha256:c63af3a6d41f273655e348203c6475e6eaeb46b8e2aa42e7c9a70b25880d25c9 \
319
- --hash=sha256:cf3a1080e6ccf69747da8315f9b1838588b1a8e48d03f939b2775c7b3729102d \
320
- --hash=sha256:ebbad67672f7b58ce64b1a3eecd2ec5545dfd9dcd64a87345a2ddd922e1dd2f7 \
321
- --hash=sha256:f4c2eb6f72f3df04c33c7129de0f05b736516464641cfad39322ad542e13d673 \
322
- --hash=sha256:f713b2874dac187c1fd96712992c5ed20a5d98e463cc7eda6186c36aa8455c64
292
+ cedarpy==4.12.1 \
293
+ --hash=sha256:14630de081249519d76a6c9aca9f677251aa5aa722a056ac4e1f365db392f1ed \
294
+ --hash=sha256:1c765643cc3c1472d85324f42147f3732b1c8dd47f71ff066386e7c8afe109b7 \
295
+ --hash=sha256:2609aaa1e2041599592a821de3741c56b2a778b9c20e87ac97c84a0531120dbd \
296
+ --hash=sha256:28f99b8c3f8faf0cd78a82c2a845360f60f47d54ab8b97ba64e19b04a42e70d5 \
297
+ --hash=sha256:3010ab38bd691387944d57d925aab6b743694a89a1cd3de4295421161bad1609 \
298
+ --hash=sha256:333e89642a5914037bead6ddc16ad4d246d7a27f227856c5636db5524d16e27c \
299
+ --hash=sha256:34316ad5eb18d5ed34beb5b00398b1928f9add67dca6fef7f12f6bf11eb86e8d \
300
+ --hash=sha256:357002b436d06ad00cd24c1dc27287933af9c45af0541b0cd9d52036cccfe8c2 \
301
+ --hash=sha256:35e7446894bf8889e5c04118391b8720afee7dcd2e9d4ebecfa646674301fb96 \
302
+ --hash=sha256:3c216ce8e4e9f8edb03154424dd99611e99533c3fb2f552147f61b0fcde5ac22 \
303
+ --hash=sha256:42e238d25695f92898d4249cd659b67e6d9cde0c3f5ab1403cc642af5e4f5b85 \
304
+ --hash=sha256:46429641712af012e1b2579cc1083eb5ab1ea7df2e7117d94b965cfe515255ba \
305
+ --hash=sha256:547fda0b8f9948634a8b4445a449d4736de4312c11a2133aa5df7deb1d2b99fb \
306
+ --hash=sha256:6f814415d96eed4d724b2ea34f1017217a7022a958307986eb009d5878d482c9 \
307
+ --hash=sha256:7047ff6368a9e52453dbd2ac33f8d7d062a67ff1ee3f3a887f41c0a857f3f6e4 \
308
+ --hash=sha256:74b3d6deb0d482f9645b7709016ab81dc7405be83270b10790b646a60f475518 \
309
+ --hash=sha256:7f71d2285a4cd048866bd66aac36c0cff791554d6755f4230a71987f0b601b71 \
310
+ --hash=sha256:80dca63da4cea16969d023daff31a15665ba54a769f633fb26ac5594b7ffd291 \
311
+ --hash=sha256:832bdcd9586bd9597e52b6adf248adc77c1e2b0c55f3cfc10259feb6627bcd96 \
312
+ --hash=sha256:84aaac429b3cae8b9d496aef9ef99426c130bde390767f46738dea04b7a05714 \
313
+ --hash=sha256:869e4318dbd827aea996fe0b858592866fb7ad1888484b71b5fdd15334eaf8a0 \
314
+ --hash=sha256:91410cbd0027a91a1a3dadf919f1d54bc75a62705247b833a004c5e24add1803 \
315
+ --hash=sha256:9497da64835f431a0acdc6f393a841235bc0657188978238badae2ded3653b02 \
316
+ --hash=sha256:970ecd03259e691d8b947c972b03d3ae34c7dd1d3e9e39d03fbe62dccc03227f \
317
+ --hash=sha256:a935e3ed9e5873f88348469eb917e816335f62387d0f9ebed7058fac76c9a547 \
318
+ --hash=sha256:bbcfb99ef9dc0c155677473d7e5bea8baac6ff2abe27b89a530a7cabb184e3e0 \
319
+ --hash=sha256:c5eea3a4ce98862f1dc06bef1038ae8edf52c74d36980e8e75b59a38168f53ab \
320
+ --hash=sha256:d00d151a1b2bd3697d778fd89597cc16aa1fca11da25594d7a000c725477f151 \
321
+ --hash=sha256:e8ed70991b958f344017663f753f044070cd0e61dfd4ffe408ba05d48c48dea4 \
322
+ --hash=sha256:f164ca11999e1d3a1641548d17755c3c45a5385b2590a642ef3122a1196947ca
323
323
  # via -r requirements/dev.in
324
324
  certifi==2026.7.22 \
325
325
  --hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \
@@ -2034,25 +2034,25 @@ rpds-py==2026.6.3 \
2034
2034
  # via
2035
2035
  # jsonschema
2036
2036
  # referencing
2037
- ruff==0.16.8 \
2038
- --hash=sha256:15e7d226246961db9235098333caa13063906d3851136b84c2900b82f5daa1df \
2039
- --hash=sha256:34508983c70665578dab88f5223d8e6228307e1135398ca8bfc8b7e9501e282b \
2040
- --hash=sha256:359a1e5b495448ee1e91018064382ebc86f90e8aac2fed222c7d0e4e8df85fd2 \
2041
- --hash=sha256:3a79b795469fef7fc6e908b218eed2eb17332afd85031db6480dc864560e69b2 \
2042
- --hash=sha256:3fdc5563cdc50555e6fba39322850860e9267c1b3d12c26a74729d8604c3c812 \
2043
- --hash=sha256:42ed6b878ed61e3acca92f2730a17acff39286944ea82398544696366a6f925e \
2044
- --hash=sha256:55793ba85c69921e89be061426d91a78652d6e50317c962240922747a4eb713f \
2045
- --hash=sha256:59e8f5681349474110b24d62e93cfda6593f5fa3473446ca3705200cac1a08b9 \
2046
- --hash=sha256:644bb578569e0ffc575741232bd385dacdd6fbe123f1a729e7a225f54aa3957f \
2047
- --hash=sha256:6ca111ba0849539165e9e59d2b442542f3c1e8060ebbdea82494f1ffbccb1e1f \
2048
- --hash=sha256:6ffbd6d87383c1edf5f6fa890f10200950240d7c1a16052a19a09d3a2307dd38 \
2049
- --hash=sha256:7ea781c7f2afba8c6a505ea0fb3f994020249e0c450635f5381286fea6b46170 \
2050
- --hash=sha256:8efeae3bbe414a5efefda11a792dfb51ef90ac48d50c4830de2f644caf3e8659 \
2051
- --hash=sha256:9247bf92b5f04d825c8639a4fe423ec2e4222acd9222e58412b0dab7e442798b \
2052
- --hash=sha256:a2bf6bc3e9ebdd4449abc6f06cf64b98051a2c61cf94d2fe9596518c881f1a1e \
2053
- --hash=sha256:a6b85621fd3c81e31fc5f5add09c9c078b430db3595ca632efafdec9e64ebfaa \
2054
- --hash=sha256:d075e820af612102ce217f07cc93e69f9490b10ec13ea85fa87bd03d996cef8a \
2055
- --hash=sha256:efa3e7a16d1baaa79957888dfdf8be9ef2e44db81cb032af06d76632ab59e773
2037
+ ruff==0.16.9 \
2038
+ --hash=sha256:0e1dbc2073624dee6618d41d0098690a7244654af746704b64759e12b6b6b385 \
2039
+ --hash=sha256:12b625c6cfba78d285d9f48eda5f053374f1e53cb10ef17342a383750db99161 \
2040
+ --hash=sha256:1632eb1d6197f33bd00b1acbc5b71009e89a8895c158e2d2b03a834fac964ab6 \
2041
+ --hash=sha256:41e3870277694177429b56406d65dfbdb2c2802c52b715edaf6a0b829c69d4ee \
2042
+ --hash=sha256:447fc07e1573afff7cb02803462b12b6c8ece7cf10e2cd78565fa6d7a1c0bf8d \
2043
+ --hash=sha256:4684dded7db60aa57cb118fa158630f5feade4af5782903b6053484bdf9bd129 \
2044
+ --hash=sha256:6bd40fec8cd4c8a3d4dd589bd8ad4e6320c13c29234159bfd959a40d529d597b \
2045
+ --hash=sha256:7baa24ef5fc8e77aa93879e1d3f43754a01ae488e869f1ae30cf431afd4d2452 \
2046
+ --hash=sha256:8a3e039a6a40ed976c491722b60e0ae4a4aa1a86057f540ee7a37a5d19ae9120 \
2047
+ --hash=sha256:8adbe4e58af167f767d7b2ba5e83c42e878350796cf78c2f5e14ab9903a92588 \
2048
+ --hash=sha256:95e6f022090368ab3b824c36276839c53b2adf1a3f4c09fefc33dfc400f6da96 \
2049
+ --hash=sha256:a21713e629d3e5bdb2f5c2def1cc7f04f47fa8e1a7eb0571b4a28e1da64bc728 \
2050
+ --hash=sha256:a41aac6230aadfaa133bdfa1614488531ffa3e0837567ae04c0da2058a9c0f9e \
2051
+ --hash=sha256:a5f27be168556594a86d2f415db0cf43f5291917849318f873c7e2791f7a8c67 \
2052
+ --hash=sha256:b3f951b14d865d5952c89d40a5ca07e87abe24fa5453299878411e127748fb1c \
2053
+ --hash=sha256:c2529fb5896d49115b0e9aa8f887490b34bbe76baf879ec2264ac59406869ce7 \
2054
+ --hash=sha256:d29c934357e45642fda2f34c0b1f4025b4a6c01e15e4bf0016879d60078a142c \
2055
+ --hash=sha256:ed1a252039200f57a59eebc063b54beabea67bfbaaca0eeaa7f54b5fbcda2284
2056
2056
  # via -r requirements/dev.in
2057
2057
  setuptools==84.0.0 \
2058
2058
  --hash=sha256:51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670 \
@@ -2161,9 +2161,9 @@ typing-inspection==0.4.4 \
2161
2161
  --hash=sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47 \
2162
2162
  --hash=sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147
2163
2163
  # via pydantic
2164
- urllib3==2.7.0 \
2165
- --hash=sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c \
2166
- --hash=sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897
2164
+ urllib3==2.8.0 \
2165
+ --hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3 \
2166
+ --hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63
2167
2167
  # via requests
2168
2168
  uvicorn==0.53.0 \
2169
2169
  --hash=sha256:a9356f0cb89b3b8621529c5d5eebd69bfe154f4c3f68b4cf2de47e45fa855c2e \
@@ -232,9 +232,9 @@ griffelib==2.3.0 \
232
232
  htmlmin2==0.1.13 \
233
233
  --hash=sha256:75609f2a42e64f7ce57dbff28a39890363bde9e7e5885db633317efbdf8c79a2
234
234
  # via mkdocs-minify-plugin
235
- idna==3.19 \
236
- --hash=sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15 \
237
- --hash=sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4
235
+ idna==3.20 \
236
+ --hash=sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44 \
237
+ --hash=sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c
238
238
  # via requests
239
239
  jinja2==3.1.6 \
240
240
  --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \
@@ -246,9 +246,9 @@ jinja2==3.1.6 \
246
246
  jsmin==3.0.1 \
247
247
  --hash=sha256:c0959a121ef94542e807a674142606f7e90214a2b3d1eb17300244bbb5cc2bfc
248
248
  # via mkdocs-minify-plugin
249
- markdown==3.10.3 \
250
- --hash=sha256:3589362618f743188b4d955b874402bc814f4f83f544dc207719f4baa7d9c45f \
251
- --hash=sha256:fa6c92a00a4a3c98b22728c64a935ae1928250ae65058a6ded814d2cc29a4cea
249
+ markdown==3.11 \
250
+ --hash=sha256:180224db6aed87ba9ce1f2781ebcd5826253de8ff637112090e24b84502bbf9f \
251
+ --hash=sha256:cd6c89e7eb308c8b332ed673215a52d208a43f8bacc030b1419376129408719e
252
252
  # via
253
253
  # mkdocs
254
254
  # mkdocs-autorefs
@@ -419,9 +419,9 @@ mkdocstrings==1.0.6 \
419
419
  # via
420
420
  # -r requirements-docs.txt
421
421
  # mkdocstrings-python
422
- mkdocstrings-python==2.0.8 \
423
- --hash=sha256:34545b54681cf0b212aab95394d37b0f5326a93b102f6ad1df3d965c79384c9d \
424
- --hash=sha256:e555d9ef53b0febdeae4dd603144d4f86ec90fef672276645ea3bb61232c3d24
422
+ mkdocstrings-python==2.0.9 \
423
+ --hash=sha256:ae945637dc0618c6beedbee169f10c0234b77f322c53db3fc9fb4c29b3013038 \
424
+ --hash=sha256:c0233eff3f84d78110df50541918e7ec2bcff8e1614faddea34290a90321a416
425
425
  # via mkdocstrings
426
426
  packaging==26.3 \
427
427
  --hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \
@@ -435,9 +435,9 @@ pathspec==1.1.1 \
435
435
  --hash=sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a \
436
436
  --hash=sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189
437
437
  # via mkdocs
438
- platformdirs==4.11.8 \
439
- --hash=sha256:52f2f181bbfde907966932cc8312d967d02976422d66d537ea16092b8e291081 \
440
- --hash=sha256:f23abafea7dd4276d1f29104b83598d7dcc567cafd07c9c951e66665645437fc
438
+ platformdirs==4.11.12 \
439
+ --hash=sha256:b1ba966ac76153d9985a0787ffab951e7c18416189873d4e4ddb2c8a04a0a254 \
440
+ --hash=sha256:e8dc1cb58f1153fd7f61db1374317770baababec2480b37b8f01c6cc25b45267
441
441
  # via mkdocs-get-deps
442
442
  pygments==2.21.0 \
443
443
  --hash=sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9 \
@@ -547,9 +547,9 @@ six==1.17.0 \
547
547
  # via
548
548
  # markdownify
549
549
  # python-dateutil
550
- soupsieve==2.9.2 \
551
- --hash=sha256:4a55d8cf158a9c2e587fa4922f1bbb91d68ac829e2d6f25403a85747c71daf74 \
552
- --hash=sha256:8089a26fd974ca7a1f30276d3d8492ab266ab15af581642dfe8aa162e0c1c823
550
+ soupsieve==2.10 \
551
+ --hash=sha256:49e9380d7d2905463583bafe285e818c7366a9ed7b3aee221c1ac79c905d8bc0 \
552
+ --hash=sha256:8596eb8967d744174820280fa62b4542a2e955bfaccca73ed8a13c6eb8e9b502
553
553
  # via beautifulsoup4
554
554
  typing-extensions==4.16.0 \
555
555
  --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \
@@ -591,7 +591,26 @@ watchdog==6.0.0 \
591
591
  --hash=sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c \
592
592
  --hash=sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2
593
593
  # via mkdocs
594
- wcwidth==0.8.4 \
595
- --hash=sha256:2097bb1d28a0ba8fe177c2eb607317f9b1627b03f33ebebfd3da670b337a65ba \
596
- --hash=sha256:2dae09efa25253ae2874188e86d6861af3b1652aef4118cdf3f0bda288a957fb
594
+ wcwidth==0.9.1 \
595
+ --hash=sha256:03cfca3dcbffa86564290fe3c9978a6191ba003e8ced7f7dbda315fcb3fbe725 \
596
+ --hash=sha256:0665ee822ea04e25801e6e82e5407528be0863e88a17b0e7ca038843a4a3ac0c \
597
+ --hash=sha256:0d68a30d504c68cfdff2a5f804675c1e7ab4c0bbe878024c8b680ec5579cde67 \
598
+ --hash=sha256:10b00ba23482e352f874d2e8135e7ace9da838646c7dd800566246bbd46125ff \
599
+ --hash=sha256:356376852357b8fca71fe5415808ec421679e04b4a98eb7c9cb6a7984b911a05 \
600
+ --hash=sha256:40d936d72c9bdc10df43f93a8be502bc5024b487259139f66a328722c07f34a9 \
601
+ --hash=sha256:5823209b0d43af322ce698c689380d7c15ca31fa8e6e3be8459f27031bef0af5 \
602
+ --hash=sha256:61bd7aef9cafb6cb77a37a169998d7928ce82a51522146d11f60db9e7d1cb43a \
603
+ --hash=sha256:69bb970cf5652b88cfdb9d3fdd1764fc15e5f8ad531643e7bb3e894cd969740e \
604
+ --hash=sha256:6e1272b7986cefe79783737e38bdb9eaae0682b333c7bd132024441193dd5ce7 \
605
+ --hash=sha256:708158c082364af442f9983de7b6ec9ac0d2e1b825ada25f0911b1f138d55405 \
606
+ --hash=sha256:747fb724223f417a17541a95a17c1dac3a8ef9a0cf41684950f0eab191a35f65 \
607
+ --hash=sha256:991d1c8834f548e9c1f16432075ee84638e122312556bbf1ed595ea8fffc4673 \
608
+ --hash=sha256:9f1636c5075ffd5c2e835b4561874f6e5dd2bbeba3c6c2c99f067d0d16883af8 \
609
+ --hash=sha256:b5da43d6967668982e44a52fb551967d293f86d26cd86036ac95bbdd34394ed9 \
610
+ --hash=sha256:bcb9ed4a367cc025bf1092ac679a156759605182d60b7ed3c28f7221a42ddf55 \
611
+ --hash=sha256:c4cead196551112cb8f43cdd1f80c235ef2456e34b1a9955c424537ec99961b2 \
612
+ --hash=sha256:dc10e262c3ac0abbfd0a2a51e45a848b1b7f500b21ff512630277973ba25674d \
613
+ --hash=sha256:e0c3a1c45c5b9550c6919a4449e95f5b177f6e165786376981db8f1addae9b21 \
614
+ --hash=sha256:eab587e18e7cadf1a750b0098fc8bebfb62c125eb9306f2268f0443a282a3d78 \
615
+ --hash=sha256:fe021c4d8de9d36c31a0cb41d0d2546dadd3b0708a301f1a0c66ce200851831f
597
616
  # via mdformat-tables
@@ -475,9 +475,9 @@ twine==7.0.0 \
475
475
  --hash=sha256:85cdb29c518efef867360ae4acd4b0dfd61c8654a22fca08e6f8539f05022177 \
476
476
  --hash=sha256:b854164df26db268af05f49aa5c0344b10e27a494343ff05b1e0bad3b135f5a7
477
477
  # via -r requirements/release.in
478
- urllib3==2.7.0 \
479
- --hash=sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c \
480
- --hash=sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897
478
+ urllib3==2.8.0 \
479
+ --hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3 \
480
+ --hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63
481
481
  # via
482
482
  # id
483
483
  # requests
@@ -6,7 +6,7 @@
6
6
  # --python-version 3.11 -o requirements/runtime.txt
7
7
  cryptography>=50.0
8
8
  pyyaml>=6.0
9
- cedarpy==4.8.7
9
+ cedarpy==4.12.1
10
10
  agentrust-trace>=0.5
11
11
  agent-manifest>=0.11.1
12
12
  rfc8785>=0.1
@@ -69,37 +69,37 @@ cbor2==6.1.4 \
69
69
  --hash=sha256:e8097e8259b78c8feb5dd5b833b23f83ed588e821ef44cf1455082cfc9434440 \
70
70
  --hash=sha256:f3fc7d15cba4174373df2496070faa4a927fe3ed772130d281808120aec7b61c
71
71
  # via agent-manifest
72
- cedarpy==4.8.7 \
73
- --hash=sha256:07690aac1f5fd0632fd3bde119c67f39f729cb88329be95b5ab43733bfa18c3c \
74
- --hash=sha256:081f2881ae4f439c6505dc14c3223d24a147cae0b16bf19f1cde9b9179669bdc \
75
- --hash=sha256:110cea54ca558996b19599cdca329a3fb59df41a08c86bd06c591e75d9f24d70 \
76
- --hash=sha256:149a89f910a937bec3835de1f0ccb5f96c955434b6eeb8c357d159bf9da81fcf \
77
- --hash=sha256:1e3cfb91738795500d2123cbdf389830253899231e34c03bd685e88a0f105474 \
78
- --hash=sha256:3039ff7905cd97be6504961bbe97abab8ce5eebd23b0811378406bdcab1fe9ea \
79
- --hash=sha256:31e63b4dff33ddbf9d9f1630c4c46561e78a28776aa43b9c9ba85c5d9483114f \
80
- --hash=sha256:365e07e108cd5b99bf2777d2ddbe803ab52594a899ab4d1fd1802a4ab27baf75 \
81
- --hash=sha256:366a9e1b24a5c98e009b1233ec415d843e4b81b0f8d0959626832091d1918147 \
82
- --hash=sha256:3a4f06417374e66b93a582340d7c8e0c4f88a370387ee3364ad7a8f563c3711c \
83
- --hash=sha256:3ff337cc540775ef7c043cd01a127b145a47e7565f9e50bc8557ea5fcd8097b5 \
84
- --hash=sha256:464f93d86e02c6212ee2112862b1c0aa023b65069f9fcd1e4137b523510827d4 \
85
- --hash=sha256:4998a9aea8e481d122940c87615a0bf3efe574f9e50b7c0efa82c88fab832e48 \
86
- --hash=sha256:51fec10645fc6a2a8f6c038e791d05297f3afcd3d9513a9c5685e50724debf1b \
87
- --hash=sha256:5bba28c91c2232f91354f135c1c08c4af8caa609ae1c02ebee970d86cc21ea13 \
88
- --hash=sha256:73d2209602c424251722cbd62f69dc0f4542fc6dd8ff4b3d29fb856d6145fa7a \
89
- --hash=sha256:7b2623226b9aaf2b21f988e93f92dc82d7ebfe18806867dbb1f75ab1e4e2acff \
90
- --hash=sha256:8302a606fd8ab197175e4dd76ae8b6749909c0cbe85ce2235e6878d58ecc477c \
91
- --hash=sha256:90eda3406daa817c243a0b2499b8b512f47e1c41656302795f9800357650ecde \
92
- --hash=sha256:9763dd6cdbebb2df6e12d94fcfc07ce0b6c7e77d7cc9da3cf94c9fd05da0a1cd \
93
- --hash=sha256:995883175655d4a328558ba7eaf1b4f6603cab0e79c543d4bf229777c78e1fb7 \
94
- --hash=sha256:9ae10446842fa81246315257d470c01cc3b0ccd64b86dece4a87ce2ace5966e1 \
95
- --hash=sha256:bba2a522c508379f796cd00ab32dea4047ad9d5d0d3091af2b6440a4c64faf99 \
96
- --hash=sha256:bc6f911e210502c1572a861ebbfe3533885e2738f1e4f492bd6067132a11d2e0 \
97
- --hash=sha256:bcce86f71a0071d3af5631d4d9e311b4cc66b131d19d1be018810799fc577171 \
98
- --hash=sha256:c63af3a6d41f273655e348203c6475e6eaeb46b8e2aa42e7c9a70b25880d25c9 \
99
- --hash=sha256:cf3a1080e6ccf69747da8315f9b1838588b1a8e48d03f939b2775c7b3729102d \
100
- --hash=sha256:ebbad67672f7b58ce64b1a3eecd2ec5545dfd9dcd64a87345a2ddd922e1dd2f7 \
101
- --hash=sha256:f4c2eb6f72f3df04c33c7129de0f05b736516464641cfad39322ad542e13d673 \
102
- --hash=sha256:f713b2874dac187c1fd96712992c5ed20a5d98e463cc7eda6186c36aa8455c64
72
+ cedarpy==4.12.1 \
73
+ --hash=sha256:14630de081249519d76a6c9aca9f677251aa5aa722a056ac4e1f365db392f1ed \
74
+ --hash=sha256:1c765643cc3c1472d85324f42147f3732b1c8dd47f71ff066386e7c8afe109b7 \
75
+ --hash=sha256:2609aaa1e2041599592a821de3741c56b2a778b9c20e87ac97c84a0531120dbd \
76
+ --hash=sha256:28f99b8c3f8faf0cd78a82c2a845360f60f47d54ab8b97ba64e19b04a42e70d5 \
77
+ --hash=sha256:3010ab38bd691387944d57d925aab6b743694a89a1cd3de4295421161bad1609 \
78
+ --hash=sha256:333e89642a5914037bead6ddc16ad4d246d7a27f227856c5636db5524d16e27c \
79
+ --hash=sha256:34316ad5eb18d5ed34beb5b00398b1928f9add67dca6fef7f12f6bf11eb86e8d \
80
+ --hash=sha256:357002b436d06ad00cd24c1dc27287933af9c45af0541b0cd9d52036cccfe8c2 \
81
+ --hash=sha256:35e7446894bf8889e5c04118391b8720afee7dcd2e9d4ebecfa646674301fb96 \
82
+ --hash=sha256:3c216ce8e4e9f8edb03154424dd99611e99533c3fb2f552147f61b0fcde5ac22 \
83
+ --hash=sha256:42e238d25695f92898d4249cd659b67e6d9cde0c3f5ab1403cc642af5e4f5b85 \
84
+ --hash=sha256:46429641712af012e1b2579cc1083eb5ab1ea7df2e7117d94b965cfe515255ba \
85
+ --hash=sha256:547fda0b8f9948634a8b4445a449d4736de4312c11a2133aa5df7deb1d2b99fb \
86
+ --hash=sha256:6f814415d96eed4d724b2ea34f1017217a7022a958307986eb009d5878d482c9 \
87
+ --hash=sha256:7047ff6368a9e52453dbd2ac33f8d7d062a67ff1ee3f3a887f41c0a857f3f6e4 \
88
+ --hash=sha256:74b3d6deb0d482f9645b7709016ab81dc7405be83270b10790b646a60f475518 \
89
+ --hash=sha256:7f71d2285a4cd048866bd66aac36c0cff791554d6755f4230a71987f0b601b71 \
90
+ --hash=sha256:80dca63da4cea16969d023daff31a15665ba54a769f633fb26ac5594b7ffd291 \
91
+ --hash=sha256:832bdcd9586bd9597e52b6adf248adc77c1e2b0c55f3cfc10259feb6627bcd96 \
92
+ --hash=sha256:84aaac429b3cae8b9d496aef9ef99426c130bde390767f46738dea04b7a05714 \
93
+ --hash=sha256:869e4318dbd827aea996fe0b858592866fb7ad1888484b71b5fdd15334eaf8a0 \
94
+ --hash=sha256:91410cbd0027a91a1a3dadf919f1d54bc75a62705247b833a004c5e24add1803 \
95
+ --hash=sha256:9497da64835f431a0acdc6f393a841235bc0657188978238badae2ded3653b02 \
96
+ --hash=sha256:970ecd03259e691d8b947c972b03d3ae34c7dd1d3e9e39d03fbe62dccc03227f \
97
+ --hash=sha256:a935e3ed9e5873f88348469eb917e816335f62387d0f9ebed7058fac76c9a547 \
98
+ --hash=sha256:bbcfb99ef9dc0c155677473d7e5bea8baac6ff2abe27b89a530a7cabb184e3e0 \
99
+ --hash=sha256:c5eea3a4ce98862f1dc06bef1038ae8edf52c74d36980e8e75b59a38168f53ab \
100
+ --hash=sha256:d00d151a1b2bd3697d778fd89597cc16aa1fca11da25594d7a000c725477f151 \
101
+ --hash=sha256:e8ed70991b958f344017663f753f044070cd0e61dfd4ffe408ba05d48c48dea4 \
102
+ --hash=sha256:f164ca11999e1d3a1641548d17755c3c45a5385b2590a642ef3122a1196947ca
103
103
  # via -r requirements/runtime.in
104
104
  cffi==2.1.1 ; platform_python_implementation != 'PyPy' \
105
105
  --hash=sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e \