matrixscroll 0.2.4__tar.gz → 0.2.6__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.2.4 → matrixscroll-0.2.6}/CHANGELOG.md +35 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/CONTRIBUTING.md +20 -1
- matrixscroll-0.2.6/PKG-INFO +267 -0
- matrixscroll-0.2.6/README.md +216 -0
- matrixscroll-0.2.6/docs/ADOPTER_KIT.md +70 -0
- matrixscroll-0.2.6/docs/CI_HARD_GATE.md +49 -0
- matrixscroll-0.2.6/docs/COMMIT_TIME_VS_ARTIFACT_TIME.md +51 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/COMPARISON.md +1 -1
- matrixscroll-0.2.6/docs/FIVE_MINUTES.md +78 -0
- matrixscroll-0.2.6/docs/ROADMAP_2026-07.md +44 -0
- matrixscroll-0.2.6/docs/SE050_POC_SCOPE.md +92 -0
- matrixscroll-0.2.6/docs/SE050_USB_PROTOCOL.md +96 -0
- matrixscroll-0.2.6/docs/SOFTWARE_PRODUCTS.md +53 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/WHITEPAPER.md +8 -6
- matrixscroll-0.2.6/docs/hardware-provider.md +60 -0
- matrixscroll-0.2.6/docs/quickstart-agent.md +64 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/quickstart-claude-code.md +5 -4
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/quickstart-git.md +10 -6
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/rekor-guac-bridge-design.md +1 -1
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/superpowers/specs/2026-06-19-matrixscroll-git-design.md +1 -1
- matrixscroll-0.2.6/docs/yubikey-bridge.md +54 -0
- matrixscroll-0.2.6/docs/yubikey-smoke.md +22 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/ci/protected-branch.yml +3 -3
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/demo/agent-commit-demo.sh +1 -1
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/__init__.py +5 -3
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/cli.py +54 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/git.py +58 -17
- matrixscroll-0.2.6/matrixscroll/guac_export.py +78 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/manifest.py +23 -5
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/providers/base.py +6 -0
- matrixscroll-0.2.6/matrixscroll/providers/hardware.py +71 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/providers/registry.py +4 -0
- matrixscroll-0.2.6/matrixscroll/providers/se050_transport.py +226 -0
- matrixscroll-0.2.6/matrixscroll/providers/tpm.py +144 -0
- matrixscroll-0.2.6/matrixscroll/providers/yubikey.py +212 -0
- matrixscroll-0.2.6/matrixscroll/rekor_publish.py +131 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/pyproject.toml +15 -3
- matrixscroll-0.2.6/tests/fixtures/github-gpgsig-commit.txt +25 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_core.py +1 -1
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_git_envelope.py +41 -0
- matrixscroll-0.2.6/tests/test_guac_rekor.py +75 -0
- matrixscroll-0.2.6/tests/test_se050_transport.py +120 -0
- matrixscroll-0.2.6/tests/test_tpm_provider.py +30 -0
- matrixscroll-0.2.6/tests/test_yubikey_provider.py +70 -0
- matrixscroll-0.2.4/PKG-INFO +0 -222
- matrixscroll-0.2.4/README.md +0 -185
- matrixscroll-0.2.4/docs/hardware-provider.md +0 -20
- matrixscroll-0.2.4/docs/quickstart-copilot.md +0 -52
- matrixscroll-0.2.4/docs/quickstart-cursor.md +0 -57
- matrixscroll-0.2.4/docs/yubikey-bridge.md +0 -137
- matrixscroll-0.2.4/matrixscroll/providers/hardware.py +0 -22
- matrixscroll-0.2.4/matrixscroll/providers/yubikey.py +0 -104
- matrixscroll-0.2.4/tests/test_yubikey_provider.py +0 -35
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/.gitignore +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/LICENSE +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/SECURITY.md +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/SPEC.md +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/controls/agentic_ai_controls.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/AGENTIC_AI_SECURITY.md +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/delegation-attestation-rfc.md +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/superpowers/plans/2026-06-19-ci-action-plan.md +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/docs/superpowers/plans/2026-06-19-sdk-refactor-plan.md +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/agentic_ai_evidence_manifest.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/agentic_ai_evidence_manifest.signed.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/commit-envelope.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/commit-envelope.signed.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/demo/generate_signed_examples.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/release-manifest.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/release-manifest.signed.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/examples/trusted-keys-policy.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/_core.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/canonical.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/constants.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/errors.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/gate.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/hooks/post-commit +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/hooks/pre-push +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/policy.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/providers/__init__.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/providers/emulated.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/matrixscroll/py.typed +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/schemas/commit-envelope.v1.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/schemas/evidence-pack.v1.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/schemas/release-manifest.v1.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/__init__.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_agentic_guidance.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_canonical.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_cli.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_gate.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_policy.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_release_metadata.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/tests/test_vectors.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/README.md +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/_fixture_key.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/_generate.py +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/tampered_algorithm.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/tampered_device_id.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/tampered_field.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/tampered_nested.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/tampered_public_key.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/tampered_schema.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/tampered_signature.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/unsigned_empty_block.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/unsigned_no_block.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/valid_commit_envelope.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/valid_nested.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/valid_simple.json +0 -0
- {matrixscroll-0.2.4 → matrixscroll-0.2.6}/vectors/valid_unicode.json +0 -0
|
@@ -4,6 +4,41 @@ 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.2.6] - 2026-06-21
|
|
8
|
+
|
|
9
|
+
SDK rollout hardening: generic public attribution, SE050 host transport preview,
|
|
10
|
+
and repo-local hardware rollout docs.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **USB CDC host transport preview** - `SerialSE050Transport` for newline-delimited
|
|
14
|
+
JSON `ping` / `pubkey` / `sign` framing over the RP2350 USB bridge.
|
|
15
|
+
- **Hardware extra** - `pip install "matrixscroll[hardware]"` now pulls in
|
|
16
|
+
`pyserial` for the SE050 host path.
|
|
17
|
+
- **Rollout docs** - adopter kit, five-minute guide, hardware provider quickstart,
|
|
18
|
+
SE050 protocol reference, and contractor-facing PoC scope kept inside the SDK repo.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
- **Public quickstarts** - replaced editor-specific public quickstarts with
|
|
22
|
+
generic agent-facing guidance while keeping the manifest schema and API unchanged.
|
|
23
|
+
- **Hardware messaging** - clarified that the SDK now ships a host transport
|
|
24
|
+
preview and mock path, while real device signing still depends on firmware PoC validation.
|
|
25
|
+
- **Release copy** - aligned README, support docs, CI examples, and package metadata
|
|
26
|
+
around the `0.2.6` rollout surface.
|
|
27
|
+
|
|
28
|
+
## [0.2.5] - 2026-06-20
|
|
29
|
+
|
|
30
|
+
Credibility and compatibility patch: GitHub gpgsig commit binding, SE050 mock transport, YubiKey pubkey export, Rekor/GUAC CLI MVP.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
- **GitHub `gpgsig` commit binding** — verify envelopes against raw commit object SHA when OpenPGP signatures are present.
|
|
34
|
+
- **SE050 mock transport** — `MATRIXSCROLL_SE050_MOCK=1` enables `HardwareProvider` for development (`providers/se050_transport.py`).
|
|
35
|
+
- **YubiKey public key export** — PKCS#11 EC public key read path (mock + real token).
|
|
36
|
+
- **GUAC export CLI** — `matrixscroll envelope-export-guac --bundle DIR --output guac.jsonl`.
|
|
37
|
+
- **Rekor publish stub** — `matrixscroll envelope-publish-rekor --bundle DIR` (dry-run artifacts; optional `--rekor-cli`).
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
- **`parse_commit()` / envelope verify** on GitHub-signed commits with multi-line `gpgsig` headers (Windows CRLF safe).
|
|
41
|
+
|
|
7
42
|
## [0.2.4] - 2026-06-20
|
|
8
43
|
|
|
9
44
|
Who-Acted gate productization: attribution policy, delegation schema, CI hardening.
|
|
@@ -29,6 +29,25 @@ pip install -e ".[dev]"
|
|
|
29
29
|
pytest -q
|
|
30
30
|
```
|
|
31
31
|
|
|
32
|
+
## Commit envelope provenance (Scroll Gate)
|
|
33
|
+
|
|
34
|
+
For PRs that include agent-assisted commits, publish signed commit envelopes to git notes:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
matrixscroll hook-install
|
|
38
|
+
export MATRIXSCROLL_ACTOR_TYPE=agent # or human / ci as appropriate
|
|
39
|
+
export MATRIXSCROLL_TOOL=agent-runner # or your editor / agent tool name
|
|
40
|
+
git commit -m "feat: your change"
|
|
41
|
+
matrixscroll envelope-publish-notes --base origin/main --head HEAD
|
|
42
|
+
git push origin refs/notes/matrixscroll
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
CI verifies the PR range with `matrixscroll envelope-verify-range --source notes`.
|
|
46
|
+
Until repository variable `ENFORCE_PROVENANCE=true` is set, missing notes produce a **warning**
|
|
47
|
+
in the GitHub Step Summary rather than a hard failure.
|
|
48
|
+
|
|
49
|
+
Optional policy file for release branches: [`.github/trusted-keys.json`](.github/trusted-keys.json).
|
|
50
|
+
|
|
32
51
|
## Running the conformance vectors
|
|
33
52
|
|
|
34
53
|
```bash
|
|
@@ -42,7 +61,7 @@ vectors are welcome.
|
|
|
42
61
|
|
|
43
62
|
## Pull request checklist
|
|
44
63
|
|
|
45
|
-
- [ ]
|
|
64
|
+
- [ ] For agent-assisted commits: publish envelope git notes (`envelope-publish-notes` + push `refs/notes/matrixscroll`).
|
|
46
65
|
- [ ] New public API has a docstring and is re-exported from
|
|
47
66
|
`matrixscroll/__init__.py` if it's part of the supported surface.
|
|
48
67
|
- [ ] `CHANGELOG.md` updated with a dated version entry (see Keep a Changelog format).
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: matrixscroll
|
|
3
|
+
Version: 0.2.6
|
|
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
|
+
Project-URL: Homepage, https://matrixscroll.com
|
|
6
|
+
Project-URL: Documentation, https://matrixscroll.com/docs
|
|
7
|
+
Project-URL: Source, https://github.com/SSX360/matrixscroll
|
|
8
|
+
Project-URL: Issues, https://github.com/SSX360/matrixscroll/issues
|
|
9
|
+
Project-URL: Specification, https://github.com/SSX360/matrixscroll/blob/main/SPEC.md
|
|
10
|
+
Project-URL: Whitepaper, https://github.com/SSX360/matrixscroll/blob/main/docs/WHITEPAPER.md
|
|
11
|
+
Project-URL: Verifier, https://matrixscroll.com/verify
|
|
12
|
+
Project-URL: Compare, https://matrixscroll.com/compare
|
|
13
|
+
Project-URL: Changelog, https://github.com/SSX360/matrixscroll/blob/main/CHANGELOG.md
|
|
14
|
+
Project-URL: Discussions, https://github.com/SSX360/matrixscroll/discussions
|
|
15
|
+
Project-URL: Security, https://github.com/SSX360/matrixscroll/blob/main/SECURITY.md
|
|
16
|
+
Project-URL: GitHub Action, https://github.com/SSX360/matrixscroll-verify-action
|
|
17
|
+
Project-URL: PyPI Provenance, https://pypi.org/project/matrixscroll/
|
|
18
|
+
Project-URL: Tests, https://github.com/SSX360/matrixscroll/tree/main/tests
|
|
19
|
+
Project-URL: Public Roadmap, https://github.com/SSX360/matrixscroll/blob/main/docs/ROADMAP_2026-07.md
|
|
20
|
+
Project-URL: Reference Device, https://matrixscroll.com/device
|
|
21
|
+
Author-email: SSX360 <security@matrixscroll.com>
|
|
22
|
+
License-Expression: Apache-2.0
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Keywords: ai,ed25519,matrixscroll,provenance,root-of-trust,secure-element,signing,ssx360,supply-chain
|
|
25
|
+
Classifier: Development Status :: 4 - Beta
|
|
26
|
+
Classifier: Intended Audience :: Developers
|
|
27
|
+
Classifier: Intended Audience :: Information Technology
|
|
28
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
29
|
+
Classifier: Operating System :: OS Independent
|
|
30
|
+
Classifier: Programming Language :: Python :: 3
|
|
31
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
32
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
33
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
34
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
35
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
36
|
+
Classifier: Topic :: Security :: Cryptography
|
|
37
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
38
|
+
Classifier: Typing :: Typed
|
|
39
|
+
Requires-Python: >=3.10
|
|
40
|
+
Requires-Dist: cryptography>=41.0
|
|
41
|
+
Provides-Extra: dev
|
|
42
|
+
Requires-Dist: build>=1.0; extra == 'dev'
|
|
43
|
+
Requires-Dist: pytest>=7.4; extra == 'dev'
|
|
44
|
+
Provides-Extra: git
|
|
45
|
+
Provides-Extra: hardware
|
|
46
|
+
Requires-Dist: pyserial>=3.5; extra == 'hardware'
|
|
47
|
+
Provides-Extra: tpm
|
|
48
|
+
Provides-Extra: yubikey
|
|
49
|
+
Requires-Dist: python-pkcs11>=0.7; extra == 'yubikey'
|
|
50
|
+
Description-Content-Type: text/markdown
|
|
51
|
+
|
|
52
|
+
# Matrix Scroll
|
|
53
|
+
|
|
54
|
+
Signed provenance for agent-assisted Git commits with offline verification.
|
|
55
|
+
|
|
56
|
+
Matrix Scroll is a cryptographic evidence layer for Git. When an agent, CI
|
|
57
|
+
workflow, or human operator produces a commit, a signed commit envelope can
|
|
58
|
+
record the actor, tool, and optional bounded scope. Anyone can verify that
|
|
59
|
+
envelope locally, in CI, or in the browser without trusting the editor session
|
|
60
|
+
that produced it.
|
|
61
|
+
|
|
62
|
+
The reference SDK ships pure Ed25519 over canonical manifest bytes today. The
|
|
63
|
+
SSX360 / NXP SE050 path is the compatible next trust layer and remains a
|
|
64
|
+
preview path until device acceptance is complete.
|
|
65
|
+
|
|
66
|
+
## Honest limits
|
|
67
|
+
|
|
68
|
+
- Shipping now: PyPI `matrixscroll==0.2.6`, Git post-commit hooks,
|
|
69
|
+
`matrixscroll envelope-verify`, Scroll Gate PR verification, browser
|
|
70
|
+
verifier, the GitHub Action, and a USB CDC host transport preview for the
|
|
71
|
+
SE050 rollout path.
|
|
72
|
+
- In progress: RP2350 + SE050 firmware validation, external Ed25519-capable
|
|
73
|
+
hardware key backends, and transparency-log integrations.
|
|
74
|
+
- Not: IAM, sandboxing, prompt filtering, or an agent runtime.
|
|
75
|
+
|
|
76
|
+
## Quickstart
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
pip install "matrixscroll==0.2.6"
|
|
80
|
+
matrixscroll hook-install
|
|
81
|
+
|
|
82
|
+
export MATRIXSCROLL_ACTOR_TYPE=agent
|
|
83
|
+
export MATRIXSCROLL_TOOL=agent-runner
|
|
84
|
+
git commit -m "feat: agent-assisted change"
|
|
85
|
+
|
|
86
|
+
matrixscroll envelope-verify "$(git rev-parse HEAD)"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
See [`docs/quickstart-git.md`](docs/quickstart-git.md) and run
|
|
90
|
+
[`examples/demo/agent-commit-demo.sh`](examples/demo/agent-commit-demo.sh).
|
|
91
|
+
|
|
92
|
+
## CI verify
|
|
93
|
+
|
|
94
|
+
### Scroll Gate for a PR commit range
|
|
95
|
+
|
|
96
|
+
```yaml
|
|
97
|
+
- uses: actions/checkout@v4
|
|
98
|
+
with:
|
|
99
|
+
fetch-depth: 0
|
|
100
|
+
- uses: SSX360/matrixscroll-verify-action@v1
|
|
101
|
+
with:
|
|
102
|
+
head-ref: ${{ github.event.pull_request.head.sha }}
|
|
103
|
+
base-ref: ${{ github.event.pull_request.base.sha }}
|
|
104
|
+
source: notes
|
|
105
|
+
matrixscroll-version: "0.2.6"
|
|
106
|
+
require-mode: emulated
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Publish envelopes to git notes before review:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
matrixscroll envelope-publish-notes --base origin/main --head HEAD
|
|
113
|
+
git push origin refs/notes/matrixscroll
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```yaml
|
|
117
|
+
- uses: actions/checkout@v4
|
|
118
|
+
with:
|
|
119
|
+
fetch-depth: 0
|
|
120
|
+
- uses: SSX360/matrixscroll-verify-action@v1
|
|
121
|
+
with:
|
|
122
|
+
head-ref: ${{ github.event.pull_request.head.sha }}
|
|
123
|
+
base-ref: ${{ github.event.pull_request.base.sha }}
|
|
124
|
+
source: notes
|
|
125
|
+
matrixscroll-version: "0.2.6"
|
|
126
|
+
summary-output: provenance-summary.json
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
See [`docs/quickstart-git.md`](docs/quickstart-git.md) and
|
|
130
|
+
[`examples/ci/protected-branch.yml`](examples/ci/protected-branch.yml).
|
|
131
|
+
|
|
132
|
+
The `--require-mode`, `--trusted-keys`, and actor or delegation policy checks
|
|
133
|
+
are available in the `0.2.x` line; the examples in this README pin `0.2.6`.
|
|
134
|
+
|
|
135
|
+
## Why it is different from Sigstore
|
|
136
|
+
|
|
137
|
+
Sigstore, GitHub artifact attestations, and SLSA answer "what was built in
|
|
138
|
+
CI?" Matrix Scroll answers "who signed this commit before push?" The systems
|
|
139
|
+
are complementary: Matrix Scroll signs commit envelopes at commit time, while
|
|
140
|
+
artifact-attestation systems sign build outputs later in the delivery chain.
|
|
141
|
+
|
|
142
|
+
Matrix Scroll does not compete with general authentication keys on their home
|
|
143
|
+
field. Existing hardware roots can become Matrix Scroll signing backends only
|
|
144
|
+
when they preserve the same pure Ed25519 byte contract.
|
|
145
|
+
|
|
146
|
+
## Public proof links
|
|
147
|
+
|
|
148
|
+
- Browser verifier: <https://matrixscroll.com/verify/>
|
|
149
|
+
- Compare page: <https://matrixscroll.com/compare/>
|
|
150
|
+
- Specification: [`SPEC.md`](SPEC.md)
|
|
151
|
+
- Commit envelope schema: [`schemas/commit-envelope.v1.json`](schemas/commit-envelope.v1.json)
|
|
152
|
+
- Whitepaper: [`docs/WHITEPAPER.md`](docs/WHITEPAPER.md)
|
|
153
|
+
- Conformance vectors: [`vectors/`](vectors/)
|
|
154
|
+
- GitHub Action: <https://github.com/SSX360/matrixscroll-verify-action>
|
|
155
|
+
- Agentic AI controls: [`docs/AGENTIC_AI_SECURITY.md`](docs/AGENTIC_AI_SECURITY.md)
|
|
156
|
+
- Site: <https://matrixscroll.com>
|
|
157
|
+
- Reference device path: <https://matrixscroll.com/device/>
|
|
158
|
+
|
|
159
|
+
## Python API
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
pip install "matrixscroll==0.2.6"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
import matrixscroll
|
|
167
|
+
|
|
168
|
+
print(matrixscroll.status())
|
|
169
|
+
# {'schema': 'matrixscroll.identity.v1', 'available': True,
|
|
170
|
+
# 'mode': 'emulated', 'device_id': 'MS-A3F2-9C81', ...}
|
|
171
|
+
|
|
172
|
+
signed = matrixscroll.sign_manifest({"release": "v1.0.0", "artifacts": [...]})
|
|
173
|
+
|
|
174
|
+
assert matrixscroll.verify_manifest(signed)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## CLI
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
$ matrixscroll status
|
|
181
|
+
{
|
|
182
|
+
"available": true,
|
|
183
|
+
"device_id": "MS-A3F2-9C81",
|
|
184
|
+
"mode": "emulated",
|
|
185
|
+
"public_key": "...",
|
|
186
|
+
"schema": "matrixscroll.identity.v1"
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
$ matrixscroll sign release.json > release.signed.json
|
|
190
|
+
$ matrixscroll verify release.signed.json
|
|
191
|
+
{"device_id": "MS-A3F2-9C81", "mode": "emulated", "ok": true, "signed_at": "..."}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
`matrixscroll verify` exits `0` on a valid signature and `2` on failure
|
|
195
|
+
(tampered manifest, missing signature block, wrong schema or algorithm,
|
|
196
|
+
mismatched device ID, malformed public key, unreadable file).
|
|
197
|
+
|
|
198
|
+
## How it works
|
|
199
|
+
|
|
200
|
+
```text
|
|
201
|
+
your IDE / agent / CI
|
|
202
|
+
|
|
|
203
|
+
| commit envelope, release manifest, evidence pack, SBOM
|
|
204
|
+
v
|
|
205
|
+
matrixscroll.sign_manifest(...) / post-commit hook
|
|
206
|
+
|
|
|
207
|
+
| canonical JSON (sorted keys, ASCII-escaped, no NaN,
|
|
208
|
+
| signature block excluded from input)
|
|
209
|
+
v
|
|
210
|
+
IdentityProvider --> Ed25519 signature
|
|
211
|
+
(L1 emulated today,
|
|
212
|
+
SSX360 / SE050 roadmap)
|
|
213
|
+
|
|
|
214
|
+
v
|
|
215
|
+
signed document --> matrixscroll.verify_manifest(...)
|
|
216
|
+
(anyone, anywhere, offline)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Switch providers with `MATRIXSCROLL_MODE`. Hardware mode includes a USB CDC
|
|
220
|
+
host transport preview and a mock path for CI; real SE050 signing still
|
|
221
|
+
depends on device firmware validation. External-key backends stay out of the
|
|
222
|
+
mainline until they can sign the same canonical bytes with Ed25519.
|
|
223
|
+
|
|
224
|
+
## Compliance levels
|
|
225
|
+
|
|
226
|
+
| Level | Provider | Backed by | Status |
|
|
227
|
+
| ----- | -------- | --------- | ------ |
|
|
228
|
+
| **L1** Emulated | `EmulatedProvider` | Software key, file-backed (0600) | Shipping |
|
|
229
|
+
| **L2** Hardware | `HardwareProvider` | NXP SE050 secure element (SSX360) | In progress |
|
|
230
|
+
| **L3** Attested | future | L2 + remote attestation | Roadmap |
|
|
231
|
+
|
|
232
|
+
`status()` exposes the active level via the `mode` and `available` fields.
|
|
233
|
+
|
|
234
|
+
## Storage and trust boundaries
|
|
235
|
+
|
|
236
|
+
- Emulated key store: `~/.matrixscroll/device.json`
|
|
237
|
+
(override with `MATRIXSCROLL_HOME`).
|
|
238
|
+
- The directory is created `0700`; the seed file is opened `0600` with
|
|
239
|
+
`O_CREAT|O_EXCL` so the private seed is never momentarily world-readable.
|
|
240
|
+
- A corrupt or truncated store fails loud (`IdentityError`) rather than
|
|
241
|
+
silently minting a fresh identity.
|
|
242
|
+
- The planned hardware path holds nothing private on disk; the seed is sealed
|
|
243
|
+
in the secure element.
|
|
244
|
+
|
|
245
|
+
## Reference implementation, not the only one
|
|
246
|
+
|
|
247
|
+
Matrix Scroll is a protocol. This Python package is the reference. We welcome
|
|
248
|
+
implementations in Rust, Go, TypeScript, and embedded C. Run them against
|
|
249
|
+
[`vectors/`](vectors/) to self-certify. See `CONTRIBUTING.md`.
|
|
250
|
+
|
|
251
|
+
## Agentic AI guidance proof
|
|
252
|
+
|
|
253
|
+
The repo includes a machine-readable control matrix at
|
|
254
|
+
[`controls/agentic_ai_controls.json`](controls/agentic_ai_controls.json), an
|
|
255
|
+
example bounded-agent evidence manifest at
|
|
256
|
+
[`examples/agentic_ai_evidence_manifest.json`](examples/agentic_ai_evidence_manifest.json),
|
|
257
|
+
and executable checks in `tests/test_agentic_guidance.py`.
|
|
258
|
+
|
|
259
|
+
## License
|
|
260
|
+
|
|
261
|
+
- Code: **Apache-2.0** (`LICENSE`).
|
|
262
|
+
- Specification text (`SPEC.md`, `vectors/`): **CC0 1.0** - public domain.
|
|
263
|
+
|
|
264
|
+
## Security
|
|
265
|
+
|
|
266
|
+
See [`SECURITY.md`](SECURITY.md). Report vulnerabilities privately to
|
|
267
|
+
**security@matrixscroll.com** or via a GitHub Security Advisory.
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# Matrix Scroll
|
|
2
|
+
|
|
3
|
+
Signed provenance for agent-assisted Git commits with offline verification.
|
|
4
|
+
|
|
5
|
+
Matrix Scroll is a cryptographic evidence layer for Git. When an agent, CI
|
|
6
|
+
workflow, or human operator produces a commit, a signed commit envelope can
|
|
7
|
+
record the actor, tool, and optional bounded scope. Anyone can verify that
|
|
8
|
+
envelope locally, in CI, or in the browser without trusting the editor session
|
|
9
|
+
that produced it.
|
|
10
|
+
|
|
11
|
+
The reference SDK ships pure Ed25519 over canonical manifest bytes today. The
|
|
12
|
+
SSX360 / NXP SE050 path is the compatible next trust layer and remains a
|
|
13
|
+
preview path until device acceptance is complete.
|
|
14
|
+
|
|
15
|
+
## Honest limits
|
|
16
|
+
|
|
17
|
+
- Shipping now: PyPI `matrixscroll==0.2.6`, Git post-commit hooks,
|
|
18
|
+
`matrixscroll envelope-verify`, Scroll Gate PR verification, browser
|
|
19
|
+
verifier, the GitHub Action, and a USB CDC host transport preview for the
|
|
20
|
+
SE050 rollout path.
|
|
21
|
+
- In progress: RP2350 + SE050 firmware validation, external Ed25519-capable
|
|
22
|
+
hardware key backends, and transparency-log integrations.
|
|
23
|
+
- Not: IAM, sandboxing, prompt filtering, or an agent runtime.
|
|
24
|
+
|
|
25
|
+
## Quickstart
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install "matrixscroll==0.2.6"
|
|
29
|
+
matrixscroll hook-install
|
|
30
|
+
|
|
31
|
+
export MATRIXSCROLL_ACTOR_TYPE=agent
|
|
32
|
+
export MATRIXSCROLL_TOOL=agent-runner
|
|
33
|
+
git commit -m "feat: agent-assisted change"
|
|
34
|
+
|
|
35
|
+
matrixscroll envelope-verify "$(git rev-parse HEAD)"
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
See [`docs/quickstart-git.md`](docs/quickstart-git.md) and run
|
|
39
|
+
[`examples/demo/agent-commit-demo.sh`](examples/demo/agent-commit-demo.sh).
|
|
40
|
+
|
|
41
|
+
## CI verify
|
|
42
|
+
|
|
43
|
+
### Scroll Gate for a PR commit range
|
|
44
|
+
|
|
45
|
+
```yaml
|
|
46
|
+
- uses: actions/checkout@v4
|
|
47
|
+
with:
|
|
48
|
+
fetch-depth: 0
|
|
49
|
+
- uses: SSX360/matrixscroll-verify-action@v1
|
|
50
|
+
with:
|
|
51
|
+
head-ref: ${{ github.event.pull_request.head.sha }}
|
|
52
|
+
base-ref: ${{ github.event.pull_request.base.sha }}
|
|
53
|
+
source: notes
|
|
54
|
+
matrixscroll-version: "0.2.6"
|
|
55
|
+
require-mode: emulated
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Publish envelopes to git notes before review:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
matrixscroll envelope-publish-notes --base origin/main --head HEAD
|
|
62
|
+
git push origin refs/notes/matrixscroll
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```yaml
|
|
66
|
+
- uses: actions/checkout@v4
|
|
67
|
+
with:
|
|
68
|
+
fetch-depth: 0
|
|
69
|
+
- uses: SSX360/matrixscroll-verify-action@v1
|
|
70
|
+
with:
|
|
71
|
+
head-ref: ${{ github.event.pull_request.head.sha }}
|
|
72
|
+
base-ref: ${{ github.event.pull_request.base.sha }}
|
|
73
|
+
source: notes
|
|
74
|
+
matrixscroll-version: "0.2.6"
|
|
75
|
+
summary-output: provenance-summary.json
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
See [`docs/quickstart-git.md`](docs/quickstart-git.md) and
|
|
79
|
+
[`examples/ci/protected-branch.yml`](examples/ci/protected-branch.yml).
|
|
80
|
+
|
|
81
|
+
The `--require-mode`, `--trusted-keys`, and actor or delegation policy checks
|
|
82
|
+
are available in the `0.2.x` line; the examples in this README pin `0.2.6`.
|
|
83
|
+
|
|
84
|
+
## Why it is different from Sigstore
|
|
85
|
+
|
|
86
|
+
Sigstore, GitHub artifact attestations, and SLSA answer "what was built in
|
|
87
|
+
CI?" Matrix Scroll answers "who signed this commit before push?" The systems
|
|
88
|
+
are complementary: Matrix Scroll signs commit envelopes at commit time, while
|
|
89
|
+
artifact-attestation systems sign build outputs later in the delivery chain.
|
|
90
|
+
|
|
91
|
+
Matrix Scroll does not compete with general authentication keys on their home
|
|
92
|
+
field. Existing hardware roots can become Matrix Scroll signing backends only
|
|
93
|
+
when they preserve the same pure Ed25519 byte contract.
|
|
94
|
+
|
|
95
|
+
## Public proof links
|
|
96
|
+
|
|
97
|
+
- Browser verifier: <https://matrixscroll.com/verify/>
|
|
98
|
+
- Compare page: <https://matrixscroll.com/compare/>
|
|
99
|
+
- Specification: [`SPEC.md`](SPEC.md)
|
|
100
|
+
- Commit envelope schema: [`schemas/commit-envelope.v1.json`](schemas/commit-envelope.v1.json)
|
|
101
|
+
- Whitepaper: [`docs/WHITEPAPER.md`](docs/WHITEPAPER.md)
|
|
102
|
+
- Conformance vectors: [`vectors/`](vectors/)
|
|
103
|
+
- GitHub Action: <https://github.com/SSX360/matrixscroll-verify-action>
|
|
104
|
+
- Agentic AI controls: [`docs/AGENTIC_AI_SECURITY.md`](docs/AGENTIC_AI_SECURITY.md)
|
|
105
|
+
- Site: <https://matrixscroll.com>
|
|
106
|
+
- Reference device path: <https://matrixscroll.com/device/>
|
|
107
|
+
|
|
108
|
+
## Python API
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
pip install "matrixscroll==0.2.6"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
import matrixscroll
|
|
116
|
+
|
|
117
|
+
print(matrixscroll.status())
|
|
118
|
+
# {'schema': 'matrixscroll.identity.v1', 'available': True,
|
|
119
|
+
# 'mode': 'emulated', 'device_id': 'MS-A3F2-9C81', ...}
|
|
120
|
+
|
|
121
|
+
signed = matrixscroll.sign_manifest({"release": "v1.0.0", "artifacts": [...]})
|
|
122
|
+
|
|
123
|
+
assert matrixscroll.verify_manifest(signed)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## CLI
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
$ matrixscroll status
|
|
130
|
+
{
|
|
131
|
+
"available": true,
|
|
132
|
+
"device_id": "MS-A3F2-9C81",
|
|
133
|
+
"mode": "emulated",
|
|
134
|
+
"public_key": "...",
|
|
135
|
+
"schema": "matrixscroll.identity.v1"
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
$ matrixscroll sign release.json > release.signed.json
|
|
139
|
+
$ matrixscroll verify release.signed.json
|
|
140
|
+
{"device_id": "MS-A3F2-9C81", "mode": "emulated", "ok": true, "signed_at": "..."}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
`matrixscroll verify` exits `0` on a valid signature and `2` on failure
|
|
144
|
+
(tampered manifest, missing signature block, wrong schema or algorithm,
|
|
145
|
+
mismatched device ID, malformed public key, unreadable file).
|
|
146
|
+
|
|
147
|
+
## How it works
|
|
148
|
+
|
|
149
|
+
```text
|
|
150
|
+
your IDE / agent / CI
|
|
151
|
+
|
|
|
152
|
+
| commit envelope, release manifest, evidence pack, SBOM
|
|
153
|
+
v
|
|
154
|
+
matrixscroll.sign_manifest(...) / post-commit hook
|
|
155
|
+
|
|
|
156
|
+
| canonical JSON (sorted keys, ASCII-escaped, no NaN,
|
|
157
|
+
| signature block excluded from input)
|
|
158
|
+
v
|
|
159
|
+
IdentityProvider --> Ed25519 signature
|
|
160
|
+
(L1 emulated today,
|
|
161
|
+
SSX360 / SE050 roadmap)
|
|
162
|
+
|
|
|
163
|
+
v
|
|
164
|
+
signed document --> matrixscroll.verify_manifest(...)
|
|
165
|
+
(anyone, anywhere, offline)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Switch providers with `MATRIXSCROLL_MODE`. Hardware mode includes a USB CDC
|
|
169
|
+
host transport preview and a mock path for CI; real SE050 signing still
|
|
170
|
+
depends on device firmware validation. External-key backends stay out of the
|
|
171
|
+
mainline until they can sign the same canonical bytes with Ed25519.
|
|
172
|
+
|
|
173
|
+
## Compliance levels
|
|
174
|
+
|
|
175
|
+
| Level | Provider | Backed by | Status |
|
|
176
|
+
| ----- | -------- | --------- | ------ |
|
|
177
|
+
| **L1** Emulated | `EmulatedProvider` | Software key, file-backed (0600) | Shipping |
|
|
178
|
+
| **L2** Hardware | `HardwareProvider` | NXP SE050 secure element (SSX360) | In progress |
|
|
179
|
+
| **L3** Attested | future | L2 + remote attestation | Roadmap |
|
|
180
|
+
|
|
181
|
+
`status()` exposes the active level via the `mode` and `available` fields.
|
|
182
|
+
|
|
183
|
+
## Storage and trust boundaries
|
|
184
|
+
|
|
185
|
+
- Emulated key store: `~/.matrixscroll/device.json`
|
|
186
|
+
(override with `MATRIXSCROLL_HOME`).
|
|
187
|
+
- The directory is created `0700`; the seed file is opened `0600` with
|
|
188
|
+
`O_CREAT|O_EXCL` so the private seed is never momentarily world-readable.
|
|
189
|
+
- A corrupt or truncated store fails loud (`IdentityError`) rather than
|
|
190
|
+
silently minting a fresh identity.
|
|
191
|
+
- The planned hardware path holds nothing private on disk; the seed is sealed
|
|
192
|
+
in the secure element.
|
|
193
|
+
|
|
194
|
+
## Reference implementation, not the only one
|
|
195
|
+
|
|
196
|
+
Matrix Scroll is a protocol. This Python package is the reference. We welcome
|
|
197
|
+
implementations in Rust, Go, TypeScript, and embedded C. Run them against
|
|
198
|
+
[`vectors/`](vectors/) to self-certify. See `CONTRIBUTING.md`.
|
|
199
|
+
|
|
200
|
+
## Agentic AI guidance proof
|
|
201
|
+
|
|
202
|
+
The repo includes a machine-readable control matrix at
|
|
203
|
+
[`controls/agentic_ai_controls.json`](controls/agentic_ai_controls.json), an
|
|
204
|
+
example bounded-agent evidence manifest at
|
|
205
|
+
[`examples/agentic_ai_evidence_manifest.json`](examples/agentic_ai_evidence_manifest.json),
|
|
206
|
+
and executable checks in `tests/test_agentic_guidance.py`.
|
|
207
|
+
|
|
208
|
+
## License
|
|
209
|
+
|
|
210
|
+
- Code: **Apache-2.0** (`LICENSE`).
|
|
211
|
+
- Specification text (`SPEC.md`, `vectors/`): **CC0 1.0** - public domain.
|
|
212
|
+
|
|
213
|
+
## Security
|
|
214
|
+
|
|
215
|
+
See [`SECURITY.md`](SECURITY.md). Report vulnerabilities privately to
|
|
216
|
+
**security@matrixscroll.com** or via a GitHub Security Advisory.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Adopter Kit
|
|
2
|
+
|
|
3
|
+
This page is for OSS maintainers, platform teams, and design-partner engineers
|
|
4
|
+
who want to trial Matrix Scroll without changing their core workflow.
|
|
5
|
+
|
|
6
|
+
## Best first-fit teams
|
|
7
|
+
|
|
8
|
+
- OSS repos with active PR review and at least one protected branch
|
|
9
|
+
- platform or DevSecOps teams evaluating agent-assisted coding controls
|
|
10
|
+
- teams that already use GitHub Actions and can add one verification job
|
|
11
|
+
|
|
12
|
+
## 15-minute pilot
|
|
13
|
+
|
|
14
|
+
1. Install `matrixscroll==0.2.6` in one repo.
|
|
15
|
+
2. Run `matrixscroll hook-install`.
|
|
16
|
+
3. Make one agent-assisted commit and verify it locally.
|
|
17
|
+
4. Publish notes with `matrixscroll envelope-publish-notes`.
|
|
18
|
+
5. Add `SSX360/matrixscroll-verify-action@v1` to PR CI.
|
|
19
|
+
|
|
20
|
+
## Suggested evaluation workflow
|
|
21
|
+
|
|
22
|
+
```yaml
|
|
23
|
+
name: Verify PR commit envelopes
|
|
24
|
+
|
|
25
|
+
on:
|
|
26
|
+
pull_request:
|
|
27
|
+
types: [opened, synchronize, reopened]
|
|
28
|
+
|
|
29
|
+
jobs:
|
|
30
|
+
verify-provenance:
|
|
31
|
+
runs-on: ubuntu-latest
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v4
|
|
34
|
+
with:
|
|
35
|
+
fetch-depth: 0
|
|
36
|
+
- uses: SSX360/matrixscroll-verify-action@v1
|
|
37
|
+
with:
|
|
38
|
+
head-ref: ${{ github.event.pull_request.head.sha }}
|
|
39
|
+
base-ref: ${{ github.event.pull_request.base.sha }}
|
|
40
|
+
source: notes
|
|
41
|
+
matrixscroll-version: "0.2.6"
|
|
42
|
+
require-mode: emulated
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## What to collect during the pilot
|
|
46
|
+
|
|
47
|
+
- one passing local `envelope-verify`
|
|
48
|
+
- one passing PR range check
|
|
49
|
+
- one example of a failed verify after tampering or missing notes
|
|
50
|
+
- reviewer feedback on whether actor / tool attribution is useful
|
|
51
|
+
|
|
52
|
+
## Success criteria
|
|
53
|
+
|
|
54
|
+
- the team can explain the difference between commit-time and artifact-time proof
|
|
55
|
+
- the GitHub Action is understandable to the repo owner
|
|
56
|
+
- the team can point to one real decision that the envelope data improved
|
|
57
|
+
|
|
58
|
+
## What not to assume
|
|
59
|
+
|
|
60
|
+
- L1 emulated mode is not a hardware root of trust
|
|
61
|
+
- Matrix Scroll does not replace IAM or sandboxing
|
|
62
|
+
- Matrix Scroll does not replace release-signing or artifact attestations
|
|
63
|
+
|
|
64
|
+
## Public follow-through
|
|
65
|
+
|
|
66
|
+
If a pilot works, publish one of these:
|
|
67
|
+
|
|
68
|
+
- a short repo note describing the evaluation
|
|
69
|
+
- a screenshot of the passing GitHub Action
|
|
70
|
+
- a testimonial about why commit-time attribution mattered
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# CI hard gate — Scroll Gate Phase C
|
|
2
|
+
|
|
3
|
+
Enable required provenance on `SSX360/matrixscroll` after contributors can publish git notes.
|
|
4
|
+
|
|
5
|
+
## 1. Repository variable
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
gh variable set ENFORCE_PROVENANCE --body true --repo SSX360/matrixscroll
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
When set, [`verify-manifest.yml`](.github/workflows/verify-manifest.yml) **fails** PRs missing `refs/notes/matrixscroll` envelopes.
|
|
12
|
+
|
|
13
|
+
## 2. Branch protection
|
|
14
|
+
|
|
15
|
+
In GitHub → Settings → Branches → `main`:
|
|
16
|
+
|
|
17
|
+
- Require status check: **Verify Matrix Scroll manifest**
|
|
18
|
+
- Require branches up to date before merging
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
gh api repos/SSX360/matrixscroll/branches/main/protection \
|
|
22
|
+
--method PUT \
|
|
23
|
+
-f required_status_checks[strict]=true \
|
|
24
|
+
-f required_status_checks[checks][][context]='Verify Matrix Scroll manifest' \
|
|
25
|
+
-f enforce_admins=false \
|
|
26
|
+
-f required_pull_request_reviews[required_approving_review_count]=0
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Adjust review count to match your team policy.
|
|
30
|
+
|
|
31
|
+
## 3. Contributor flow
|
|
32
|
+
|
|
33
|
+
Every PR must:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
matrixscroll envelope-publish-notes --base origin/main --head HEAD
|
|
37
|
+
git push origin refs/notes/matrixscroll
|
|
38
|
+
matrixscroll envelope-verify-range --base origin/main --head HEAD --source notes
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
42
|
+
|
|
43
|
+
## Rollback
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gh variable set ENFORCE_PROVENANCE --body false --repo SSX360/matrixscroll
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Soft gate resumes (warning only in Step Summary).
|