SPDX 3.0.1 Profile Support

Version: Draft Status: Planned Sprint: SPRINT_20260107_004

This document describes StellaOps support for SPDX 3.0.1 and its profile-based model.


Overview

SPDX 3.0.1 introduces a profile-based model that extends the Core specification with domain-specific metadata. StellaOps implements the following profiles:

ProfileStatusDescriptionIntegration
CorePlannedFoundation for all elementsRequired
SoftwarePlannedPackages, files, snippetsScanner
LitePlannedMinimal CI/CD SBOMsScanner
BuildPlannedBuild provenanceAttestor
SecurityPlannedVulnerability assessmentsVexLens
LicensingFutureLicense expressionsPolicy
AIFutureAI model artifactsAdvisoryAI
DatasetFutureDataset metadataFuture

Current Support

SPDX 2.x (Current)

StellaOps currently supports SPDX 2.2 and 2.3:

SPDX 3.0.1 (Planned)

Full SPDX 3.0.1 support is planned with:


Profile Details

Core Profile

The Core profile is the foundation for all SPDX 3.0.1 documents.

Key Elements:

Required Fields:

Software Profile

The Software profile describes software components.

Key Elements:

Common Properties:

Example:

{
  "@type": "software_Package",
  "spdxId": "urn:stellaops:spdx:sha256-abc:Package:xyz",
  "name": "example-package",
  "software_packageVersion": "1.0.0",
  "externalIdentifier": [
    {
      "@type": "ExternalIdentifier",
      "externalIdentifierType": "packageUrl",
      "identifier": "pkg:npm/example-package@1.0.0"
    }
  ]
}

Lite Profile

The Lite profile provides minimal SBOMs for CI/CD pipelines.

Minimal Required Fields:

Use Cases:

Build Profile

The Build profile captures build provenance.

Implementation note (2026-05-15): the shared SPDX3 parser/model exposes typed StellaOps.Spdx3.Model.Build.Spdx3Build elements for Build profile payloads so Attestor and VexLens consumers can compile and parse local build provenance. Full SPDX 3 generation remains governed by the planned profile-support work.

Key Element:

Properties:

Integration with Attestor:

in-toto/SLSA             SPDX 3.0.1 Build
-----------              ----------------
buildType           -->  build_buildType
builder.id          -->  createdBy (Agent)
invocation.config   -->  build_configSourceUri
materials           -->  Relationships (GENERATED_FROM)

Security Profile

The Security profile describes vulnerability assessments.

Key Elements:

Integration with VexLens:

OpenVEX                  SPDX 3.0.1 Security
-------                  -------------------
status: affected    -->  VexAffectedVulnAssessmentRelationship
status: not_affected --> VexNotAffectedVulnAssessmentRelationship
status: fixed       -->  VexFixedVulnAssessmentRelationship
justification       -->  statusNotes
action_statement    -->  actionStatement

JSON-LD Structure

SPDX 3.0.1 uses JSON-LD format:

{
  "@context": "https://spdx.org/rdf/3.0.1/spdx-context.jsonld",
  "@graph": [
    {
      "@type": "SpdxDocument",
      "spdxId": "urn:example:doc",
      "creationInfo": {
        "@type": "CreationInfo",
        "specVersion": "3.0.1",
        "created": "2026-01-07T12:00:00Z",
        "createdBy": ["urn:example:tool:stellaops"],
        "profile": [
          "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/core",
          "https://spdx.org/rdf/3.0.1/terms/Software/ProfileIdentifierType/software"
        ]
      },
      "rootElement": ["urn:example:pkg:root"],
      "element": [
        "urn:example:pkg:root",
        "urn:example:pkg:dep1"
      ]
    },
    {
      "@type": "software_Package",
      "spdxId": "urn:example:pkg:root",
      "name": "my-application",
      "software_packageVersion": "2.0.0"
    }
  ]
}

API Usage

Scanner SBOM Generation

GET /api/v1/scan/{id}/sbom?format=spdx3&profile=software

Parameters:

ParameterValuesDefault
formatspdx3, spdx2, cyclonedxspdx2
profilesoftware, litesoftware

Attestor Build Profile

GET /api/v1/attestation/{id}?format=spdx3

VexLens Security Profile

GET /api/v1/vex/consensus/{artifact}?format=spdx3

Profile Conformance

Documents declare profile conformance in CreationInfo.profile:

{
  "profile": [
    "https://spdx.org/rdf/3.0.1/terms/Core/ProfileIdentifierType/core",
    "https://spdx.org/rdf/3.0.1/terms/Software/ProfileIdentifierType/software",
    "https://spdx.org/rdf/3.0.1/terms/Security/ProfileIdentifierType/security"
  ]
}

StellaOps validates documents against declared profiles when:


Migration from SPDX 2.x

Parallel Support

During transition, StellaOps supports both formats:

  1. SPDX 2.x - Default for backward compatibility
  2. SPDX 3.0.1 - Opt-in via format=spdx3

Key Differences

AspectSPDX 2.xSPDX 3.0.1
FormatFlat JSONJSON-LD
Version fieldspdxVersionspecVersion in CreationInfo
Packagespackages[] array@graph with @type
Relationshipsrelationships[]Relationship elements in @graph
Checksumschecksums[]verifiedUsing IntegrityMethod
PURLexternalRefsexternalIdentifier

Version Detection

StellaOps auto-detects SPDX version:

// 2.x: Has spdxVersion property
if (root.TryGetProperty("spdxVersion", out _))
    return SpdxVersion.V2;

// 3.x: Has @context property
if (root.TryGetProperty("@context", out _))
    return SpdxVersion.V3;

Air-Gap Considerations

For air-gapped deployments:

  1. Bundle contexts locally - SPDX JSON-LD contexts must be available offline
  2. Configure local context URIs - Point to local context files
  3. Validate offline - Use bundled schemas for validation
# etc/spdx3.yaml
Spdx3:
  ContextResolution:
    Mode: Local  # or Remote, Cached
    LocalContextPath: /etc/stellaops/spdx3-contexts/

References