scpe-protocol 0.2.0__tar.gz → 0.2.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.
- {scpe_protocol-0.2.0/scpe_protocol.egg-info → scpe_protocol-0.2.1}/PKG-INFO +25 -15
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/README.md +280 -270
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/pyproject.toml +56 -56
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/producer.py +13 -4
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/__init__.py +16 -16
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/seal.py +41 -12
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1/scpe_protocol.egg-info}/PKG-INFO +25 -15
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/SOURCES.txt +1 -0
- scpe_protocol-0.2.1/tests/test_action_expressions.py +69 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_action_yaml.py +561 -508
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_results_contract.py +1 -1
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_seal.py +50 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/LICENSE +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/LICENSE-SPEC +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/__init__.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/disclosure.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/level1_lint.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/standalone/__init__.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/standalone/verify_envelope.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/cli.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/diffinfo.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/optin.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/results.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/testrun.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/verify.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/dependency_links.txt +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/entry_points.txt +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/requires.txt +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/top_level.txt +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/setup.cfg +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_diff_resolution.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_differential_verifiers.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_disclosure.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_e2e_local.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_empty_keys_anchor_parity.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_entry_points.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_gate_requires_forge_anchor.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_key_source_anchor.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_level1_lint.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_level2_implies_level1.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_no_duplicate_verifier.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_optin.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_package_is_stdlib_only.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_producer_cli.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_producer_roundtrip.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_producer_submit.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_profiles_demo.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_retired_envelope_format.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_seal_render.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_seal_results.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_spec_vectors.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_ssrf_fetch.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_stress_100prs.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_testrun.py +0 -0
- {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_verify_cli_parity.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scpe-protocol
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: SCPE: an open protocol for verifiable provenance of any digital artifact — who signed a contribution or file, what they declared about AI use, and that nothing was tampered with, verified offline with no server and no new accounts. Ships the single-file reference verifier, its producer, and a CLI (`scpe`) that seals a pull request from it.
|
|
5
5
|
Author: Augusto Bastos
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -44,7 +44,11 @@ Dynamic: license-file
|
|
|
44
44
|
<img alt="spec" src="https://img.shields.io/badge/spec-scpe%2F0.1-41c257?style=flat-square&labelColor=0b0b0c">
|
|
45
45
|
<img alt="python" src="https://img.shields.io/badge/python-3.11%2B-41c257?style=flat-square&labelColor=0b0b0c">
|
|
46
46
|
<img alt="license" src="https://img.shields.io/badge/code-Apache--2.0-41c257?style=flat-square&labelColor=0b0b0c">
|
|
47
|
-
<img alt="status" src="https://img.shields.io/badge/v0.2-early-d29922?style=flat-square&labelColor=0b0b0c">
|
|
47
|
+
<img alt="status" src="https://img.shields.io/badge/v0.2.1-early-d29922?style=flat-square&labelColor=0b0b0c">
|
|
48
|
+
</p>
|
|
49
|
+
|
|
50
|
+
<p align="center">
|
|
51
|
+
<a href="https://augbastos.github.io/scpe/"><b>augbastos.github.io/scpe</b></a> — what it is, in one page
|
|
48
52
|
</p>
|
|
49
53
|
|
|
50
54
|
An open protocol for two questions a pull request cannot answer today: **who signed this
|
|
@@ -188,22 +192,28 @@ anchors and what a verdict is worth under each.
|
|
|
188
192
|
Add a workflow that verifies every PR and posts a seal. Set `require` to gate merges.
|
|
189
193
|
|
|
190
194
|
```yaml
|
|
191
|
-
# .github/workflows/scpe.yml —
|
|
192
|
-
-
|
|
195
|
+
# .github/workflows/scpe.yml — the step. Copy BOTH files from docs/workflows/ for the
|
|
196
|
+
# fork-safe version: scpe.yml (verify) and its companion scpe-seal.yml (post the seal).
|
|
197
|
+
- uses: augbastos/scpe@v0.2.1
|
|
193
198
|
with:
|
|
194
199
|
level: "1" # 1 = disclosure lint · 2 = signed envelope required
|
|
195
200
|
require: "true" # fail the check on anything not verifiable
|
|
196
201
|
```
|
|
197
202
|
|
|
198
|
-
Pin the exact tag while the protocol is pre-1.0.
|
|
199
|
-
one commit and is never moved, so a fix arrives as a new tag you adopt by editing the
|
|
200
|
-
a silent change under the one you already wrote.
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
203
|
+
Pin the exact tag while the protocol is pre-1.0. Every tag here is an **immutable alias** — it
|
|
204
|
+
points at one commit and is never moved, so a fix arrives as a new tag you adopt by editing the
|
|
205
|
+
pin, not as a silent change under the one you already wrote. `v0.2.1` is that in practice: `v0.2`
|
|
206
|
+
shipped a seal banner that read `VERIFIED` on unattested PRs and a workflow template GitHub
|
|
207
|
+
refuses to register, and both were fixed by publishing a new tag rather than by moving the old
|
|
208
|
+
one. The `v0.2` line is also the first in which the Action verifies the `scpe/0.1` envelope
|
|
209
|
+
itself; `v0.1.x` verified a different, now-removed format, so upgrading from it is a behaviour
|
|
210
|
+
change and not a patch — [docs/MIGRATION.md](docs/MIGRATION.md) has the steps.
|
|
211
|
+
|
|
212
|
+
The Action uses a fork-safe two-job split, and the two jobs live in **two files**: the untrusted
|
|
213
|
+
job in `scpe.yml` (which runs contributor code) holds no secrets, and only the trusted follow-up
|
|
214
|
+
job in `scpe-seal.yml` posts the comment. Two files is a GitHub constraint, not a preference — a
|
|
215
|
+
workflow that names itself in its own `workflow_run` trigger fails to register at all. Neither
|
|
216
|
+
level installs anything in the
|
|
207
217
|
runner — both run stdlib-only Python straight out of the Action's own checkout, so the bytes that
|
|
208
218
|
decide a merge are the bytes of the tag you pinned, not whatever a package index serves that day.
|
|
209
219
|
Check out with `fetch-depth: 0`: level 2 recomputes the diff as `git diff <base>...<head>`, and the
|
|
@@ -237,7 +247,7 @@ passing all eighteen does not by itself show that the `key_source` MUST is honou
|
|
|
237
247
|
checked by inspection. Every vector ships its own `keys` file so the suite runs offline, and no
|
|
238
248
|
vector reaches the `forge` anchor.
|
|
239
249
|
|
|
240
|
-
**Cost**
|
|
250
|
+
**Cost**
|
|
241
251
|
|
|
242
252
|
| | Measured |
|
|
243
253
|
|---|---|
|
|
@@ -264,7 +274,7 @@ single machine — not a formal benchmark suite.
|
|
|
264
274
|
|
|
265
275
|
## Status
|
|
266
276
|
|
|
267
|
-
**v0.2 — early.** This is a specification plus a reference implementation (a single-file
|
|
277
|
+
**v0.2.1 — early.** This is a specification plus a reference implementation (a single-file
|
|
268
278
|
verifier, a producer, and a maintainer-side Action). The full test suite — including a 100-PR
|
|
269
279
|
stress proof and a local end-to-end — runs on every push; the CI badge above is its live
|
|
270
280
|
result. Two more independent verifiers, in Go and Rust, reach the same verdict as the Python
|