Scope rule (D-2 — "which parts need to be listed"): everything that executes in
production. L1 backend Gradle runtimeClasspath (transitive) + L2 npm production
tree (bundled into the artifact) + L3 container image layer (base OS packages + JRE) form
the product SBOM; L4 deployment composition (postgres, keycloak image digests) is a
separate deployment manifest (distinct upstream products we prescribe and watch); L5
build/dev tooling is excluded from the SBOM (tracked by Dependabot; provenance = git SHA +
CI run). Production-only matches the license gate's --production posture.
Format (D-1): CycloneDX (JSON) ≥ 1.5 primary — first-class tooling on every layer
(Gradle plugin, cyclonedx-npm, syft) and a native VEX lane; SPDX exportable on demand.
Per-artifact SBOMs merged into one release SBOM carrying the same identity triple
(version, git SHA, image digest) as everything else.
Validation duties ("how do we have to validate them"):
a. Accuracy against the artifact — syft scan of the final image cross-checked against the
declared L1+L2 (IEC 81001-5-1 practice); CI fails on undeclared components.
b. License compliance on BOTH stacks — the npm gate stays; a Gradle-side gate with the
same all-permissive allow-list closes today's half-enforced posture.
c. Vulnerability monitoring + triage — Dependabot alerts continuously; grype/osv over the
release SBOM at tag time; findings above threshold block unless a recorded triage decision
exists. Triage record home (D-4): docs/security/vuln-triage.md now, a controlled
document in LQMS later (dogfood).
d. Currency + delta — regenerated per release by construction; the dependency delta vs
the previous release rides the validation report (ADR-0061).
e. EOL watch — release job flags stale upstreams; judgment stays human, in the triage log.
Pull-forwards (D-3 — effective immediately):npm + docker ecosystems join
dependabot.yml (both were missing — webui updates arrived only via the gradle graph, images
not at all); the Gradle license gate is the first P2 work item.
Requirements (D-5): REQ-SBOM rows (generate per release, verify against artifact, triage
duty) enter at the v1.7 baseline.
Phases P1 (generate) → P2 (gate) → P3 (report integration) → P4 (CRA readiness review when
commercialization nears or the Q3-2026 harmonised standards publish) — per the planning doc,
which holds the tooling detail.
The SBOM becomes the SOUP list REQ-NFR-010 always referred to, with the triage log as the
"findings triaged" evidence.