IDKMesh

GitHub Release Statement v0.1

Status: experimental C14-G contract for issue #609.

Purpose

GitHub Release Provenance v0.1 (C14-F) records which artifact digests and which public-safe run evidence a proposed release references. C14-G renders that record as an in-toto Statement v1 so the same facts are available in the interchange shape that artifact-attestation tooling consumes: the release’s distributable artifacts as subjects, and the whole release record as the predicate.

The result is an unsigned payload, not an attestation. This contract exists so that a CI job running under a GitHub workflow identity has a deterministic, validated document to hand to an attestation step. It does not perform that step.

The implementation is idkmesh/github_release_statement.py; the command is idkmesh release-provenance --statement.

statement = build_github_release_statement(record)   # record from C14-F
json_text = render_github_release_statement_json(statement)

Command

idkmesh release-provenance --repository owner/name --tag v0.1.0 \
  --target-commit <40-hex-commit> \
  --artifact pkg-0.1.0.tar.gz=sha256:<64-hex> \
  --projection projections/run-1.json --statement

--statement is mutually exclusive with --notes. At least one --artifact is required, because a statement without subjects attests nothing. The statement goes to standard output; any rejected input prints error: ... on standard error, writes nothing to standard output, and exits 2.

Shape

Field Value
_type https://in-toto.io/Statement/v1
subject[] One per release artifact, in record order: name and digest: {"sha256": "<64 hex>"} (bare hex, as in-toto requires)
predicateType The URL of this document
predicate.schema_version 0.1
predicate.signature Fixed: status = unsigned, signing_requires = CI workflow identity
predicate.claims Fixed all-false: signed, attestation_registered, slsa_build_provenance, subjects_verified_against_build, functional_correctness
predicate.record The complete, validated C14-F record, including its record_digest

The statement has no timestamps and no field outside the table.

What is explicitly not claimed

Validation

validate_github_release_statement fails closed unless the statement is exactly this shape: unknown keys anywhere, a different _type or predicateType, relaxed signature or claims, an invalid or tampered embedded record (it is re-validated through the C14-F validator), an empty subject list, and subjects that differ from the embedded record’s artifacts in name, digest, order, or count are all rejected. Rendering re-validates, so a hand-built or mutated statement cannot be emitted. Output is bounded to 2 MiB and rendered with sorted keys.

Non-goals