matrixscroll 0.1.0__tar.gz → 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/CHANGELOG.md +14 -0
  2. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/CONTRIBUTING.md +2 -2
  3. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/PKG-INFO +16 -12
  4. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/README.md +14 -10
  5. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/controls/agentic_ai_controls.json +7 -5
  6. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/docs/AGENTIC_AI_SECURITY.md +8 -8
  7. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/matrixscroll/__init__.py +5 -4
  8. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/matrixscroll/_core.py +4 -4
  9. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/pyproject.toml +2 -2
  10. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/tests/test_agentic_guidance.py +3 -1
  11. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/tests/test_release_metadata.py +20 -1
  12. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/.gitignore +0 -0
  13. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/LICENSE +0 -0
  14. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/SECURITY.md +0 -0
  15. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/SPEC.md +0 -0
  16. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/examples/agentic_ai_evidence_manifest.json +0 -0
  17. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/matrixscroll/cli.py +0 -0
  18. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/matrixscroll/py.typed +0 -0
  19. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/tests/__init__.py +0 -0
  20. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/tests/test_cli.py +0 -0
  21. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/tests/test_core.py +0 -0
  22. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/tests/test_vectors.py +0 -0
  23. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/README.md +0 -0
  24. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/_fixture_key.json +0 -0
  25. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/_generate.py +0 -0
  26. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/tampered_algorithm.json +0 -0
  27. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/tampered_device_id.json +0 -0
  28. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/tampered_field.json +0 -0
  29. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/tampered_nested.json +0 -0
  30. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/tampered_public_key.json +0 -0
  31. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/tampered_schema.json +0 -0
  32. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/tampered_signature.json +0 -0
  33. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/unsigned_empty_block.json +0 -0
  34. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/unsigned_no_block.json +0 -0
  35. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/valid_nested.json +0 -0
  36. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/valid_simple.json +0 -0
  37. {matrixscroll-0.1.0 → matrixscroll-0.1.1}/vectors/valid_unicode.json +0 -0
@@ -4,6 +4,19 @@ 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.1.1] - 2026-06-19
8
+
9
+ Copy and citation hardening patch. No protocol or API changes.
10
+
11
+ ### Changed
12
+ - Clarified public README and package metadata: v0.1.x ships a software root of
13
+ trust; SSX360/NXP SE050 hardware signing is the compatible reference-device
14
+ path in progress.
15
+ - Replaced a direct PDF citation that may return `403` from some environments
16
+ with resolvable official agency pages for the joint agentic-AI guidance.
17
+ - Added regression checks so PyPI-facing metadata avoids over-strong hardware
18
+ availability claims.
19
+
7
20
  ## [0.1.0] - 2026-06-19
8
21
 
9
22
  Initial public release. Extracted from the SSX360 reference implementation.
@@ -31,4 +44,5 @@ Initial public release. Extracted from the SSX360 reference implementation.
31
44
  - Device id format: `MS-XXXX-XXXX` (SHA-256 of the raw public key, first 8 hex
32
45
  chars, uppercase).
33
46
 
47
+ [0.1.1]: https://github.com/SSX360/matrixscroll/releases/tag/v0.1.1
34
48
  [0.1.0]: https://github.com/SSX360/matrixscroll/releases/tag/v0.1.0
@@ -15,8 +15,8 @@ well-tested, spec-aware."
15
15
  - **No new runtime dependencies** without discussion in an issue first. The
16
16
  surface area of a cryptographic SDK should stay tight.
17
17
  - **Signed commits preferred.** Use `git config commit.gpgsign true` or an SSH
18
- signing key. Once the SSX360 device ships, hardware-signed commits are the
19
- preferred default.
18
+ signing key. Once the SSX360 device ships, hardware-backed commit signing is
19
+ the preferred default.
20
20
 
21
21
  ## Development setup
22
22
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: matrixscroll
3
- Version: 0.1.0
4
- Summary: Open protocol for hardware-signed AI-assisted code (Ed25519 root of trust, software emulator + SSX360 reference device).
3
+ Version: 0.1.1
4
+ Summary: Open protocol for signing AI-assisted code provenance with Ed25519; shipping software root of trust with SSX360 hardware support in progress.
5
5
  Project-URL: Homepage, https://matrixscroll.com
6
6
  Project-URL: Documentation, https://matrixscroll.com/docs
7
7
  Project-URL: Source, https://github.com/SSX360/matrixscroll
@@ -35,19 +35,21 @@ Description-Content-Type: text/markdown
35
35
 
36
36
  # Matrix Scroll
37
37
 
38
- **Open protocol for hardware-signed AI-assisted code.**
38
+ **Open protocol for signed AI-assisted code provenance.**
39
39
 
40
- Every AI-generated change in your IDE gets cryptographically signed by an
41
- Ed25519 key sealed in a hardware root of trust. Anyone can verify the result
42
- offline with a public key and one command.
40
+ Every AI-generated change in your IDE can be cryptographically signed by an
41
+ Ed25519 identity and verified offline with a public key and one command. The
42
+ v0.1.x reference implementation ships a well-tested software root of trust;
43
+ SSX360/NXP SE050 hardware signing is the compatible reference-device path in
44
+ progress.
43
45
 
44
46
  - 📜 **Spec:** [`SPEC.md`](SPEC.md) — wire format, canonical encoding, schemas.
45
47
  - 🛡 **Agentic AI controls:** [`docs/AGENTIC_AI_SECURITY.md`](docs/AGENTIC_AI_SECURITY.md)
46
48
  maps Matrix Scroll to the joint *Careful Adoption of Agentic AI Services* guidance.
47
- - 🔐 **Algorithm:** Ed25519 (RFC 8032). Keys never leave the provider.
49
+ - 🔐 **Algorithm:** Ed25519 (RFC 8032). Private keys are never exposed by the SDK API.
48
50
  - 🧪 **Conformance vectors:** [`vectors/`](vectors/) — for non-Python implementations.
49
51
  - 🌐 **Site:** <https://matrixscroll.com>
50
- - 🔧 **Reference device:** [SSX360](https://matrixscroll.com/device) (NXP SE050).
52
+ - 🔧 **Reference device:** [SSX360](https://matrixscroll.com/device) (NXP SE050 hardware path in progress).
51
53
 
52
54
  ```bash
53
55
  pip install matrixscroll
@@ -113,8 +115,10 @@ parsing the output.
113
115
  (anyone, anywhere, offline)
114
116
  ```
115
117
 
116
- The same Python API serves the local software emulator and the physical
117
- SSX360 device. Switch with the `MATRIXSCROLL_MODE` environment variable.
118
+ The same Python API is designed to serve the local software emulator and the
119
+ physical SSX360 device path. Switch with the `MATRIXSCROLL_MODE` environment
120
+ variable; in v0.1.x, `hardware` mode reports unavailable until the SE050
121
+ transport ships.
118
122
 
119
123
  ## Compliance levels
120
124
 
@@ -136,8 +140,8 @@ read-only dashboards can render before the hardware path is wired.
136
140
  a race cannot silently clobber an existing key store.
137
141
  - A corrupt or truncated store **fails loud** (`IdentityError`) rather than
138
142
  silently minting a fresh identity. Identity rotation is an explicit operation.
139
- - The hardware path holds nothing private on disk — the seed is sealed in the
140
- secure element.
143
+ - The planned hardware path holds nothing private on disk — the seed is sealed
144
+ in the secure element. In v0.1.x, this path is a typed availability stub.
141
145
 
142
146
  ## Reference implementation, not the only one
143
147
 
@@ -1,18 +1,20 @@
1
1
  # Matrix Scroll
2
2
 
3
- **Open protocol for hardware-signed AI-assisted code.**
3
+ **Open protocol for signed AI-assisted code provenance.**
4
4
 
5
- Every AI-generated change in your IDE gets cryptographically signed by an
6
- Ed25519 key sealed in a hardware root of trust. Anyone can verify the result
7
- offline with a public key and one command.
5
+ Every AI-generated change in your IDE can be cryptographically signed by an
6
+ Ed25519 identity and verified offline with a public key and one command. The
7
+ v0.1.x reference implementation ships a well-tested software root of trust;
8
+ SSX360/NXP SE050 hardware signing is the compatible reference-device path in
9
+ progress.
8
10
 
9
11
  - 📜 **Spec:** [`SPEC.md`](SPEC.md) — wire format, canonical encoding, schemas.
10
12
  - 🛡 **Agentic AI controls:** [`docs/AGENTIC_AI_SECURITY.md`](docs/AGENTIC_AI_SECURITY.md)
11
13
  maps Matrix Scroll to the joint *Careful Adoption of Agentic AI Services* guidance.
12
- - 🔐 **Algorithm:** Ed25519 (RFC 8032). Keys never leave the provider.
14
+ - 🔐 **Algorithm:** Ed25519 (RFC 8032). Private keys are never exposed by the SDK API.
13
15
  - 🧪 **Conformance vectors:** [`vectors/`](vectors/) — for non-Python implementations.
14
16
  - 🌐 **Site:** <https://matrixscroll.com>
15
- - 🔧 **Reference device:** [SSX360](https://matrixscroll.com/device) (NXP SE050).
17
+ - 🔧 **Reference device:** [SSX360](https://matrixscroll.com/device) (NXP SE050 hardware path in progress).
16
18
 
17
19
  ```bash
18
20
  pip install matrixscroll
@@ -78,8 +80,10 @@ parsing the output.
78
80
  (anyone, anywhere, offline)
79
81
  ```
80
82
 
81
- The same Python API serves the local software emulator and the physical
82
- SSX360 device. Switch with the `MATRIXSCROLL_MODE` environment variable.
83
+ The same Python API is designed to serve the local software emulator and the
84
+ physical SSX360 device path. Switch with the `MATRIXSCROLL_MODE` environment
85
+ variable; in v0.1.x, `hardware` mode reports unavailable until the SE050
86
+ transport ships.
83
87
 
84
88
  ## Compliance levels
85
89
 
@@ -101,8 +105,8 @@ read-only dashboards can render before the hardware path is wired.
101
105
  a race cannot silently clobber an existing key store.
102
106
  - A corrupt or truncated store **fails loud** (`IdentityError`) rather than
103
107
  silently minting a fresh identity. Identity rotation is an explicit operation.
104
- - The hardware path holds nothing private on disk — the seed is sealed in the
105
- secure element.
108
+ - The planned hardware path holds nothing private on disk — the seed is sealed
109
+ in the secure element. In v0.1.x, this path is a typed availability stub.
106
110
 
107
111
  ## Reference implementation, not the only one
108
112
 
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "schema": "matrixscroll.agentic_ai_controls.v1",
3
3
  "sources": [
4
- "https://media.defense.gov/2026/Apr/30/2003922823/-1/-1/0/CAREFUL%20ADOPTION%20OF%20AGENTIC%20AI%20SERVICES_FINAL.PDF",
4
+ "https://www.cyber.gov.au/business-government/secure-design/artificial-intelligence/careful-adoption-of-agentic-ai-services",
5
5
  "https://www.cisa.gov/resources-tools/resources/careful-adoption-agentic-ai-services",
6
+ "https://www.nsa.gov/aisc/",
7
+ "https://www.cyber.gc.ca/en/news-events/joint-guidance-careful-adoption-agentic-artificial-intelligence-services",
6
8
  "https://www.ncsc.govt.nz/protect-your-organisation/careful-adoption-of-agentic-ai-services/",
7
9
  "https://www.ncsc.gov.uk/blogs/thinking-carefully-before-adopting-agentic-ai"
8
10
  ],
@@ -13,7 +15,7 @@
13
15
  "guidance": "Adopt agentic AI incrementally; prefer tightly scoped pilots before connecting agents to real systems or sensitive data.",
14
16
  "matrixscroll_control": "Matrix Scroll signs bounded manifests rather than granting agents authority. The SDK records scope, task, reviewer, and policy fields as verifiable evidence.",
15
17
  "evidence_paths": ["examples/agentic_ai_evidence_manifest.json", "README.md"],
16
- "goes_beyond": "Hardware-rooted signatures make the boundary review portable and independently auditable."
18
+ "goes_beyond": "Signed boundary reviews are portable and independently auditable; the planned hardware path can bind them to a physical signer."
17
19
  },
18
20
  {
19
21
  "id": "AAI-02",
@@ -29,7 +31,7 @@
29
31
  "guidance": "Use temporary credentials where possible and revoke elevated access when work completes.",
30
32
  "matrixscroll_control": "Manifests can require short-lived credential metadata and explicitly avoid embedding secrets. Tests enforce redaction-sensitive fields stay unsigned as labels only.",
31
33
  "evidence_paths": ["SECURITY.md", "examples/agentic_ai_evidence_manifest.json"],
32
- "goes_beyond": "The signing key itself never appears as an application credential; hardware mode seals it in SSX360/SE050."
34
+ "goes_beyond": "The signing key itself never appears as an application credential; the planned hardware mode seals it in SSX360/SE050."
33
35
  },
34
36
  {
35
37
  "id": "AAI-04",
@@ -37,7 +39,7 @@
37
39
  "guidance": "Define who owns the agent, approves access, monitors behaviour, reviews incidents, and can stop it.",
38
40
  "matrixscroll_control": "Signed manifests carry owner, approver, reviewer, and break-glass contact fields as tamper-evident accountability evidence.",
39
41
  "evidence_paths": ["examples/agentic_ai_evidence_manifest.json", "docs/AGENTIC_AI_SECURITY.md"],
40
- "goes_beyond": "Approvals can be bound to a physical root of trust instead of a mutable log entry."
42
+ "goes_beyond": "Approvals can be bound to a signature instead of a mutable log entry; the planned hardware path can bind that signature to a physical root of trust."
41
43
  },
42
44
  {
43
45
  "id": "AAI-05",
@@ -83,7 +85,7 @@
83
85
  "id": "AAI-10",
84
86
  "title": "Strong authentication and non-repudiation",
85
87
  "guidance": "Use strong authentication and avoid relying on weak internal safeguards for agent authority.",
86
- "matrixscroll_control": "Ed25519 signatures bind agent evidence to a public key; hardware mode moves the private key into SSX360/SE050.",
88
+ "matrixscroll_control": "Ed25519 signatures bind agent evidence to a public key; the planned hardware mode moves the private key into SSX360/SE050.",
87
89
  "evidence_paths": ["SPEC.md", "matrixscroll/_core.py", "SECURITY.md"],
88
90
  "goes_beyond": "The private signing key is separated from agent runtime credentials and can be physically held or removed."
89
91
  },
@@ -4,13 +4,12 @@ This document maps Matrix Scroll to the joint guidance **Careful Adoption of
4
4
  Agentic AI Services** published by ASD's ACSC, CISA, NSA, the Canadian Centre
5
5
  for Cyber Security, NCSC-NZ, and NCSC-UK.
6
6
 
7
- Primary source:
8
-
9
- - <https://media.defense.gov/2026/Apr/30/2003922823/-1/-1/0/CAREFUL%20ADOPTION%20OF%20AGENTIC%20AI%20SERVICES_FINAL.PDF>
10
-
11
- Additional public mirrors/summaries used for traceability:
7
+ Official public sources verified for traceability:
12
8
 
9
+ - <https://www.cyber.gov.au/business-government/secure-design/artificial-intelligence/careful-adoption-of-agentic-ai-services>
13
10
  - <https://www.cisa.gov/resources-tools/resources/careful-adoption-agentic-ai-services>
11
+ - <https://www.nsa.gov/aisc/>
12
+ - <https://www.cyber.gc.ca/en/news-events/joint-guidance-careful-adoption-agentic-artificial-intelligence-services>
14
13
  - <https://www.ncsc.govt.nz/protect-your-organisation/careful-adoption-of-agentic-ai-services/>
15
14
  - <https://www.ncsc.gov.uk/blogs/thinking-carefully-before-adopting-agentic-ai>
16
15
 
@@ -40,7 +39,7 @@ The machine-readable control matrix lives at
40
39
  | AAI-07 | Monitoring and auditability | Signed manifests are portable audit records verifiable offline. |
41
40
  | AAI-08 | Incident response / kill switch | CI/CLI verification exits non-zero; manifests include escalation and shutdown metadata. |
42
41
  | AAI-09 | Supply-chain management | Minimal deps, Dependabot, CI build verification, and conformance vectors. |
43
- | AAI-10 | Strong authentication / non-repudiation | Ed25519 identity; SSX360 hardware mode keeps private keys out of agent runtimes. |
42
+ | AAI-10 | Strong authentication / non-repudiation | Ed25519 identity; the planned SSX360 hardware mode keeps private keys out of agent runtimes. |
44
43
  | AAI-11 | Governance and change control | CODEOWNERS + CI protect spec/core/vectors/security files. |
45
44
  | AAI-12 | Deception / prompt-injection resilience | Trust is verified after agent action; model text cannot forge signatures. |
46
45
 
@@ -51,8 +50,9 @@ Matrix Scroll adds a stronger evidence layer on top:
51
50
 
52
51
  1. **Offline verification** — auditors can verify a manifest without trusting
53
52
  Matrix Scroll servers, the original CI system, or the agent runtime.
54
- 2. **Hardware-rooted provenance** — SSX360 L2 mode moves the signing key into a
55
- secure element so the agent cannot exfiltrate it as a normal credential.
53
+ 2. **Hardware-rooted provenance path** — the SSX360 L2 design moves the signing
54
+ key into a secure element so the agent cannot exfiltrate it as a normal
55
+ credential. In v0.1.x, this is a typed provider path awaiting SE050 transport.
56
56
  3. **Fail-closed policy gates** — the CLI returns exit `2` for tampered,
57
57
  unsigned, malformed, wrong-schema, wrong-algorithm, or wrong-device-id input.
58
58
  4. **Executable conformance** — `vectors/` lets third-party implementations
@@ -1,9 +1,10 @@
1
- """Matrix Scroll — open protocol for hardware-signed AI-assisted code.
1
+ """Matrix Scroll — open protocol for signed AI-assisted code provenance.
2
2
 
3
3
  This package is the Python reference implementation of the Matrix Scroll
4
4
  protocol. It exposes an Ed25519 root-of-trust abstraction with a software
5
- emulator (default) and a hardware provider stub for the SSX360 reference
6
- device (NXP SE050). Private keys never leave the provider.
5
+ emulator (default) and a typed hardware-provider path for the SSX360 reference
6
+ device (NXP SE050). In v0.1.x, hardware mode reports unavailable until the
7
+ SE050 transport ships. Private keys are never exposed by the SDK API.
7
8
 
8
9
  Quickstart:
9
10
 
@@ -37,7 +38,7 @@ from ._core import (
37
38
  verify_manifest,
38
39
  )
39
40
 
40
- __version__ = "0.1.0"
41
+ __version__ = "0.1.1"
41
42
 
42
43
  __all__ = [
43
44
  "ALGORITHM",
@@ -5,14 +5,14 @@ The same API serves the local emulator today and the physical NXP SE050 device
5
5
  later, selected via the MATRIXSCROLL_MODE environment variable.
6
6
 
7
7
  Security contract:
8
- - Private keys never leave the provider. Public callers only ever see the
9
- public key, the derived device id, and signatures.
8
+ - Private keys are never exposed by the SDK API. Public callers only ever see
9
+ the public key, the derived device id, and signatures.
10
10
  - In emulated mode the private seed is stored locally under
11
11
  ~/.matrixscroll/device.json. The directory is created 0700 and the file is
12
12
  opened 0600 at creation time (never write-then-chmod), so the seed is never
13
13
  momentarily world-readable. A corrupt store fails loud rather than silently
14
- re-minting identity. On real hardware the seed is sealed in the secure
15
- element and this file holds only public material.
14
+ re-minting identity. In the planned hardware path the seed is sealed in the
15
+ secure element and this file holds only public material.
16
16
  """
17
17
 
18
18
  from __future__ import annotations
@@ -4,8 +4,8 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "matrixscroll"
7
- version = "0.1.0"
8
- description = "Open protocol for hardware-signed AI-assisted code (Ed25519 root of trust, software emulator + SSX360 reference device)."
7
+ version = "0.1.1"
8
+ description = "Open protocol for signing AI-assisted code provenance with Ed25519; shipping software root of trust with SSX360 hardware support in progress."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
11
11
  license = "Apache-2.0"
@@ -29,8 +29,10 @@ class AgenticGuidanceControlMatrixTests(unittest.TestCase):
29
29
  def test_control_matrix_has_expected_schema_and_sources(self):
30
30
  self.assertEqual(self.matrix["schema"], "matrixscroll.agentic_ai_controls.v1")
31
31
  self.assertGreaterEqual(len(self.matrix["sources"]), 4)
32
- self.assertTrue(any("media.defense.gov" in src for src in self.matrix["sources"]))
32
+ self.assertTrue(any("cyber.gov.au" in src for src in self.matrix["sources"]))
33
33
  self.assertTrue(any("cisa.gov" in src for src in self.matrix["sources"]))
34
+ self.assertTrue(any("nsa.gov" in src for src in self.matrix["sources"]))
35
+ self.assertTrue(any("cyber.gc.ca" in src for src in self.matrix["sources"]))
34
36
  self.assertTrue(any("ncsc.gov" in src for src in self.matrix["sources"]))
35
37
 
36
38
  def test_every_control_has_required_fields_and_repo_evidence(self):
@@ -18,4 +18,23 @@ def test_sdk_public_docs_do_not_link_vercel_preview_urls():
18
18
  checked = [ROOT / "README.md", ROOT / "pyproject.toml", ROOT / "SPEC.md"]
19
19
  for path in checked:
20
20
  text = path.read_text(encoding="utf-8")
21
- assert "vercel.app" not in text, path.name
21
+ assert "vercel.app" not in text, path.name
22
+
23
+
24
+ def test_pypi_metadata_does_not_overclaim_hardware_availability():
25
+ checked = [
26
+ ROOT / "README.md",
27
+ ROOT / "CONTRIBUTING.md",
28
+ ROOT / "pyproject.toml",
29
+ ROOT / "matrixscroll" / "__init__.py",
30
+ ROOT / "matrixscroll" / "_core.py",
31
+ ]
32
+ forbidden = [
33
+ "hardware-signed",
34
+ "sealed in a hardware root",
35
+ "keys never leave the provider",
36
+ ]
37
+ for path in checked:
38
+ text = path.read_text(encoding="utf-8").lower()
39
+ for phrase in forbidden:
40
+ assert phrase not in text, f"{phrase!r} found in {path.name}"
File without changes
File without changes
File without changes
File without changes