The Quantum Reproducibility Crisis
Quantum computing experiments are notoriously difficult to reproduce. When a paper claims "We achieved 73% fidelity on Grover's algorithm", reviewers and researchers have no way to verify or reproduce the result because critical information is missing.
What's actually needed: Exact versions of qiskit, qiskit-aer, numpy, scipy; which of the 127 qubits were used; what were the error rates; what optimization level; what routing algorithm.
You can't reproduce what you can't document. QBOM solves this by automatically capturing complete experiment provenance with zero code changes required.
| Capability | QBOM | Manual Logging | Notebooks |
|---|---|---|---|
| Zero code changes | Yes | No | No |
| Automatic capture | Yes | No | No |
| Calibration data (T1, T2, error rates) | Yes | Rarely | Rarely |
| Transpilation details | Yes | Often forgotten | Often forgotten |
| Content verification (hashing) | Yes | No | No |
| SBOM export (CycloneDX/SPDX) | Yes | No | No |
What is QBOM
QBOM (Quantum Bill of Materials) automatically captures complete provenance for quantum computing experiments. Just add one import line to your code, and QBOM invisibly records everything needed to reproduce your experiment.
Zero Code Changes
Add import qbom and your existing quantum code works unchanged. Provenance capture is invisible.
Multi-Framework Support
Full support for Qiskit, Cirq, and PennyLane. AWS Braket support planned.
Reproducibility Scoring
Get a 0-100 score showing how reproducible your experiment is, with detailed component breakdown.
Standard Exports
Export to CycloneDX and SPDX formats for software supply chain integration.
Getting Started
Installation
Requires Python 3.10+. Clone and install from source:
git clone https://github.com/csnp/qbom.git
cd qbom
pip install -e ".[qiskit]" # Qiskit support
qbom --version
Framework options:
pip install -e ".[qiskit]" # Qiskit support
pip install -e ".[cirq]" # Cirq support
pip install -e ".[pennylane]" # PennyLane support
pip install -e ".[all]" # All frameworks
Basic Usage
Add a single import line to your quantum code:
import qbom # Add this single line - that's it!
# Your existing quantum code - unchanged
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.measure_all()
backend = AerSimulator()
job = backend.run(qc, shots=4096)
result = job.result()
# View what was captured
qbom.show()
Sample Output
╭──────────────────────────── QBOM: qbom_c4b17b13 ─────────────────────────────╮
│ Summary: 2 circuits | on aer_simulator | 4,096 shots │
│ Created: 2025-01-15 14:30:07 UTC │
│ │
│ ENVIRONMENT │
│ Python: 3.11.12 │
│ qiskit: 2.2.3, qiskit-aer: 0.17.2, numpy: 1.26.4 │
│ │
│ CIRCUIT │
│ Name: bell_state | Qubits: 2 | Depth: 3 | Gates: 5 │
│ │
│ HARDWARE │
│ Backend: aer_simulator | Type: Simulator │
│ │
│ EXECUTION │
│ Shots: 4,096 │
│ │
│ RESULTS │
│ |11⟩ ███████████████░░░░░░░░░░░░░░░ 50.8% │
│ |00⟩ ██████████████░░░░░░░░░░░░░░░░ 49.2% │
╰──────────────────────────────────────────────────────────────────────────────╯
What Gets Captured
| Category | What's Captured |
|---|---|
| Environment | Python version, all package versions |
| Circuit | Gates, depth, qubits, content hash |
| Transpilation | Optimization level, qubit mapping, routing |
| Hardware | Backend, calibration (T1, T2, error rates) |
| Execution | Shots, job ID, timestamps |
| Results | Counts, probabilities, result hash |
How It Works
import qbom # 1. Import hook installed
from qiskit import ... # 2. Qiskit adapter activates
transpile(circuit, backend) # 3. Transpilation captured
job = backend.run(circuit) # 4. Execution captured
result = job.result() # 5. Results captured, trace saved
Traces are stored in ~/.qbom/traces/.
Reproducibility Score
QBOM calculates a 0-100 score showing how reproducible your experiment is:
| Score | Rating | Meaning |
|---|---|---|
| 90-100 | Excellent | Fully reproducible |
| 70-89 | Good | Minor details missing |
| 50-69 | Fair | Some information missing |
| 25-49 | Poor | Major gaps |
| 0-24 | Critical | Cannot reproduce |
$ qbom score qbom_c4b17b13
╭─────────────────────────── Reproducibility Score ────────────────────────────╮
│ 71/100 (Good) │
╰──────────────────────────────────────────────────────────────────────────────╯
┏━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┓
┃ Component ┃ Score ┃ Status ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━┩
│ Environment │ 20/20 │ ● │
│ Circuit │ 17/20 │ ◐ │
│ Transpilation │ 7/15 │ ◐ │
│ Hardware │ 9/25 │ ◐ │
│ Execution │ 10/10 │ ● │
│ Results │ 8/10 │ ● │
└───────────────┴───────┴────────┘
CLI Reference
| Command | Description |
|---|---|
qbom list |
List recent traces |
qbom show <id> |
Display trace details |
qbom score <id> |
Calculate reproducibility score |
qbom validate <id> |
Check trace completeness |
qbom diff <id1> <id2> |
Compare two traces |
qbom drift <id> |
Analyze calibration drift |
qbom export <id> <file> |
Export to file |
qbom paper <id> |
Generate paper statement |
qbom verify <file> |
Verify trace integrity |
Example: List Recent Traces
$ qbom list
Recent QBOM Traces
╭───────────────┬──────────────────┬───────────────┬─────────┬───────╮
│ ID │ Created │ Backend │ Circuit │ Shots │
├───────────────┼──────────────────┼───────────────┼─────────┼───────┤
│ qbom_c4b17b13 │ 2025-01-15 14:40 │ aer_simulator │ 2q, d=3 │ 4,096 │
│ qbom_bf522429 │ 2025-01-15 14:45 │ aer_simulator │ 2q, d=3 │ 1,024 │
│ qbom_b8678a13 │ 2025-01-15 14:46 │ aer_simulator │ 2q, d=3 │ 1,024 │
╰───────────────┴──────────────────┴───────────────┴─────────┴───────╯
Example: Generate Paper Statement
$ qbom paper qbom_c4b17b13
Reproducibility Statement
(For Methods section)
Experiments were performed using qiskit==2.2.3 on the aer_simulator simulator.
Circuits were transpiled with optimization level 2. Each experiment used 4,096
shots.
Complete QBOM trace: qbom_c4b17b13
Content hash: a9463e429a524897
Export Formats
qbom export <id> trace.json # JSON (default)
qbom export <id> trace.cdx.json -f cyclonedx # CycloneDX SBOM
qbom export <id> trace.spdx.json -f spdx # SPDX SBOM
qbom export <id> trace.yaml -f yaml # YAML
Python API
import qbom
# View current trace
qbom.show()
# Get trace object
trace = qbom.current()
print(trace.environment.packages)
print(trace.hardware.backend_name)
# Export
qbom.export("experiment.json")
# Scoped experiments
with qbom.experiment(name="VQE optimization"):
# quantum code here
pass
Ready to Make Your Quantum Experiments Reproducible?
Get started with QBOM today - one import for complete provenance capture with zero code changes.
View on GitHub Take QRAMM AssessmentRelated Resources
- CryptoScan Guide - Source code cryptographic discovery
- TLS Analyzer Guide - Network security assessment
- CryptoDeps Guide - Dependency crypto analysis
- PQC-Bench Guide - Post-quantum algorithm recommendations