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.
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/CHANGELOG.md +12 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/PKG-INFO +55 -14
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/README.md +52 -13
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/controls/agentic_ai_controls.json +2 -2
- matrixscroll-0.4.1/docs/SECURITY_PROPERTIES.md +36 -0
- matrixscroll-0.4.1/docs/commercial/SCROLL_GATE_V2.md +82 -0
- matrixscroll-0.4.1/docs/commercial/SSX360_SCROLL.md +31 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/cli.py +72 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/cloud/client.py +31 -4
- matrixscroll-0.4.1/matrixscroll/mcp.py +672 -0
- matrixscroll-0.4.1/matrixscroll/provenance/__init__.py +24 -0
- matrixscroll-0.4.1/matrixscroll/provenance/actions.py +110 -0
- matrixscroll-0.4.1/matrixscroll/scroll/README.md +37 -0
- matrixscroll-0.4.1/matrixscroll/scroll/__init__.py +94 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/pyproject.toml +3 -1
- matrixscroll-0.4.1/schemas/action-envelope.v1.json +152 -0
- matrixscroll-0.4.1/tests/test_provenance.py +73 -0
- matrixscroll-0.4.1/tests/test_security_properties.py +57 -0
- matrixscroll-0.4.0/docs/commercial/SCROLL_GATE_V2.md +0 -47
- matrixscroll-0.4.0/matrixscroll/mcp.py +0 -417
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/.gitignore +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/CONTRIBUTING.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/LICENSE +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/SECURITY.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/SPEC.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/ADOPTER_KIT.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/ADOPTION.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/AGENTIC_AI_SECURITY.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/CI_HARD_GATE.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/COMMIT_TIME_VS_ARTIFACT_TIME.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/COMPARISON.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/FIVE_MINUTES.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/HERO_DEMO.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/ROADMAP_2026-07.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/SE050_POC_SCOPE.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/SE050_USB_PROTOCOL.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/SOFTWARE_PRODUCTS.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/WHITEPAPER.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/commercial/PLATFORM_PIVOT.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/delegation-attestation-rfc.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/hardware-provider.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/quickstart-agent.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/quickstart-claude-code.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/quickstart-git.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/quickstart-mcp.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/registries-guide.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/rekor-guac-bridge-design.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/superpowers/plans/2026-06-19-ci-action-plan.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/superpowers/plans/2026-06-19-sdk-refactor-plan.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/superpowers/specs/2026-06-19-matrixscroll-git-design.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/yubikey-bridge.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/docs/yubikey-smoke.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/agentic_ai_evidence_manifest.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/agentic_ai_evidence_manifest.signed.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/ci/protected-branch.yml +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/commit-envelope.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/commit-envelope.signed.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/demo/agent-commit-demo.sh +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/demo/generate_signed_examples.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/demo/hero-self-attestation-demo.sh +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/release-manifest.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/release-manifest.signed.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/examples/trusted-keys-policy.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/__init__.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/_claim.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/_core.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/_payment.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/canonical.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/cloud/__init__.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/constants.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/errors.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/gate.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/git.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/guac_export.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/hooks/post-commit +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/hooks/pre-push +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/manifest.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/mcp_core.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/policy.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/__init__.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/base.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/emulated.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/hardware.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/registry.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/se050_transport.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/tpm.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/providers/yubikey.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/py.typed +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/matrixscroll/rekor_publish.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/schemas/commit-envelope.v1.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/schemas/evidence-pack.v1.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/schemas/release-manifest.v1.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/__init__.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/fixtures/github-gpgsig-commit.txt +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_agentic_guidance.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_canonical.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_cli.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_core.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_gate.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_git_envelope.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_guac_rekor.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_mcp_core.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_mcp_server.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_policy.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_release_metadata.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_se050_transport.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_tpm_provider.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_vectors.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/tests/test_yubikey_provider.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/README.md +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/_fixture_key.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/_generate.py +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_algorithm.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_device_id.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_field.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_nested.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_public_key.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_schema.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/tampered_signature.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/unsigned_empty_block.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/unsigned_no_block.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/valid_commit_envelope.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/valid_nested.json +0 -0
- {matrixscroll-0.4.0 → matrixscroll-0.4.1}/vectors/valid_simple.json +0 -0
- {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.
|
|
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
|
+
[](https://github.com/SSX360/matrixscroll/actions/workflows/ci-unit.yml)
|
|
57
60
|
[](https://github.com/SSX360/matrixscroll/actions/workflows/provenance-gate.yml)
|
|
61
|
+
[](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
|
|
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.
|
|
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.
|
|
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.
|
|
140
|
-
`matrixscroll
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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)
|
|
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
|
+
[](https://github.com/SSX360/matrixscroll/actions/workflows/ci-unit.yml)
|
|
3
4
|
[](https://github.com/SSX360/matrixscroll/actions/workflows/provenance-gate.yml)
|
|
5
|
+
[](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
|
|
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.
|
|
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.
|
|
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.
|
|
86
|
-
`matrixscroll
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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)
|
|
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/
|
|
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/
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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}")
|