# Mental models for the different types of attestations Attestations can have different types of "predicates" which define the specific content and format of the claim being made about a package artifact. In practice, this creates different _types_ of attestations for end users to understand.  Image source: https://slsa.dev/attestation-model ## Predicates supported on npm, PYPI, RubyGems | Registry | Predicate Name | Predicate URI (Full Link) | Mental Model / Purpose | Key Question it Answers | Example Rekor Log | | :--- | :--- | :--- | :--- | :--- | :--- | | **PyPI** | PyPI Publish | `https://docs.pypi.org/attestations/publish/v1/` | A verified and tamper-proof record, signed by PyPI itself, confirming that that a release file was uploaded via a PyPI Trusted Publisher, and that a specific Trusted Publisher identity was used to publish the file, such as a particular GitHub Actions workflow, etc.| Can I verify that this exact file was uploaded to PyPI by the project's official, pre-authorized publishing workflow, and not by some other means like a compromised developer's API token? | https://search.sigstore.dev/?logIndex=227282797 | | **PyPI** | SLSA Provenance | `https://slsa.dev/provenance/v1` | A verifiable and tamper-proof record, signed by the build platform (e.g., GitHub Actions, Google Cloud Build), that details exactly how a software artifact was produced, cryptographically linking the final artifact back to its original source code, build instructions, and dependencies. | "Can I verify that this software artifact was securely built from the expected source code, by a trusted build system, and that it wasn't tampered with during the build process?" |None generated to date. | | **npm** | SLSA Provenance | `https://slsa.dev/provenance/v1` | A verifiable and tamper-proof record, signed by the build platform (e.g., GitHub Actions, Google Cloud Build), that details exactly how a software artifact was produced, cryptographically linking the final artifact back to its original source code, build instructions, and dependencies. | "Can I verify that this software artifact was securely built from the expected source code, by a trusted build system, and that it wasn't tampered with during the build process?" | https://search.sigstore.dev/?logIndex=243056726 | | **npm** | npm Publish | `https://github.com/npm/attestation/tree/main/specs/publish/v0.1` | A verifiable and tamper-proof record, signed by npm itself, creating an authoritative link between a package's identity (name and version) and its content (hash) | Is the package I just downloaded with this specific content hash the same one that the npm registry officially recognises as this package name and version?" | https://search.sigstore.dev/?logIndex=211457175 | | **RubyGems** | No formal predicate name | No formal predicate spec | A verified and tamper-proof record, signed by RubyGems itself, confirming that that a release file was uploaded via a RubyGems Trusted Publisher, and that a specific Trusted Publisher identity was used to publish the file, such as a particular GitHub Actions workflow, etc.| Can I verify that this exact file was uploaded to RubyGems by the project's official, pre-authorized publishing workflow, and not by some other means like a compromised developer's API token? | https://search.sigstore.dev/?logIndex=225255766 | 1. [SLSA Provenance](https://slsa.dev/spec/v1.0/provenance) * The predicate standard used by build platforms (e.g. GitHub, GitLab, etc.) to attest the details of an artifact build * Supported by npm and PyPI * All attestations exposed on the npm UI are SLSA provenance * Currently there are no SLSA attestions on PyPI. This is because there is no widely adopted workflow for PyPI project maintainers to generate SLSA provenance attestations. See [this (unofficial) documentation](https://sethmlarson.dev/python-and-slsa) for an example SLSA publishing workflow for PyPI. 2. Publish Attestations * These are predicates created by PyPI, npm and RubyGems, who can "sign" an attestation * PyPI and npm have defined a formal predicate for their publish attestations, RubyGems have not (TBC) * PyPI and RubyGems publish attestations include information about the Trusted publisher and associated build workflow. * npm's publish attestation does not include trusted publisher information, or information about the build workflow. Currently, publish attestations are not exposed in npm's UI ## UI Considerations Package repositories _can_ display multiple attestations per file/package (each with a different predicates). * "Currently PyPI supports two attestations per file: one for each of the allowed predicates." (see [PyPI docs](https://docs.pypi.org/attestations/)). However there are currently no PyPI packages with multiple attestations. * In the future, more predicate types may emerge, as different organisations or users choose to verify packages for their own purposes * In the future, established/existing predicate types will publish new versions (e.g. [SLSA versioning](https://slsa.dev/spec-stages#versioning)). Currently there are both `SLSA v.02` and `SLSA v.1` attestations on npm (3, 836 and 26,757 respectively, as of 2025-06-17) * For users to differentiate between the different types of attestations, and understand what they each mean, the predicate type (including version) must be exposed (and explained) in the UI. Currently PyPI exposes the predicate type, but does not explain it. Neither npm or RubyGems expose the predicate type.