Release Integrity¶
Release integrity controls are emitted only from the canonical repository,
oaslananka/kicad-mcp-pro.
Release evidence target¶
Current target: evidence-backed professional release integrity. The project does not claim a formal SLSA level.
Each release artifact class should provide the strongest evidence supported by its ecosystem: checksums, SBOMs, GitHub artifact attestations, package-registry provenance, container digests, and post-publish verification. A future formal level can be defined per artifact class after the evidence map is stable.
Python SBOM¶
The Python publish workflow generates a CycloneDX SBOM as release evidence:
release-evidence/sbom.cdx.json
Download the python-release-evidence Actions artifact or the corresponding
kicad-mcp-pro-python-sbom.cdx.json GitHub Release asset and keep it with
the matching Python distributions.
SHA256SUMS¶
Release checksums are published as workflow evidence, separate from the PyPI distribution upload directory:
release-evidence/SHA256SUMS.txt
In workflow artifacts, download python-release-evidence next to the
python-dist wheel and source distribution artifacts before verification.
Verify a downloaded artifact:
sha256sum --check SHA256SUMS.txt
On Windows PowerShell:
Get-FileHash .\kicad_mcp_pro-<version>-py3-none-any.whl -Algorithm SHA256
Compare the hash with the matching line in SHA256SUMS.txt.
PyPI publication identity and Sigstore¶
The Python publishing jobs use PyPI trusted publishing with GitHub Actions OIDC,
and verify PEP 740 publication attestations for both the wheel and source archive.
These attestations are signed using Sigstore and checked against the canonical
oaslananka/kicad-mcp-pro publisher, publish-python.yml workflow, pypi
environment, and exact artifact digest. The release pipeline verifies this contract
with the repository-pinned pypi-attestations library. To repeat the verification
with the downloaded release checksum file:
uv run --frozen --group release python scripts/generate_release_evidence.py \
verify-pypi-provenance \
--repository pypi --package kicad-mcp-pro --version <version> \
--checksums kicad-mcp-pro-python-SHA256SUMS.txt \
--publisher-repository oaslananka/kicad-mcp-pro \
--publisher-workflow publish-python.yml --publisher-environment pypi
This verifies PyPI publication provenance, not a separately distributed
Sigstore signature file for the GitHub Release wheel. The repository does not
publish a standalone wheel signature bundle for 4.0.2, so a plain
python -m sigstore verify identity <wheel> command is not a working substitute.
GitHub Artifact Attestations¶
The Python workflow publishes a CycloneDX SBOM attestation, signed for the wheel and source archive with GitHub Actions. Verify the downloaded artifact:
gh attestation verify kicad_mcp_pro-<version>-py3-none-any.whl \
--repo oaslananka/kicad-mcp-pro \
--predicate-type https://cyclonedx.org/bom
For the source archive:
gh attestation verify kicad_mcp_pro-<version>.tar.gz \
--repo oaslananka/kicad-mcp-pro \
--predicate-type https://cyclonedx.org/bom
The GitHub CLI defaults to the SLSA v1 provenance predicate and will not find
the CycloneDX attestation without the explicit --predicate-type. A valid SBOM
attestation proves its signed statement and artifact digest, not SLSA build
provenance or absence of vulnerabilities. PyPI PEP 740 publication provenance
is separately verified above. Do not treat either mechanism as a replacement
for the other.
GHCR Image Digest and Provenance¶
Inspect the published image digest:
docker buildx imagetools inspect ghcr.io/oaslananka/kicad-mcp-pro:<version>
Pull by digest for reproducible deployment:
docker pull ghcr.io/oaslananka/kicad-mcp-pro@sha256:<digest>
Verify the keyless Sigstore signature:
cosign verify \
--certificate-identity-regexp "https://github.com/oaslananka/kicad-mcp-pro/.github/workflows/publish-mcp-container.yml@refs/tags/mcp-server-v.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
ghcr.io/oaslananka/kicad-mcp-pro@sha256:<digest>
The Docker workflow publishes BuildKit provenance and SBOM attestations only when the image is pushed.
GUI installer integrity¶
The Tauri GUI release workflow builds the Linux, Windows, and macOS installers from the exact kicad-mcp-gui-v* tag commit and publishes three evidence files with the installers:
kicad-mcp-pro-gui-SHA256SUMS.txt
kicad-mcp-pro-gui-sbom.cdx.json
kicad-mcp-pro-gui-release-evidence.json
The evidence JSON records the source commit, release tag, normalized installer inventory, platform classification, size, SHA-256 digest, and the actual platform-signing status. The CycloneDX 1.6 SBOM is generated deterministically from the committed src-tauri/Cargo.lock. Before publication the workflow verifies the installer directory against the generated evidence; after upload it downloads the GitHub Release assets and requires the published inventory and installer digests to match exactly.
Verify a downloaded GUI installer with the published checksum file and GitHub attestation:
sha256sum --check kicad-mcp-pro-gui-SHA256SUMS.txt
gh attestation verify <installer-file> --repo oaslananka/kicad-mcp-pro
The GitHub attestation proves CI/source provenance for the installer digest; it is not a substitute for platform code signing. Windows Authenticode, Apple code signing/notarization, and Linux package signing remain separately reported and must not be inferred from the GitHub attestation.
PyPI Trusted Publishing¶
The Python workflow uses short-lived GitHub OIDC credentials and PyPI Trusted Publishing. The required publisher identities are:
| Index | Repository | Workflow | Environment | Allowed ref |
|---|---|---|---|---|
| PyPI | oaslananka/kicad-mcp-pro |
publish-python.yml |
pypi |
tag mcp-server-v* |
| TestPyPI | oaslananka/kicad-mcp-pro |
publish-python.yml |
testpypi |
branch main |
Repository renames change the OIDC identity. Update both PyPI and TestPyPI Trusted Publisher records before publishing from a renamed repository. A publisher record for the former repository name is not accepted as current provenance.
After upload, the workflow queries the PyPI Integrity API for every wheel and
source distribution. It requires a PEP 740 publish attestation whose digest, repository,
workflow, and environment match the expected release identity. The pinned
pypi-attestations verifier then validates the Sigstore-backed attestation
cryptographically against the canonical repository. A
matching file digest without matching Trusted Publisher provenance is a release
failure.
Independent verification can use the PyPI attestations CLI:
pypi-attestations verify pypi \
--repository https://github.com/oaslananka/kicad-mcp-pro \
https://files.pythonhosted.org/.../kicad_mcp_pro-<version>-py3-none-any.whl
The token fallback is emergency-only and cannot produce the Trusted Publisher publish attestation. Its successful digest verification does not satisfy the normal provenance requirement.
DockerHub¶
DockerHub publishing is not enabled. GHCR is the canonical container registry.
If DockerHub support is added later, it must be manual or tag gated, protected by
the release environment, and documented with the exact digest and provenance
verification path.
See also release-signing.md for artifact-signing and verification policy.