matrixscroll 0.7.0__tar.gz → 0.9.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 (204) hide show
  1. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/.gitignore +9 -0
  2. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/CHANGELOG.md +121 -0
  3. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/PKG-INFO +50 -100
  4. matrixscroll-0.9.0/README.md +210 -0
  5. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/SECURITY.md +44 -0
  6. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/SPEC.md +18 -2
  7. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/COMMIT_TIME_VS_ARTIFACT_TIME.md +1 -1
  8. matrixscroll-0.9.0/docs/COMPARISON.md +172 -0
  9. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/CRYPTO_BACKEND.md +4 -1
  10. matrixscroll-0.9.0/docs/CRYPTO_ROADMAP.md +156 -0
  11. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/GIT_AI_NOTES_INTEROP.md +1 -1
  12. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/HERO_DEMO.md +2 -2
  13. matrixscroll-0.9.0/docs/OFFLINE-SHUTDOWN.md +47 -0
  14. matrixscroll-0.9.0/docs/OPERATOR_RUNBOOK.md +82 -0
  15. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/POC2_AUDIT.md +2 -2
  16. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/SOFTWARE_PRODUCTS.md +2 -2
  17. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/commercial/README.md +1 -1
  18. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/explanation/style-supplement.md +2 -2
  19. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/index.md +6 -1
  20. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/reference/python-api.md +2 -1
  21. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/registries-guide.md +5 -4
  22. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/yubikey-bridge.md +1 -1
  23. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/mcp/matrixscroll-mcp.baseline.json +21 -17
  24. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/mcp/matrixscroll-mcp.manifest.json +17 -13
  25. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/mcp/matrixscroll-mcp.signed.json +21 -17
  26. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/__init__.py +8 -7
  27. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/_core.py +2 -3
  28. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/cli.py +7 -2
  29. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/cloud/client.py +1 -1
  30. matrixscroll-0.9.0/matrixscroll/constants.py +37 -0
  31. matrixscroll-0.9.0/matrixscroll/crypto_backend.py +279 -0
  32. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/git.py +1 -1
  33. matrixscroll-0.9.0/matrixscroll/kem.py +145 -0
  34. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/mcp.py +1 -82
  35. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/pqc.py +22 -12
  36. matrixscroll-0.9.0/matrixscroll/providers/__init__.py +6 -0
  37. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/providers/registry.py +8 -3
  38. matrixscroll-0.9.0/matrixscroll/sealed.py +153 -0
  39. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/ssx360_cli.py +2 -1
  40. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/pyproject.toml +8 -8
  41. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/schemas/pqc-signature.v1.json +3 -1
  42. matrixscroll-0.9.0/schemas/sealed-evidence-pack.v1.json +114 -0
  43. matrixscroll-0.9.0/tests/_pqc_support.py +15 -0
  44. matrixscroll-0.9.0/tests/test_acvp_mlkem.py +139 -0
  45. matrixscroll-0.9.0/tests/test_acvp_sigver.py +131 -0
  46. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_agentic_guidance.py +11 -5
  47. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_core.py +14 -13
  48. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_evidence_pack_export.py +1 -0
  49. matrixscroll-0.9.0/tests/test_independent_verifier.py +288 -0
  50. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_mcp_core.py +6 -0
  51. matrixscroll-0.9.0/tests/test_offline_verify_network.py +73 -0
  52. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_pqc.py +48 -2
  53. matrixscroll-0.9.0/tests/test_pqc_defaults.py +67 -0
  54. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_release_metadata.py +9 -11
  55. matrixscroll-0.9.0/tests/test_sealed.py +134 -0
  56. matrixscroll-0.9.0/tools/independent_verify.py +386 -0
  57. matrixscroll-0.9.0/vectors/README.md +72 -0
  58. matrixscroll-0.9.0/vectors/acvp-mlkem-fips203.json +208 -0
  59. matrixscroll-0.9.0/vectors/acvp-sigver-fips204-fips205.json +316 -0
  60. matrixscroll-0.9.0/vectors/sealed/README.md +16 -0
  61. matrixscroll-0.7.0/README.md +0 -258
  62. matrixscroll-0.7.0/docs/COMPARISON.md +0 -47
  63. matrixscroll-0.7.0/docs/CRYPTO_ROADMAP.md +0 -75
  64. matrixscroll-0.7.0/docs/SE050_POC_SCOPE.md +0 -92
  65. matrixscroll-0.7.0/docs/SE050_USB_PROTOCOL.md +0 -96
  66. matrixscroll-0.7.0/docs/hardware-provider.md +0 -115
  67. matrixscroll-0.7.0/docs/images/ssx360-usb-signer-architecture.jpg +0 -0
  68. matrixscroll-0.7.0/docs/images/ssx360-usb-signer-round-trip.jpg +0 -0
  69. matrixscroll-0.7.0/docs/images/ssx360-usb-signer.jpg +0 -0
  70. matrixscroll-0.7.0/matrixscroll/constants.py +0 -26
  71. matrixscroll-0.7.0/matrixscroll/crypto_backend.py +0 -176
  72. matrixscroll-0.7.0/matrixscroll/providers/__init__.py +0 -7
  73. matrixscroll-0.7.0/matrixscroll/providers/hardware.py +0 -71
  74. matrixscroll-0.7.0/matrixscroll/providers/se050_transport.py +0 -225
  75. matrixscroll-0.7.0/tests/test_se050_acceptance_vectors.py +0 -56
  76. matrixscroll-0.7.0/tests/test_se050_transport.py +0 -120
  77. matrixscroll-0.7.0/vectors/README.md +0 -43
  78. matrixscroll-0.7.0/vectors/se050/README.md +0 -35
  79. matrixscroll-0.7.0/vectors/se050/vector_01.json +0 -16
  80. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/CONTRIBUTING.md +0 -0
  81. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/LICENSE +0 -0
  82. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/controls/agentic_ai_controls.json +0 -0
  83. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/ADOPTER_KIT.md +0 -0
  84. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/AGENTIC_AI_SECURITY.md +0 -0
  85. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/AIMS_INTEROP.md +0 -0
  86. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/CI_HARD_GATE.md +0 -0
  87. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/DOCTRINE.md +0 -0
  88. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/FIVE_MINUTES.md +0 -0
  89. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/GITTUF_INTEROP.md +0 -0
  90. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/OPENSSF_SANDBOX_DECISION.md +0 -0
  91. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/ROADMAP_2026-07.md +0 -0
  92. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/SECURITY_PROPERTIES.md +0 -0
  93. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/SLSA_SOURCE_TRACK_MAPPING.md +0 -0
  94. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/WHITEPAPER.md +0 -0
  95. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/commercial/SCROLL_GATE_V2.md +0 -0
  96. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/commercial/SSX360_SCROLL.md +0 -0
  97. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/delegation-attestation-rfc.md +0 -0
  98. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/explanation/actor-attribution.md +0 -0
  99. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/explanation/ap2.md +0 -0
  100. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/explanation/commit-time-vs-artifact-time.md +0 -0
  101. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/explanation/trust-boundaries.md +0 -0
  102. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/explanation/writing-workflow.md +0 -0
  103. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/how-to/gate-protected-branch.md +0 -0
  104. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/how-to/publish-git-notes.md +0 -0
  105. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/how-to/scan-mcp-server.md +0 -0
  106. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/quickstart-agent.md +0 -0
  107. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/quickstart-claude-code.md +0 -0
  108. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/quickstart-git.md +0 -0
  109. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/quickstart-mcp.md +0 -0
  110. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/reference/cli.md +0 -0
  111. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/reference/commit-envelope.md +0 -0
  112. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/reference/exit-codes.md +0 -0
  113. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/rekor-guac-bridge-design.md +0 -0
  114. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/requirements.txt +0 -0
  115. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/superpowers/plans/2026-06-19-ci-action-plan.md +0 -0
  116. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/superpowers/plans/2026-06-19-sdk-refactor-plan.md +0 -0
  117. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/superpowers/specs/2026-06-19-matrixscroll-git-design.md +0 -0
  118. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/tutorial/first-commit.md +0 -0
  119. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/docs/yubikey-smoke.md +0 -0
  120. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/agentic_ai_evidence_manifest.json +0 -0
  121. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/agentic_ai_evidence_manifest.signed.json +0 -0
  122. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/ci/protected-branch.yml +0 -0
  123. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/commit-envelope.json +0 -0
  124. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/commit-envelope.signed.json +0 -0
  125. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/demo/agent-commit-demo.sh +0 -0
  126. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/demo/generate_signed_examples.py +0 -0
  127. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/demo/hero-self-attestation-demo.sh +0 -0
  128. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/demo/mcp-rugpull-demo.cast +0 -0
  129. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/demo/mcp-rugpull-demo.gif +0 -0
  130. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/demo/mcp-rugpull-demo.sh +0 -0
  131. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/release-manifest.json +0 -0
  132. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/release-manifest.signed.json +0 -0
  133. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/examples/trusted-keys-policy.json +0 -0
  134. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/_payment.py +0 -0
  135. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/_schemas.py +0 -0
  136. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/agent_trace.py +0 -0
  137. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/canonical.py +0 -0
  138. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/cloud/__init__.py +0 -0
  139. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/errors.py +0 -0
  140. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/formal.py +0 -0
  141. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/gate.py +0 -0
  142. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/guac_export.py +0 -0
  143. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/hooks/post-commit +0 -0
  144. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/hooks/pre-push +0 -0
  145. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/manifest.py +0 -0
  146. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/mcp_core.py +0 -0
  147. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/mcp_trust.py +0 -0
  148. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/policy.py +0 -0
  149. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/provenance/__init__.py +0 -0
  150. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/provenance/actions.py +0 -0
  151. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/providers/base.py +0 -0
  152. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/providers/emulated.py +0 -0
  153. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/providers/tpm.py +0 -0
  154. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/providers/yubikey.py +0 -0
  155. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/py.typed +0 -0
  156. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/rekor_publish.py +0 -0
  157. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/scroll/README.md +0 -0
  158. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/matrixscroll/scroll/__init__.py +0 -0
  159. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/schemas/action-envelope.v1.json +0 -0
  160. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/schemas/commit-envelope.v1.1.json +0 -0
  161. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/schemas/commit-envelope.v1.json +0 -0
  162. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/schemas/evidence-pack.v1.json +0 -0
  163. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/schemas/release-manifest.v1.json +0 -0
  164. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/schemas/ssx360.evidence-pack.v1.json +0 -0
  165. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/schemas/ssx360.mcp-manifest.v1.json +0 -0
  166. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/__init__.py +0 -0
  167. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/fixtures/github-gpgsig-commit.txt +0 -0
  168. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/fixtures/mcp-tools-sample.json +0 -0
  169. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_agent_trace.py +0 -0
  170. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_canonical.py +0 -0
  171. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_canonical_pqc.py +0 -0
  172. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_cli.py +0 -0
  173. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_crypto_backend.py +0 -0
  174. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_formal_specs.py +0 -0
  175. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_gate.py +0 -0
  176. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_git_envelope.py +0 -0
  177. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_guac_rekor.py +0 -0
  178. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_mcp_server.py +0 -0
  179. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_mcp_trust.py +0 -0
  180. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_no_monetization_surface.py +0 -0
  181. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_policy.py +0 -0
  182. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_provenance.py +0 -0
  183. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_security_properties.py +0 -0
  184. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_ssx360_cli.py +0 -0
  185. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_tpm_provider.py +0 -0
  186. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_vectors.py +0 -0
  187. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_verify_action_parser.py +0 -0
  188. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_verify_action_step.py +0 -0
  189. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/tests/test_yubikey_provider.py +0 -0
  190. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/_fixture_key.json +0 -0
  191. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/_generate.py +0 -0
  192. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/tampered_algorithm.json +0 -0
  193. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/tampered_device_id.json +0 -0
  194. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/tampered_field.json +0 -0
  195. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/tampered_nested.json +0 -0
  196. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/tampered_public_key.json +0 -0
  197. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/tampered_schema.json +0 -0
  198. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/tampered_signature.json +0 -0
  199. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/unsigned_empty_block.json +0 -0
  200. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/unsigned_no_block.json +0 -0
  201. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/valid_commit_envelope.json +0 -0
  202. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/valid_nested.json +0 -0
  203. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/valid_simple.json +0 -0
  204. {matrixscroll-0.7.0 → matrixscroll-0.9.0}/vectors/valid_unicode.json +0 -0
@@ -46,9 +46,15 @@ credentials/
46
46
  .cursor/
47
47
  .playwright-cli/
48
48
 
49
+ # Local operational data (workbench / envelopes)
50
+ data/
51
+
49
52
  # Matrix Scroll local store (never commit a private key)
50
53
  .matrixscroll/
51
54
  device.json
55
+ session.secret
56
+ credentials.once.txt
57
+ workbench.sqlite3
52
58
 
53
59
  # TLA+ tools (download locally or in CI)
54
60
  tla2tools.jar
@@ -66,3 +72,6 @@ site/
66
72
  .vale/styles/write-good/
67
73
  .vale/styles/ai-tells/
68
74
  .vale/styles/ai-tells-commits/
75
+
76
+ .mcp-resign-home/
77
+
@@ -6,6 +6,125 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.9.0] - 2026-09-13
10
+
11
+ Device-agnostic custody and CNSA 2.0 Category 5 sealed evidence packs. The USB/SE050
12
+ signing path is removed from the public SDK; historical `signature.mode=hardware`
13
+ envelopes still verify.
14
+
15
+ ### Removed
16
+ - **`matrixscroll[hardware]`**, `HardwareProvider`, USB CDC SE050 transport, MCP
17
+ `connect_card`, SE050 acceptance vectors, and USB-first documentation. Setting
18
+ `MATRIXSCROLL_MODE=hardware` raises `IdentityError` with migration guidance.
19
+ - Product visualizations and protocol docs that described a single USB signer as the
20
+ custody path.
21
+
22
+ ### Added
23
+ - **Sealed evidence packs** (`matrixscroll.sealed`, schema
24
+ `matrixscroll.sealed-evidence-pack.v1`): hybrid X25519 + ML-KEM-1024 key agreement,
25
+ AES-256-GCM body, Ed25519 + ML-DSA-87 signatures. Requires `matrixscroll[pqc]`.
26
+ Parameter-set readiness through liboqs; not a CNSA certification or FIPS validation.
27
+ - Device-agnostic custody documentation: implement `IdentityProvider` for any device
28
+ or HSM; default remains the file-backed `emulated` provider.
29
+
30
+ ### Changed
31
+ - MCP stdio server is **13 tools** (was 14). Version pins, action default, and
32
+ public docs target **0.9.0**.
33
+ - CRYPTO_ROADMAP sealed-pack step marked shipping for 0.9.0.
34
+
35
+ ## [0.8.0] - 2026-09-12
36
+
37
+ Default post-quantum signature set moves to the CNSA 2.0 parameter set. No
38
+ wire-format change; Ed25519 remains the default signature scheme and the
39
+ post-quantum overlay remains opt-in through `MATRIXSCROLL_PQC`.
40
+
41
+ ### Changed
42
+ - **Default PQC algorithm is now `ml-dsa-87`.** When you run
43
+ `matrixscroll pqc-keygen` without `--algorithm`, and when a library caller
44
+ invokes `load_pqc_keypair` or `attach_pqc_overlay` without an algorithm while
45
+ `MATRIXSCROLL_PQC` is unset, the SDK selects ML-DSA-87 (FIPS 204 Category 5).
46
+ That matches the CNSA 2.0 signature parameter set. Git commit envelopes and
47
+ `sign_manifest_with_pqc` attach the overlay only when you enable it:
48
+ `MATRIXSCROLL_PQC` names the set (`MATRIXSCROLL_PQC=ml-dsa-87`) or the caller
49
+ passes `pqc_algorithm`; `0`, `false`, `off` and `no` disable it, and an unset
50
+ variable leaves the manifest Ed25519-only. `matrixscroll sign`, the MCP
51
+ `sign_action` tool and `sign_mcp_manifest` remain Ed25519-only, as in 0.7.0;
52
+ the MCP `create_envelope` tool signs Git envelopes through
53
+ `sign_manifest_with_pqc`. It is parameter-set readiness through liboqs, not
54
+ CNSA certification, FIPS CMVP validation, or NSA approval.
55
+ Callers can still pass `ml-dsa-44` or `ml-dsa-65` explicitly. Existing key
56
+ files under `~/.matrixscroll/pqc/` are unchanged; a new default only affects
57
+ newly generated keys. `0.7.0` and earlier default to `ml-dsa-65`. Status of
58
+ each algorithm (shipping now, in progress, not planned) is the table in
59
+ `docs/CRYPTO_ROADMAP.md`.
60
+ - The public README and documentation now lead with the offline verification
61
+ outcome, use explicit verification-boundary sections, and reserve signer
62
+ implementation detail for qualified setup.
63
+ - **Documentation refreshed against the standards status of 12 September 2026.**
64
+ `docs/CRYPTO_ROADMAP.md` gains a policy-dates table (CNSSP-15 and the CNSA 2.0
65
+ FAQ v2.1, Executive Order 14412 and OMB M-26-15, the Department of War PQC
66
+ strategy, the NIST IR 8547 draft) and rows for FIPS 206, ML-KEM, LMS/XMSS and
67
+ the ACVP tests; `docs/COMPARISON.md` gains a dated landscape section (Sigstore,
68
+ GitHub attestations, gittuf, forge commit signing, MCP scanners, 2025-2026
69
+ agent-receipt projects) and a list of claims Matrix Scroll does not make. The
70
+ README and the documentation home open with the SSX360 USB signer render
71
+ (`docs/images/ssx360-usb-signer.jpg`, replaced) and the signer section shows
72
+ the sign round-trip sequence.
73
+
74
+ ### Added
75
+ - **`slh-dsa-sha2-256s` and `slh-dsa-sha2-256f`** in the allowed PQC algorithm
76
+ list (FIPS 205 Category 5 hash-based options), schema, and CLI choices.
77
+ - **NIST ACVP vectors** for the overlay: `vectors/acvp-sigver-fips204-fips205.json`
78
+ carries a subset of the ACVP-Server sample vectors for ML-DSA-87,
79
+ SLH-DSA-SHA2-256s and SLH-DSA-SHA2-256f (external interface, pure variant):
80
+ sigVer cases with the NIST tcIds, verdicts and reason strings, and sigGen
81
+ expected signatures over an empty context restated as positive cases. The
82
+ provenance block records the URL and SHA-256 of each source file. This is an
83
+ evidence mapping to NIST sample vectors, not a certification claim
84
+ (`docs/CRYPTO_ROADMAP.md`).
85
+ - **`tests/test_acvp_sigver.py`** verifies the NIST-valid empty-context
86
+ signatures through `pqc_verify`, verifies and rejects the context-string
87
+ cases through liboqs's `verify_with_ctx_str` on the same mechanism the
88
+ overlay uses, and treats a wrong-length signature as invalid without calling
89
+ the verifier; the provenance check runs without liboqs.
90
+ - **`tests/test_pqc.py`** signs, verifies and rejects a tampered signature for
91
+ every identifier in `PQC_ALGORITHMS`, and checks that a key file naming a set
92
+ the build does not enable fails through `IdentityError`.
93
+ - **`tools/independent_verify.py`**, a second implementation of the verifier
94
+ written from SPEC.md alone: its own canonical serializer, a pure-Python
95
+ RFC 8032 Ed25519, the device-id derivation and the section 6 procedure, with
96
+ no import from the SDK (the section 11 overlay is checked when liboqs is
97
+ present). `tests/test_independent_verifier.py` holds it against the SDK on
98
+ every committed vector, on 500 random documents and on fresh signatures; the
99
+ README's "Ten-minute check for reviewers" names the commands.
100
+ - **`matrixscroll.kem`** (CNSA 2.0 full-suite track, in progress): ML-KEM-1024
101
+ and ML-KEM-768 key generation, encapsulation and decapsulation through liboqs,
102
+ with deterministic key generation from the FIPS 203 seed. No envelope or
103
+ export format uses the module yet; `docs/CRYPTO_ROADMAP.md` names the sealed
104
+ evidence-pack design that will. `vectors/acvp-mlkem-fips203.json` and
105
+ `tests/test_acvp_mlkem.py` check it against the NIST ACVP sample vectors
106
+ (keyGen, decapsulation of NIST ciphertexts, implicit rejection of modified
107
+ ciphertexts); evidence mapping, not a certification claim.
108
+ - **`CNSA_PREFERRED_PQC_ALGORITHM`** constant (`ml-dsa-87`) for policy and docs
109
+ that need a named CNSA 2.0 signature target without hard-coding the string.
110
+ - **`docs/CRYPTO_ROADMAP.md`** CNSA 2.0 shipping / in progress / not table.
111
+
112
+ ### Fixed
113
+ - **SLH-DSA identifiers now resolve against liboqs.** The overlay mapped the
114
+ `slh-dsa-*` identifiers to mechanism names liboqs does not expose
115
+ (`SLH-DSA-SHA2-256s`), so every SLH-DSA key generation, signature and
116
+ verification raised `MechanismNotSupportedError` on liboqs 0.16. The backend
117
+ now resolves each identifier against `oqs.get_enabled_sig_mechanisms()`
118
+ (`SLH_DSA_PURE_SHA2_256S` on liboqs 0.13 and later, the hyphenated spelling as
119
+ a fallback) and reports an unsupported set as `IdentityError` with the liboqs
120
+ version. ML-DSA was unaffected.
121
+ - **`pqc_available()` no longer flips to true on the second call.** The probe
122
+ cached its negative result as an empty string and returned it unchanged on
123
+ later calls, so any second query reported the backend as present without
124
+ liboqs installed and the next signing call failed with a raw import error
125
+ instead of `IdentityError`. Found by the new tests, which query the probe
126
+ from two modules.
127
+
9
128
  ## [0.7.0] - 2026-08-11
10
129
 
11
130
  Fail-closed verification, package completeness, and public positioning. No
@@ -387,6 +506,8 @@ Initial public release. Extracted from the SSX360 reference implementation.
387
506
  - Device id format: `MS-XXXX-XXXX` (SHA-256 of the raw public key, first 8 hex
388
507
  chars, uppercase).
389
508
 
509
+ [0.9.0]: https://github.com/SSX360/matrixscroll/releases/tag/v0.9.0
510
+ [0.8.0]: https://github.com/SSX360/matrixscroll/releases/tag/v0.8.0
390
511
  [0.7.0]: https://github.com/SSX360/matrixscroll/releases/tag/v0.7.0
391
512
  [0.6.4]: https://github.com/SSX360/matrixscroll/releases/tag/v0.6.4
392
513
  [0.6.3]: https://github.com/SSX360/matrixscroll/releases/tag/v0.6.3
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: matrixscroll
3
- Version: 0.7.0
4
- Summary: MCP server for signed machine-action records, offline tool-surface checks, and SSX360 USB signer support.
3
+ Version: 0.9.0
4
+ Summary: MCP server for signed machine-action records, offline tool-surface checks, with device-agnostic custody and CNSA 2.0 Category 5 crypto (ML-DSA-87, ML-KEM-1024).
5
5
  Project-URL: Homepage, https://matrixscroll.com
6
- Project-URL: Documentation, https://matrixscroll.com/docs/
7
- Project-URL: Specification, https://matrixscroll.com/spec/
8
- Project-URL: Verifier, https://matrixscroll.com/verify/
6
+ Project-URL: Documentation, https://github.com/SSX360/matrixscroll/tree/main/docs
7
+ Project-URL: Specification, https://github.com/SSX360/matrixscroll/blob/main/SPEC.md
8
+ Project-URL: Verifier, https://matrixscroll.com/#verify-offline
9
9
  Project-URL: Repository, https://github.com/SSX360/matrixscroll
10
10
  Project-URL: Source, https://github.com/SSX360/matrixscroll
11
11
  Project-URL: Issues, https://github.com/SSX360/matrixscroll/issues
@@ -16,12 +16,12 @@ Project-URL: Security, https://github.com/SSX360/matrixscroll/blob/main/SECURITY
16
16
  Project-URL: GitHub Action, https://github.com/SSX360/matrixscroll/tree/main/.github/actions/verify
17
17
  Project-URL: Tests, https://github.com/SSX360/matrixscroll/tree/main/tests
18
18
  Project-URL: Public Roadmap, https://github.com/SSX360/matrixscroll/blob/main/docs/ROADMAP_2026-07.md
19
- Project-URL: Hardware Status, https://github.com/SSX360/matrixscroll/blob/main/docs/hardware-provider.md
19
+ Project-URL: Crypto Roadmap, https://github.com/SSX360/matrixscroll/blob/main/docs/CRYPTO_ROADMAP.md
20
20
  Project-URL: Maintainer, https://ssx360.com/about
21
21
  Author-email: SSX360 <security@matrixscroll.com>
22
22
  License-Expression: Apache-2.0
23
23
  License-File: LICENSE
24
- Keywords: authorization,ed25519,fips-204,fips-205,machine-action,matrixscroll,ml-dsa,post-quantum,provenance,root-of-trust,secure-element,signing,slh-dsa,ssx360,supply-chain
24
+ Keywords: authorization,ed25519,fips-204,fips-205,machine-action,matrixscroll,ml-dsa,ml-kem,post-quantum,provenance,root-of-trust,signing,slh-dsa,ssx360,supply-chain
25
25
  Classifier: Development Status :: 4 - Beta
26
26
  Classifier: Intended Audience :: Developers
27
27
  Classifier: Intended Audience :: Information Technology
@@ -46,8 +46,6 @@ Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
46
46
  Requires-Dist: pytest>=9.1.1; extra == 'dev'
47
47
  Requires-Dist: pyyaml>=6.0.3; extra == 'dev'
48
48
  Provides-Extra: git
49
- Provides-Extra: hardware
50
- Requires-Dist: pyserial>=3.5; extra == 'hardware'
51
49
  Provides-Extra: mcp
52
50
  Requires-Dist: mcp<2.0.0,>=1.28.0; extra == 'mcp'
53
51
  Provides-Extra: pqc
@@ -59,18 +57,16 @@ Description-Content-Type: text/markdown
59
57
 
60
58
  # Matrix Scroll
61
59
 
62
- Model Context Protocol server for signed machine-action records and offline tool-surface verification.
60
+ Signed machine-action records with offline verification for MCP, Git, and CI.
63
61
 
64
62
  [![ci-unit](https://github.com/SSX360/matrixscroll/actions/workflows/ci-unit.yml/badge.svg)](https://github.com/SSX360/matrixscroll/actions/workflows/ci-unit.yml)
65
63
  [![PyPI](https://img.shields.io/pypi/v/matrixscroll)](https://pypi.org/project/matrixscroll/)
66
64
  [![Python](https://img.shields.io/pypi/pyversions/matrixscroll)](https://pypi.org/project/matrixscroll/)
67
65
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/SSX360/matrixscroll/blob/main/LICENSE)
68
66
 
69
- An MCP server can change its tool descriptions or input schemas after installation. A Git commit can also declare an actor or tool without carrying a signed authorization record. Matrix Scroll addresses both gaps with Ed25519-signed evidence that reviewers can verify offline.
67
+ An MCP server can change its tool descriptions or input schemas after installation. A Git commit can also declare an actor or tool without carrying a signed authorization record. Matrix Scroll records both surfaces as Ed25519-signed evidence that reviewers can verify offline, with an optional ML-DSA-87 post-quantum overlay and ML-KEM-1024 sealed evidence packs on the CNSA 2.0 Category 5 track.
70
68
 
71
- The `matrixscroll-mcp` stdio server exposes 14 tools for commit envelopes, action records, pull-request checks, Git notes, MCP surface manifests, agent traces, and the SSX360 USB signer. Local signing and verification need no cloud account.
72
-
73
- SSX360 has completed and produced the USB signer shown below. The device uses an RP2350 USB bridge and an NXP SE050 secure element. SSX360 supplies the signer by direct inquiry through [SSX360 contact](https://ssx360.com/contact) or `mission@ssx360.com`.
69
+ The `matrixscroll-mcp` stdio server exposes 13 tools for commit envelopes, action records, pull-request checks, Git notes, MCP surface manifests, and agent traces. Custody is device-agnostic: the default is a file-backed software provider, and any device or HSM plugs in through the `IdentityProvider` seam. Local signing and verification need no cloud account.
74
70
 
75
71
  Matrix Scroll is an open protocol. The Python SDK is Apache-2.0 software, and the specification and vectors are CC0 1.0.
76
72
 
@@ -79,10 +75,11 @@ Matrix Scroll is an open protocol. The Python SDK is Apache-2.0 software, and th
79
75
  - [Install the MCP server](#install-the-mcp-server)
80
76
  - [MCP tools](#mcp-tools)
81
77
  - [Detect MCP tool-surface changes](#detect-mcp-tool-surface-changes)
82
- - [Use the SSX360 USB signer](#use-the-ssx360-usb-signer)
78
+ - [Device-agnostic custody](#device-agnostic-custody)
83
79
  - [Sign and verify from the CLI](#sign-and-verify-from-the-cli)
84
- - [Honest limits](#honest-limits)
80
+ - [Verification boundaries](#verification-boundaries)
85
81
  - [Verify the release](#verify-the-release)
82
+ - [Ten-minute check for reviewers](#ten-minute-check-for-reviewers)
86
83
  - [Security and license](#security-and-license)
87
84
 
88
85
  ## Install the MCP server
@@ -90,7 +87,7 @@ Matrix Scroll is an open protocol. The Python SDK is Apache-2.0 software, and th
90
87
  Install the current release from PyPI:
91
88
 
92
89
  ```bash
93
- pip install "matrixscroll[mcp]==0.7.0"
90
+ pip install "matrixscroll[mcp]==0.9.0"
94
91
  ```
95
92
 
96
93
  Register the stdio server in your MCP client:
@@ -118,7 +115,7 @@ After your client connects, call `status`. The server reports the local identity
118
115
 
119
116
  ## MCP tools
120
117
 
121
- The `0.7.0` server exposes these tools:
118
+ The `0.9.0` server exposes these tools:
122
119
 
123
120
  | Tool | What it does | Network or write behavior |
124
121
  | --- | --- | --- |
@@ -130,21 +127,20 @@ The `0.7.0` server exposes these tools:
130
127
  | `publish_notes` | Publishes local envelopes to `refs/notes/matrixscroll` | Writes local Git notes |
131
128
  | `audit_export` | Exports evidence for review | Writes a local bundle or uses the hosted API when configured |
132
129
  | `list_envelopes` | Lists organization envelopes | Requires `SSX360_API_KEY` and the hosted API |
133
- | `connect_card` | Probes the SSX360 USB signer over USB CDC | Opens the configured serial port |
134
130
  | `scan_mcp_server` | Fingerprints MCP tool names, descriptions, and input schemas | Read-only when tools are supplied |
135
131
  | `sign_mcp_manifest` | Signs an MCP tool-surface manifest | Writes only when `save_path` is set |
136
132
  | `verify_mcp_manifest` | Verifies a manifest and compares it with a signed baseline | Read-only and local |
137
133
  | `sign_agent_trace` | Signs a browser-agent JSONL trace | Writes a signed envelope |
138
134
  | `verify_agent_trace` | Verifies a signed trace and optionally checks the source bytes | Read-only and local |
139
135
 
140
- An API key is optional. Local signing, offline verification, MCP manifest checks, and USB signer access do not require one. Hosted organization history and hosted range verification use `SSX360_API_KEY`.
136
+ An API key is optional. Local signing, offline verification, and MCP manifest checks do not require one. Hosted organization history and hosted range verification use `SSX360_API_KEY`.
141
137
 
142
138
  ## Detect MCP tool-surface changes
143
139
 
144
140
  Matrix Scroll records an MCP server's tool names, descriptions, and input schemas in a signed manifest. Re-scan the server after an update and compare it with the install-time baseline.
145
141
 
146
142
  ```bash
147
- pip install "matrixscroll[mcp]==0.7.0"
143
+ pip install "matrixscroll[mcp]==0.9.0"
148
144
 
149
145
  matrixscroll mcp scan \
150
146
  --connect stdio \
@@ -174,83 +170,25 @@ The verify command exits with code `2` when the signature is invalid or the curr
174
170
  matrixscroll mcp scan --tools tools.json --output manifest.json --pretty
175
171
  ```
176
172
 
177
- ## Use the SSX360 USB signer
178
-
179
- ![Completed SSX360 USB signer](https://raw.githubusercontent.com/SSX360/matrixscroll/main/docs/images/ssx360-usb-signer.jpg)
180
-
181
- Install the hardware and MCP extras:
182
-
183
- ```bash
184
- pip install "matrixscroll[mcp,hardware]==0.7.0"
185
- ```
186
-
187
- Set the hardware provider and USB CDC port before starting the MCP server.
188
-
189
- Windows PowerShell:
190
-
191
- ```powershell
192
- $env:MATRIXSCROLL_MODE = "hardware"
193
- $env:MATRIXSCROLL_SE050_PORT = "COM3"
194
- matrixscroll status
195
- matrixscroll-mcp
196
- ```
197
-
198
- Linux:
199
-
200
- ```bash
201
- export MATRIXSCROLL_MODE=hardware
202
- export MATRIXSCROLL_SE050_PORT=/dev/ttyACM0
203
- matrixscroll status
204
- matrixscroll-mcp
205
- ```
206
-
207
- You can also pass the hardware settings through the MCP client configuration:
173
+ ## Device-agnostic custody
208
174
 
209
- ```json
210
- {
211
- "mcpServers": {
212
- "matrixscroll": {
213
- "command": "matrixscroll-mcp",
214
- "args": [],
215
- "env": {
216
- "MATRIXSCROLL_MODE": "hardware",
217
- "MATRIXSCROLL_SE050_PORT": "COM3"
218
- }
219
- }
220
- }
221
- }
222
- ```
175
+ Signing goes through an `IdentityProvider` (`public_key_bytes`, `sign`, `mode`). The default `emulated` provider stores an Ed25519 key under `~/.matrixscroll`. To adapt Matrix Scroll to any device or HSM, implement that interface and select it with `MATRIXSCROLL_MODE` (or pass a provider instance to the library APIs). Experimental `tpm` and `yubikey` previews remain available; they are not the Category 5 story and do not claim hardware ML-DSA.
223
176
 
224
- Call `connect_card` to confirm that the signer responds. Then call `status` to inspect the active provider before creating an envelope.
177
+ Historical envelopes with `signature.mode` equal to `"hardware"` still verify. The USB/SE050 signing path was removed in 0.9.0; `MATRIXSCROLL_MODE=hardware` raises instead of opening a serial port.
225
178
 
226
- SSX360 supplies the finished signer through direct contact. Ask for the Matrix Scroll USB signer through [SSX360 contact](https://ssx360.com/contact). The hardware is not distributed through PyPI or listed for self-service purchase.
227
-
228
- ### How hardware signing works
229
-
230
- ![USB signing round trip](https://raw.githubusercontent.com/SSX360/matrixscroll/main/docs/images/ssx360-usb-signer-round-trip.jpg)
231
-
232
- 1. The host sends `GEN_KEY` through the RP2350 USB bridge.
233
- 2. The SE050 creates an Ed25519 key pair in the secure element. The private key is non-exportable.
234
- 3. The host reads the 32-byte public key.
235
- 4. The host sends canonical bytes with a `SIGN` request.
236
- 5. The SE050 returns a 64-byte Ed25519 signature.
237
- 6. Matrix Scroll assembles the signed record and verifies it with the same offline verifier used for software signing.
238
-
239
- The host receives the public key and signature. The private key stays inside the SE050.
240
-
241
- ![USB signer architecture](https://raw.githubusercontent.com/SSX360/matrixscroll/main/docs/images/ssx360-usb-signer-architecture.jpg)
179
+ Sealed evidence packs (`matrixscroll.sealed`) encrypt a payload to a recipient's ML-KEM-1024 key with a hybrid X25519 + ML-KEM-1024 agreement, AES-256-GCM for the body, and Ed25519 plus ML-DSA-87 signatures over the pack. Install `matrixscroll[pqc]`. This is parameter-set readiness through liboqs, not a CNSA certification or FIPS validation.
242
180
 
243
181
  ## Sign and verify from the CLI
244
182
 
245
183
  The Python package includes a CLI and Git hooks for workflows that do not use MCP.
246
184
 
247
185
  ```bash
248
- pip install "matrixscroll==0.7.0"
186
+ pip install "matrixscroll==0.9.0"
249
187
  matrixscroll hook-install
250
188
 
251
- export MATRIXSCROLL_ACTOR_TYPE=agent
252
- export MATRIXSCROLL_TOOL=agent-runner
253
- git commit -m "feat: agent-assisted change"
189
+ export MATRIXSCROLL_ACTOR_TYPE=ci
190
+ export MATRIXSCROLL_TOOL=release-runner
191
+ git commit -m "feat: automate release"
254
192
 
255
193
  matrixscroll envelope-verify "$(git rev-parse HEAD)"
256
194
  ```
@@ -264,16 +202,16 @@ matrixscroll verify release.signed.json
264
202
 
265
203
  `matrixscroll verify` exits with code `0` for a valid signature and code `2` for invalid input, a failed signature, a mismatched device identity, or an unsupported schema or algorithm.
266
204
 
267
- ## Honest limits
205
+ ## Verification boundaries
268
206
 
269
207
  <!-- vale ai-tells.ShipOveruse = NO -->
270
208
 
271
- - Shipping now: PyPI `matrixscroll==0.7.0` installs the 14-tool stdio MCP server and Git hooks. The release also includes the MCP Trust Scanner, offline verification, and USB CDC integration for the SSX360 signer.
272
- - Hardware availability: SSX360 produces the USB signer and supplies it after a direct inquiry. PyPI distributes the host software only.
273
- - Hosted tools: `list_envelopes` and the hosted modes of `verify_pr_range` and `audit_export` require `SSX360_API_KEY` and a deployed SSX360 API. Local alternatives remain available without a key.
274
- - Post-quantum overlay: the optional `matrixscroll[pqc]` extra provides ML-DSA and SLH-DSA through liboqs. This module has no CMVP validation. liboqs states that applications should not rely on it to protect sensitive data in production.
275
- - Verification scope: an Ed25519 signature proves that the signed bytes match and correspond to the included public key. The declared `actor_type` still requires a trusted-key and authorization policy.
276
- - Not included: identity and access management, sandboxing, prompt filtering, or an agent runtime.
209
+ - Release: PyPI `matrixscroll==0.9.0` installs the 13-tool stdio MCP server and Git hooks, the MCP Trust Scanner, offline verification, sealed evidence packs, and device-agnostic custody.
210
+ - Hosted tools: `list_envelopes` and the hosted modes of `verify_pr_range` and `audit_export` require `SSX360_API_KEY` and a deployed SSX360 API. Local signing and verification remain available without a key.
211
+ - Post-quantum evaluation path: the optional `matrixscroll[pqc]` extra provides ML-DSA and SLH-DSA through liboqs, including Category 5 sets (`ml-dsa-87`, `slh-dsa-sha2-256s`/`256f`). Release `0.9.0` defaults new software keys to `ml-dsa-87` for CNSA 2.0 signature-parameter alignment (`0.7.0` and earlier default to `ml-dsa-65`; pass `--algorithm` or `MATRIXSCROLL_PQC` to choose a set explicitly). That is parameter-set readiness, not CNSA certification, FIPS CMVP validation, or NSA approval. This module has no CMVP validation. liboqs states that applications should not rely on it to protect sensitive data in production.
212
+ - CNSA 2.0 full-suite track: `matrixscroll.kem` provides ML-KEM-1024 primitives (ACVP-checked). Sealed evidence packs in `matrixscroll.sealed` use hybrid X25519 + ML-KEM-1024 with Ed25519 + ML-DSA-87. Same boundary as the signature overlay: evidence mapping against NIST vectors, not a validation. See `docs/CRYPTO_ROADMAP.md`.
213
+ - Verification scope: an Ed25519 signature proves that the signed bytes match and correspond to the included public key. A trusted-key and authorization policy establishes whether the declared `actor_type` can perform the action.
214
+ - Adjacent controls: identity and access management, sandboxing, prompt filtering, and agent runtime policy remain separate controls.
277
215
 
278
216
  <!-- vale ai-tells.ShipOveruse = YES -->
279
217
 
@@ -281,11 +219,11 @@ matrixscroll verify release.signed.json
281
219
 
282
220
  GitHub Actions publishes each Matrix Scroll release through PyPI Trusted Publishing. PyPI records a PEP 740 attestation for the wheel and source distribution.
283
221
 
284
- Ask PyPI for the `0.7.0` wheel provenance:
222
+ Ask PyPI for the `0.9.0` wheel provenance:
285
223
 
286
224
  ```bash
287
225
  curl -H "Accept: application/vnd.pypi.integrity.v1+json" \
288
- https://pypi.org/integrity/matrixscroll/0.7.0/matrixscroll-0.7.0-py3-none-any.whl/provenance
226
+ https://pypi.org/integrity/matrixscroll/0.9.0/matrixscroll-0.9.0-py3-none-any.whl/provenance
289
227
  ```
290
228
 
291
229
  The response names the GitHub publisher:
@@ -301,6 +239,16 @@ The response names the GitHub publisher:
301
239
 
302
240
  Compare the attested `subject[].digest.sha256` value with the SHA-256 digest of the file you downloaded. Stop if the repository, workflow, or digest differs.
303
241
 
242
+ ## Ten-minute check for reviewers
243
+
244
+ Five questions a programme manager or auditor asks first, each with the command that answers it. Everything below runs offline from a clone of this repository with `pip install "matrixscroll[pqc]==0.9.0"` (the `pqc` extra is needed only for the last two lines of question 3).
245
+
246
+ 1. **Does it run in one command, offline?** `matrixscroll verify vectors/valid_simple.json` prints `"ok": true` and exits `0`; `matrixscroll verify vectors/tampered_field.json` prints `"ok": false` and exits `2`. Neither command opens a network connection. Exit codes are fixed in [docs/reference/exit-codes.md](https://github.com/SSX360/matrixscroll/blob/main/docs/reference/exit-codes.md).
247
+ 2. **Is there a second implementation of the verifier?** `python tools/independent_verify.py vectors/` re-implements SPEC.md sections 3 to 6 from the text, with its own canonical serializer and a pure-Python RFC 8032 Ed25519, and imports nothing from the SDK. It must reach the same verdict as the SDK on every committed vector and on 500 randomly generated documents; `tests/test_independent_verifier.py` enforces that in CI on every change.
248
+ 3. **Are the vectors committed?** `vectors/valid_*.json`, `tampered_*.json` and `unsigned_*.json` are the conformance set (CC0 1.0); `vectors/acvp-sigver-fips204-fips205.json` and `vectors/acvp-mlkem-fips203.json` are NIST ACVP sample vectors with source URLs and SHA-256 digests. `python -m pytest tests/test_vectors.py tests/test_independent_verifier.py -q` runs the conformance set; `python -m pytest tests/test_acvp_sigver.py tests/test_acvp_mlkem.py -q` runs the NIST vectors through liboqs.
249
+ 4. **Is the boundary stated?** [Verification boundaries](#verification-boundaries) above, [docs/CRYPTO_ROADMAP.md](https://github.com/SSX360/matrixscroll/blob/main/docs/CRYPTO_ROADMAP.md) (Shipping now / In progress / Not, with policy dates) and [docs/COMPARISON.md](https://github.com/SSX360/matrixscroll/blob/main/docs/COMPARISON.md) (a dated landscape and the claims Matrix Scroll does not make). Compliance language everywhere is evidence mapping, not a certification claim.
250
+ 5. **Are the design rules checked by a model checker?** `formal/tla/` holds TLA+ models of the canonical bytes, the dual signature and the Scroll Gate range rules; `.github/workflows/formal-verify.yml` runs TLC on all seven configurations on every change to them. The models check the design, not the Python implementation; the tests above check the implementation. [docs/WHITEPAPER.md](https://github.com/SSX360/matrixscroll/blob/main/docs/WHITEPAPER.md) is the written account of the protocol.
251
+
304
252
  ## Security and license
305
253
 
306
254
  Read the [security policy](https://github.com/SSX360/matrixscroll/blob/main/SECURITY.md) and [security properties](https://github.com/SSX360/matrixscroll/blob/main/docs/SECURITY_PROPERTIES.md). Report vulnerabilities privately to `security@matrixscroll.com` or through a GitHub Security Advisory.
@@ -309,9 +257,11 @@ Matrix Scroll code is licensed under Apache-2.0. [`SPEC.md`](https://github.com/
309
257
 
310
258
  | Resource | Link |
311
259
  | --- | --- |
312
- | Documentation | [matrixscroll.com/docs](https://matrixscroll.com/docs/) |
313
- | MCP Trust Scanner | [matrixscroll.com/scan](https://matrixscroll.com/scan/) |
314
- | Offline verifier | [matrixscroll.com/verify](https://matrixscroll.com/verify/) |
315
- | Protocol specification | [matrixscroll.com/spec](https://matrixscroll.com/spec/) |
260
+ | Tombstone / schemas | [matrixscroll.com](https://matrixscroll.com/) |
261
+ | Documentation | [GitHub docs](https://github.com/SSX360/matrixscroll/tree/main/docs) |
262
+ | Where Matrix Scroll fits (dated comparison) | [docs/COMPARISON.md](https://github.com/SSX360/matrixscroll/blob/main/docs/COMPARISON.md) |
263
+ | Cryptographic roadmap (Ed25519, ML-DSA-87 overlay, policy dates) | [docs/CRYPTO_ROADMAP.md](https://github.com/SSX360/matrixscroll/blob/main/docs/CRYPTO_ROADMAP.md) |
264
+ | Offline verification | [CLI guide](https://github.com/SSX360/matrixscroll#sign-and-verify-from-the-cli) |
265
+ | Protocol specification | [SPEC.md](https://github.com/SSX360/matrixscroll/blob/main/SPEC.md) |
316
266
  | Source repository | [github.com/SSX360/matrixscroll](https://github.com/SSX360/matrixscroll) |
317
267
  | SSX360 contact | [Contact SSX360](https://ssx360.com/contact) |