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 proof — enforced_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.

Metadata

Release files for checkseal 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for checkseal 0.1.1
File Size Uploaded
checkseal-0.1.1.tar.gz 49.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for checkseal 0.1.1
File Interpreter ABI Platform
checkseal-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 80.0 kB

Release files / checkseal-0.1.1.tar.gz

Download URL checkseal-0.1.1.tar.gz
Size 49.1 kB
Tags Source
SHA-256 checksum
How to use checksums
30715778ba8a21fdf47e401b63c82b5d91c9c904d164c08afa065bd873521b6f
BLAKE2b-256 checksum
How to use checksums
7f8a1a168abbacaaa5a1b7cf0cf62d85ff00c225d1609a79aaef122cbce86023
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / checkseal-0.1.1-py3-none-any.whl

Download URL checkseal-0.1.1-py3-none-any.whl
Size 30.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
32848aed24f0ad2f6bf7e9718b34f7737752801661845961dd45954d214c1b1f
BLAKE2b-256 checksum
How to use checksums
344e112273e876ae83434eea62b14fd70df8a10894bf2dec6b29e994cfceef30
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page