matrixscroll 0.4.0__tar.gz → 0.4.1__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 (125) hide show
  1. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/CHANGELOG.md +12 -0
  2. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/PKG-INFO +55 -14
  3. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/README.md +52 -13
  4. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/controls/agentic_ai_controls.json +2 -2
  5. matrixscroll-0.4.1/docs/SECURITY_PROPERTIES.md +36 -0
  6. matrixscroll-0.4.1/docs/commercial/SCROLL_GATE_V2.md +82 -0
  7. matrixscroll-0.4.1/docs/commercial/SSX360_SCROLL.md +31 -0
  8. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/cli.py +72 -0
  9. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/cloud/client.py +31 -4
  10. matrixscroll-0.4.1/matrixscroll/mcp.py +672 -0
  11. matrixscroll-0.4.1/matrixscroll/provenance/__init__.py +24 -0
  12. matrixscroll-0.4.1/matrixscroll/provenance/actions.py +110 -0
  13. matrixscroll-0.4.1/matrixscroll/scroll/README.md +37 -0
  14. matrixscroll-0.4.1/matrixscroll/scroll/__init__.py +94 -0
  15. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/pyproject.toml +3 -1
  16. matrixscroll-0.4.1/schemas/action-envelope.v1.json +152 -0
  17. matrixscroll-0.4.1/tests/test_provenance.py +73 -0
  18. matrixscroll-0.4.1/tests/test_security_properties.py +57 -0
  19. matrixscroll-0.4.0/docs/commercial/SCROLL_GATE_V2.md +0 -47
  20. matrixscroll-0.4.0/matrixscroll/mcp.py +0 -417
  21. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/.gitignore +0 -0
  22. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/CONTRIBUTING.md +0 -0
  23. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/LICENSE +0 -0
  24. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/SECURITY.md +0 -0
  25. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/SPEC.md +0 -0
  26. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/ADOPTER_KIT.md +0 -0
  27. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/ADOPTION.md +0 -0
  28. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/AGENTIC_AI_SECURITY.md +0 -0
  29. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/CI_HARD_GATE.md +0 -0
  30. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/COMMIT_TIME_VS_ARTIFACT_TIME.md +0 -0
  31. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/COMPARISON.md +0 -0
  32. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/FIVE_MINUTES.md +0 -0
  33. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/HERO_DEMO.md +0 -0
  34. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/ROADMAP_2026-07.md +0 -0
  35. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/SE050_POC_SCOPE.md +0 -0
  36. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/SE050_USB_PROTOCOL.md +0 -0
  37. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/SOFTWARE_PRODUCTS.md +0 -0
  38. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/WHITEPAPER.md +0 -0
  39. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/commercial/PLATFORM_PIVOT.md +0 -0
  40. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/delegation-attestation-rfc.md +0 -0
  41. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/hardware-provider.md +0 -0
  42. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/quickstart-agent.md +0 -0
  43. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/quickstart-claude-code.md +0 -0
  44. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/quickstart-git.md +0 -0
  45. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/quickstart-mcp.md +0 -0
  46. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/registries-guide.md +0 -0
  47. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/rekor-guac-bridge-design.md +0 -0
  48. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/superpowers/plans/2026-06-19-ci-action-plan.md +0 -0
  49. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/superpowers/plans/2026-06-19-sdk-refactor-plan.md +0 -0
  50. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/superpowers/specs/2026-06-19-matrixscroll-git-design.md +0 -0
  51. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/yubikey-bridge.md +0 -0
  52. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/yubikey-smoke.md +0 -0
  53. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/agentic_ai_evidence_manifest.json +0 -0
  54. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/agentic_ai_evidence_manifest.signed.json +0 -0
  55. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/ci/protected-branch.yml +0 -0
  56. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/commit-envelope.json +0 -0
  57. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/commit-envelope.signed.json +0 -0
  58. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/demo/agent-commit-demo.sh +0 -0
  59. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/demo/generate_signed_examples.py +0 -0
  60. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/demo/hero-self-attestation-demo.sh +0 -0
  61. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/release-manifest.json +0 -0
  62. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/release-manifest.signed.json +0 -0
  63. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/trusted-keys-policy.json +0 -0
  64. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/__init__.py +0 -0
  65. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/_claim.py +0 -0
  66. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/_core.py +0 -0
  67. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/_payment.py +0 -0
  68. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/canonical.py +0 -0
  69. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/cloud/__init__.py +0 -0
  70. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/constants.py +0 -0
  71. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/errors.py +0 -0
  72. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/gate.py +0 -0
  73. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/git.py +0 -0
  74. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/guac_export.py +0 -0
  75. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/hooks/post-commit +0 -0
  76. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/hooks/pre-push +0 -0
  77. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/manifest.py +0 -0
  78. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/mcp_core.py +0 -0
  79. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/policy.py +0 -0
  80. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/__init__.py +0 -0
  81. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/base.py +0 -0
  82. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/emulated.py +0 -0
  83. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/hardware.py +0 -0
  84. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/registry.py +0 -0
  85. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/se050_transport.py +0 -0
  86. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/tpm.py +0 -0
  87. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/yubikey.py +0 -0
  88. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/py.typed +0 -0
  89. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/rekor_publish.py +0 -0
  90. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/schemas/commit-envelope.v1.json +0 -0
  91. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/schemas/evidence-pack.v1.json +0 -0
  92. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/schemas/release-manifest.v1.json +0 -0
  93. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/__init__.py +0 -0
  94. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/fixtures/github-gpgsig-commit.txt +0 -0
  95. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_agentic_guidance.py +0 -0
  96. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_canonical.py +0 -0
  97. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_cli.py +0 -0
  98. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_core.py +0 -0
  99. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_gate.py +0 -0
  100. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_git_envelope.py +0 -0
  101. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_guac_rekor.py +0 -0
  102. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_mcp_core.py +0 -0
  103. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_mcp_server.py +0 -0
  104. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_policy.py +0 -0
  105. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_release_metadata.py +0 -0
  106. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_se050_transport.py +0 -0
  107. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_tpm_provider.py +0 -0
  108. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_vectors.py +0 -0
  109. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_yubikey_provider.py +0 -0
  110. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/README.md +0 -0
  111. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/_fixture_key.json +0 -0
  112. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/_generate.py +0 -0
  113. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_algorithm.json +0 -0
  114. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_device_id.json +0 -0
  115. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_field.json +0 -0
  116. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_nested.json +0 -0
  117. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_public_key.json +0 -0
  118. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_schema.json +0 -0
  119. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_signature.json +0 -0
  120. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/unsigned_empty_block.json +0 -0
  121. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/unsigned_no_block.json +0 -0
  122. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/valid_commit_envelope.json +0 -0
  123. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/valid_nested.json +0 -0
  124. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/valid_simple.json +0 -0
  125. {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/valid_unicode.json +0 -0
@@ -4,6 +4,18 @@ 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.4.1] - 2026-06-29
8
+
9
+ Universal provenance SDK expansion and SSX360 Scroll Phase 1 wrapper.
10
+
11
+ ### Added
12
+ - **`matrixscroll.provenance`** — action envelope builders for `ci_step`, `iac_change`,
13
+ `db_migration`, `api_call`, and `contract_deploy` (`schemas/action-envelope.v1.json`).
14
+ - **`matrixscroll sign-action`** CLI — sign typed action envelopes with Ed25519.
15
+ - **`matrixscroll scroll commit`** — thin Git wrapper (Phase 1; not a Git replacement).
16
+ - **MCP** — `sign_action` validates typed payloads; new `matrixscroll://schema/action-envelope.v1` resource.
17
+ - **Docs** — SSX360 Scroll brief, Scroll Gate v2 SLSA L1–2 honest mapping.
18
+
7
19
  ## [0.3.0] - 2026-06-28
8
20
 
9
21
  Digital Rain removal and provenance-only SDK surface.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matrixscroll
3
- Version: 0.4.0
3
+ Version: 0.4.1
4
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.
5
5
  Project-URL: Homepage, https://ssx360.com
6
6
  Project-URL: Documentation, https://ssx360.com/docs
@@ -41,6 +41,8 @@ Requires-Python: >=3.10
41
41
  Requires-Dist: cryptography>=41.0
42
42
  Provides-Extra: dev
43
43
  Requires-Dist: build>=1.0; extra == 'dev'
44
+ Requires-Dist: hypothesis>=6.100; extra == 'dev'
45
+ Requires-Dist: pytest-cov>=4.1; extra == 'dev'
44
46
  Requires-Dist: pytest>=7.4; extra == 'dev'
45
47
  Provides-Extra: git
46
48
  Provides-Extra: hardware
@@ -54,10 +56,15 @@ Description-Content-Type: text/markdown
54
56
 
55
57
  # Matrix Scroll
56
58
 
59
+ [![ci-unit](https://github.com/SSX360/matrixscroll/actions/workflows/ci-unit.yml/badge.svg)](https://github.com/SSX360/matrixscroll/actions/workflows/ci-unit.yml)
57
60
  [![Scroll Gate v2 (hosted)](https://github.com/SSX360/matrixscroll/actions/workflows/provenance-gate.yml/badge.svg)](https://github.com/SSX360/matrixscroll/actions/workflows/provenance-gate.yml)
61
+ [![codecov](https://codecov.io/gh/SSX360/matrixscroll/graph/badge.svg)](https://codecov.io/gh/SSX360/matrixscroll)
62
+
63
+ **112 tests** · Hypothesis-verified security properties · [Security properties](docs/SECURITY_PROPERTIES.md)
58
64
 
59
65
  **Signed proof of who — or what — wrote every commit.** Matrix Scroll is the
60
- open Ed25519 commit-provenance protocol for agent-assisted Git — verified
66
+ **universal provenance SDK** — open Ed25519 envelopes for Git commits, CI steps,
67
+ IaC changes, DB migrations, API calls, and smart-contract deploys — verified
61
68
  offline in CLI, browser, and CI. Hardware (SE050) is an optional preview trust
62
69
  upgrade; emulated mode ships today.
63
70
 
@@ -93,17 +100,18 @@ Agents sign commits in-loop via the **provenance-only** MCP server:
93
100
  ```
94
101
 
95
102
  ```bash
96
- pip install "matrixscroll[mcp]==0.4.0"
103
+ pip install "matrixscroll[mcp]==0.4.1"
97
104
  matrixscroll-mcp # stdio — register in Cursor / Claude Desktop / VS Code
98
105
  ```
99
106
 
100
- **MCP tools (provenance verbs only):** `create_envelope`, `verify_envelope`,
101
- `verify_pr_range` (Scroll Gate), `publish_notes`, `status`, `audit_export`.
107
+ **MCP tools (provenance verbs only):** `create_envelope`, `sign_action`, `verify_envelope`,
108
+ `verify_pr_range` (Scroll Gate), `publish_notes`, `status`, `audit_export`, `list_envelopes`,
109
+ `connect_card` (SE050 preview).
102
110
 
103
111
  ## Also available — CLI & hooks
104
112
 
105
113
  ```bash
106
- pip install "matrixscroll==0.4.0"
114
+ pip install "matrixscroll==0.4.1"
107
115
  matrixscroll hook-install
108
116
  export MATRIXSCROLL_ACTOR_TYPE=agent
109
117
  export MATRIXSCROLL_TOOL=agent-runner
@@ -111,6 +119,29 @@ git commit -m "feat: agent-assisted change"
111
119
  matrixscroll envelope-verify "$(git rev-parse HEAD)"
112
120
  ```
113
121
 
122
+ ### Universal action envelopes (Layer 2)
123
+
124
+ Sign provenance for CI, IaC, migrations, API calls, and contract deploys:
125
+
126
+ ```bash
127
+ matrixscroll sign-action --type ci_step \
128
+ --payload ./payloads/ci-step.json \
129
+ --output ./ci-step.signed.json \
130
+ --actor-type ci
131
+ ```
132
+
133
+ Action schema: [`schemas/action-envelope.v1.json`](schemas/action-envelope.v1.json)
134
+
135
+ ### SSX360 Scroll — Git wrapper (Layer 3, Phase 1)
136
+
137
+ Git under the hood; governance on top. **Not a Git replacement.**
138
+
139
+ ```bash
140
+ matrixscroll scroll commit -m "feat: governed commit"
141
+ ```
142
+
143
+ See [`docs/commercial/SSX360_SCROLL.md`](docs/commercial/SSX360_SCROLL.md).
144
+
114
145
  See [`docs/quickstart-git.md`](docs/quickstart-git.md) and
115
146
  [`examples/demo/agent-commit-demo.sh`](examples/demo/agent-commit-demo.sh).
116
147
 
@@ -134,10 +165,19 @@ The reference SDK ships pure Ed25519 over canonical manifest bytes today. The
134
165
  SSX360 / NXP SE050 path is the compatible next trust layer and remains a
135
166
  preview path until device acceptance is complete.
136
167
 
168
+ ## RFC 8032 (Ed25519) alignment
169
+
170
+ Matrix Scroll v1 binds exclusively to [RFC 8032](https://www.rfc-editor.org/rfc/rfc8032)
171
+ Ed25519: 32-byte seeds, 32-byte public keys, 64-byte detached signatures over
172
+ canonical UTF-8 JSON bytes (see [`SPEC.md`](SPEC.md) §4). Verifiers reject any
173
+ `signature.algorithm` other than `"ed25519"`. Conformance vectors live in
174
+ [`vectors/`](vectors/); property tests in [`docs/SECURITY_PROPERTIES.md`](docs/SECURITY_PROPERTIES.md).
175
+
137
176
  ## Honest limits
138
177
 
139
- - Shipping now: PyPI `matrixscroll==0.4.0`, Git post-commit hooks,
140
- `matrixscroll envelope-verify`, Scroll Gate PR verification, browser
178
+ - Shipping now: PyPI `matrixscroll==0.4.1`, Git post-commit hooks,
179
+ `matrixscroll sign-action`, `matrixscroll scroll commit` (thin wrapper),
180
+ `matrixscroll envelope-verify`, Scroll Gate PR verification (partial SLSA L1–2),
141
181
  verifier, the GitHub Action, and a USB CDC host transport preview for the
142
182
  SE050 rollout path. Emulated mode is the default evaluation path.
143
183
  - In progress: nRF52840 + SE050 firmware validation (AP2 Vault Card PoC), external Ed25519-capable
@@ -181,7 +221,7 @@ alongside your existing scanners, branch protection, and build attestations.
181
221
  ## Quickstart (CLI)
182
222
 
183
223
  ```bash
184
- pip install "matrixscroll==0.4.0"
224
+ pip install "matrixscroll==0.4.1"
185
225
  matrixscroll hook-install
186
226
  matrixscroll hook-status
187
227
 
@@ -208,7 +248,7 @@ See [`docs/quickstart-git.md`](docs/quickstart-git.md) and run
208
248
  head-ref: ${{ github.event.pull_request.head.sha }}
209
249
  base-ref: ${{ github.event.pull_request.base.sha }}
210
250
  source: notes
211
- matrixscroll-version: "0.4.0"
251
+ matrixscroll-version: "0.4.1"
212
252
  require-mode: emulated
213
253
  ```
214
254
 
@@ -228,7 +268,7 @@ git push origin refs/notes/matrixscroll
228
268
  head-ref: ${{ github.event.pull_request.head.sha }}
229
269
  base-ref: ${{ github.event.pull_request.base.sha }}
230
270
  source: notes
231
- matrixscroll-version: "0.4.0"
271
+ matrixscroll-version: "0.4.1"
232
272
  summary-output: provenance-summary.json
233
273
  ```
234
274
 
@@ -265,7 +305,7 @@ when they preserve the same pure Ed25519 byte contract.
265
305
  ## Python API
266
306
 
267
307
  ```bash
268
- pip install "matrixscroll==0.4.0"
308
+ pip install "matrixscroll==0.4.1"
269
309
  ```
270
310
 
271
311
  ```python
@@ -375,7 +415,7 @@ The MCP server exposes **provenance verbs only**: `create_envelope`, `verify_env
375
415
  Install and register in Cursor / Claude Desktop / VS Code:
376
416
 
377
417
  ```bash
378
- pip install "matrixscroll[mcp]==0.4.0"
418
+ pip install "matrixscroll[mcp]==0.4.1"
379
419
  matrixscroll-mcp # stdio
380
420
  ```
381
421
 
@@ -389,7 +429,8 @@ the recommended `mcp.json` snippet.
389
429
 
390
430
  ## Security
391
431
 
392
- See [`SECURITY.md`](SECURITY.md). Report vulnerabilities privately to
432
+ See [`SECURITY.md`](SECURITY.md) and [`docs/SECURITY_PROPERTIES.md`](docs/SECURITY_PROPERTIES.md).
433
+ Report vulnerabilities privately to
393
434
  **security@matrixscroll.com** or via a GitHub Security Advisory.
394
435
 
395
436
  ---
@@ -1,9 +1,14 @@
1
1
  # Matrix Scroll
2
2
 
3
+ [![ci-unit](https://github.com/SSX360/matrixscroll/actions/workflows/ci-unit.yml/badge.svg)](https://github.com/SSX360/matrixscroll/actions/workflows/ci-unit.yml)
3
4
  [![Scroll Gate v2 (hosted)](https://github.com/SSX360/matrixscroll/actions/workflows/provenance-gate.yml/badge.svg)](https://github.com/SSX360/matrixscroll/actions/workflows/provenance-gate.yml)
5
+ [![codecov](https://codecov.io/gh/SSX360/matrixscroll/graph/badge.svg)](https://codecov.io/gh/SSX360/matrixscroll)
6
+
7
+ **112 tests** · Hypothesis-verified security properties · [Security properties](docs/SECURITY_PROPERTIES.md)
4
8
 
5
9
  **Signed proof of who — or what — wrote every commit.** Matrix Scroll is the
6
- open Ed25519 commit-provenance protocol for agent-assisted Git — verified
10
+ **universal provenance SDK** — open Ed25519 envelopes for Git commits, CI steps,
11
+ IaC changes, DB migrations, API calls, and smart-contract deploys — verified
7
12
  offline in CLI, browser, and CI. Hardware (SE050) is an optional preview trust
8
13
  upgrade; emulated mode ships today.
9
14
 
@@ -39,17 +44,18 @@ Agents sign commits in-loop via the **provenance-only** MCP server:
39
44
  ```
40
45
 
41
46
  ```bash
42
- pip install "matrixscroll[mcp]==0.4.0"
47
+ pip install "matrixscroll[mcp]==0.4.1"
43
48
  matrixscroll-mcp # stdio — register in Cursor / Claude Desktop / VS Code
44
49
  ```
45
50
 
46
- **MCP tools (provenance verbs only):** `create_envelope`, `verify_envelope`,
47
- `verify_pr_range` (Scroll Gate), `publish_notes`, `status`, `audit_export`.
51
+ **MCP tools (provenance verbs only):** `create_envelope`, `sign_action`, `verify_envelope`,
52
+ `verify_pr_range` (Scroll Gate), `publish_notes`, `status`, `audit_export`, `list_envelopes`,
53
+ `connect_card` (SE050 preview).
48
54
 
49
55
  ## Also available — CLI & hooks
50
56
 
51
57
  ```bash
52
- pip install "matrixscroll==0.4.0"
58
+ pip install "matrixscroll==0.4.1"
53
59
  matrixscroll hook-install
54
60
  export MATRIXSCROLL_ACTOR_TYPE=agent
55
61
  export MATRIXSCROLL_TOOL=agent-runner
@@ -57,6 +63,29 @@ git commit -m "feat: agent-assisted change"
57
63
  matrixscroll envelope-verify "$(git rev-parse HEAD)"
58
64
  ```
59
65
 
66
+ ### Universal action envelopes (Layer 2)
67
+
68
+ Sign provenance for CI, IaC, migrations, API calls, and contract deploys:
69
+
70
+ ```bash
71
+ matrixscroll sign-action --type ci_step \
72
+ --payload ./payloads/ci-step.json \
73
+ --output ./ci-step.signed.json \
74
+ --actor-type ci
75
+ ```
76
+
77
+ Action schema: [`schemas/action-envelope.v1.json`](schemas/action-envelope.v1.json)
78
+
79
+ ### SSX360 Scroll — Git wrapper (Layer 3, Phase 1)
80
+
81
+ Git under the hood; governance on top. **Not a Git replacement.**
82
+
83
+ ```bash
84
+ matrixscroll scroll commit -m "feat: governed commit"
85
+ ```
86
+
87
+ See [`docs/commercial/SSX360_SCROLL.md`](docs/commercial/SSX360_SCROLL.md).
88
+
60
89
  See [`docs/quickstart-git.md`](docs/quickstart-git.md) and
61
90
  [`examples/demo/agent-commit-demo.sh`](examples/demo/agent-commit-demo.sh).
62
91
 
@@ -80,10 +109,19 @@ The reference SDK ships pure Ed25519 over canonical manifest bytes today. The
80
109
  SSX360 / NXP SE050 path is the compatible next trust layer and remains a
81
110
  preview path until device acceptance is complete.
82
111
 
112
+ ## RFC 8032 (Ed25519) alignment
113
+
114
+ Matrix Scroll v1 binds exclusively to [RFC 8032](https://www.rfc-editor.org/rfc/rfc8032)
115
+ Ed25519: 32-byte seeds, 32-byte public keys, 64-byte detached signatures over
116
+ canonical UTF-8 JSON bytes (see [`SPEC.md`](SPEC.md) §4). Verifiers reject any
117
+ `signature.algorithm` other than `"ed25519"`. Conformance vectors live in
118
+ [`vectors/`](vectors/); property tests in [`docs/SECURITY_PROPERTIES.md`](docs/SECURITY_PROPERTIES.md).
119
+
83
120
  ## Honest limits
84
121
 
85
- - Shipping now: PyPI `matrixscroll==0.4.0`, Git post-commit hooks,
86
- `matrixscroll envelope-verify`, Scroll Gate PR verification, browser
122
+ - Shipping now: PyPI `matrixscroll==0.4.1`, Git post-commit hooks,
123
+ `matrixscroll sign-action`, `matrixscroll scroll commit` (thin wrapper),
124
+ `matrixscroll envelope-verify`, Scroll Gate PR verification (partial SLSA L1–2),
87
125
  verifier, the GitHub Action, and a USB CDC host transport preview for the
88
126
  SE050 rollout path. Emulated mode is the default evaluation path.
89
127
  - In progress: nRF52840 + SE050 firmware validation (AP2 Vault Card PoC), external Ed25519-capable
@@ -127,7 +165,7 @@ alongside your existing scanners, branch protection, and build attestations.
127
165
  ## Quickstart (CLI)
128
166
 
129
167
  ```bash
130
- pip install "matrixscroll==0.4.0"
168
+ pip install "matrixscroll==0.4.1"
131
169
  matrixscroll hook-install
132
170
  matrixscroll hook-status
133
171
 
@@ -154,7 +192,7 @@ See [`docs/quickstart-git.md`](docs/quickstart-git.md) and run
154
192
  head-ref: ${{ github.event.pull_request.head.sha }}
155
193
  base-ref: ${{ github.event.pull_request.base.sha }}
156
194
  source: notes
157
- matrixscroll-version: "0.4.0"
195
+ matrixscroll-version: "0.4.1"
158
196
  require-mode: emulated
159
197
  ```
160
198
 
@@ -174,7 +212,7 @@ git push origin refs/notes/matrixscroll
174
212
  head-ref: ${{ github.event.pull_request.head.sha }}
175
213
  base-ref: ${{ github.event.pull_request.base.sha }}
176
214
  source: notes
177
- matrixscroll-version: "0.4.0"
215
+ matrixscroll-version: "0.4.1"
178
216
  summary-output: provenance-summary.json
179
217
  ```
180
218
 
@@ -211,7 +249,7 @@ when they preserve the same pure Ed25519 byte contract.
211
249
  ## Python API
212
250
 
213
251
  ```bash
214
- pip install "matrixscroll==0.4.0"
252
+ pip install "matrixscroll==0.4.1"
215
253
  ```
216
254
 
217
255
  ```python
@@ -321,7 +359,7 @@ The MCP server exposes **provenance verbs only**: `create_envelope`, `verify_env
321
359
  Install and register in Cursor / Claude Desktop / VS Code:
322
360
 
323
361
  ```bash
324
- pip install "matrixscroll[mcp]==0.4.0"
362
+ pip install "matrixscroll[mcp]==0.4.1"
325
363
  matrixscroll-mcp # stdio
326
364
  ```
327
365
 
@@ -335,7 +373,8 @@ the recommended `mcp.json` snippet.
335
373
 
336
374
  ## Security
337
375
 
338
- See [`SECURITY.md`](SECURITY.md). Report vulnerabilities privately to
376
+ See [`SECURITY.md`](SECURITY.md) and [`docs/SECURITY_PROPERTIES.md`](docs/SECURITY_PROPERTIES.md).
377
+ Report vulnerabilities privately to
339
378
  **security@matrixscroll.com** or via a GitHub Security Advisory.
340
379
 
341
380
  ---
@@ -78,7 +78,7 @@
78
78
  "title": "Supply-chain and dependency management",
79
79
  "guidance": "Understand third-party components, models, tools, integrations, and update exposure.",
80
80
  "matrixscroll_control": "The repo uses minimal runtime dependencies, Dependabot, CI build verification, and a public spec/conformance suite.",
81
- "evidence_paths": ["pyproject.toml", ".github/dependabot.yml", ".github/workflows/test.yml", "vectors/README.md"],
81
+ "evidence_paths": ["pyproject.toml", ".github/dependabot.yml", ".github/workflows/ci-unit.yml", "vectors/README.md"],
82
82
  "goes_beyond": "Third-party implementations can self-test against public vectors before being trusted."
83
83
  },
84
84
  {
@@ -94,7 +94,7 @@
94
94
  "title": "Governance and change control",
95
95
  "guidance": "Integrate agentic AI risk with existing security governance and define ownership before deployment.",
96
96
  "matrixscroll_control": "Spec, core crypto, vectors, security policy, and CI are CODEOWNERS-protected and tested across OS/Python versions.",
97
- "evidence_paths": [".github/CODEOWNERS", ".github/workflows/test.yml", "CONTRIBUTING.md"],
97
+ "evidence_paths": [".github/CODEOWNERS", ".github/workflows/ci-unit.yml", ".github/workflows/ci-integration.yml", "CONTRIBUTING.md"],
98
98
  "goes_beyond": "Protocol-impacting changes require both human review and machine conformance checks."
99
99
  },
100
100
  {
@@ -0,0 +1,36 @@
1
+ # Matrix Scroll security properties
2
+
3
+ Machine-checkable guarantees for the reference SDK (v0.4.0). Properties marked
4
+ **verified** have Hypothesis property tests in `tests/test_security_properties.py`.
5
+ Formal TLA+ models are on the public roadmap.
6
+
7
+ | ID | Property | Statement | Status |
8
+ | -- | -------- | ----------- | ------ |
9
+ | **P1** | Sign–verify roundtrip | For any canonical manifest bytes, `verify(pub, msg, sign(msg, key))` is true when `pub` derives from the same key material. | **Verified** (Hypothesis) |
10
+ | **P2** | Tamper detection | Changing any signed byte (manifest body or signature octet) causes verification to fail. | **Verified** (Hypothesis) |
11
+ | **P3** | Wrong-key rejection | A signature valid under key A MUST NOT verify under key B's public key. | **Verified** (Hypothesis) |
12
+ | **P4** | Canonical determinism | Identical logical manifests produce identical signing input bytes after canonical JSON encoding (sorted keys, ASCII escapes, no NaN). | **Verified** (unit + vectors) |
13
+ | **P5** | Offline verification | Envelope verification requires no network, hosted API, or hardware ping once the envelope and trusted key set are local. | **Verified** (unit) |
14
+ | **P6** | Algorithm binding | Only Ed25519 (RFC 8032) signatures with `algorithm: "ed25519"` are accepted; other algorithms are rejected. | **Verified** (unit + vectors) |
15
+
16
+ ## Standards alignment
17
+
18
+ - **Ed25519:** [RFC 8032](https://www.rfc-editor.org/rfc/rfc8032) — 32-byte seed, 32-byte public key, 64-byte signature.
19
+ - **Canonical JSON:** Deterministic UTF-8 encoding per [`SPEC.md`](../SPEC.md) §4.
20
+ - **Commit envelopes:** `matrixscroll.commit_envelope.v1` schema in [`schemas/commit-envelope.v1.json`](../schemas/commit-envelope.v1.json).
21
+
22
+ ## Trust modes (honest scope)
23
+
24
+ | Mode | Private key location | Shipping status |
25
+ | ---- | -------------------- | --------------- |
26
+ | **Emulated** | Owner-only file (`~/.matrixscroll/device.json`, mode 0600) | **Shipping today** |
27
+ | **Hardware (SE050)** | NXP secure element on AP2 Vault Card pilot | **Pilot / preview** — same verifier contract, key not exportable from chip |
28
+
29
+ ## Roadmap (not claimed today)
30
+
31
+ - TLA+ specification of Scroll Gate merge semantics
32
+ - Third-party cryptographic audit and public threat model
33
+ - npm `@ssx360/verify` browser/Node verifier package
34
+ - IETF informational draft for commit-envelope wire format
35
+
36
+ See [`SECURITY.md`](../SECURITY.md) for vulnerability reporting.
@@ -0,0 +1,82 @@
1
+ # Scroll Gate v2 — hosted verification
2
+
3
+ Scroll Gate **v2** calls the SSX360 hosted API. Local-only verification remains in the Matrix Scroll SDK and MCP (`verify_envelope`, offline `source=local|notes|bundle`).
4
+
5
+ ## Requirements
6
+
7
+ - **`SSX360_API_KEY`** — required for CI and hosted MCP Scroll Gate
8
+ - Community tier includes **100 CI verifications/day**
9
+ - Get a key at [ssx360.com/signup](https://ssx360.com/signup)
10
+
11
+ ## GitHub Actions
12
+
13
+ Add repository secret `SSX360_API_KEY` (Settings → Secrets → Actions).
14
+
15
+ The workflow in `.github/workflows/provenance-gate.yml` posts to:
16
+
17
+ ```text
18
+ POST https://ssx360.com/api/v1/verify
19
+ Authorization: Bearer $SSX360_API_KEY
20
+ ```
21
+
22
+ Example body:
23
+
24
+ ```json
25
+ {
26
+ "base": "<base-sha>",
27
+ "head": "<head-sha>",
28
+ "commits": []
29
+ }
30
+ ```
31
+
32
+ ## Migration from v1
33
+
34
+ | v1 (local) | v2 (hosted) |
35
+ |------------|-------------|
36
+ | `matrixscroll-verify-action@v1` | `curl` or `@v2` action against ssx360.com |
37
+ | Local git notes only | Network audit + usage metering |
38
+ | No API key | `SSX360_API_KEY` required |
39
+
40
+ ## MCP
41
+
42
+ Set `SSX360_API_KEY` in your MCP server environment. The default `verify_pr_range` source is `hosted`. Use `source=notes` for offline git-notes verification without a key.
43
+
44
+ ---
45
+
46
+ ## SLSA mapping (honest — partial today)
47
+
48
+ Scroll Gate provides **governance-as-a-service** aligned with [SLSA](https://slsa.dev/) Build Level 1–2 concepts. SSX360 does **not** claim full SLSA Build Level 3 or certification.
49
+
50
+ | SLSA concept | SSX360 / Scroll Gate today | Gap |
51
+ |--------------|----------------------------|-----|
52
+ | **Version control** | Git + signed commit envelopes on every governed commit | Scroll client MVP still rolling out |
53
+ | **Retained history** | Git immutable objects + optional hosted envelope storage (Team+) | Community: local/git-notes only |
54
+ | **Authenticated source** | Ed25519 commit envelopes bind actor, tool, scope | Default **emulated** keys; SE050 hardware is pilot |
55
+ | **Hosted build platform** | ⚠️ Partial — `ci_step` action envelopes + hosted verify API | Not a replacement for GitHub Actions / Cloud Build |
56
+ | **Non-falsifiable provenance** | ❌ Not claimed at L3+ | Requires hardware-backed signing + builder attestations (Layer 4) |
57
+
58
+ ### What hosted verify proves today
59
+
60
+ When Scroll Gate passes for a PR range:
61
+
62
+ 1. Each commit in range has a **cryptographically valid** envelope (or policy allows warn-mode gaps).
63
+ 2. Signatures verify against trusted keys / team policy when configured.
64
+ 3. Verification is **logged** on ssx360.com for Team+ audit export (usage-metered on Community).
65
+
66
+ This maps to **SLSA Source L1–L2** style controls (versioned, authenticated change history) for **commit provenance**, not full **build artifact** provenance.
67
+
68
+ ### Roadmap toward stronger SLSA alignment
69
+
70
+ | Phase | Deliverable | SLSA relevance |
71
+ |-------|-------------|----------------|
72
+ | Phase 1 (now) | `sign-action --type ci_step`, hosted verify | CI step attestation alongside commits |
73
+ | Phase 2 | Scroll `push` + mandatory notes | Stronger retained provenance chain |
74
+ | Phase 3 | Builder attestations (Layer 4 doc) | Toward L3 build provenance — not committed |
75
+
76
+ Portal reference: [ssx360.com/docs/slsa](https://ssx360.com/docs/slsa)
77
+
78
+ ## Docs
79
+
80
+ - Platform docs: [ssx360.com/docs](https://ssx360.com/docs)
81
+ - Migration guide: [PLATFORM_PIVOT.md](./PLATFORM_PIVOT.md)
82
+ - Layer 3 roadmap: [LAYER3 governance (digital-rain)](https://github.com/SSX360/digital-rain/blob/main/docs/commercial/LAYER3_GOVERNANCE_ROADMAP.md)
@@ -0,0 +1,31 @@
1
+ # SSX360 Scroll — Provenance-native Git governance
2
+
3
+ **Status:** Phase 1 thin wrapper + hooks. **Not** a Git replacement.
4
+
5
+ See also the platform copy in [digital-rain/docs/commercial/SSX360_SCROLL.md](https://github.com/SSX360/digital-rain/blob/main/docs/commercial/SSX360_SCROLL.md).
6
+
7
+ ## Module location
8
+
9
+ - `matrixscroll/scroll/` — Phase 1 `scroll commit` wrapper
10
+ - `matrixscroll/provenance/` — universal action envelope builders
11
+
12
+ ## Quick start
13
+
14
+ ```bash
15
+ pip install "matrixscroll==0.4.1"
16
+ matrixscroll hook-install
17
+ matrixscroll scroll commit -m "feat: governed commit"
18
+ ```
19
+
20
+ ## Universal actions (Layer 2)
21
+
22
+ ```bash
23
+ matrixscroll sign-action --type ci_step \
24
+ --payload ./ci-step.json \
25
+ --output ./ci-step.signed.json \
26
+ --actor-type ci
27
+ ```
28
+
29
+ Action types: `git_commit`, `ci_step`, `iac_change`, `db_migration`, `api_call`, `contract_deploy`.
30
+
31
+ Schema: [`schemas/action-envelope.v1.json`](../schemas/action-envelope.v1.json)
@@ -328,6 +328,46 @@ def _cmd_sign_payment(args: argparse.Namespace) -> int:
328
328
  return 1
329
329
 
330
330
 
331
+ def _cmd_sign_action(args: argparse.Namespace) -> int:
332
+ from .provenance import build_action_envelope, sign_action_envelope, validate_action_payload
333
+
334
+ payload_path = Path(args.payload)
335
+ try:
336
+ payload = json.loads(payload_path.read_text(encoding="utf-8-sig"))
337
+ except (OSError, ValueError) as exc:
338
+ print(json.dumps({"ok": False, "error": f"cannot read payload: {exc}"}))
339
+ return 2
340
+ ok, err = validate_action_payload(args.type, payload)
341
+ if not ok:
342
+ print(json.dumps({"ok": False, "error": err}))
343
+ return 2
344
+ envelope = build_action_envelope(
345
+ args.type, # type: ignore[arg-type]
346
+ payload,
347
+ actor_type=args.actor_type,
348
+ tool=args.tool,
349
+ )
350
+ signed = sign_action_envelope(envelope)
351
+ if args.output:
352
+ Path(args.output).write_text(json.dumps(signed, indent=2, sort_keys=True) + "\n", encoding="utf-8")
353
+ else:
354
+ print(json.dumps(signed, indent=2, sort_keys=True))
355
+ return 0
356
+
357
+
358
+ def _cmd_scroll_commit(args: argparse.Namespace) -> int:
359
+ from .scroll import commit as scroll_commit
360
+
361
+ result = scroll_commit(
362
+ args.message,
363
+ actor_type=args.actor_type,
364
+ tool=args.tool,
365
+ allow_empty=args.allow_empty,
366
+ )
367
+ print(json.dumps(result, indent=2, sort_keys=True))
368
+ return 0 if result.get("ok") else 2
369
+
370
+
331
371
  def build_parser() -> argparse.ArgumentParser:
332
372
  parser = argparse.ArgumentParser(
333
373
  prog="matrixscroll",
@@ -454,6 +494,36 @@ def build_parser() -> argparse.ArgumentParser:
454
494
  pay_p.add_argument("--key-path", help="Alternative signing key path")
455
495
  pay_p.set_defaults(command="sign-payment")
456
496
 
497
+ sign_action_p = sub.add_parser(
498
+ "sign-action",
499
+ help="Sign a universal provenance action envelope (ci_step, iac_change, etc.)",
500
+ )
501
+ sign_action_p.add_argument(
502
+ "--type",
503
+ required=True,
504
+ choices=["git_commit", "ci_step", "iac_change", "db_migration", "api_call", "contract_deploy"],
505
+ help="Action type per schemas/action-envelope.v1.json",
506
+ )
507
+ sign_action_p.add_argument("--payload", required=True, help="JSON file with action-specific payload")
508
+ sign_action_p.add_argument("--output", "-o", help="Write signed envelope to file")
509
+ sign_action_p.add_argument(
510
+ "--actor-type",
511
+ default="human",
512
+ choices=["human", "agent", "ci"],
513
+ help="Provenance actor label",
514
+ )
515
+ sign_action_p.add_argument("--tool", default="matrixscroll", help="Producing tool name")
516
+ sign_action_p.set_defaults(command="sign-action")
517
+
518
+ scroll_p = sub.add_parser("scroll", help="SSX360 Scroll — Git wrapper with auto-envelope (Phase 1)")
519
+ scroll_sub = scroll_p.add_subparsers(dest="scroll_command")
520
+ scroll_commit_p = scroll_sub.add_parser("commit", help="git commit + signed envelope")
521
+ scroll_commit_p.add_argument("-m", "--message", required=True)
522
+ scroll_commit_p.add_argument("--actor-type", default="human", choices=["human", "agent", "ci"])
523
+ scroll_commit_p.add_argument("--tool", default="scroll")
524
+ scroll_commit_p.add_argument("--allow-empty", action="store_true")
525
+ scroll_commit_p.set_defaults(command="scroll-commit")
526
+
457
527
  return parser
458
528
 
459
529
 
@@ -479,6 +549,8 @@ def main(argv: list[str] | None = None) -> int:
479
549
  "claim": cmd_claim,
480
550
  "identity": cmd_identity,
481
551
  "sign-payment": _cmd_sign_payment,
552
+ "sign-action": _cmd_sign_action,
553
+ "scroll-commit": _cmd_scroll_commit,
482
554
  }
483
555
  handler = handlers.get(args.command)
484
556
  if handler is None:
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import json
6
6
  import os
7
7
  import urllib.error
8
+ import urllib.parse
8
9
  import urllib.request
9
10
  from typing import Any
10
11
 
@@ -81,11 +82,37 @@ def verify_range(
81
82
  )
82
83
 
83
84
 
84
- def list_envelopes(*, limit: int = 50) -> dict[str, Any]:
85
+ def list_envelopes(
86
+ *,
87
+ limit: int = 50,
88
+ offset: int = 0,
89
+ signer_filter: str = "",
90
+ ) -> dict[str, Any]:
85
91
  """List stored envelopes for the authenticated organization."""
86
- return _request("GET", f"/api/v1/envelopes?limit={limit}")
92
+ params = [f"limit={limit}", f"offset={offset}"]
93
+ if signer_filter.strip():
94
+ params.append(f"signer_filter={urllib.parse.quote(signer_filter.strip())}")
95
+ query = "&".join(params)
96
+ return _request("GET", f"/api/v1/envelopes?{query}")
87
97
 
88
98
 
89
- def audit_export(*, format: str = "json") -> dict[str, Any]:
99
+ def audit_export(
100
+ *,
101
+ format: str = "json",
102
+ start_date: str = "",
103
+ end_date: str = "",
104
+ signer_id: str = "",
105
+ include_verification: bool = True,
106
+ ) -> dict[str, Any]:
90
107
  """Export audit bundle from the hosted platform (Team+)."""
91
- return _request("GET", f"/api/v1/audit/export?format={format}")
108
+ params = [f"format={urllib.parse.quote(format)}"]
109
+ if start_date.strip():
110
+ params.append(f"start_date={urllib.parse.quote(start_date.strip())}")
111
+ if end_date.strip():
112
+ params.append(f"end_date={urllib.parse.quote(end_date.strip())}")
113
+ if signer_id.strip():
114
+ params.append(f"signer_id={urllib.parse.quote(signer_id.strip())}")
115
+ if include_verification:
116
+ params.append("include_verification=true")
117
+ query = "&".join(params)
118
+ return _request("GET", f"/api/v1/audit/export?{query}")