# ADR 0004 — SBOM and supply-chain provenance - Status: Accepted - Date: 2026-07-05 ## Context This package underpins security-scenario content across the ACES ecosystem. Consumers (and their own downstream auditors) need to know exactly what a given release contains and depends on. A Software Bill of Materials (SBOM) is the standard, machine-readable way to provide that, and it is a prerequisite for supply-chain review and vulnerability triage. ## Decision - Every release produces a **CycloneDX** SBOM in JSON format, generated from the installed distribution and its resolved dependencies (`cyclonedx-py environment`). CycloneDX is chosen for broad tooling support in the security ecosystem. - The SBOM is **attached to the GitHub Release** alongside the wheel and sdist (ADR 0003) and uploaded as a build artifact, so every published version has a downloadable component inventory. Embedding the SBOM inside the wheel is deferred; the Release attachment plus PyPI's OIDC provenance is the supply-chain record for now. - The SBOM is generated in the release workflow, not committed to the source tree, so it always reflects the actual built artifact. - Because publishing uses OIDC trusted publishing (ADR 0003), the release also carries PyPI's provenance/attestation; the SBOM complements that with the component inventory. ## Consequences - Each published version has a verifiable component inventory a consumer can feed into supply-chain and vulnerability tooling. - The release workflow gains an SBOM-generation step and a dependency on `cyclonedx-py` (build-time only, not a runtime dependency of the package). - Keeping the dependency surface minimal (currently `PyYAML`) keeps the SBOM small and the attack surface low; adding a runtime dependency is a deliberate, reviewable change reflected in the next release's SBOM.