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