Software bill of materials#
The sbom GitHub Actions workflow generates a software bill of materials (SBOM)
from the committed dependency-manifest/ snapshots. It runs on pushes to
main, version tags, pull requests that change its inputs or tooling, and manual
dispatch. Download xr-ai-sbom-<commit> from the workflow run’s artifacts:
xr-ai.spdx.json: SPDX 2.3 JSON for dependency analysis tools.xr-ai.cdx.json: CycloneDX JSON for dependency analysis tools.xr-ai.syft.json: Syft’s native inventory and discovery evidence.provenance.json: source revision, qualification cutoffs, input and output SHA-256 digests, generator version, and package counts by ecosystem.
Artifacts are retained for 90 days. Download and retain them alongside release materials when longer retention is required.
Generate locally#
Install Syft 1.55.0 and uv (Python 3.11 or later). From the repository root, run:
uv run --script .github/scripts/generate_sbom.py
Use --syft /path/to/syft to select the executable and --output-dir <directory>
to change the default dist/sbom/ destination. Generation reads lockfiles
without installing their packages or resolving newer versions. It includes web
development dependencies and both Android application and buildscript locks.
The generator checks every in-scope locked package name and version against
the native inventory and fails if a package is missing or unexpected.
The snapshots and uv.toml must match HEAD; generation rejects uncommitted
input changes. Provenance hashes include uv.toml and record both the global
cutoff and package-specific cutoff overrides.
CI also validates the SPDX document with spdx-tools. npm’s local SDK download
reference is preserved as source information and represented as NOASSERTION
in SPDX’s absolute download-location field.
Coverage#
This SBOM describes the qualified dependency snapshot, which changes during
qualification refreshes and targeted security updates. Ordinary project changes
can precede the next snapshot refresh. The Python lock includes mutually
exclusive environments and platform alternatives; their union is an inventory,
not a claim that all packages can be installed together. Refer to
DEPENDENCIES.md
for snapshot refresh rules and dependency boundaries.
The inventory covers locked third-party Python runtime dependencies, including
registry and git sources, web runtime and development dependencies, and Android
application and buildscript dependencies recorded in those locks. Python editable workspace members and the virtual
manifest root are excluded from all three inventories; they are not assigned
PyPI identities. License fields are limited to metadata in the inputs;
generation does not fetch license texts or establish license compliance. The SBOM does not
replace THIRD_PARTY_NOTICES.md or third_party_licenses/.
Installed environments, container operating-system packages, native libraries bundled inside wheels or SDK archives, Apple client dependencies, and Python build-system requirements outside the lock are outside this inventory’s scope. Use an SBOM generated from the final wheel, application, or container to describe redistributed contents.