matrixscroll 0.4.2__tar.gz → 0.5.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 (133) hide show
  1. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/CHANGELOG.md +17 -0
  2. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/PKG-INFO +33 -31
  3. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/README.md +28 -28
  4. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/SPEC.md +55 -0
  5. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/CRYPTO_BACKEND.md +6 -1
  6. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/ROADMAP_2026-07.md +2 -2
  7. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/SECURITY_PROPERTIES.md +1 -1
  8. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/WHITEPAPER.md +4 -4
  9. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/commercial/SSX360_SCROLL.md +1 -1
  10. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/registries-guide.md +11 -4
  11. matrixscroll-0.5.0/matrixscroll/canonical.py +38 -0
  12. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/cli.py +71 -1
  13. matrixscroll-0.5.0/matrixscroll/constants.py +26 -0
  14. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/crypto_backend.py +77 -0
  15. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/gate.py +12 -0
  16. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/git.py +2 -2
  17. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/manifest.py +29 -0
  18. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/mcp.py +176 -38
  19. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/policy.py +55 -0
  20. matrixscroll-0.5.0/matrixscroll/pqc.py +208 -0
  21. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/pyproject.toml +11 -3
  22. matrixscroll-0.5.0/schemas/commit-envelope.v1.1.json +19 -0
  23. matrixscroll-0.5.0/schemas/pqc-signature.v1.json +37 -0
  24. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_canonical.py +9 -0
  25. matrixscroll-0.5.0/tests/test_canonical_pqc.py +16 -0
  26. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_mcp_server.py +36 -1
  27. matrixscroll-0.5.0/tests/test_pqc.py +100 -0
  28. matrixscroll-0.4.2/matrixscroll/canonical.py +0 -18
  29. matrixscroll-0.4.2/matrixscroll/constants.py +0 -12
  30. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/.gitignore +0 -0
  31. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/CONTRIBUTING.md +0 -0
  32. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/LICENSE +0 -0
  33. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/SECURITY.md +0 -0
  34. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/controls/agentic_ai_controls.json +0 -0
  35. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/ADOPTER_KIT.md +0 -0
  36. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/ADOPTION.md +0 -0
  37. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/AGENTIC_AI_SECURITY.md +0 -0
  38. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/CI_HARD_GATE.md +0 -0
  39. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/COMMIT_TIME_VS_ARTIFACT_TIME.md +0 -0
  40. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/COMPARISON.md +0 -0
  41. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/FIVE_MINUTES.md +0 -0
  42. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/HERO_DEMO.md +0 -0
  43. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/SE050_POC_SCOPE.md +0 -0
  44. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/SE050_USB_PROTOCOL.md +0 -0
  45. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/SOFTWARE_PRODUCTS.md +0 -0
  46. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/commercial/PLATFORM_PIVOT.md +0 -0
  47. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/commercial/SCROLL_GATE_V2.md +0 -0
  48. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/delegation-attestation-rfc.md +0 -0
  49. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/hardware-provider.md +0 -0
  50. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/quickstart-agent.md +0 -0
  51. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/quickstart-claude-code.md +0 -0
  52. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/quickstart-git.md +0 -0
  53. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/quickstart-mcp.md +0 -0
  54. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/rekor-guac-bridge-design.md +0 -0
  55. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/superpowers/plans/2026-06-19-ci-action-plan.md +0 -0
  56. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/superpowers/plans/2026-06-19-sdk-refactor-plan.md +0 -0
  57. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/superpowers/specs/2026-06-19-matrixscroll-git-design.md +0 -0
  58. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/yubikey-bridge.md +0 -0
  59. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/docs/yubikey-smoke.md +0 -0
  60. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/agentic_ai_evidence_manifest.json +0 -0
  61. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/agentic_ai_evidence_manifest.signed.json +0 -0
  62. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/ci/protected-branch.yml +0 -0
  63. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/commit-envelope.json +0 -0
  64. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/commit-envelope.signed.json +0 -0
  65. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/demo/agent-commit-demo.sh +0 -0
  66. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/demo/generate_signed_examples.py +0 -0
  67. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/demo/hero-self-attestation-demo.sh +0 -0
  68. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/release-manifest.json +0 -0
  69. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/release-manifest.signed.json +0 -0
  70. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/examples/trusted-keys-policy.json +0 -0
  71. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/__init__.py +0 -0
  72. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/_claim.py +0 -0
  73. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/_core.py +0 -0
  74. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/_payment.py +0 -0
  75. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/cloud/__init__.py +0 -0
  76. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/cloud/client.py +0 -0
  77. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/errors.py +0 -0
  78. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/guac_export.py +0 -0
  79. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/hooks/post-commit +0 -0
  80. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/hooks/pre-push +0 -0
  81. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/mcp_core.py +0 -0
  82. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/provenance/__init__.py +0 -0
  83. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/provenance/actions.py +0 -0
  84. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/providers/__init__.py +0 -0
  85. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/providers/base.py +0 -0
  86. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/providers/emulated.py +0 -0
  87. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/providers/hardware.py +0 -0
  88. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/providers/registry.py +0 -0
  89. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/providers/se050_transport.py +0 -0
  90. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/providers/tpm.py +0 -0
  91. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/providers/yubikey.py +0 -0
  92. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/py.typed +0 -0
  93. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/rekor_publish.py +0 -0
  94. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/scroll/README.md +0 -0
  95. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/matrixscroll/scroll/__init__.py +0 -0
  96. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/schemas/action-envelope.v1.json +0 -0
  97. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/schemas/commit-envelope.v1.json +0 -0
  98. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/schemas/evidence-pack.v1.json +0 -0
  99. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/schemas/release-manifest.v1.json +0 -0
  100. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/__init__.py +0 -0
  101. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/fixtures/github-gpgsig-commit.txt +0 -0
  102. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_agentic_guidance.py +0 -0
  103. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_cli.py +0 -0
  104. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_core.py +0 -0
  105. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_crypto_backend.py +0 -0
  106. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_gate.py +0 -0
  107. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_git_envelope.py +0 -0
  108. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_guac_rekor.py +0 -0
  109. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_mcp_core.py +0 -0
  110. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_policy.py +0 -0
  111. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_provenance.py +0 -0
  112. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_release_metadata.py +0 -0
  113. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_se050_transport.py +0 -0
  114. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_security_properties.py +0 -0
  115. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_tpm_provider.py +0 -0
  116. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_vectors.py +0 -0
  117. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/tests/test_yubikey_provider.py +0 -0
  118. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/README.md +0 -0
  119. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/_fixture_key.json +0 -0
  120. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/_generate.py +0 -0
  121. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/tampered_algorithm.json +0 -0
  122. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/tampered_device_id.json +0 -0
  123. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/tampered_field.json +0 -0
  124. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/tampered_nested.json +0 -0
  125. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/tampered_public_key.json +0 -0
  126. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/tampered_schema.json +0 -0
  127. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/tampered_signature.json +0 -0
  128. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/unsigned_empty_block.json +0 -0
  129. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/unsigned_no_block.json +0 -0
  130. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/valid_commit_envelope.json +0 -0
  131. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/valid_nested.json +0 -0
  132. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/valid_simple.json +0 -0
  133. {matrixscroll-0.4.2 → matrixscroll-0.5.0}/vectors/valid_unicode.json +0 -0
@@ -4,6 +4,22 @@ All notable changes to the Matrix Scroll Python SDK are documented here. The
4
4
  format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and
5
5
  this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.5.0] - 2026-07-02
8
+
9
+ Post-quantum overlay (v1.1 additive extension).
10
+
11
+ ### Added
12
+ - **SPEC.md §11** — optional `pqc_signatures` array (ML-DSA FIPS 204, SLH-DSA FIPS 205).
13
+ - **`matrixscroll.pqc`** — software-only PQC overlay; Ed25519 `signature` block unchanged.
14
+ - **`matrixscroll pqc-keygen`** — generate/load PQC keys under `~/.matrixscroll/pqc/`.
15
+ - **`MATRIXSCROLL_PQC`** env — attach overlay on sign (e.g. `ml-dsa-65`); hardware mode exempt.
16
+ - **Policy `require_pqc`** — `false` (default), `emulated_only`, or `true` (hardware exempt).
17
+ - **Optional extra `[pqc]`** — `liboqs-python` backend for ML-DSA / SLH-DSA.
18
+
19
+ ### Unchanged
20
+ - USB/NFC/SE050 device signing remains **Ed25519-only** (no firmware change).
21
+ - All v1 vectors and Ed25519 verification behavior.
22
+
7
23
  ## [0.4.2] - 2026-06-29
8
24
 
9
25
  Crypto backend consolidation (middle path).
@@ -189,6 +205,7 @@ Initial public release. Extracted from the SSX360 reference implementation.
189
205
  - Device id format: `MS-XXXX-XXXX` (SHA-256 of the raw public key, first 8 hex
190
206
  chars, uppercase).
191
207
 
208
+ [0.5.0]: https://github.com/SSX360/matrixscroll/releases/tag/v0.5.0
192
209
  [0.2.2]: https://github.com/SSX360/matrixscroll/releases/tag/v0.2.2
193
210
  [0.2.1]: https://github.com/SSX360/matrixscroll/releases/tag/v0.2.1
194
211
  [0.2.0]: https://github.com/SSX360/matrixscroll/releases/tag/v0.2.0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matrixscroll
3
- Version: 0.4.2
4
- Summary: Signed provenance for agent-assisted Git commits with offline verification; emulated Ed25519 ships today and the SE050 hardware path remains an optional preview.
3
+ Version: 0.5.0
4
+ Summary: Signed provenance for agent-assisted Git commits with offline Ed25519 verification; optional ML-DSA/SLH-DSA software overlay (FIPS 204/205). USB/NFC/SE050 hardware remains Ed25519.
5
5
  Project-URL: Homepage, https://ssx360.com
6
6
  Project-URL: Documentation, https://ssx360.com/docs
7
7
  Project-URL: Repository, https://github.com/SSX360/matrixscroll
@@ -22,7 +22,7 @@ Project-URL: Public Roadmap, https://github.com/SSX360/matrixscroll/blob/main/do
22
22
  Author-email: SSX360 <security@matrixscroll.com>
23
23
  License-Expression: Apache-2.0
24
24
  License-File: LICENSE
25
- Keywords: ai,ed25519,matrixscroll,provenance,root-of-trust,secure-element,signing,ssx360,supply-chain
25
+ Keywords: ai,ed25519,fips-204,fips-205,matrixscroll,ml-dsa,post-quantum,provenance,root-of-trust,secure-element,signing,slh-dsa,ssx360,supply-chain
26
26
  Classifier: Development Status :: 4 - Beta
27
27
  Classifier: Intended Audience :: Developers
28
28
  Classifier: Intended Audience :: Information Technology
@@ -38,7 +38,7 @@ Classifier: Topic :: Security :: Cryptography
38
38
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
39
39
  Classifier: Typing :: Typed
40
40
  Requires-Python: >=3.10
41
- Requires-Dist: cryptography>=42.0
41
+ Requires-Dist: cryptography>=43.0
42
42
  Provides-Extra: dev
43
43
  Requires-Dist: build>=1.0; extra == 'dev'
44
44
  Requires-Dist: hypothesis>=6.100; extra == 'dev'
@@ -49,6 +49,8 @@ Provides-Extra: hardware
49
49
  Requires-Dist: pyserial>=3.5; extra == 'hardware'
50
50
  Provides-Extra: mcp
51
51
  Requires-Dist: mcp<2.0.0,>=1.0.0; extra == 'mcp'
52
+ Provides-Extra: pqc
53
+ Requires-Dist: liboqs-python>=0.12.0; extra == 'pqc'
52
54
  Provides-Extra: tpm
53
55
  Provides-Extra: yubikey
54
56
  Requires-Dist: python-pkcs11>=0.7; extra == 'yubikey'
@@ -62,19 +64,16 @@ Description-Content-Type: text/markdown
62
64
 
63
65
  **123 tests** · Hypothesis-verified security properties · [Security properties](docs/SECURITY_PROPERTIES.md)
64
66
 
65
- **Signed proof of who — or what — wrote every commit.** Matrix Scroll is the
66
- **universal provenance SDK** open Ed25519 envelopes for Git commits, CI steps,
67
- IaC changes, DB migrations, API calls, and smart-contract deploys verified
68
- offline in CLI, browser, and CI. Hardware (SE050) is an optional preview trust
69
- upgrade; emulated mode ships today.
67
+ **Signed proof of who — or what — wrote every AI-assisted commit.** Matrix Scroll is an
68
+ **open protocol for cryptographically signed, AI-assisted code provenance** Ed25519 commit
69
+ envelopes for Git (and universal action envelopes for CI, IaC, and migrations),
70
+ verified offline in CLI, browser, and CI. Software emulated keys ship today; NXP SE050
71
+ secure-element signing is on the roadmap with the same verifier contract.
70
72
 
71
- **TAM wedge (honest):** Layer 2 universal provenance SDK ($50–200M) · Layer 3 SSX360 Scroll
72
- governance on Git ($200M–1B) · Scroll Gate CI ($50–150M) · Python-first ML/agent
73
- ecosystem via `pip install matrixscroll`.
74
-
75
- **Hosted control plane:** identity, billing, and device confirmation live at
76
- [ssx360.com](https://ssx360.com/). Teams evaluating protected-branch enforcement should
77
- [book a provenance pilot](https://ssx360.com/contact?intent=pilot);
73
+ **Hosted control plane:** identity, billing, audit ledger, and Scroll Gate live at
74
+ [ssx360.com](https://ssx360.com/). Enterprise teams evaluating protected-branch enforcement should
75
+ [book a provenance pilot](https://ssx360.com/contact?intent=pilot) or visit
76
+ [ssx360.com/enterprise](https://ssx360.com/enterprise).
78
77
  Provisioned pilot and team accounts sign in at [ssx360.com/signup](https://ssx360.com/signup).
79
78
 
80
79
  ## Compliance evidence mapping
@@ -104,18 +103,18 @@ Agents sign commits in-loop via the **provenance-only** MCP server:
104
103
  ```
105
104
 
106
105
  ```bash
107
- pip install "matrixscroll[mcp]==0.4.2"
106
+ pip install "matrixscroll[mcp]==0.5.0"
108
107
  matrixscroll-mcp # stdio — register in Cursor / Claude Desktop / VS Code
109
108
  ```
110
109
 
111
110
  **MCP tools (provenance verbs only):** `create_envelope`, `sign_action`, `verify_envelope`,
112
111
  `verify_pr_range` (Scroll Gate), `publish_notes`, `status`, `audit_export`, `list_envelopes`,
113
- `connect_card` (SE050 preview).
112
+ `connect_card` (SE050 hardware preview, roadmap).
114
113
 
115
114
  ## Also available — CLI & hooks
116
115
 
117
116
  ```bash
118
- pip install "matrixscroll==0.4.2"
117
+ pip install "matrixscroll==0.5.0"
119
118
  matrixscroll hook-install
120
119
  export MATRIXSCROLL_ACTOR_TYPE=agent
121
120
  export MATRIXSCROLL_TOOL=agent-runner
@@ -179,12 +178,12 @@ canonical UTF-8 JSON bytes (see [`SPEC.md`](SPEC.md) §4). Verifiers reject any
179
178
 
180
179
  ## Honest limits
181
180
 
182
- - Shipping now: PyPI `matrixscroll==0.4.2`, Git post-commit hooks,
181
+ - Shipping now: PyPI `matrixscroll==0.5.0`, Git post-commit hooks,
183
182
  `matrixscroll sign-action`, `matrixscroll scroll commit` (thin wrapper),
184
183
  `matrixscroll envelope-verify`, Scroll Gate PR verification (partial SLSA L1–2),
185
184
  verifier, the GitHub Action, and a USB CDC host transport preview for the
186
185
  SE050 rollout path. Emulated mode is the default evaluation path.
187
- - In progress: nRF52840 + SE050 firmware validation (AP2 Vault Card PoC), external Ed25519-capable
186
+ - In progress: nRF52840 + SE050 firmware validation for hardware-backed signing, external Ed25519-capable
188
187
  hardware key backends, and transparency-log integrations.
189
188
  - Not: IAM, sandboxing, prompt filtering, or an agent runtime.
190
189
 
@@ -194,8 +193,10 @@ canonical UTF-8 JSON bytes (see [`SPEC.md`](SPEC.md) §4). Verifiers reject any
194
193
  records who or what signed the change before push.
195
194
  - Hardware keys and build attestations remain complementary roots and downstream
196
195
  proofs; Matrix Scroll covers commit-time provenance.
197
- - The public contract stays pure Ed25519 over canonical manifest bytes,
198
- whether the signer is emulated today or hardware-backed later.
196
+ - The public contract stays pure Ed25519 over canonical manifest bytes for the
197
+ required `signature` block — whether the signer is emulated today or
198
+ hardware-backed later. Software signers may optionally attach ML-DSA/SLH-DSA
199
+ overlays (FIPS 204/205) via `matrixscroll[pqc]` without changing hardware firmware.
199
200
 
200
201
  ## Common questions
201
202
 
@@ -225,7 +226,7 @@ alongside your existing scanners, branch protection, and build attestations.
225
226
  ## Quickstart (CLI)
226
227
 
227
228
  ```bash
228
- pip install "matrixscroll==0.4.2"
229
+ pip install "matrixscroll==0.5.0"
229
230
  matrixscroll hook-install
230
231
  matrixscroll hook-status
231
232
 
@@ -252,7 +253,7 @@ See [`docs/quickstart-git.md`](docs/quickstart-git.md) and run
252
253
  head-ref: ${{ github.event.pull_request.head.sha }}
253
254
  base-ref: ${{ github.event.pull_request.base.sha }}
254
255
  source: notes
255
- matrixscroll-version: "0.4.2"
256
+ matrixscroll-version: "0.5.0"
256
257
  require-mode: emulated
257
258
  ```
258
259
 
@@ -272,7 +273,7 @@ git push origin refs/notes/matrixscroll
272
273
  head-ref: ${{ github.event.pull_request.head.sha }}
273
274
  base-ref: ${{ github.event.pull_request.base.sha }}
274
275
  source: notes
275
- matrixscroll-version: "0.4.2"
276
+ matrixscroll-version: "0.5.0"
276
277
  summary-output: provenance-summary.json
277
278
  ```
278
279
 
@@ -280,7 +281,7 @@ See [`docs/quickstart-git.md`](docs/quickstart-git.md) and
280
281
  [`examples/ci/protected-branch.yml`](examples/ci/protected-branch.yml).
281
282
 
282
283
  The `--require-mode`, `--trusted-keys`, and actor or delegation policy checks
283
- ship in the current release line; examples in this README pin `0.4.2`.
284
+ ship in the current release line; examples in this README pin `0.5.0`.
284
285
 
285
286
  ## Security: Ed25519 via cryptography
286
287
 
@@ -312,13 +313,14 @@ when they preserve the same pure Ed25519 byte contract.
312
313
  - Conformance vectors: [`vectors/`](vectors/)
313
314
  - GitHub Action: <https://github.com/SSX360/matrixscroll-verify-action>
314
315
  - Agentic AI controls: [`docs/AGENTIC_AI_SECURITY.md`](docs/AGENTIC_AI_SECURITY.md)
315
- - Site: <https://ssx360.com/docs> (matrixscroll.com redirects here)
316
- - Reference device path: [AP2 Vault Card hardware](https://ssx360.com/hardware)
316
+ - Site: <https://matrixscroll.com> · Enterprise: <https://ssx360.com/enterprise>
317
+ - [AP2 Vault Card hardware](https://ssx360.com/hardware)
318
+ - SE050 hardware signing: <https://ssx360.com/enterprise#roadmap>
317
319
 
318
320
  ## Python API
319
321
 
320
322
  ```bash
321
- pip install "matrixscroll==0.4.2"
323
+ pip install "matrixscroll==0.5.0"
322
324
  ```
323
325
 
324
326
  ```python
@@ -428,7 +430,7 @@ The MCP server exposes **provenance verbs only**: `create_envelope`, `verify_env
428
430
  Install and register in Cursor / Claude Desktop / VS Code:
429
431
 
430
432
  ```bash
431
- pip install "matrixscroll[mcp]==0.4.2"
433
+ pip install "matrixscroll[mcp]==0.5.0"
432
434
  matrixscroll-mcp # stdio
433
435
  ```
434
436
 
@@ -6,19 +6,16 @@
6
6
 
7
7
  **123 tests** · Hypothesis-verified security properties · [Security properties](docs/SECURITY_PROPERTIES.md)
8
8
 
9
- **Signed proof of who — or what — wrote every commit.** Matrix Scroll is the
10
- **universal provenance SDK** open Ed25519 envelopes for Git commits, CI steps,
11
- IaC changes, DB migrations, API calls, and smart-contract deploys verified
12
- offline in CLI, browser, and CI. Hardware (SE050) is an optional preview trust
13
- upgrade; emulated mode ships today.
14
-
15
- **TAM wedge (honest):** Layer 2 universal provenance SDK ($50–200M) · Layer 3 SSX360 Scroll
16
- governance on Git ($200M–1B) · Scroll Gate CI ($50–150M) · Python-first ML/agent
17
- ecosystem via `pip install matrixscroll`.
18
-
19
- **Hosted control plane:** identity, billing, and device confirmation live at
20
- [ssx360.com](https://ssx360.com/). Teams evaluating protected-branch enforcement should
21
- [book a provenance pilot](https://ssx360.com/contact?intent=pilot);
9
+ **Signed proof of who — or what — wrote every AI-assisted commit.** Matrix Scroll is an
10
+ **open protocol for cryptographically signed, AI-assisted code provenance** Ed25519 commit
11
+ envelopes for Git (and universal action envelopes for CI, IaC, and migrations),
12
+ verified offline in CLI, browser, and CI. Software emulated keys ship today; NXP SE050
13
+ secure-element signing is on the roadmap with the same verifier contract.
14
+
15
+ **Hosted control plane:** identity, billing, audit ledger, and Scroll Gate live at
16
+ [ssx360.com](https://ssx360.com/). Enterprise teams evaluating protected-branch enforcement should
17
+ [book a provenance pilot](https://ssx360.com/contact?intent=pilot) or visit
18
+ [ssx360.com/enterprise](https://ssx360.com/enterprise).
22
19
  Provisioned pilot and team accounts sign in at [ssx360.com/signup](https://ssx360.com/signup).
23
20
 
24
21
  ## Compliance evidence mapping
@@ -48,18 +45,18 @@ Agents sign commits in-loop via the **provenance-only** MCP server:
48
45
  ```
49
46
 
50
47
  ```bash
51
- pip install "matrixscroll[mcp]==0.4.2"
48
+ pip install "matrixscroll[mcp]==0.5.0"
52
49
  matrixscroll-mcp # stdio — register in Cursor / Claude Desktop / VS Code
53
50
  ```
54
51
 
55
52
  **MCP tools (provenance verbs only):** `create_envelope`, `sign_action`, `verify_envelope`,
56
53
  `verify_pr_range` (Scroll Gate), `publish_notes`, `status`, `audit_export`, `list_envelopes`,
57
- `connect_card` (SE050 preview).
54
+ `connect_card` (SE050 hardware preview, roadmap).
58
55
 
59
56
  ## Also available — CLI & hooks
60
57
 
61
58
  ```bash
62
- pip install "matrixscroll==0.4.2"
59
+ pip install "matrixscroll==0.5.0"
63
60
  matrixscroll hook-install
64
61
  export MATRIXSCROLL_ACTOR_TYPE=agent
65
62
  export MATRIXSCROLL_TOOL=agent-runner
@@ -123,12 +120,12 @@ canonical UTF-8 JSON bytes (see [`SPEC.md`](SPEC.md) §4). Verifiers reject any
123
120
 
124
121
  ## Honest limits
125
122
 
126
- - Shipping now: PyPI `matrixscroll==0.4.2`, Git post-commit hooks,
123
+ - Shipping now: PyPI `matrixscroll==0.5.0`, Git post-commit hooks,
127
124
  `matrixscroll sign-action`, `matrixscroll scroll commit` (thin wrapper),
128
125
  `matrixscroll envelope-verify`, Scroll Gate PR verification (partial SLSA L1–2),
129
126
  verifier, the GitHub Action, and a USB CDC host transport preview for the
130
127
  SE050 rollout path. Emulated mode is the default evaluation path.
131
- - In progress: nRF52840 + SE050 firmware validation (AP2 Vault Card PoC), external Ed25519-capable
128
+ - In progress: nRF52840 + SE050 firmware validation for hardware-backed signing, external Ed25519-capable
132
129
  hardware key backends, and transparency-log integrations.
133
130
  - Not: IAM, sandboxing, prompt filtering, or an agent runtime.
134
131
 
@@ -138,8 +135,10 @@ canonical UTF-8 JSON bytes (see [`SPEC.md`](SPEC.md) §4). Verifiers reject any
138
135
  records who or what signed the change before push.
139
136
  - Hardware keys and build attestations remain complementary roots and downstream
140
137
  proofs; Matrix Scroll covers commit-time provenance.
141
- - The public contract stays pure Ed25519 over canonical manifest bytes,
142
- whether the signer is emulated today or hardware-backed later.
138
+ - The public contract stays pure Ed25519 over canonical manifest bytes for the
139
+ required `signature` block — whether the signer is emulated today or
140
+ hardware-backed later. Software signers may optionally attach ML-DSA/SLH-DSA
141
+ overlays (FIPS 204/205) via `matrixscroll[pqc]` without changing hardware firmware.
143
142
 
144
143
  ## Common questions
145
144
 
@@ -169,7 +168,7 @@ alongside your existing scanners, branch protection, and build attestations.
169
168
  ## Quickstart (CLI)
170
169
 
171
170
  ```bash
172
- pip install "matrixscroll==0.4.2"
171
+ pip install "matrixscroll==0.5.0"
173
172
  matrixscroll hook-install
174
173
  matrixscroll hook-status
175
174
 
@@ -196,7 +195,7 @@ See [`docs/quickstart-git.md`](docs/quickstart-git.md) and run
196
195
  head-ref: ${{ github.event.pull_request.head.sha }}
197
196
  base-ref: ${{ github.event.pull_request.base.sha }}
198
197
  source: notes
199
- matrixscroll-version: "0.4.2"
198
+ matrixscroll-version: "0.5.0"
200
199
  require-mode: emulated
201
200
  ```
202
201
 
@@ -216,7 +215,7 @@ git push origin refs/notes/matrixscroll
216
215
  head-ref: ${{ github.event.pull_request.head.sha }}
217
216
  base-ref: ${{ github.event.pull_request.base.sha }}
218
217
  source: notes
219
- matrixscroll-version: "0.4.2"
218
+ matrixscroll-version: "0.5.0"
220
219
  summary-output: provenance-summary.json
221
220
  ```
222
221
 
@@ -224,7 +223,7 @@ See [`docs/quickstart-git.md`](docs/quickstart-git.md) and
224
223
  [`examples/ci/protected-branch.yml`](examples/ci/protected-branch.yml).
225
224
 
226
225
  The `--require-mode`, `--trusted-keys`, and actor or delegation policy checks
227
- ship in the current release line; examples in this README pin `0.4.2`.
226
+ ship in the current release line; examples in this README pin `0.5.0`.
228
227
 
229
228
  ## Security: Ed25519 via cryptography
230
229
 
@@ -256,13 +255,14 @@ when they preserve the same pure Ed25519 byte contract.
256
255
  - Conformance vectors: [`vectors/`](vectors/)
257
256
  - GitHub Action: <https://github.com/SSX360/matrixscroll-verify-action>
258
257
  - Agentic AI controls: [`docs/AGENTIC_AI_SECURITY.md`](docs/AGENTIC_AI_SECURITY.md)
259
- - Site: <https://ssx360.com/docs> (matrixscroll.com redirects here)
260
- - Reference device path: [AP2 Vault Card hardware](https://ssx360.com/hardware)
258
+ - Site: <https://matrixscroll.com> · Enterprise: <https://ssx360.com/enterprise>
259
+ - [AP2 Vault Card hardware](https://ssx360.com/hardware)
260
+ - SE050 hardware signing: <https://ssx360.com/enterprise#roadmap>
261
261
 
262
262
  ## Python API
263
263
 
264
264
  ```bash
265
- pip install "matrixscroll==0.4.2"
265
+ pip install "matrixscroll==0.5.0"
266
266
  ```
267
267
 
268
268
  ```python
@@ -372,7 +372,7 @@ The MCP server exposes **provenance verbs only**: `create_envelope`, `verify_env
372
372
  Install and register in Cursor / Claude Desktop / VS Code:
373
373
 
374
374
  ```bash
375
- pip install "matrixscroll[mcp]==0.4.2"
375
+ pip install "matrixscroll[mcp]==0.5.0"
376
376
  matrixscroll-mcp # stdio
377
377
  ```
378
378
 
@@ -196,3 +196,58 @@ Signed release metadata (version, tag, artifact list). JSON Schema:
196
196
 
197
197
  Signed audit or agent-scope evidence. JSON Schema:
198
198
  [`schemas/evidence-pack.v1.json`](schemas/evidence-pack.v1.json).
199
+
200
+ ## 11. Post-quantum overlay (v1.1 extension)
201
+
202
+ Matrix Scroll v1 **requires** an Ed25519 `signature` block (§5). USB, NFC, and SE050
203
+ hardware signers produce **only** this block today and remain unchanged.
204
+
205
+ Software signers MAY attach an optional `pqc_signatures` array for FIPS 204 (ML-DSA)
206
+ and FIPS 205 (SLH-DSA) post-quantum overlays. This is an **additive** extension;
207
+ verifiers that do not implement PQC MUST still verify Ed25519 and MAY ignore
208
+ `pqc_signatures`.
209
+
210
+ ### 11.1 PQC signature block
211
+
212
+ Each element of `pqc_signatures`:
213
+
214
+ ```json
215
+ {
216
+ "schema": "matrixscroll.pqc_signature.v1",
217
+ "algorithm": "ml-dsa-65",
218
+ "public_key": "<base64(raw public key bytes)>",
219
+ "value": "<base64(detached signature)>",
220
+ "signed_at": "<RFC 3339 UTC, informational>"
221
+ }
222
+ ```
223
+
224
+ Allowed `algorithm` values: `ml-dsa-44`, `ml-dsa-65`, `ml-dsa-87`,
225
+ `slh-dsa-sha2-128s`, `slh-dsa-sha2-128f`.
226
+
227
+ Hardware envelopes (`signature.mode` = `"hardware"`) MUST NOT include
228
+ `pqc_signatures` until secure-element firmware supports PQC. Policy engines
229
+ MUST exempt hardware mode from `require_pqc` rules.
230
+
231
+ ### 11.2 Canonical input for PQC (§4.1)
232
+
233
+ PQC signing and verification remove **both** top-level keys `"signature"` and
234
+ `"pqc_signatures"` before applying §4 encoding rules. Because Ed25519 is applied
235
+ first, the PQC signing input is byte-identical to the Ed25519 signing input.
236
+
237
+ ### 11.3 Verification
238
+
239
+ 1. Verify Ed25519 per §6 (always required).
240
+ 2. If `pqc_signatures` is absent, stop (valid for v1-only policy).
241
+ 3. For each PQC block: validate `schema`, decode keys, verify against PQC canonical bytes.
242
+ 4. If policy requires PQC and verification fails or array is missing (non-hardware), reject.
243
+
244
+ ### 11.4 Policy knobs
245
+
246
+ | `require_pqc` | Behavior |
247
+ | ------------- | -------- |
248
+ | `false` (default) | PQC optional |
249
+ | `emulated_only` | Require valid PQC when `signature.mode` is `emulated` or `tpm` |
250
+ | `true` | Require valid PQC for all modes except `hardware` |
251
+
252
+ JSON Schema: [`schemas/pqc-signature.v1.json`](schemas/pqc-signature.v1.json),
253
+ [`schemas/commit-envelope.v1.1.json`](schemas/commit-envelope.v1.1.json).
@@ -1,8 +1,12 @@
1
1
  # Cryptographic backend (middle path)
2
2
 
3
- Matrix Scroll v0.4.2+ routes all Ed25519 and security-relevant SHA-256
3
+ Matrix Scroll v0.5.0+ routes all Ed25519 and security-relevant SHA-256
4
4
  operations through a single Python module: `matrixscroll/crypto_backend.py`.
5
5
 
6
+ Post-quantum overlays (ML-DSA FIPS 204, SLH-DSA FIPS 205) are optional and
7
+ implemented via `matrixscroll/pqc.py` when `matrixscroll[pqc]` (liboqs-python)
8
+ is installed. **USB/NFC/SE050 hardware signers remain Ed25519-only.**
9
+
6
10
  ## Design
7
11
 
8
12
  | Approach | What users install | Crypto implementation |
@@ -22,6 +26,7 @@ moving primitive work onto battle-tested native code shipped inside official
22
26
  | Ed25519 key generation | `generate_ed25519_private_key()` | `cryptography.hazmat.primitives.asymmetric.ed25519` |
23
27
  | Ed25519 sign / verify | `ed25519_sign`, `ed25519_verify` | Same |
24
28
  | SHA-256 (device IDs, gate digests, Rekor bridge) | `sha256`, `sha256_hex` | `cryptography.hazmat.primitives.hashes.SHA256` |
29
+ | ML-DSA / SLH-DSA overlay (optional) | `pqc_sign`, `pqc_verify` | `liboqs-python` via `matrixscroll[pqc]` extra |
25
30
 
26
31
  Git object hashing (`hashlib.sha1` in `matrixscroll/git.py`) stays on the
27
32
  stdlib because it implements Git wire-format identifiers, not provenance
@@ -8,13 +8,13 @@ what ships now before widening the story.
8
8
  ## Baseline on June 21, 2026
9
9
 
10
10
  - GitHub: early public repo, product-first docs, and offline verification
11
- - Current public release: `matrixscroll==0.4.1`
11
+ - Current public release: `matrixscroll==0.5.0`
12
12
  - Public trust contract: pure Ed25519 over canonical manifest bytes
13
13
  - Hardware path: SSX360 SE050 reference implementation in progress
14
14
 
15
15
  ## Next 7 days
16
16
 
17
- - Public release: `matrixscroll==0.4.1` (universal provenance + scroll commit)
17
+ - Public release: `matrixscroll==0.5.0` (universal provenance + scroll commit)
18
18
  - make the GitHub Action a real public proof surface
19
19
  - align site, README, action docs, and PyPI around one install flow
20
20
  - remove broken links and stale release drift from public copy
@@ -1,6 +1,6 @@
1
1
  # Matrix Scroll security properties
2
2
 
3
- Machine-checkable guarantees for the reference SDK (v0.4.2). Properties marked
3
+ Machine-checkable guarantees for the reference SDK (v0.5.0). Properties marked
4
4
  **verified** have Hypothesis property tests in `tests/test_security_properties.py`.
5
5
  Formal TLA+ models are on the public roadmap.
6
6
 
@@ -71,7 +71,7 @@ Full wire format: [`SPEC.md`](../SPEC.md). Schema: [`schemas/commit-envelope.v1.
71
71
  ### 1. Install
72
72
 
73
73
  ```bash
74
- pip install "matrixscroll==0.4.1"
74
+ pip install "matrixscroll==0.5.0"
75
75
  matrixscroll hook-install
76
76
  matrixscroll hook-status
77
77
  ```
@@ -87,7 +87,7 @@ matrixscroll envelope-verify "$(git rev-parse HEAD)"
87
87
 
88
88
  Hooks default to **warn mode**; set `"enforce": true` in `.git/matrixscroll/config.json` to block commits when signing fails. See [`docs/quickstart-git.md`](quickstart-git.md).
89
89
 
90
- **Windows:** support landed in matrixscroll **0.2.1**; pin **0.4.1** in pilot environments.
90
+ **Windows:** support landed in matrixscroll **0.2.1**; pin **0.5.0** in pilot environments.
91
91
 
92
92
  ### 3. CI gate
93
93
 
@@ -95,12 +95,12 @@ Hooks default to **warn mode**; set `"enforce": true` in `.git/matrixscroll/conf
95
95
  - uses: SSX360/matrixscroll-verify-action@v1
96
96
  with:
97
97
  manifest: path/to/signed-manifest.json
98
- matrixscroll-version: "0.4.1"
98
+ matrixscroll-version: "0.5.0"
99
99
  require-mode: emulated
100
100
  trusted-keys: trusted-keys.json
101
101
  ```
102
102
 
103
- Policy flags (`--require-mode`, `--trusted-keys`) ship in the current release; this whitepaper pins `0.4.1` for copy-and-paste examples.
103
+ Policy flags (`--require-mode`, `--trusted-keys`) ship in the current release; this whitepaper pins `0.5.0` for copy-and-paste examples.
104
104
 
105
105
  ### 4. Optional scope manifest
106
106
 
@@ -12,7 +12,7 @@ See also the platform copy in [digital-rain/docs/commercial/SSX360_SCROLL.md](ht
12
12
  ## Quick start
13
13
 
14
14
  ```bash
15
- pip install "matrixscroll==0.4.2"
15
+ pip install "matrixscroll==0.5.0"
16
16
  matrixscroll hook-install
17
17
  matrixscroll scroll commit -m "feat: governed commit"
18
18
  ```
@@ -5,11 +5,18 @@ This guide details how to submit the `matrixscroll-mcp` server to all major MCP
5
5
  ---
6
6
 
7
7
  ## 1. Glama Registry
8
- - **Status:** Integrated via `glama.json`.
9
- - **How to Publish:**
8
+ - **Status:** Live quality **A** on [matrixscroll Glama listing](https://glama.ai/mcp/servers/SSX360/matrixscroll) (license A, maintenance A, TDQS tool-set A as of 2026-06-29).
9
+ - **Listing:** [matrixscroll on Glama](https://glama.ai/mcp/servers/SSX360/matrixscroll)
10
+ - **Internal only:** Do **not** submit `digital-rain-mcp` (private SSX360 repo intelligence). If it appears on Glama from an old public scrape, email **support@glama.ai** with server id `xwxknl3sgw` and request delisting of `SSX360/digital-rain`.
11
+ - **TDQS checklist (quality A):**
12
+ 1. Every `@mcp.tool()` declares MCP annotations (`readOnlyHint`, `destructiveHint`, `idempotentHint`, `openWorldHint`).
13
+ 2. Tool docstrings include **when to use**, **when not to use**, sibling alternatives, side effects, and return shape.
14
+ 3. Pydantic `Field(description=...)` on every parameter (Glama introspection reads `tools/list` JSON Schema).
15
+ 4. CI guard: `tests/test_mcp_server.py::MCPToolDefinitionTests` asserts ≥80% schema description coverage.
16
+ - **How to publish / re-sync:**
10
17
  1. Log in to [Glama.ai](https://glama.ai/mcp).
11
- 2. Sync your repository `https://github.com/SSX360/matrixscroll`.
12
- 3. Glama will automatically parse `glama.json` and score the tools (our tight, attestation-focused tool docstrings will secure an **A** grade).
18
+ 2. Sync repository `https://github.com/SSX360/matrixscroll` (auto on push; manual sync if stale).
19
+ 3. Confirm per-tool TDQS B and server quality **A** on the listing page.
13
20
 
14
21
  ## 2. Official MCP Registry (Model Context Protocol)
15
22
  - **Status:** Ready for submission.
@@ -0,0 +1,38 @@
1
+ """Deterministic canonical JSON encoding for Matrix Scroll manifests."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from typing import Any
7
+
8
+ _SIGNATURE_KEYS = frozenset({"signature", "pqc_signatures"})
9
+
10
+
11
+ def _canonical_body(payload: dict[str, Any], *, exclude_pqc: bool) -> dict[str, Any]:
12
+ if exclude_pqc:
13
+ return {k: v for k, v in payload.items() if k not in _SIGNATURE_KEYS}
14
+ return {k: v for k, v in payload.items() if k != "signature"}
15
+
16
+
17
+ def _encode(body: dict[str, Any]) -> bytes:
18
+ return json.dumps(
19
+ body,
20
+ sort_keys=True,
21
+ ensure_ascii=True,
22
+ allow_nan=False,
23
+ separators=(",", ":"),
24
+ ).encode("utf-8")
25
+
26
+
27
+ def canonical_bytes(payload: dict[str, Any]) -> bytes:
28
+ """Return deterministic signing bytes per SPEC.md section 4 (Ed25519 v1).
29
+
30
+ Excludes ``signature`` and optional ``pqc_signatures`` so Ed25519 verification
31
+ stays valid after a v1.1 PQC overlay is attached.
32
+ """
33
+ return _encode(_canonical_body(payload, exclude_pqc=True))
34
+
35
+
36
+ def canonical_bytes_pqc(payload: dict[str, Any]) -> bytes:
37
+ """Return signing bytes for PQC overlay (§11) — excludes signature and pqc_signatures."""
38
+ return _encode(_canonical_body(payload, exclude_pqc=True))