sbom-tools v0.1.22
Highlights
The AI BOM release. sbom-tools now treats AI systems as a first-class domain across the whole pipeline: it parses CycloneDX ML-BOMs and SPDX 3.0 AI/Dataset profiles, scores AI-readiness (AI-001…AI-010), machine-checks the EU AI Act (Annex IV) and the G7/BSI "SBOM for AI — Minimum Elements" standards, diffs model and dataset changes semantically, verifies model-weight integrity, enriches Hugging Face components, and renders AI-BOMs as a dedicated profile in the TUI (Models / Datasets / AI-Readiness tabs).
Alongside the AI work this release lands a large wave of correctness and security fixes — including a hostile-SBOM stack-overflow, empty OSV severity data, and broken CycloneDX XML parsing — a new convert command (CycloneDX ↔ SPDX), KEV/EPSS vulnerability enrichment with an offline/air-gapped mode, and broad CLI/TUI alignment.
Please read Upgrade notes below — this release changes several user-visible behaviors (scoring engine 2.1, stricter license-policy gating, logs moved to stderr, official EPSS endpoint).
What's New
AI / ML Bill of Materials
- AI-readiness scoring profile. A dedicated
quality --profile ai-readiness(and TUI AI-BOM profile) grades ten AI-specific checks (AI-001…AI-010): model-card, architecture, training datasets, quantitative analysis, fairness, ethical considerations, use-cases, limitations, energy, and model-weight hash integrity. (#205, #239, #246) - CycloneDX ML-BOM + SPDX 3.0 AI/Dataset parsing. Spec-compliant CycloneDX
modelCardparsing (typed fairness/quantitative-analysis/considerations) and SPDX 3.0 AI + Dataset profile metadata including thetrainedOnrelationship. (#204, #208, #239) - Semantic ML model & dataset diffing. Model and dataset changes are diffed field-by-field — quantization, architecture, training-dataset add/remove, dataset sensitivity — with high diff-costs on provenance-loss and PII-escalation signals, instead of opaque blobs. (#244)
- Model-weight integrity & Hugging Face enrichment. New AI-010 weight-hash check, a
verify model-weights --model-dirsubcommand (direct + HF cache layouts), and a Hugging Face enrichment source that mapssiblings[].lfs.sha256→ component hashes,pipeline_tag→ task, and routespkg:huggingfacemodels into the vulnerability stack. (#246, #253) SBOM-AIBOM-*SARIF rule family for AI-readiness findings, and TUI rendering of ML model / dataset metadata in the component-detail panel. (#207, #206)
Compliance
- EU AI Act (Annex IV) readiness compliance level with
SBOM-AIACT-*SARIF rules, N/A-gated for non-AI SBOMs and severity-escalated by the CRA high-risk-AI flag. (#245) - G7 / BSI "SBOM for AI — Minimum Elements" readiness — a new
validate --standard bsi-aiprofile that scores an AI-BOM element-by-element across the seven BSI clusters (Metadata, System-Level, Models, Datasets, Infrastructure, Security) withSBOM-BSIAI-*rules. (#255) - Compliance rule registry. Every violation now carries a stable
rule_id; SARIF rule IDs and standard references come from a single registry instead of fragile message-text matching. (#231, #233)
Cross-format conversion
convertcommand. Re-emit any parsed SBOM to CycloneDX 1.7 or SPDX 2.3 with a fidelity report listing synthesized/dropped fields, built on an opt-in source-field preservation slot. (#241, #243, #247)
Vulnerability enrichment
- CISA KEV and EPSS enrichment. New
--kev/--epssflags surface Known-Exploited-Vulnerabilities flags and EPSS exploit-probability on vulnerabilities, with--fail-on-kevgating, KEV/EPSS columns in reports, and a watch-mode "entered KEV" alert. (#235, #237) - Offline / air-gapped mode + cache management. A global
--offline(andSBOM_TOOLS_OFFLINE) serves enrichment purely from cache, plus a newcache status / warm / clear / export / importsubcommand for sneakernet transfer. (#238) - Unified enrichment platform. All sources (OSV, EOL, VEX, KEV, staleness, EPSS, Hugging Face) now share one
EnrichmentSourcetrait, an atomic-write cache with schema versioning, and a single retry/User-Agent HTTP client. (#230)
CLI & TUI
- Global
--configfile is now honored by every command (it was previously read only byconfig show), with CLI-flag > file > default precedence. (#227) - Stdin input (
-as a path) fordiff/quality/validate/query/vex, enablingsyft … | sbom-tools quality -pipelines. (#224) - Typed exit codes & NDJSON output. Per-command exit codes,
clapvalue-enums (typos fail at parse), and a wired-o ndjsonformat. (#226) - Document-metadata diffing.
diffnow reports author, tool, timestamp, spec-version, signature and serial-number changes. (#254) - AI-BOM is first-class in the TUI — detected as its own profile with AI-readiness scoring and dedicated Models / Datasets / AI-Readiness tabs, plus EPSS/KEV badges, a KEV filter, richer component detail, and a profile-aware help overlay. (#258, #257, #259, #261, #260, #223)
Bug Fixes
- Hostile-SBOM stack-overflow fixed. Cycle detection is now iterative (Tarjan SCC); a deeply-nested dependency chain previously aborted the process (and any FFI host) via stack overflow. (#215)
- OSV enrichment now carries severity / CVSS / description. Results from
/v1/querybatch(id-only) are hydrated via/v1/vulns/{id}; previously enriched vulnerabilities had empty severity and were cached empty for 24h. (#219) - CycloneDX XML parsing fixed for spec-conformant documents (components, dependencies, vulnerabilities, license choice, xmlns spec version). (#214)
- License policy correctness.
fail_on_conflictnow actually fails, concluded-only licenses are evaluated against the deny list, and deny-patterns match per-operand in SPDX expressions (deny "GPL-*"now catchesMIT OR GPL-3.0-only). (#212) - Per-component license changes are populated in diffs (the field was always empty), and the Licenses TUI tab no longer falsely reports "no changes". (#211, #259)
- Watch mode no longer fires false "resolved vulnerability" alerts on file changes (re-parsed SBOMs are now enriched before diffing). (#221)
- Incremental diff cache no longer splices sections from an unrelated cached pair, and diff errors propagate instead of becoming "no changes". (#217)
- Deterministic diffs. Fixed-seed MinHash and stable solver ordering make diff output reproducible above the LSH threshold (CI
--fail-on-*gating). (#218) - Machine output is parseable again. Logs are written to stderr so
-o json/-o sarif/-o ndjsonon stdout is valid when piped or redirected (previously twoINFOlines preceded the JSON, breaking SARIF upload andjq). (#256) - Multi-SBOM commands honor their flags.
diff-multi/timeline/matrixnow apply--graph-*/filter/rules and can reach exit code 4, and reject unsupported-ovalues. (#225) - Output hardening. CSV formula-injection guard, terminal control-char sanitization, and a TUI panic hook that restores the terminal. (#213)
- Enrichment entry-point consistency.
enrich/watch/querynow route through the unified orchestrator so--kev/--epss/--huggingfacetake effect everywhere,query --offlineno longer makes network calls, and the EPSS default endpoint is the official FIRST host with a response-size bound. (#249, #248, #247) - FFI binding parity. The
AiReadinessprofile is exposed in the Go / Swift wrappers with a CI drift check, and thesbom-tools-fficrate's version/cargo publishblockers are fixed. (#216, #234)
Performance
- Sparse assignment matching. The dense O(n²) Hungarian path (≈200 MB / effective hang on cross-format diffs) is replaced by a sparse solver over the candidate edge list. (#232)
- In-place enrichment mutation removes a 2× component-map copy per pass, and report-stage compliance is computed lazily per reporter. (#236)
- TUI dependency tab caches its graph and uses an iterative longest-path, eliminating a per-frame rebuild and an exponential depth calculation. (#223)
Internal & Quality
- Compliance engine split into a
StandardCheckerper-standard module layout behind a registry, and the enrichment platform unified behind one trait. (#233, #230) - cli / tui feature gates so the FFI staticlib and fuzz targets no longer link ratatui/clap/rustls (FFI dependency tree 281 → 104 crates). (#228)
- Test infrastructure. A ratatui
TestBackendsnapshot harness for the TUI, golden snapshots for all report formats (plus streaming-JSON validity fixes), graph-shaped hot-path benches, and diff/scoring property tests. (#229, #240, #242, #218)
Infrastructure
- Dependency bumps:
ratatui0.30.0 → 0.30.1,chrono0.4.44 → 0.4.45,regex1.12.3 → 1.12.4,reqwest0.13.3 → 0.13.4,serde_json1.0.149 → 1.0.150,libfuzzer-sys0.4.12 → 0.4.13, plus dagger-SDK-only bumps. New runtime dependency:flate2(gzip, enrichment feature) for the EPSS bulk feed. (#251, #252, #195, #196, #222, #248) - GitHub Actions bumps:
codeql-action→ 4.36.1,cargo-deny-action→ 2.0.20,actions/checkout→ 6.0.3; SHA-pin hygiene + expanded Dependabot coverage; fuzz CI now installscargo-fuzzwith the nightly toolchain. (#193, #194, #199, #200, #202) - Total tests: 1560 (1014 lib + 546 integration), up from 1214 in v0.1.21.
- 0 clippy warnings (default + all-features) on Rust 1.88; 0 production
unwrap().
Upgrade notes
These behaviors changed in this release:
- Scoring engine 2.0 → 2.1. Cycle detection now counts strongly-connected components (actual cycles) rather than DFS back-edges, so quality scores for SBOMs with cyclic dependencies may change. (#215)
semantic_scorenow counts per-component license transitions, so diffs that change a component's license score slightly lower than before. (#211)- License-policy gating is stricter.
license-checknow fails on license conflicts and concluded-only denied licenses that previously passed silently — CI gates may newly fail (correctly). (#212) - Logs are on stderr. Anything parsing tool stdout for log lines must now read stderr; machine-readable report output on stdout is clean. (#256)
- EPSS default endpoint moved to the official FIRST host
epss.empiricalsecurity.com(gzip). Override with--epss-url/SBOM_TOOLS_EPSS_URL. (#248) - Library API:
IncrementalDiffEngine::diffandMultiDiffEngine::{diff_multi,timeline,matrix}now returnResult. (#217)
Acknowledgments
The AI-BOM direction in this release was driven by @MChorfa (Mohamed Chorfa), who proposed the original ML-BOM and AI-readiness work and filed the issues this release implements: AI-BOM model-card scoring (#184), SBOM-AIBOM SARIF rules (#185), SPDX 3.0 AI-profile parsing (#186), and TUI ML/dataset display (#187). Thanks also to @jkowalleck (Jan Kowalleck) for the CycloneDX Tool Center invitation (#176) behind the new submission guide (#177), and continued thanks to @cmyank0 and @VincentR-OCD whose issue reports keep sbom-tools' diff and enrichment output honest.
This release also builds on the public security and standards work behind the G7/BSI "SBOM for AI" minimum elements, the EU AI Act, CISA KEV, and FIRST EPSS.
Install: cargo install sbom-tools
Homebrew: brew install sbom-tool/tap/sbom-tools
Crate: https://crates.io/crates/sbom-tools
Full changelog: v0.1.21...v0.1.22