Software Requirements: Software Bill of Materials & Supply-Chain Assurance¶
Prepared toward requirements baseline v1.7 (ADR-0062, registered at ADR-0062 D-5).
These rows govern the production supply chain of LQMS itself (they are the SOUP list
REQ-NFR-010 always referred to), driven by EU CRA reporting/SBOM duties, ISO 13485
§4.1.6 supplier context, IEC 62304 §8.1.2 SOUP discipline, and IEC 81001-5-1 SCA
practice. The tooling lives in CI, Gradle/npm build config and docs/security/
(outside the product code/test globs), so these rows enter the traceability matrix as
curated accepted-gap / future per their realization state, not as product-code
gaps.
| ID | Requirement | Trace |
|---|---|---|
| REQ-SBOM-001 | The system shall generate, per tagged release, a CycloneDX (JSON) SBOM at version ≥ 1.5 over everything that executes in production — L1 (backend Gradle runtimeClasspath, transitive), L2 (the npm production tree bundled into the artifact), and L3 (the container image's base-OS packages + JRE) — merged into ONE release SBOM carrying the release identity triple (version, git SHA, image digest); L4 deployment composition (postgres, keycloak image digests) shall be a SEPARATE deployment manifest and L5 build/dev tooling shall be excluded from the SBOM; SPDX shall be exportable on demand. |
STR-013, STR-014; ADR-0062 |
| REQ-SBOM-002 | SBOM accuracy shall be validated against the built artifact: a syft scan of the final image shall be cross-checked against the declared L1 + L2 components (IEC 81001-5-1 practice) and CI shall fail on any undeclared component. | STR-014; ADR-0062 |
| REQ-SBOM-003 | License compliance shall be enforced on BOTH stacks against the same all-permissive allow-list — the npm production tree and the backend Gradle runtimeClasspath — failing the build on any license not on the allow-list; unavoidable exceptions (e.g. Jakarta EE API jars) shall be recorded in the checked-in exceptions file, never granted ad hoc. |
STR-014; ADR-0062, ADR-0074 |
| REQ-SBOM-004 | Vulnerabilities shall be monitored continuously and gated at release: Dependabot shall watch the npm, Gradle and docker ecosystems; a grype/osv scan over the release SBOM at tag time shall BLOCK the release on any finding at or above the High threshold UNLESS a recorded triage decision exists, with docs/security/vuln-triage.md as the SOLE source of such exceptions (a controlled document in LQMS later). |
STR-014; ADR-0062, REQ-NFR-010 |
| REQ-SBOM-005 | The release job shall flag stale / end-of-life upstream components for human judgment, recorded in the triage log; the dependency delta versus the previous release shall ride the per-release validation report (ADR-0061). | STR-014; ADR-0062, ADR-0061 |