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.1.tar.gz (49.1 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.1-py3-none-any.whl (30.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: checkseal-0.1.1.tar.gz
  • Upload date:
  • Size: 49.1 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.1.tar.gz
Algorithm Hash digest
SHA256 30715778ba8a21fdf47e401b63c82b5d91c9c904d164c08afa065bd873521b6f
MD5 f2b25c63391461bf5a6ddb6cddf1f7c4
BLAKE2b-256 7f8a1a168abbacaaa5a1b7cf0cf62d85ff00c225d1609a79aaef122cbce86023

See more details on using hashes here.

File details

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

File metadata

  • Download URL: checkseal-0.1.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 32848aed24f0ad2f6bf7e9718b34f7737752801661845961dd45954d214c1b1f
MD5 bc9489fc42bbb49373dbdd92bc2f846d
BLAKE2b-256 344e112273e876ae83434eea62b14fd70df8a10894bf2dec6b29e994cfceef30

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