The root component is the thing the SBOM is about: your application, library or image. SPDX marks it with a DESCRIBES relationship. CycloneDX puts it in the metadata component. Without it, a reader sees a list of parts with no whole, and tools cannot merge, diff or attribute the file correctly.
Where it lives
| Format | Where the subject is stated | Other components |
|---|---|---|
| SPDX | A DESCRIBES relationship from the document to the main package | Linked by DEPENDS_ON and similar |
| CycloneDX | The component in the metadata section | Listed under components, linked by dependencies |
The SPDX specification defines DESCRIBES as used when the document describes a given element, and calls it mandatory if more than one package or set of files is present. CycloneDX tooling relies on the metadata component too. The CycloneDX CLI, for instance, requires each input's subject in the metadata component for a hierarchical merge.
What a good root says
- A name that matches how you refer to the product.
- A version that matches the release.
- A type: application, library, container or firmware.
- A package URL or other identifier, where one exists.
- The supplier, if you are shipping to others.
Four things it makes possible
- Attribution. A customer with ten of your SBOMs can tell which is which.
- Merging. A hierarchical merge nests each input under its subject. With no subject, it cannot.
- Diffing. Comparing release 1.4 against 1.5 starts with knowing both describe the same product.
- Scanning. A scanner can report findings against a product and version, not an anonymous file.
Common mistakes
- Leaving the root as a placeholder name such as unknown or the folder name.
- Using the same version for every release because the field was never wired to the build.
- Putting the root in as a normal dependency, so it appears as a component of itself.
- Mixing up the SBOM version, which counts revisions of the document, with the product version.
How to fix it in a pipeline
Pass the product name and version into the generator from your build variables. Several tools take a main component version option for this. Validate that the root is present before you upload.
Containers add a wrinkle. For an image, the root is usually the image itself, identified by name and digest, and the packages inside are its components. If you describe an application running in that image, you may want two roots in two files, one for the app and one for the image, instead of forcing both into a single subject. Keeping them apart makes it clear which team owns which findings.
Quick check
Is the root component the same as the top dependency?
No. It is the product itself. Its dependencies come below it.
What if I scan a directory with no product name?
Set the name and version explicitly. Do not rely on the folder name.
Safeguard's SBOM and dependency scanning organizes findings by project and version, and a free scan is available at gold.safeguard.sh/scan.
Sources
Last reviewed: 19 October 2026.