gpu-seal 0.1.0a0__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 (60) hide show
  1. gpu_seal-0.1.0a0/LICENSE +202 -0
  2. gpu_seal-0.1.0a0/PKG-INFO +400 -0
  3. gpu_seal-0.1.0a0/README.md +371 -0
  4. gpu_seal-0.1.0a0/probe/gpu_seal/__init__.py +8 -0
  5. gpu_seal-0.1.0a0/probe/gpu_seal/__main__.py +4 -0
  6. gpu_seal-0.1.0a0/probe/gpu_seal/analysis/__init__.py +40 -0
  7. gpu_seal-0.1.0a0/probe/gpu_seal/analysis/separability.py +310 -0
  8. gpu_seal-0.1.0a0/probe/gpu_seal/analysis/statistics.py +170 -0
  9. gpu_seal-0.1.0a0/probe/gpu_seal/cli.py +213 -0
  10. gpu_seal-0.1.0a0/probe/gpu_seal/controller/__init__.py +100 -0
  11. gpu_seal-0.1.0a0/probe/gpu_seal/controller/budget.py +263 -0
  12. gpu_seal-0.1.0a0/probe/gpu_seal/controller/disclosure.py +218 -0
  13. gpu_seal-0.1.0a0/probe/gpu_seal/controller/evidence_store.py +279 -0
  14. gpu_seal-0.1.0a0/probe/gpu_seal/controller/fake_runtime.py +103 -0
  15. gpu_seal-0.1.0a0/probe/gpu_seal/controller/native_runner.py +362 -0
  16. gpu_seal-0.1.0a0/probe/gpu_seal/controller/orchestrator.py +217 -0
  17. gpu_seal-0.1.0a0/probe/gpu_seal/controller/policy_matrix.py +270 -0
  18. gpu_seal-0.1.0a0/probe/gpu_seal/controller/scheduler.py +273 -0
  19. gpu_seal-0.1.0a0/probe/gpu_seal/cuda/__init__.py +34 -0
  20. gpu_seal-0.1.0a0/probe/gpu_seal/cuda/backend.py +660 -0
  21. gpu_seal-0.1.0a0/probe/gpu_seal/cuda/nvml.py +190 -0
  22. gpu_seal-0.1.0a0/probe/gpu_seal/evidence/__init__.py +32 -0
  23. gpu_seal-0.1.0a0/probe/gpu_seal/evidence/observation.py +181 -0
  24. gpu_seal-0.1.0a0/probe/gpu_seal/evidence/result.py +386 -0
  25. gpu_seal-0.1.0a0/probe/gpu_seal/evidence/signing.py +275 -0
  26. gpu_seal-0.1.0a0/probe/gpu_seal/probes/__init__.py +127 -0
  27. gpu_seal-0.1.0a0/probe/gpu_seal/probes/allocation_model.py +554 -0
  28. gpu_seal-0.1.0a0/probe/gpu_seal/probes/attestation.py +407 -0
  29. gpu_seal-0.1.0a0/probe/gpu_seal/probes/device_exposure.py +596 -0
  30. gpu_seal-0.1.0a0/probe/gpu_seal/probes/environment.py +414 -0
  31. gpu_seal-0.1.0a0/probe/gpu_seal/probes/framework_allocator.py +218 -0
  32. gpu_seal-0.1.0a0/probe/gpu_seal/probes/location.py +275 -0
  33. gpu_seal-0.1.0a0/probe/gpu_seal/probes/memory_global.py +423 -0
  34. gpu_seal-0.1.0a0/probe/gpu_seal/probes/memory_local.py +294 -0
  35. gpu_seal-0.1.0a0/probe/gpu_seal/probes/mig_temporal.py +395 -0
  36. gpu_seal-0.1.0a0/probe/gpu_seal/probes/self_canary.py +296 -0
  37. gpu_seal-0.1.0a0/probe/gpu_seal/probes/topology.py +656 -0
  38. gpu_seal-0.1.0a0/probe/gpu_seal/reporting/__init__.py +33 -0
  39. gpu_seal-0.1.0a0/probe/gpu_seal/reporting/report_card.py +622 -0
  40. gpu_seal-0.1.0a0/probe/gpu_seal/resources.py +35 -0
  41. gpu_seal-0.1.0a0/probe/gpu_seal/safety/__init__.py +60 -0
  42. gpu_seal-0.1.0a0/probe/gpu_seal/safety/aggregation.py +573 -0
  43. gpu_seal-0.1.0a0/probe/gpu_seal/safety/buffer.py +332 -0
  44. gpu_seal-0.1.0a0/probe/gpu_seal/safety/campaign.py +88 -0
  45. gpu_seal-0.1.0a0/probe/gpu_seal/safety/canary.py +475 -0
  46. gpu_seal-0.1.0a0/probe/gpu_seal/safety/errors.py +127 -0
  47. gpu_seal-0.1.0a0/probe/gpu_seal/safety/metadata.py +98 -0
  48. gpu_seal-0.1.0a0/probe/gpu_seal/safety/policy.py +303 -0
  49. gpu_seal-0.1.0a0/probe/gpu_seal/schemas/experiment.schema.json +181 -0
  50. gpu_seal-0.1.0a0/probe/gpu_seal/schemas/provider-policy.schema.json +106 -0
  51. gpu_seal-0.1.0a0/probe/gpu_seal/schemas/report-card.schema.json +84 -0
  52. gpu_seal-0.1.0a0/probe/gpu_seal/schemas/result.schema.json +360 -0
  53. gpu_seal-0.1.0a0/probe/gpu_seal.egg-info/PKG-INFO +400 -0
  54. gpu_seal-0.1.0a0/probe/gpu_seal.egg-info/SOURCES.txt +58 -0
  55. gpu_seal-0.1.0a0/probe/gpu_seal.egg-info/dependency_links.txt +1 -0
  56. gpu_seal-0.1.0a0/probe/gpu_seal.egg-info/entry_points.txt +2 -0
  57. gpu_seal-0.1.0a0/probe/gpu_seal.egg-info/requires.txt +17 -0
  58. gpu_seal-0.1.0a0/probe/gpu_seal.egg-info/top_level.txt +1 -0
  59. gpu_seal-0.1.0a0/pyproject.toml +119 -0
  60. gpu_seal-0.1.0a0/setup.cfg +4 -0
@@ -0,0 +1,202 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
@@ -0,0 +1,400 @@
1
+ Metadata-Version: 2.4
2
+ Name: gpu-seal
3
+ Version: 0.1.0a0
4
+ Summary: Tenant-Observable Security and Isolation Assurance for GPU Clouds
5
+ License-Expression: Apache-2.0
6
+ Keywords: gpu,cloud,security,isolation,attestation,measurement
7
+ Classifier: Development Status :: 2 - Pre-Alpha
8
+ Classifier: Intended Audience :: Science/Research
9
+ Classifier: Topic :: Security
10
+ Requires-Python: >=3.10
11
+ Description-Content-Type: text/markdown
12
+ License-File: LICENSE
13
+ Requires-Dist: cryptography>=42
14
+ Requires-Dist: numpy<3,>=1.24
15
+ Requires-Dist: jsonschema>=4
16
+ Provides-Extra: dev
17
+ Requires-Dist: build>=1.2; extra == "dev"
18
+ Requires-Dist: mypy>=1.10; extra == "dev"
19
+ Requires-Dist: pytest>=8; extra == "dev"
20
+ Requires-Dist: pytest-cov>=5; extra == "dev"
21
+ Requires-Dist: ruff<0.17,>=0.16; extra == "dev"
22
+ Requires-Dist: types-jsonschema>=4.24; extra == "dev"
23
+ Provides-Extra: cuda
24
+ Requires-Dist: cupy-cuda12x>=13; extra == "cuda"
25
+ Requires-Dist: nvidia-cuda-nvrtc-cu12; extra == "cuda"
26
+ Requires-Dist: nvidia-cuda-runtime-cu12; extra == "cuda"
27
+ Requires-Dist: nvidia-cuda-nvcc-cu12; extra == "cuda"
28
+ Dynamic: license-file
29
+
30
+ # GPU-SEAL
31
+
32
+ *Internal codename: GHOSTMETER*
33
+
34
+ > Measures the GPU you rented, using only ordinary customer privileges, under
35
+ > a strict canary-only data policy. An assurance and measurement framework —
36
+ > **not** an exploitation toolkit.
37
+
38
+ [![status](https://img.shields.io/badge/status-pre--alpha%20(Phase%200%E2%80%931)-orange)]()
39
+ [![mutations caught](https://img.shields.io/badge/injected%20violations%20caught-38%2F38-brightgreen)]()
40
+ [![licence](https://img.shields.io/badge/licence-Apache--2.0-blue)]()
41
+
42
+ Repository: <https://github.com/KubixDesiney/gpu-seal> · Current measured
43
+ status: [`docs/STATUS.md`](docs/STATUS.md)
44
+
45
+ **GPU-SEAL is a tenant-side, canary-only framework that lets GPU-cloud
46
+ customers independently measure memory sanitisation, hardware consistency,
47
+ and isolation controls without accessing other tenants’ data.**
48
+
49
+ **Primary audience:** security engineers and GPU-cloud decision-makers.
50
+ **Secondary audience:** academic and independent security reviewers.
51
+
52
+ New to the project, or looking for a specific role's path through the docs
53
+ (engineer, security reviewer, academic reviewer, operator)? Start at the
54
+ [documentation index](docs/INDEX.md).
55
+
56
+ ---
57
+
58
+ ## The problem
59
+
60
+ A GPU-cloud tenant pays for a clean chip, a specific model, a specific
61
+ region, and isolation from other tenants — and receives an invoice, not
62
+ evidence. Nothing in that commercial relationship lets the customer check any
63
+ of those claims from where they're actually sitting: inside the rented
64
+ instance, with no special access.
65
+
66
+ The gap is not hypothetical. NVIDIA's own CUDA documentation states that
67
+ memory returned by `cudaMalloc`, `cuMemAlloc`, `cudaMallocManaged`, and
68
+ `cuMemAllocManaged` **"is not cleared,"** and NVIDIA ships an administrative
69
+ `--clear-memory` tool precisely because clearing isn't the default.
70
+ Confidential Computing scrubs memory at Function Level Reset, not within a
71
+ session. MIG's documentation covers *runtime* isolation in detail and says
72
+ nothing about what happens when an instance is destroyed and handed to the
73
+ next tenant.
74
+
75
+ Nobody measures any of this in the wild, across providers, from the tenant's
76
+ own seat. That's the gap GPU-SEAL targets: turning "everyone knows GPUs might
77
+ leak" into a reproducible, signed, per-provider dataset — or into evidence
78
+ that they don't.
79
+
80
+ ## What it measures
81
+
82
+ Thirteen probe families ([`CHARTER.md`](CHARTER.md) §9):
83
+
84
+ - **Memory residue** — device-global VRAM and shared memory, read before any
85
+ write of our own
86
+ - **Detection-capability control** — a framework-level allocator canary that
87
+ proves the probe *can* recover a marker when one exists, independent of
88
+ what the driver does
89
+ - **Isolation & exposure** — device/namespace visibility, allocation-model
90
+ classification (dedicated vs. shared vs. time-sliced), MIG temporal
91
+ isolation
92
+ - **Hardware identity** — a topology fingerprint, reproduced from external
93
+ published research, checked for consistency with an advertised chip class
94
+ - **Location & attestation** — coarse network-location consistency,
95
+ confidential-computing attestation and channel binding
96
+
97
+ Every measurement leaves the probe as a signed, schema-validated JSON
98
+ bundle — never as raw memory.
99
+
100
+ ## What it absolutely does not do
101
+
102
+ GPU-SEAL will never: exploit a provider, escape a VM or container, access
103
+ the host OS, circumvent authentication or billing, read another tenant's
104
+ files, processes, traffic, or data, recover natural-language text from
105
+ memory it didn't write, classify unknown memory content, retain raw unknown
106
+ VRAM, attempt Rowhammer / privilege escalation / denial of service, or
107
+ publish an uncoordinated accusation.
108
+
109
+ It searches only for cryptographic canaries it minted itself — there is no
110
+ API that accepts a caller-supplied search pattern, and static analysis
111
+ (`tests/safety/test_static_analysis.py`) rejects source that tries. Full
112
+ policy, with an enforcement point named for every rule: [`ETHICS.md`](ETHICS.md).
113
+
114
+ ---
115
+
116
+ ## Current status
117
+
118
+ No provider measurement study has been run or validated. The current checkout
119
+ has a green local Python contract and a real local RTX 3050 smoke result, but
120
+ it is not a provider result and is not a release candidate. The policy matrix
121
+ has two complete records and two records awaiting written permission. Ethics
122
+ sign-off, Linux/MIG/H100/same-model validation, and owner decisions remain
123
+ open. See the dated [status snapshot](docs/STATUS.md) for the measured counts
124
+ and exact gate outcomes.
125
+
126
+ ---
127
+
128
+ ## Quickstarts
129
+
130
+ The commands below separate software verification, simulated runs, and real
131
+ CUDA observations. A simulated result is a test fixture: it is always marked
132
+ `backend_is_real=false` and cannot be published as hardware or provider
133
+ evidence.
134
+
135
+ ### Linux or WSL2
136
+
137
+ From a Bash shell in a fresh checkout:
138
+
139
+ ```bash
140
+ git clone https://github.com/KubixDesiney/gpu-seal.git
141
+ cd gpu-seal
142
+ python3 -m venv .venv
143
+ . .venv/bin/activate
144
+ python -m pip install --no-build-isolation -e ".[dev]"
145
+ python -m pytest tests -q
146
+ python lab/check-provider-policy.py
147
+ python lab/local-runner/smoke.py
148
+ ```
149
+
150
+ Validation note for this snapshot: the PowerShell quickstart and Git Bash
151
+ negative control were run on Windows. WSL2 was unavailable in the managed
152
+ session (`E_ACCESSDENIED`), so Linux/WSL2 hardware evidence still needs a
153
+ supported Linux or WSL2 host run.
154
+
155
+ For the safety negative control, use a working Bash installation:
156
+
157
+ ```bash
158
+ PYTHON_BIN="$(command -v python)" bash lab/verify-safety-suite.sh
159
+ ```
160
+
161
+ Real CUDA work in WSL2 additionally requires the Windows NVIDIA driver, WSL2
162
+ GPU integration, Docker Desktop WSL integration if using containers, and the
163
+ NVIDIA Container Toolkit. Do not install a Linux NVIDIA driver inside WSL2.
164
+ The full container setup is in [`lab/docker/README.md`](lab/docker/README.md).
165
+
166
+ ### Windows PowerShell
167
+
168
+ From the repository root, use Python 3.10 or newer in an isolated environment:
169
+
170
+ ```powershell
171
+ python -m venv .venv
172
+ .\.venv\Scripts\Activate.ps1
173
+ python -m pip install --no-build-isolation -e ".[dev]"
174
+ python -m pytest tests -q
175
+ python lab/check-provider-policy.py
176
+ python lab/local-runner/smoke.py
177
+ ```
178
+
179
+ The safety battery needs Bash. Run it from WSL2 or Git Bash with the Python
180
+ interpreter selected for that shell. PowerShell itself is sufficient for the
181
+ unit/safety suite, the policy check, simulated runs, and the local smoke check.
182
+
183
+ For a real CUDA backend on bare metal, install the CUDA extra as well:
184
+
185
+ ```powershell
186
+ python -m pip install --no-build-isolation -e ".[dev,cuda]"
187
+ ```
188
+
189
+ The `cuda` extra provides CuPy and the Python CUDA runtime/compiler components
190
+ used by the probes. Native compilation still requires a compatible CUDA
191
+ toolkit/compiler or the pinned CUDA container; the extra does not establish
192
+ native conformance.
193
+
194
+ ### First successful verification
195
+
196
+ 1. Run `python -m pytest tests -q`; the checkout measured 430 passed as of the
197
+ 2026-09-11 run recorded in [`docs/STATUS.md`](docs/STATUS.md).
198
+ 2. Run `python lab/check-provider-policy.py`; expect 2 complete, 2 awaiting,
199
+ and `GATE: lifted`. This does not authorize all providers.
200
+ 3. Run `python lab/local-runner/run_phase1.py --simulate --size-mib 1
201
+ --cycles 2 --unsafe-development-ephemeral --out ./out-simulated`; expect
202
+ exit 0 and a non-publishable result with `backend_is_real=false`. For any
203
+ provenance-suitable bundle, replace the explicit development flag with
204
+ `--signing-key <caller-supplied-ed25519.pem>`.
205
+ 4. Run `python lab/local-runner/smoke.py`. Only a `CupyBackend` report with
206
+ `backend_is_real=true` is a real local CUDA observation; it is still not
207
+ provider validation.
208
+
209
+ To verify a signed bundle, obtain the expected public key through an
210
+ independent trusted channel and use the CLI with that external key:
211
+
212
+ ```bash
213
+ gpu-seal verify ./out/<run-id>.result.json --public-key ./trusted-ed25519.pem
214
+ ```
215
+
216
+ See [`docs/TRUST-MODEL.md`](docs/TRUST-MODEL.md) for the distinction between
217
+ dashboard inspection and cryptographic verification. A non-pinned local run
218
+ does not satisfy the publication provenance gate; use the pinned CUDA image
219
+ for evidence intended for publication.
220
+
221
+ The repository-owned campaign harness is also available without a provider:
222
+
223
+ ```bash
224
+ python -m gpu_seal campaign run \
225
+ --ownership-confirmation "local deterministic validation" \
226
+ --confirmed-by researcher \
227
+ --unsafe-development-ephemeral
228
+ ```
229
+
230
+ This command uses only the deterministic fake runtime. It exercises campaign
231
+ sequencing, timeouts, cleanup reconciliation, and signed storage; it does not
232
+ contact a provider or produce hardware evidence. The provider adapter boundary
233
+ and its owner inputs are documented in [`docs/PROVIDER-ADAPTER.md`](docs/PROVIDER-ADAPTER.md).
234
+
235
+ ---
236
+
237
+ ## Example output (trimmed)
238
+
239
+ ```json
240
+ {
241
+ "provider_code": "local-lab",
242
+ "product_claim": "NVIDIA GeForce RTX 3050 Laptop GPU",
243
+ "probes": [
244
+ {
245
+ "probe_name": "framework_allocator_reuse",
246
+ "measurement_path": "framework_pooled",
247
+ "zero_fraction": 0.9999748,
248
+ "owned_canary_match": true,
249
+ "owned_canary_exact_matches": 8
250
+ },
251
+ {
252
+ "probe_name": "memory_global_read_before_write",
253
+ "measurement_path": "driver_direct",
254
+ "zero_fraction": 1.0,
255
+ "owned_canary_match": false,
256
+ "owned_canary_exact_matches": 0
257
+ }
258
+ ],
259
+ "report_card": {
260
+ "note": "Independent category grades, no composite score. U means unproven, not failing.",
261
+ "memory_lifecycle_hygiene": {
262
+ "grade": "U",
263
+ "basis": "No canaries recovered, but same-model die separation (§9.8b) is not yet validated — a clean result cannot distinguish sanitisation from a different physical chip."
264
+ },
265
+ "hardware_claim_consistency": {
266
+ "grade": "A",
267
+ "basis": "Topology certificate strongly consistent with the advertised class."
268
+ },
269
+ "allocation_model_transparency": {
270
+ "grade": "C",
271
+ "basis": "Undocumented by the provider; inferred as time_sliced_full_gpu at confidence 0.80."
272
+ }
273
+ },
274
+ "safety": {
275
+ "raw_unknown_memory_retained": false,
276
+ "unknown_memory_rendered": false,
277
+ "canary_only_search": true
278
+ }
279
+ }
280
+ ```
281
+
282
+ `memory_lifecycle_hygiene` grading **U** next to `hardware_claim_consistency`
283
+ grading **A**, in the same bundle, is intentional: grades are independent per
284
+ category, and **U means the evidence doesn't support a claim yet — not that
285
+ anything failed.** Real, untrimmed bundle:
286
+ [`examples/sample-safe-result.json`](examples/sample-safe-result.json).
287
+
288
+ ---
289
+
290
+ ## Architecture
291
+
292
+ ```
293
+ rented GPU instance
294
+
295
+
296
+ ┌────────────────────────────┐
297
+ │ Controller │ provider allowlist · ownership attestation
298
+ │ gpu_seal.controller │ duration ceiling · budget · disclosure gate
299
+ └──────────────┬─────────────┘
300
+ │ deploys
301
+
302
+ ┌────────────────────────────┐
303
+ │ Probe agent │ 13 families, §9.1–§9.12
304
+ │ gpu_seal.probes │
305
+ └──────────────┬─────────────┘
306
+ │ all unknown memory passes through here
307
+
308
+ ┌────────────────────────────┐
309
+ │ Enforced-safe layer │ SafeBuffer: fill_via() is the only write
310
+ │ gpu_seal.safety │ door, aggregate() the only read door
311
+ └──────────────┬─────────────┘
312
+ │ allowlisted statistics only
313
+
314
+ ┌────────────────────────────┐
315
+ │ Signed evidence bundle │ Ed25519 + SHA-256, schema-validated,
316
+ │ gpu_seal.evidence │ report card, no composite score
317
+ └────────────────────────────┘
318
+ ```
319
+
320
+ Full component map and the reasoning behind each boundary:
321
+ [`docs/architecture.md`](docs/architecture.md).
322
+
323
+ ---
324
+
325
+ ## Roadmap — CHARTER.md §17
326
+
327
+ - [x] Wk 1–2 Foundation — threat model, ethics/disclosure policy, schemas,
328
+ prior-art sweep
329
+ - [x] Wk 3–4 Local probe core — built, run on real silicon, §9.4 control
330
+ validated
331
+ - [x] Wk 5–6 Exposure & container tests — §9.1 / §9.6 running, NVML wired in
332
+ - [x] Wk 7–8 Topology + allocation classifier — §9.8 reproduced on silicon,
333
+ §9.7 classifier built
334
+ - [ ] Wk 9–10 Provider pilot — blocked on ethics approval, provider
335
+ permissions, pinned native conformance, and owner launch decisions
336
+ - [~] Wk 11 Attestation module — built and tested; needs H100-class CC
337
+ hardware to exercise
338
+ - [~] Wk 12 Release + preprint — tooling and docs are present; public release
339
+ remains blocked by the dirty-tree gate and unresolved human/external
340
+ validation decisions
341
+
342
+ **Next concrete steps:** review the current dirty tree, obtain the two
343
+ outstanding written permissions, get ethics sign-off, and schedule the pinned
344
+ native/Linux and same-model validation work. Do not start provider testing from
345
+ this quickstart.
346
+
347
+ ---
348
+
349
+ ## Standing on prior work
350
+
351
+ GPU-SEAL reuses, rather than reinvents,
352
+ [Alpay & Alpay (2026), *Unprivileged Topology Certificates for Cloud GPU
353
+ Attestation*](https://arxiv.org/abs/2606.24934) for hardware-class and
354
+ coarse-location attestation. Their instrument answers *which chip did I get,
355
+ and roughly where is it?* GPU-SEAL asks the question they leave open: *what
356
+ was left on it, and does the provider's isolation model match what they sold
357
+ you?* Their paper explicitly leaves same-model die separation unresolved
358
+ (§12); the report card refuses grade A on memory hygiene until that's
359
+ closed, and CI enforces the refusal. Details: [`docs/prior-art.md`](docs/prior-art.md).
360
+
361
+ ---
362
+
363
+ ## Documentation
364
+
365
+ Role-based navigation (start here, run locally, safety model, methodology,
366
+ provider testing, release checklist): [`docs/INDEX.md`](docs/INDEX.md).
367
+
368
+ Full flat list, by content:
369
+
370
+ | Document | Contents |
371
+ |---|---|
372
+ | [`docs/PROGRESS.md`](docs/PROGRESS.md) | Implementation progress, category assessment, and boundaries |
373
+ | [`docs/REMAINING.md`](docs/REMAINING.md) | What is left, ordered by what actually unblocks the project |
374
+ | [`docs/STATUS.md`](docs/STATUS.md) | Dated measured release-readiness snapshot |
375
+ | [`docs/OWNER-ACTION-CHECKLIST.md`](docs/OWNER-ACTION-CHECKLIST.md) | Human decisions and external inputs |
376
+ | [`docs/TRUST-MODEL.md`](docs/TRUST-MODEL.md) | Dashboard inspection and cryptographic verification |
377
+ | [`docs/RELEASE.md`](docs/RELEASE.md) | Release process and automated-gate limits |
378
+ | [`docs/TROUBLESHOOTING.md`](docs/TROUBLESHOOTING.md) | Setup, platform, and evidence FAQ |
379
+ | [`CHARTER.md`](CHARTER.md) | Governing research and implementation charter |
380
+ | [`ETHICS.md`](ETHICS.md) | Ethics policy, with the enforcement point named for every rule |
381
+ | [`docs/threat-model.md`](docs/threat-model.md) | Tenant position, adversary model, hard boundaries |
382
+ | [`docs/methodology.md`](docs/methodology.md) | How a measurement is taken, and what it may conclude |
383
+ | [`docs/scoring.md`](docs/scoring.md) | The report card, and why there is no composite score |
384
+ | [`docs/pre-registration.md`](docs/pre-registration.md) | Hypotheses and thresholds, fixed before any provider data |
385
+ | [`docs/architecture.md`](docs/architecture.md) | Full component map and design principles |
386
+ | [`docs/data-handling.md`](docs/data-handling.md) | What is held, for how long, and what is refused outright |
387
+ | [`DISCLOSURE.md`](DISCLOSURE.md) | Responsible disclosure process |
388
+ | [`docs/provider-policy-review/`](docs/provider-policy-review/) | The Phase 0 gate: no reviewed record, no probing |
389
+ | [`docs/adr/`](docs/adr/) | Architecture decision records |
390
+ | [`SECURITY.md`](SECURITY.md) | Reporting vulnerabilities in GPU-SEAL itself |
391
+ | [`CONTRIBUTING.md`](CONTRIBUTING.md) | Contribution workflow and required checks |
392
+ | [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) | Participation standards |
393
+ | [`CHANGELOG.md`](CHANGELOG.md) | Release notes and change policy |
394
+
395
+ ---
396
+
397
+ ## Licence & citation
398
+
399
+ Apache-2.0 — see [`LICENSE`](LICENSE). Citation metadata is in
400
+ [`CITATION.cff`](CITATION.cff).