Skip to main content

CheckSeal

A check-receipt for AI artifacts: which verification checks passed, and how strongly each one binds.

Provenance standards tell you who made an artifact and that it hasn't changed since. They do not tell you which checks it passed and whether those checks were mechanically enforced or merely advisory. CheckSeal is the reference implementation of that check-assertion predicate. It rides in-toto Attestation v1 and Sigstore keyless; it does not invent a competing format.

The differentiator is the enforced / advisory / observed grade on every check, and the honesty machinery behind it:

  • evidence is a digest, recomputed — a verifier checks the evidence, it does not trust the claim.
  • an enforced grade needs a proofenforced_proof resolves to a HarnessBench report that empirically measured the gate, and the corpus's threat class must actually cover the check (a destructive-execution corpus cannot prove a content rights-gate).
  • consumers display trust_floor, never a bare "enforced" — the weaker of how strongly a check binds and how strong its evidence is, so a seal can't over-claim in either dimension.
  • Sigstore + Rekor make backdating detectable (a not-after bound; Rekor does not prove not-before, and CheckSeal says so).

A seal asserts presence with evidence. It cannot prove a check was not run. That limit is stated, not hidden.

Install

pip install checkseal            # stdlib-only core
pip install checkseal[sign]      # + T1 local-key signing (cryptography)
pip install checkseal[keyless]   # + T2 Sigstore keyless (public seals)

Quickstart (T1, offline)

checkseal keygen --out key.pem --pub key.pub.pem

# after your checks run and land in a T0 store (t0.jsonl), seal one subject:
checkseal seal --store t0.jsonl --subject ./artifact --name my/artifact \
  --key key.pem --out artifact.intoto.jsonl

# verify against the live artifact (exits non-zero if the seal does not pass):
checkseal verify artifact.intoto.jsonl --subject ./artifact --pubkey key.pub.pem

Public seals must be T2 (Sigstore keyless); that path runs in CI where an OIDC credential is available.

The Verifier Contract

A verification is valid only if the verifier (1) recomputes the live subject digest, (2) checks Rekor inclusion for a freshness bound, (3) re-executes enforced Grade-A checks, (4) resolves enforced_proof against HarnessBench with a corpus-relevance check, (5) renders trust_floor, and (6) treats all sealed content as untrusted. See DESIGN.md.

Client-side verification (/receipts)

js/checkseal_verify.mjs is the honest browser subset: it recomputes the subject digest, checks the Statement/predicate subject coupling, verifies the Ed25519 signature over the DSSE PAE, and renders trust_floor — and it states loudly what it does NOT check (re-execution, enforced_proof resolution, full Rekor proof), which are CLI-only. A Python-signed seal verifies in this JS verifier (node --test js/), proving the format is language-agnostic.

Public T2 seals are minted in CI: checkseal seal-keyless plus .github/workflows/seal.yml (GitHub OIDC → Fulcio → Rekor).

Status

Phases 0-2 complete (format, producer/sealer, verifier CLI); Phase 3 in progress (client-side verifier + T2 keyless CI). Part of the Verification Chain program (HarnessBench + Verification Ledger + CheckSeal on one schema). MIT.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

checkseal-0.1.0.tar.gz (47.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

checkseal-0.1.0-py3-none-any.whl (30.9 kB view details)

Uploaded Python 3

File details

Details for the file checkseal-0.1.0.tar.gz.

File metadata

  • Download URL: checkseal-0.1.0.tar.gz
  • Upload date:
  • Size: 47.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for checkseal-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d1d1dfbb07a3336543a07a8386a70464734315a5d04a6229c2c938ff1cd9a06c
MD5 d85685284b5b8e4d071272802d00554e
BLAKE2b-256 c92e0890dad13666ebc716012be4264ce8eb775c9e9101bd74b9e9346c3c299c

See more details on using hashes here.

File details

Details for the file checkseal-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: checkseal-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 30.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for checkseal-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5095b93cf47b19c8a0698285ad34e5ee506472c5160de78b82b056b7669ba24b
MD5 ddf35d728e1824088bf22f6c36426b06
BLAKE2b-256 813c93259e1d2ab2ed12d0081c1c791edd15f0cf3c5ac1d3bbb1b68f45cc363f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page