SBOM Evidence Fusion & Dependency Graph Repair Engine
Tracker idea: OC-009
Goal: repair incomplete SBOM dependency graphs using independent evidence while preserving provenance and refusing unsafe "unreachable" conclusions when graph evidence is incomplete.
Why this exists
CycloneDX explicitly notes that components omitted from a dependency graph may have unknown dependencies, not zero dependencies. Existing SBOM tools already aggregate or assemble documents; this project targets a narrower problem: reconcile dependency-edge evidence from independent sources, score relationship confidence, detect degenerate graphs, and keep reachability uncertainty visible.
Implemented end-to-end flow
- Ingest CycloneDX JSON, SPDX JSON, npm
package-lock.json, pnpm/yarn JSON dependency trees,pip inspectJSON,poetry.lock, Mavendependency:treetext, and generic runtime/build evidence JSON. - Normalize component identity using PURLs when available.
- Detect empty/degenerate dependency graphs per source.
- Fuse positive edge evidence with source-specific weights.
- Classify edges as
confirmed,probable, orunknown. - Emit repaired CycloneDX and SPDX documents, a graph-diff summary, and an evidence/provenance sidecar.
- Answer reachability queries with
reachable,unreachable, orunknown; absence of a path is not treated as proof when completeness is insufficient. - Run a deterministic 100-case synthetic benchmark that measures fusion recovery against known ground truth.
Install
python -m pip install https://github.com/virajsabhaya23/sbom-evidence-fusion/releases/download/v0.1.0/sbom_evidence_fusion-0.1.0-py3-none-any.whl
Demo
sbom-fuse fuse examples/source-a.cdx.json examples/source-b.spdx.json examples/package-lock.json --out-dir demo-out
cat demo-out/evidence-ledger.json
Expected: the alpha -> beta relationship missing from the CycloneDX source is recovered from SPDX + package-lock evidence, and every repaired edge contains source provenance.
Reachability
sbom-fuse reach examples/source-a.cdx.json examples/source-b.spdx.json examples/package-lock.json \
--from pkg:npm/demo-app@1.0.0 --to pkg:npm/beta@2.0.0 --json
Tests
python -m unittest discover -s tests -v
Benchmark
python benchmark/generate_benchmark.py
The included benchmark is deterministic and synthetic. It validates the fusion algorithm mechanically; it is not represented as the planned real-world 100-project benchmark across Syft/Trivy/Microsoft SBOM Tool/GUAC-style workflows.
Architecture
parsers.py: format-specific evidence ingestionidentity.py: cross-source component normalizationfusion.py: graph diagnostics, evidence fusion, confidence, safe reachabilityexporters.py: repaired CycloneDX + evidence ledgercli.py: local zero-service CLI
See docs/SPEC.md and docs/THREAT_MODEL.md.
Originality boundary
This repository does not claim originality for SBOM aggregation, graph storage, hidden dependency discovery, or package-manager parsing. The proposed contribution is the combination of:
- explicit per-edge evidence provenance;
- confidence-based cross-source relationship repair;
- graph-degeneracy detection; and
- uncertainty-aware reachability that refuses a closed-world negative verdict when the evidence base is incomplete.
Those claims still require external validation and independent adoption before they can support any "major significance" argument.
Current limitations
- Reference implementation supports CycloneDX JSON, SPDX JSON, npm package-lock v2/v3, pnpm/yarn JSON dependency-tree exports, pip inspect JSON, Poetry lock files, and Maven dependency-tree text.
- Raw pnpm/yarn lockfile YAML is intentionally not parsed without a YAML dependency; use their JSON resolution/list output as evidence.
- Confidence weights are transparent defaults, not statistically calibrated probabilities.
- Real-world 100-project multi-generator validation remains required before publication of comparative claims.
License
Apache-2.0
Metadata
Release files for sbom-evidence-fusion 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sbom_evidence_fusion-0.1.1.tar.gz | 15.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sbom_evidence_fusion-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.0 kB
Release files / sbom_evidence_fusion-0.1.1.tar.gz
| Download URL | sbom_evidence_fusion-0.1.1.tar.gz |
|---|---|
| Size | 15.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d034642064bed62cc95a1aeb5b406de873fa06ece08649bd5a081ec9dc2fe66f
|
|
BLAKE2b-256 checksum How to use checksums |
40e046a08f11b92fc54fd0a3e0aa34a6cd16cf119a807f2957a4f3f72e5bed1c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.
Transparency logRelease files / sbom_evidence_fusion-0.1.1-py3-none-any.whl
| Download URL | sbom_evidence_fusion-0.1.1-py3-none-any.whl |
|---|---|
| Size | 17.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1d72e26fb39961472a92c48e5e152af8f6c8dc0fef3cfeb84725dbe8082d73a1
|
|
BLAKE2b-256 checksum How to use checksums |
b9cd357fd52bca1fef73157cf8357d1571fd7d6b60ed48692f1eefa9d2a82f57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 16, 2026.
Transparency log