Pre-registration Protocol for Hardware Campaigns
July 7, 2026 · View on GitHub
Why pre-register
Hardware experiments on a shared QPU are expensive and
under-specified by nature — the submitter decides post hoc what
counts as a "successful" run. Without a protocol frozen before the
first circuit is submitted, hypothesis-after-the-results
(HARKing), garden-of-forking-paths analysis, and selective
reporting become indistinguishable from honest discovery. The
Phase 1 DLA parity campaign (data/phase1_dla_parity/) pre-dates
this policy but was documented retroactively in
docs/falsification.md C2 with the specific falsifiers we would
now have named in a pre-registration.
Every scpn-quantum-control hardware campaign from Phase 2 onward
must be pre-registered on OSF (Open Science Framework) before the
first circuit is submitted to any backend. The pre-registration
URL goes into the campaign's entry in docs/results.md at the
moment the campaign starts, not after it finishes.
What gets pre-registered
A single markdown-size document covering:
- Hypothesis. A claim of the form used in
docs/falsification.md— one sentence, one observable, one domain of validity. - Predicted signal size with a 95 % apriori confidence interval from the classical (noiseless) simulator.
- Decision procedure. Exactly one primary statistic (e.g. Welch's two-sample -test on per-depth parity leakage) and the decision rule that turns its value into confirm / falsify / inconclusive.
- Circuit budget — total circuits, per-depth reps, backend name, shot count. Changing any of these during the run requires a protocol amendment that is itself timestamped.
- Pre-specified subgroup analyses — every slice of the data we already plan to report (e.g. "depth 4 only"). Subgroups added after seeing the data are reported separately as exploratory with that label.
- Known confounds + pre-specified robustness checks. Example from Phase 1 that would now be pre-registered: popcount-matched control circuits, randomised schedule order.
- Analysis script. Path in the repo, frozen at a specific commit hash, that will take the raw result JSON and produce the decision statistic.
- Data deposit target. Zenodo DOI (new version of the dataset DOI) before publication; GitHub path during the submission window.
- Authors. Who is responsible for each section; who has backend access.
Template lives at docs/preregistration_template.md; fill in a
copy under <private-local-record>
(gitignored local working copy) and upload to OSF for the frozen
copy.
When the freeze happens
The pre-registration is considered frozen at the moment the OSF record is created with the registered flag (OSF supports both "draft" and "registered" states). Subsequent edits leave a timestamp and diff; the decision statistic cannot be swapped silently.
In the repository workflow:
- Before freeze: all iteration lives in
<private-local-record>(local). No artefacts are uploaded to the backend. - At freeze: OSF record is created, the DOI for the
registration is added to the campaign's row in
docs/results.md, and theregistered_attimestamp lands in the per-campaign header of the submission script. - After freeze: the submission script is run. Results are
written under
data/<campaign>/with the provenance block (hardware/provenance.py) including the OSF DOI so readers can cross-verify. - After analysis: the analysis script runs, the decision
statistic is computed, the
CHANGELOG.mdentry cites both the OSF DOI and the result git hash.
Amendments
Pre-specified changes to the protocol are expected (e.g. IBM changes the backend queue depth while we are running). Every amendment:
- Lives in a new file
<private-local-record>. - Cites the original OSF DOI and explains the trigger.
- Creates a new OSF registration (amendment, not overwrite).
- The amendment DOI is added to the campaign's row in
docs/results.mdalongside the original DOI.
Any amendment that changes the primary statistic or the confirm / falsify rule is effectively a new study. Report it as such.
Retroactive record for Phase 1
The Phase 1 DLA parity campaign (April 2026, ibm_kingston) was
run before this policy existed. A retroactive pre-registration is
not scientifically meaningful — we cannot un-see the results. What
we do instead:
docs/falsification.mdC2 records the falsifier we would have pre-registered (mean asymmetry for depths , sign not reversed, depths Welch-significant).tests/test_phase1_dla_parity_reproduces.pygates every future re-run on those numbers.- No amendment is possible; the campaign is sealed.
Upcoming campaigns to pre-register
- Phase 2 DLA parity ( scaling, popcount control). Draft
exists in
private local workspace/per memoryreference_ibm_credits_application. Freeze target: before the 180-minute/year IBM Quantum Open Plan allocation activates. - Phase 3 Heron r2 cross-backend replication (kingston + marrakesh). Freeze target: when both backends have matching calibration passes.
References
- OSF pre-registration — https://osf.io/prereg/
- Simmons, Nelson, Simonsohn (2011), "False-Positive Psychology: Undisclosed Flexibility in Data Collection and Analysis Allows Presenting Anything as Significant" — https://doi.org/10.1177/0956797611417632
- Chambers, D. (2017), "The Seven Deadly Sins of Psychology" — Princeton University Press.
Audit item C9 in
the internal gap audit closes
when the first campaign (Phase 2) completes this workflow end to
end, including the OSF DOI in docs/results.md.