quantum devops · open source · apache-2.0

Ship quantum code
like software.

Quantum programs return probability distributions, not values — and the same job costs $6 on one vendor, $961 on another. Qontinuum is the missing delivery pipeline: statistical regression testing, cost intelligence on every PR, noise-aware CI, and spend-guarded hardware runs.

$ pip install qontinuum
0
CLI commands
0
priced devices
0
tests behind it
$0
to run your whole CI
the problem

assert result == expected
doesn't work here.

Run a perfect Bell pair twice at 4,000 shots. You get two different answers — both correct. Every classical test runner calls that a failure. Regression testing quantum programs is a statistics problem, and your toolchain doesn't speak statistics.

run #1 — same circuit

50.3%
00
0.1%
01
0.2%
10
49.4%
11

run #2 — same circuit

49.1%
00
0.2%
01
0.1%
10
50.6%
11
01 · statistical testing

pytest, but it speaks distributions.

Decorate a circuit factory, attach checks. Assertions are statistical tests — total variation distance, chi-squared, fidelity, two-sample snapshot baselines — and every one is shots-aware: if your threshold is below the sampling noise floor, Qontinuum refuses to run a test that would be flaky by construction, and tells you the shot count that fixes it.

qont test
$ qont test q_test_bell.py::bell_pair  aer, 4000 shots, 30 ms    ✓ is_maximally_entangled  TVD 0.011 < 0.05    ✓ no_odd_parity_leakage q_test_ghz.py::ghz_5  aer, 4000 shots    ✓ snapshot  two-sample p = 0.44! q_test_deep.py::qaoa_layer    ! tvd_threshold=0.01 is below the sampling noise floor 0.0289      at 4000 shots. Use ≥ 33380 shots or threshold ≥ 0.0289. 2 passed, 0 failed, 1 statistically unsound
noise-aware CI — no account, no network
@qtest(shots=4000, backend="ibm:manila")   # real calibration snapshotdef bell_under_noise():    ... @qtest(shots=4000, backend="ibm:brisbane@live") # today's noisedef bell_today():    ... ✓ survives_real_calibration_noise  TVD 0.041 < 0.2 under ibm:manila
02 · noise-aware ci

Test against real hardware noise. Offline. Free.

IBM publishes per-device calibration data — gate errors, readout errors, T1/T2. Qontinuum turns it into local noise models, so every push answers "does my circuit still survive realistic noise?" without accounts, queues, or bills. Live calibration is one @live suffix away.

03 · cost intelligence

Same job. 100× price spread.

Providers price by shots, by seconds, by gate-shots, by credits. Qontinuum encodes every model in a verified, source-linked catalog and prices your whole suite before you spend a cent.

$0 vs $0

the identical 12,000-shot suite, cheapest vs priciest device

PROVIDERDEVICEMODELEST. COST
AWS BraketRigetti Cepheusper-shot$6.00
IBM QuantumHeron (PAYG)per-second$9.61
AWS BraketIQM Garnetper-shot$18.30
Azure QuantumIonQ Aria 1gate-shot formula$63.29
AWS BraketIonQ Forteper-shot$960.90
Azure QuantumQuantinuum H2HQC credits137.4 HQC
04 · the github action

Cost review becomes code review.

One sticky comment per PR, updated in place: every statistical check with its actual statistic, and what the suite would cost on real hardware. Like Infracost did for Terraform — a 100× price decision stops hiding in the invoice.

- uses: XTanishkX/quantum/action@main
⚛️
github-actionsbot · commented 12 seconds ago

⚛️ Qontinuum report

5 passed · 0 failed · 0 errors (5 tests, 20,000 shots, seed 42)

💸 Running this suite on real hardware

ProviderDeviceEst. cost
AWS BraketRigetti Cepheus$10.00
IBM QuantumHeron (PAYG)$16.01
AWS BraketIonQ Forte$1,601.50
05 · hardware routing & the spend guard

Pick hardware rationally. Spend deliberately.

qont route ranks devices by estimated success probability × price — cheap-but-noisy vs pricey-but-clean, resolved with one number. And when you do run on real QPUs, qont run prices the entire suite before the first shot is submitted. The default budget is $0: spending is always an explicit decision.

Rigetti Cepheus
$14.08
IBM Heron
$17.17
IQM Garnet
$34.74
IonQ Aria
$112.10

$ per successful shot batch — lower is better

qont run — the $0-default spend guard
$ qont run --on braket:rigetti_cepheusspend guard: estimated cost $10.00 exceeds the --max-costbudget $0.00; nothing was submitted.Re-run with --max-cost 10.00 or higher to proceed. $ qont run --on braket:rigetti_cepheus --max-cost 12ran on braket:rigetti_cepheus; estimated cost $10.00 bell_pair  hw:braket:rigetti_cepheus, 4000 shots    ✓ is_maximally_entangled  TVD 0.078 < 0.2
06 · observability

Watch your suite drift.

Every run appends to a local history. qont dashboard renders it as a single self-contained HTML file — status timeline, every check's statistic trending against its threshold, cost per run. No server, no JS dependencies. Statistics are captured even on passing runs, so healthy suites chart too.

🧮

Soundness floor

Assertions refuse thresholds that shot noise can't resolve — flaky-by-construction tests are config errors, not failures.

🔐

Content-addressed circuits

Canonical hashing ignores register names & formatting. qont diff shows only semantic changes.

📸

Quantum snapshots

Golden baselines compared with two-sample tests; circuit changes flag the snapshot stale — exactly like Jest.

🔌

Bring your SDK

Qiskit, QASM 2/3, Cirq circuits, PennyLane tapes — one loader, one runner, one report.

get started

Your first quantum test is 12 lines away.

q_test_bell.py
from qiskit import QuantumCircuitfrom qontinuum import qtest, assert_distribution @qtest(shots=4000)def bell_pair():    qc = QuantumCircuit(2)    qc.h(0); qc.cx(0, 1); qc.measure_all()    return qc @bell_pair.checkdef is_entangled(result):    assert_distribution(result, {"00": .5, "11": .5}, tvd_threshold=0.05)