PEP 740 · SLSA · read-only · census
What the supply chain actually signs
Two questions get collapsed into one. Does a package carry an attestation that verifies, and
does that attestation describe how the package was built? This is the full dependency set of
one working engine, checked against both, with the expectations published before the run and
every refusal named by the limb that failed.
A census of one install set, not a sample of PyPI · no badge, no score, no ranking · an
unattested package is not an unsafe package
Subject requirements.txt at engine commit c9e1ab67d08c
Requirements SHA-256 7e1faf942c6cddc14cc4a137a2a83c98635bae2cb66528f14bf42fcd672319eb
Resolved for Darwin arm64 · Python 3.11.15 · 94 distributions · 35,769,965 bytes downloaded and hashed
Expectations digest d089f5dc2f47169f77d83f4b4374334c580f85102640ffea3b46e8c4697a71aa published 2026-08-02 03:41 UTC
Ledger digest 0c23b0305508b27607895a32440e1d4949cebe5e43e20cf568f4dfbf11e61a00 run 2026-08-02 05:44 UTC
How to cite / re-check
Cite
expectations.json (published first) and
summary.json. One package at a time:
https://geniusflow-federation.vercel.app/slsa/receipts/<normalized-name>.json
This is a census of one install set, not a sample. A later run resolves a later set; the
expectations file pins which artifact filenames and digests a given run covered.
53.2%
50 of 94
serve no attestation at all
PyPI returns 404 from the integrity endpoint. There is nothing to verify, so nothing was verified.
46.8%
44 of 94
pass every MUST limb
An attestation exists, the downloaded bytes hash to the digest the index recorded, and the signature verifies against that computed digest.
0
of 94
carry SLSA build provenance
Every attestation in this set is a PyPI publish attestation. It binds an upload to a workflow and says nothing about how the artifact was built.
100.0%
94 of 94
refuse at the full level
The full level adds the signer to source cross check and the two observed limbs. Nothing in this dependency set clears it.
The distinction this ledger exists for
A publish attestation says a named workflow in a named repository uploaded
this exact file. That is worth having. It is not build provenance.
SLSA build provenance says how the artifact was produced: the builder, the
source it was built from, the parameters. It is what lets you check that a wheel came from
the commit it claims.
Every attestation in this dependency set is the first kind. A project that treats a verified
PyPI attestation as SLSA build provenance is claiming more than it holds.
| Verified predicate type | Packages |
| https://docs.pypi.org/attestations/publish/v1 | 44 |
| https://slsa.dev/provenance/v1 | 0 |
Predictions, written down first
The expectations file was committed and published at digest d089f5dc2f47169f before a single package was checked, and the run refuses to start if that file's digest stops
matching its contents. These four predictions were in it.
| Stated before the run | Observed | Verdict |
| Fewer than half of these distributions will serve any PEP 740 attestation. | 44 of 94 served an attestation | met |
| No distribution in this set will carry a SLSA build provenance predicate. | 0 of 94 carried one | met |
| Both host published roots will refuse at the first limb. | 2 roots failed index_resolves | met |
| Every attestation that verifies will also be in the transparency log. | 44 of 44 verified attestations carried a log entry | met |
Where they fail first
Limbs run in a frozen order and a refusal names the first one that failed, so these counts
partition the census rather than double-counting it.
| First failing limb | Packages |
| provenance_published | 48 |
| predicate_is_slsa_build_provenance | 42 |
| index_resolves | 2 |
| signer_matches_declared_source | 2 |
Named reasons
| Limb and reason | Packages |
| provenance_published:no_provenance_published | 48 |
| predicate_is_slsa_build_provenance:publish_attestation_not_build_provenance | 42 |
| index_resolves:declared_range_unsatisfiable_on_pypi | 1 |
| signer_matches_declared_source:signer_repo_mismatch:numpy/numpy!=numpy/numpy-release | 1 |
| index_resolves:project_not_on_pypi | 1 |
| signer_matches_declared_source:signer_repo_mismatch:tox-dev/py-filelock!=tox-dev/filelock | 1 |
Every limb, reported separately
not reached means an earlier limb failed first, so this one was never observed: it
is neither a pass nor an exemption. The digest compared against each signature is one this
probe computed over bytes it downloaded, never a digest quoted back from an API.
| Limb | Level | ok | fail | n/a | absent | not reached |
| index_resolves | MUST | 92 | 2 | 0 | 0 | 0 |
| provenance_published | MUST | 44 | 48 | 0 | 0 | 2 |
| bundle_wellformed | MUST | 44 | 0 | 0 | 0 | 50 |
| artifact_bytes_match_index | MUST | 44 | 0 | 0 | 0 | 50 |
| signature_verifies | MUST | 44 | 0 | 0 | 0 | 50 |
| signer_matches_declared_source | SHOULD | 42 | 2 | 0 | 0 | 50 |
| predicate_is_slsa_build_provenance | OBSERVED | 0 | 44 | 0 | 0 | 50 |
| attestation_in_transparency_log | OBSERVED | 44 | 0 | 0 | 0 | 50 |
The part that did work
Every attestation that exists in this set verified. All 44
passed Sigstore verification against the Fulcio certificate chain and the Rekor transparency
log, the digest computed over the downloaded bytes matched the index in every case, and every
one was discoverable in the log. The gap here is adoption, not broken cryptography, and a
refusal ledger that only ever prints bad news is not measuring anything.
Anomalies, and why they are not accusations
The signer to source limb compares two facts a maintainer sets in two different places:
the repository PyPI reports as the signer, and the source repository the project
declares in its own PyPI metadata. They disagreed twice.
| Package | Declared source | Signed from |
| numpy | numpy/numpy | numpy/numpy-release |
| filelock | tox-dev/py-filelock | tox-dev/filelock |
A project may build and upload from a repository other than the one it lists as its
source, and a repository that has been renamed keeps answering on its old name. Both are
ordinary and neither is evidence of wrongdoing. What the receipt records is that an
automated consumer pinning the declared source repository would not match the signer,
which is a real cost of the naming gap even when nobody did anything wrong.
What the probe found about its own author
The first limb failed on this engine's own declared roots before it failed on anyone
else's package.
| Declared | Reason | Latest on PyPI |
| helixhash>=1.0 | declared_range_unsatisfiable_on_pypi | 0.1.1 |
| witnessfield>=1.0 | project_not_on_pypi | not published |
Both are packages this host publishes. The engine declares a version range the public
index cannot satisfy, which means a third party following this requirements.txt cannot reproduce the environment. That is a refusal
against the author of the probe, found by the probe, published here rather than fixed
quietly first.
Read it yourself
One package's receipt, by normalized name, from the federation origin:
curl -sS https://geniusflow-federation.vercel.app/slsa/receipts/cryptography.json | jq '{package, version, must_admit, first_refuse_reason, limbs}' Re-run it
The probe is stdlib only apart from the verifier, which is not an engine runtime dependency.
When it is missing the signature limb refuses by name rather than passing, so an unverified run
can never read as a verified one.
python3 -m venv .slsa && .slsa/bin/pip install pypi-attestations
.slsa/bin/python engine/tools/slsa_provenance_run.py expect
.slsa/bin/python engine/tools/slsa_provenance_run.py run
Version ranges float, so a later run resolves a later set and the counts move. The expectations
file pins exactly which artifact filenames and digests a given run covered, so a disagreement
is about what the index served rather than about which packages were picked.
What this cannot tell you
- One resolution on one platform at one moment. Wheel filenames are platform specific, so another machine resolves a different artifact list for the same declared versions.
- The signer identity is checked against the publisher PyPI reports and then cross checked against the source repository the project declares in its own PyPI metadata. Both facts come from PyPI, so a PyPI that lies about both consistently would pass that limb. The signature verification itself does not depend on PyPI: it goes to the Fulcio chain and the Rekor log.
- A 404 from the integrity endpoint is recorded as a refusal, not an absence. The uploader may have chosen not to attest, or may predate PEP 740. Neither case is distinguished here.
- Only GitHub publisher slugs are cross checked against declared source. Other publisher kinds refuse that limb by name rather than passing unchecked.
- Version ranges float, so re-running resolves a newer set. The expectations file pins exactly which artifacts a given run covered.
-
This is a census of one dependency set. It supports no claim about PyPI as a whole, and no
rate here should be quoted as one.