pcs-core ships two supported products. pcs capabilities reports which backends are
actually available on the current machine and never claims Lean or live CertifyEdge
when those assets are absent.
Asset locations (Lean root, PF-Core / PCS kernels, generated proofs, pins, catalogs,
schemas) are resolved exclusively through
python/pcs_core/asset_resolver.py. Compilers,
hashers, bundle assembly, and proof-reference paths must not hardcode
repo_root() / "lean". Override with PCS_DISTRIBUTION_ROOT, PCS_LEAN_ROOT,
PCS_PINS_DIR, or PCS_CATALOG_DIR when needed.
Contains
- Python validators and
pcsCLI - JSON schemas (
pcs_core/schemasvia wheel force-include) - PF-Core capability catalog
- Shared hash vectors
- Runtime semantic checks and release-chain validation
Does not contain
- Lean toolchain
lean/PFCoreorlean/PCSkernel sources- Proof-binding / lake build environment
Install:
cd python
pip install -e ".[dev]"
# or: pip install pcs-core
pcs capabilitiesExpected product line: pcs product: validator unless a full checkout plus lake
are present. Lean subcommands may still be listed for developer checkouts; capability
detection and command failures remain the source of truth for what is available.
From a fresh virtualenv with only the built validator wheel installed (no repo checkout
on PYTHONPATH, no lake on PATH):
- Schema validation succeeds (
pcs validate <fixture>). - Semantic validation succeeds (
pcs examples checkor release-chain validate). pcs capabilities --jsonreportsproduct: validatorandlean_toolchain/pf_core_kernel/pcs_envelope_kernelasfalse.
CI job: validator-wheel in .github/workflows/distribution.yml.
Local: bash scripts/test-validator-wheel.sh.
Contains
- Pinned Lean toolchain (via elan; see
pins/elan.json) - Lake project under
lean/ - PF-Core and PCS Lean sources
- Generated-proof and proof-binding tooling
- Release-bundle tooling (
pcs pf-core bundle-release,pcs pf-core verify-bundle)
Dockerfile: docker/verifier/Dockerfile.
- Base image pinned by digest (
pins/python-base-image.json). - Runs as non-root user
pcs(uid/gid10001). - Elan / Lean tools live under
/opt/elan(owned bypcs).
docker build -f docker/verifier/Dockerfile -t pcs-core-verifier:local .
docker run --rm --user 10001:10001 pcs-core-verifier:local capabilitiesPublish path (once org signing keys / GitHub OIDC are configured):
-
Build and push by digest:
docker buildx build --push \ -f docker/verifier/Dockerfile \ -t ghcr.io/sentinelops-ci/pcs-core-verifier:vX.Y.Z \ -t ghcr.io/sentinelops-ci/pcs-core-verifier:sha-<gitsha> \ .
-
Attach SBOM (CycloneDX) and provenance attestations:
# SBOM (example with syft) syft packages pcs-core-verifier:vX.Y.Z -o cyclonedx-json > pcs-core-verifier.cdx.json # GitHub artifact attestations / build provenance # (.github/workflows/release-provenance.yml: # actions/attest-build-provenance + actions/attest-sbom; # consumer job: scripts/verify-release-provenance.sh)
-
Sign with cosign (keyless OIDC preferred):
cosign sign --yes ghcr.io/sentinelops-ci/pcs-core-verifier@sha256:<digest> cosign attest --yes --predicate pcs-core-verifier.cdx.json --type cyclonedx \ ghcr.io/sentinelops-ci/pcs-core-verifier@sha256:<digest> cosign verify ghcr.io/sentinelops-ci/pcs-core-verifier@sha256:<digest>
-
Publish the image digest, cosign signature, SBOM digest, and provenance statement in the GitHub Release assets. Consumers verify:
cosign verify ghcr.io/sentinelops-ci/pcs-core-verifier@sha256:<digest> cosign verify-attestation --type cyclonedx \ ghcr.io/sentinelops-ci/pcs-core-verifier@sha256:<digest>
CI job: Verifier OCI clean execution in .github/workflows/distribution.yml
(scripts/test-verifier-oci.sh). Local:
bash scripts/test-verifier-oci.shSigned image publish (cosign / GHCR) remains org-gated until signing keys / OIDC are provisioned. Operator runbook: pf-core/operator-release-gates.md.
bash scripts/build-verifier-wheel.shEmbeds lean/ and pins/ under pcs_core/ for importlib.resources style layouts.
Prefer the OCI image for production verifiers.
From a fresh virtualenv with the verifier wheel installed and pinned lake on PATH:
- Bundled Lean assets are located (
asset_resolver.lean_root()/ capabilities paths). compute_pfcore_kernel_hash()is non-empty and matches checkout kernel hash.compute_lean_environment_hash()matches the bundled lake/toolchain inputs.- PF-Core proof compiles (
pcs pf-core lean-checkon TraceSafeR fixture). - PCS envelope proof path remains available (
lake build PCS). - Bundle assembly succeeds (
pcs pf-core bundle-release). - Independent bundle verification succeeds (
pcs pf-core verify-bundle).
CI jobs: Validator-wheel clean install, Verifier-wheel clean install, and
Verifier OCI clean execution in .github/workflows/distribution.yml.
Local: bash scripts/test-validator-wheel.sh, bash scripts/test-verifier-wheel.sh (requires elan/lake),
bash scripts/test-verifier-oci.sh (requires Docker).
| Capability | Validator wheel | Full checkout + lake | Verifier OCI |
|---|---|---|---|
| Schema validation | yes | yes | yes |
| Rust validator | no* | if cargo + crate |
no* |
| TypeScript validator | no* | if node + package |
no* |
| Lean toolchain | no | yes | yes |
| PF-Core kernel | no | yes | yes |
| PCS envelope kernel | no | yes | yes |
| Live CertifyEdge | if CLI on PATH | if CLI on PATH | if CLI installed |
* Language bindings ship in-repo but are not part of the Python validator wheel.
| File | Purpose |
|---|---|
pins/elan.json |
Elan archive URL + sha256 |
pins/python-base-image.json |
Verifier OCI base image digests |
pins/certifyedge.json |
CertifyEdge image digest placeholder |
pins/github-actions.json |
Immutable Action SHAs |
lean/lean-toolchain |
Lean 4 version |
rust/Cargo.lock |
Rust dependency lock |
typescript/package-lock.json |
npm lock |
python/requirements.lock |
Pip constraint lock |