Observed since 20 Oct, 21:53 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
agent-evidence-admission
Check that an artifact has the digest its compliance document, SBOM or attestation names.
Checks that an artifact has the digest its document names: a TEA artifact, a CycloneDX SBOM or VEX, or an in-toto statement.
It is for manufacturers, integrators and admission controllers that receive a compliance document for a release and need to know the document covers the bytes they actually hold.
Start in a new directory with Python 3.10 or newer and uv. Install the checker in its own environment:
uv venv admission-env
uv pip install --python admission-env/bin/python agent-evidence-admission==0.1.2
Create three known bytes and a synthetic in-toto statement that names their digest:
printf 'abc' > artifact.txt
cat > statement.json <<'JSON'
{
"_type": "https://in-toto.io/Statement/v1",
"subject": [{"name": "artifact.txt", "digest": {"sha256": "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"}}],
"predicateType": "https://example.org/digest-demo/v1",
"predicate": {}
}
JSON
admission-env/bin/agent-evidence-admission digest-check statement.json artifact.txt
It prints:
PASS artifact.txt has sha256:ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad, named in statement.json
A match binds the document to bytes. It does not verify a signature or admit a workload.
For an existing CycloneDX SBOM and JAR, provide both files in your working directory:
uvx agent-evidence-admission==0.1.2 digest-check bom.json log4j-core-2.26.1.jar
The check runs three steps: read the document (a path or an https URL), recompute the artifact's digest with every algorithm the document names, and compare. It prints one line and exits 0 when a named digest matches:
PASS log4j-core-2.26.1.jar has sha512:..., named in bom.json
It exits 1 with FAIL digest-mismatch when the bytes differ, or FAIL no-digest-named when the document names no digest at all, and 2 when the document or the artifact could not be read. Plain http URLs are refused.
Version 0.1.2. The Kubernetes admission policies (Rego, Kyverno, policy-controller) live in the same repository; see the repository README.
From the repository root, check the license copy, build both archives and check their license text and metadata:
python scripts/python-license-gate.py
python -m build python --outdir dist
python scripts/python-license-gate.py --dist dist
The repository LICENSE is the source of the existing Apache-2.0 grant. python/LICENSE is its byte-for-byte distribution copy because license-file paths must stay within the Python project. Copy the root file when it changes; the gate refuses drift. Both the wheel and source archive include that text, and the source archive can build without the repository parent.
Download counts and popularity will appear here as the collector receives them.
Declarations describe requirements; they are not a resolved dependency graph.
bdist_wheel · 10.61 KB · Python py3
sdist · 10.86 KB · Python source
Observed since 20 Oct, 21:53 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:86fb95f0091f3fc9b0b5f6d22f69bea786fc143bb6dcdf0a4addb62fda4edb83