Evidence Locker Attestation Contract (v1 · frozen 2025-11-20)
Scope: Evidence Bundle v1 produced by Evidence Locker and consumed by Concelier, Excititor, Export Center, CLI, and Policy Engine.
Predicates & subjects
- Subject (mandatory): Merkle root derived from
checksums.txt(sha256 of the sorted file) for the sealed bundle. OCI digest of the tarball remains recorded asbundle_oci_digestinside the predicate for registry mirroring but is not the DSSE subject. - Predicates (DSSE/In-Toto)
stellaops.evidence.bundle.v1: declares bundle layout (manifests, CAS paths, replay log offsets, Merkle recipe, chunking strategy).stellaops.evidence.transparency.v1: Rekor/log inclusion proof (UUID, log index, root hash at inclusion). Required when network-permitted; when offline, includereason="offline"and omit log pointers.stellaops.evidence.integrity.v1: hashes for each payload (SBOMs, VEX, policy packs, telemetry snapshots), keyed by canonical path; must match entries inbundle.manifest.schema.json.
Required claim set
bundle_id(UUID v4)produced_at(UTC ISO-8601)producer(evidence-locker:<region>)subject_merkle_root(sha256 from checksums.txt)hashes(map: canonicalPath → sha256) sorted lexicographicallysbom(array of SPDX/CycloneDX digests and mediaTypes)vex(array of VEX doc digests and schema versions)replay_manifest(optional; digest + sequence number, ledger URI, dsseEnvelope)transparency(optional; Rekor UUID, logIndex, rootHash, inclusionProof) orreason="offline"signing_profile(sovereign-default|fips|gost|pq-experimental)
Bundling & signing rules
- Startup gate (Sprint 20260501-051, audit finding L2): EvidenceLocker refuses to start outside the local harness when capsule signing material, the RFC3161 timestamp authority, or the Timeline publisher would resolve to the null fallback. The validator inspects
EvidenceLockerOptionsbefore the host accepts traffic; see architecture §4bis for the exact configuration keys. This prevents the “no signature, no timestamp, no anchor” silent-disable mode that previously passed health checks. The same posture applies toEvidenceLocker:Signing:AllowUnsignedCapsules— it is harness-only and trips the startup error in any non-harness environment. Cross-references:- Attestor verdict acceptance must couple to a non-null signed capsule (Pass-2 audit L1: missing-signature DSSE rejection is the consumer-side mirror of this gate).
- Findings ledger entries that reference an evidence bundle must be able to assume the bundle’s DSSE envelope is real, not the
signer_not_registeredplaceholder.
- DSSE envelope is mandatory for every sealed bundle using the configured
ICryptoProviderRegistryprofile; keys must be short-lived (<24h) and recorded in provider registry. - Subject = sha256(Merkle root) from
checksums.txt; verifier must recompute to match. - Hash list must match
bundle.manifest.schema.json(entries + optionalhashSummary), sorted bycanonicalPath. - Rekor/logging policy:
- If outbound log is allowed, submit to configured log and embed UUID/logIndex/rootHash in
transparency. - If outbound log is disallowed/offline, set
transparencyto null and includereason="offline"pluslog_policy="skip"inside the predicate.
- If outbound log is allowed, submit to configured log and embed UUID/logIndex/rootHash in
Verification plan
- Verify DSSE signature against provider registry (per profile) and check key expiry.
- Recompute sha256 for every manifest entry and the Merkle root; fail if subject differs.
- If
transparencypresent, verify inclusion proof against bundled Rekor root; fail closed on mismatch. If absent, requirereason="offline"andlog_policy="skip". - Emit verification report JSON (deterministic key order) and store beside bundle as
verify.json.
Fixtures
- Sample bundle + report:
docs/modules/evidence-locker/samples/bundle-v1-sample.tar.gz(sha256 TBD at publish time). - Sample attestation envelope:
docs/modules/evidence-locker/samples/attestation-v1-sample.json.
Ownership
- Primary: Evidence Locker Guild.
- Reviewers: Concelier Core Guild, Excititor Guild, Export Center Guild, Policy Guild.
Gate Artifact Evidence Score Contract (v1, 2026-02-09)
Evidence Locker accepts a producer bundle and emits a single deterministic gate value (evidence_score) used by Release Orchestrator promotion gates.
Producer submission
POST /evidence
Request body:
producer_bundle.artifact_id(required)producer_bundle.canonical_bom_sha256(required, 64 hex)producer_bundle.dsse_envelope_path(required)producer_bundle.payload_digest(required, 64 hex)producer_bundle.rekor.index(required, integer >= 0)producer_bundle.rekor.tile_id(required)producer_bundle.rekor.inclusion_proof_path(required)producer_bundle.attestation_refs[](optional list of stable refs)raw_bom_path(optional)vex_refs[](optional list of refs)
Response body:
evidence_idevidence_scorestored
Score lookup
GET /evidence/score?artifact_id=<artifact-id>
Response body:
evidence_scorestatus(ready)
Deterministic scoring algorithm
Inputs:
canonical_bom_sha256payload_digestsorted(attestation_refs)using ordinal lexical sort
Computation:
- join inputs with ASCII Unit Separator (
0x1F) evidence_score = SHA256(joined_bytes)(lowercase hex)
Validation is fail-closed:
- reject non-hex or non-64-byte digests
- reject missing required producer fields
- reject invalid Rekor index values
This contract is authoritative for Sprint 110 and blocks CONCELIER-ATTEST-73-001/002 and EXCITITOR-ATTEST-01-003/73-001/73-002.
Gate Artifact Extension (v1.1, 2026-02-10)
Promotion evidence consumers now rely on additional optional fields for policy-gate semantics:
producer_bundle.evidence_score_value(0-100 numeric score for threshold checks)producer_bundle.build_link.exists(bool)producer_bundle.build_link.product_digest.sha256|sha512(optional digest binding inputs)producer_bundle.artifact_digest.sha256|sha512(optional explicit artifact digest)producer_bundle.dsse_signatures[]:key_idalgorithmvalid
producer_bundle.rekor.checked_at(UTC RFC3339 timestamp for freshness TTL checks)producer_bundle.human_decision_dsse_ref(optional DSSE reference for signed escalation disposition)
Offline exports must retain enough metadata for air-gapped gate replay:
- Rekor proof references (
tile_id,inclusion_proof_path) and freshness timestamp. - DSSE signer evidence needed for k-of-n verification.
- Human decision DSSE reference when escalation policy requires signed disposition.
