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.
Files changed (55) hide show
  1. {scpe_protocol-0.2.0/scpe_protocol.egg-info → scpe_protocol-0.2.1}/PKG-INFO +25 -15
  2. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/README.md +280 -270
  3. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/pyproject.toml +56 -56
  4. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/producer.py +13 -4
  5. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/__init__.py +16 -16
  6. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/seal.py +41 -12
  7. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1/scpe_protocol.egg-info}/PKG-INFO +25 -15
  8. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/SOURCES.txt +1 -0
  9. scpe_protocol-0.2.1/tests/test_action_expressions.py +69 -0
  10. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_action_yaml.py +561 -508
  11. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_results_contract.py +1 -1
  12. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_seal.py +50 -0
  13. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/LICENSE +0 -0
  14. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/LICENSE-SPEC +0 -0
  15. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/__init__.py +0 -0
  16. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/disclosure.py +0 -0
  17. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/level1_lint.py +0 -0
  18. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/standalone/__init__.py +0 -0
  19. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/reference/standalone/verify_envelope.py +0 -0
  20. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/cli.py +0 -0
  21. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/diffinfo.py +0 -0
  22. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/optin.py +0 -0
  23. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/results.py +0 -0
  24. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/testrun.py +0 -0
  25. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe/verify.py +0 -0
  26. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/dependency_links.txt +0 -0
  27. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/entry_points.txt +0 -0
  28. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/requires.txt +0 -0
  29. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/scpe_protocol.egg-info/top_level.txt +0 -0
  30. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/setup.cfg +0 -0
  31. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_diff_resolution.py +0 -0
  32. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_differential_verifiers.py +0 -0
  33. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_disclosure.py +0 -0
  34. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_e2e_local.py +0 -0
  35. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_empty_keys_anchor_parity.py +0 -0
  36. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_entry_points.py +0 -0
  37. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_gate_requires_forge_anchor.py +0 -0
  38. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_key_source_anchor.py +0 -0
  39. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_level1_lint.py +0 -0
  40. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_level2_implies_level1.py +0 -0
  41. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_no_duplicate_verifier.py +0 -0
  42. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_optin.py +0 -0
  43. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_package_is_stdlib_only.py +0 -0
  44. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_producer_cli.py +0 -0
  45. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_producer_roundtrip.py +0 -0
  46. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_producer_submit.py +0 -0
  47. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_profiles_demo.py +0 -0
  48. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_retired_envelope_format.py +0 -0
  49. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_seal_render.py +0 -0
  50. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_seal_results.py +0 -0
  51. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_spec_vectors.py +0 -0
  52. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_ssrf_fetch.py +0 -0
  53. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_stress_100prs.py +0 -0
  54. {scpe_protocol-0.2.0 → scpe_protocol-0.2.1}/tests/test_testrun.py +0 -0
  55. {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.0
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 — see docs/workflows/scpe.yml for the fork-safe full version
192
- - uses: augbastos/scpe@v0.2
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. `v0.2` is an **immutable alias** — it points at
199
- one commit and is never moved, so a fix arrives as a new tag you adopt by editing the pin, not as
200
- a silent change under the one you already wrote. It is also the first release in which the Action
201
- verifies the `scpe/0.1` envelope itself; `v0.1.x` verified a different, now-removed format, so
202
- upgrading from it is a behaviour change and not a patch [docs/MIGRATION.md](docs/MIGRATION.md)
203
- has the steps.
204
-
205
- The Action uses a fork-safe two-job split: the untrusted job (which runs contributor code) holds
206
- no secrets; only a trusted follow-up job posts the comment. Neither level installs anything in the
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** — measured on the Python reference (Ryzen 5 5600H, Python 3.14, `local` provider):
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