Repository navigation
Closed
Labels
pq-transportHybrid post-quantum v2 transport (#184)Hybrid post-quantum v2 transport (#184)
Description
Start here
This is the state of the #184 work (hybrid post-quantum v2 transport) as of 2026-10-21. All of it is on GitHub; nothing depends on any one machine.
- Every p2p: add hybrid post-quantum key exchange (ML-KEM-1024) to BIP324 v2 transport #184 PR targets
feature/pq-transport. Draft Hybrid post-quantum v2 transport (#184) — integration #233 tracks the whole thing and merges it into1.x.xat the end, with one approval. - Merge criteria: a PR merges only when its CI is complete and green, including the Required Merge Gate, and its agentic review (Codex) is clean on the current head commit. Stacked PRs merge bottom-up.
- Merge ci: wait for a newer run instead of failing on an earlier one's result #231 early. It fixes a merge-gate bug that causes most of the false red gates described below.
Where everything is
| PR | Head branch @ commit | Base | State |
|---|---|---|---|
| #231 merge-gate fix | djh58/merge-gate-stale-checks @ e92b46b |
feature/pq-transport |
Codex clean on e92b46b. CI running. Merge when green. |
| #224 part 2 (#186) | djh58/pq184-2-foundations @ 012e687 |
feature/pq-transport |
Bottom of the stack. Codex clean on 012e687, after two more canary-evaluator fixes (a day exactly 20% off its baseline, and IPv6 spellings in the known-good list). CI running. |
| #225 part 3 (#190) | djh58/pq184-3-library @ df22737 |
#224 | CI green, Codex clean on this commit. |
| #230 part 4 (#199) | djh58/pq184-4-handshake @ ac16fb6 |
#225 | CI green, Codex clean on this commit. |
| #235 part 5 (#206) | djh58/pq184-5-outcomes-pr @ 35524c4 |
#230 | CI green, Codex clean on this commit. |
| #236 part 6 (#209) | djh58/pq184-6-rpc @ c00ff75 |
#235 | Rebased onto #235, with the tidy fix. Codex clean on c00ff75. Conflicts with #224's a4ade90 in test/functional/p2p_v2_previous_release.py, in the imports only. CI can't run until that's resolved (see below). |
| #239 part 7 (#212) | djh58/pq184-7-e2e @ d258d08 |
#236 | Complete: G1, a commit adding two regtest-only test options (7da1f60), G2 with a deterministic load-shedding test, and G3. Codex review requested. CI waits behind #236. |
| #240 part 8 (#215) | djh58/pq184-8-docs @ 7d0d2de |
#239 | The handshake benchmark, operator guide, release note, quick-start test and doc-token lint. H1's flood tooling is not in it, and #215 stays open for that. Codex review requested. Not linked into the stack yet: link it after the #224–#235 merge, because relinking can cancel running CI. |
#233 feature → 1.x.x |
feature/pq-transport |
1.x.x |
Draft. Its checklist covers the remaining release steps. |
Already merged into feature/pq-transport: #223 (I2P post-quantum leasesets), #228 (RPC docs CI checkout fix), #229 (Cadence benchmark out-of-memory fix) and #237 (Boost ≥ 1.91 backport).
Order of operations
- ci: wait for a newer run instead of failing on an earlier one's result #231 once its CI is green. It's independent of the stack.
- test, ci: foundations for hybrid v2 transport (Python ML-KEM, qbit releases, v1.0.0 interop, PQ CI, canary tools) #224. GitHub then auto-rebases the stacked PRs (crypto: vendor mlkem-native and build ML-KEM-1024 with runtime backend selection #225, net: hybrid post-quantum v2 handshake with key confirmation (#184 part 4) #230, net: hybrid handshake outcomes, 3-strike fallback and load shedding (#184 part 5) #235) onto the updated base. Refetch those branches before doing anything on them, then get CI and Codex on their new heads.
- Fix rpc, init: -v2pqtransport, getpqtransportinfo and hybrid peer fields (#184 part 6) #236's conflict. Rebase its 6 commits onto net: hybrid handshake outcomes, 3-strike fallback and load shedding (#184 part 5) #235's new head, linearly with no merge commits. In
p2p_v2_previous_release.pykeep both sides' imports:itertools,osandshutil,BitcoinTestFramework, SkipTest, andTestNodeCLI, release_info. Nothing else conflicts; the merged test passes against the real v1.0.0 binaries. Then rebase test: end-to-end hybrid transport tests, Python hybrid peer, misbehaving peers and fallback (#184 part 7) #239's 4 commits onto rpc, init: -v2pqtransport, getpqtransportinfo and hybrid peer fields (#184 part 6) #236's new head. - crypto: vendor mlkem-native and build ML-KEM-1024 with runtime backend selection #225, then net: hybrid post-quantum v2 handshake with key confirmation (#184 part 4) #230, then net: hybrid handshake outcomes, 3-strike fallback and load shedding (#184 part 5) #235, then rpc, init: -v2pqtransport, getpqtransportinfo and hybrid peer fields (#184 part 6) #236, then test: end-to-end hybrid transport tests, Python hybrid peer, misbehaving peers and fallback (#184 part 7) #239, each once it meets the criteria. Every merge rebases the PRs above it again.
- doc, bench: operator guide, release note and handshake benchmark for hybrid v2 transport #240 (part 8): link it into the stack (
gh stack linkwith the stack's PRs in order, ending in 240) and label itpq-transport, after test: end-to-end hybrid transport tests, Python hybrid peer, misbehaving peers and fallback (#184 part 7) #239 is rebased. Then CI and Codex. - Hybrid post-quantum v2 transport (#184) — integration #233: finish its checklist (Guix builds with hashes and ELF notes, remove the CI branch-list entry, merge the latest
1.x.x), mark it ready, get one approval. - Release gate release: hybrid v2 transport release gate and default-on (#184 part 9) #222, updated for the shortened plan: no mainnet canary, a short testnet4 soak, then mainnet. R4 (outside review) still needs a decision.
Remaining work
- ci: wait for a newer run instead of failing on an earlier one's result #231: green CI, then merge
- multi_index: fix compilation failure with boost >= 1.91 (backport bitcoin#35175) #237: merged
- test, ci: foundations for hybrid v2 transport (Python ML-KEM, qbit releases, v1.0.0 interop, PQ CI, canary tools) #224: green CI, then merge
- rpc, init: -v2pqtransport, getpqtransportinfo and hybrid peer fields (#184 part 6) #236: resolve the import conflict after test, ci: foundations for hybrid v2 transport (Python ML-KEM, qbit releases, v1.0.0 interop, PQ CI, canary tools) #224 merges; rebase test: end-to-end hybrid transport tests, Python hybrid peer, misbehaving peers and fallback (#184 part 7) #239 on it
- crypto: vendor mlkem-native and build ML-KEM-1024 with runtime backend selection #225 → net: hybrid post-quantum v2 handshake with key confirmation (#184 part 4) #230 → net: hybrid handshake outcomes, 3-strike fallback and load shedding (#184 part 5) #235 → rpc, init: -v2pqtransport, getpqtransportinfo and hybrid peer fields (#184 part 6) #236 → test: end-to-end hybrid transport tests, Python hybrid peer, misbehaving peers and fallback (#184 part 7) #239 in order
- doc, bench: operator guide, release note and handshake benchmark for hybrid v2 transport #240 (part 8): link into the stack, label, CI, Codex, merge after test: end-to-end hybrid transport tests, Python hybrid peer, misbehaving peers and fallback (#184 part 7) #239
- contrib, doc: v2flood harness, handshake benchmark, operator guide and release note (#184 part 8) #215's flood tooling (H1), out of doc, bench: operator guide, release note and handshake benchmark for hybrid v2 transport #240's scope; R3 needs a plan for it
- Hybrid post-quantum v2 transport (#184) — integration #233 checklist, then approval
- release: hybrid v2 transport release gate and default-on (#184 part 9) #222 release gate (R1 default-on, R2 fuzz campaign, R3 flood measurement, R6 short testnet4 soak, R7 release decision; R4 to decide)
CI gotchas (each cost real time)
- Stacked PRs need a label to get full CI. A PR opened before it joins a stack only runs Core Checks and RPC Docs. Adding any label (we use
pq-transport) starts Full Validation and the Required Merge Gate. - The merge gate can read stale results until ci: wait for a newer run instead of failing on an earlier one's result #231 lands. On a rerun, reopen or label of the same commit, the gate can judge an earlier run's cancelled or failed check and fail within seconds. Once the real jobs are green, rerun just the gate:
gh run rerun <gate-run> --failed. ci: wait for a newer run instead of failing on an earlier one's result #231 fixes this by matching each check to the event that started it. - Runner starvation. Many PRs pushed at once fill the GitHub-hosted job limit. Jobs that wait about 15 minutes are cancelled, and the gates then fail. Push PRs one at a time.
- The self-hosted runners' disk fills up. They share one 234 GB disk on one host, and two PRs' Full Validation runs at once fill it. Sanitizer, CentOS and i686 jobs then fail together, within seconds, with
Disk space is too low!in the log; the code is fine. Let one PR's Full Validation run at a time, then rerun the failed jobs. The host needs pruning or more disk. - The Blacksmith Windows runners sometimes die. The job then shows "failure" with no steps and no log. Rerun it.
- GitHub auto-rebases stacks when a PR merges into the base. Keep stacked branches linear (no merge commits), or GitHub stops and leaves the PR conflicting. Rebased commits are committed by GitHub.
- Don't run
bench_sanity_checkor barebench_qbiton branches that predate bench: bound the Cadence benchmark chain without -asymptote #229. The Cadence benchmark there allocates without bound until the machine runs out of memory. Build those branches with-DBUILD_BENCH=OFF. - Boost ≥ 1.91 (Homebrew) broke
txmempool.hon branches without multi_index: fix compilation failure with boost >= 1.91 (backport bitcoin#35175) #237, which is now merged. The macOS PQ jobs build Boost through depends either way. pq-functional(nightly, or on a named dispatch) hasn't run on GitHub yet. Its 45-minute limit is twice the measured cold 4-core build plus the whole--v2pqtransportsuite. Check the first run's duration.
Decisions already made
- All p2p: add hybrid post-quantum key exchange (ML-KEM-1024) to BIP324 v2 transport #184 work integrates on
feature/pq-transportfirst, because approvals on1.x.xweren't available. - The release gate is shortened (release: hybrid v2 transport release gate and default-on (#184 part 9) #222): no mainnet canary, a short testnet4 soak, then mainnet.
-nov2pqtransportand-mlkemportablewith non-numeric or double-negative values warn whenever the result is ON. The argument parser itself is unchanged, to stay aligned with upstream.-mlkemportableexists as a hidden option (part 6), and the local-fault warning names it.- Shutdown wipes PQ secrets but records no outcome (part 5).
- Merge gate (ci: wait for a newer run instead of failing on an earlier one's result #231): a cancelled check is never a verdict.
- The load-shedding functional test runs on a frozen steady clock, using the regtest-only
-test=pq_low_shed_thresholdand-test=mock_steady_clock. It has no real-time or skip path.
Metadata
Metadata
Assignees
Labels
pq-transportHybrid post-quantum v2 transport (#184)Hybrid post-quantum v2 transport (#184)
Activity
djh58 commentedon Oct 21, 2026
The handover is over, so I'm closing this. Tracking continues in #233, which now holds this issue's merge criteria and order, CI notes and decisions.