Validation: ranking notes

Category notes

The P2 band is large because this category genuinely contains many substantive items (storage-error correctness, measured IBD/pruning speedups, and five proposed-soft-fork implementations); they are ordered so concrete bug and performance work precedes the non-activated consensus proposals. Several entries (#32427, #35187, #35557) are kernel-motivated but were kept here because they change block-index persistence, the ConnectBlock entry path, or validation time sources; #35187 in particular is mostly kernel API surface and would be better split so the validation part gets focused review.

Review order and overlapping PRs

  • Chain: #35646 (remove M_ERROR, route fatal errors through util::Expected) explicitly unblocks #35570 (return BlockValidationState by value). Review #35646 first; #35570 will need rework otherwise.
  • Chain: #36603 (loadtxoutset pipeline) is the stated base for #35054 (P2P UTXO set sharing). #36603 first.
  • Chain: #35861 (Testnet 5 / BIP 95) sits on top of #35793 (BIP 54) and activates its rules from block 1. #35793 must be settled first.
  • Chain: #35906, #36066 and #35569 are all preparatory steps toward the stateless validation library (#35904). #35906 is the one that carries actual validation-semantics change and should be reviewed first; the other two are mechanical follow-on.
  • Direction conflict: #36598 proposes removing AssumeUTXO entirely while #36543, #36500, #36542, #36346, #36702 and #35054 all invest in it. A maintainer decision on AssumeUTXO's future affects the value of all of them; the bug fixes (#36346, #36702) should proceed regardless.
  • Overlapping area: #36452 (false corruption from missing undo data) and #36702 (snapshot block treated as linked on startup) were found in the same review thread and both touch assumeutxo/pruned startup paths; expect interaction, review #36702 (crash) first.
  • Overlapping error-handling surface: #34132, #35003, #36049, #35731, #36318 and #36555 all restructure how validation reports I/O and failure states, and #35646 removes the runtime-error state they build on. Coordinating #35646 with #36318/#36555 avoids rebasing churn.
  • Overlapping code: #35751 and #36496 both modify CoinsViewOverlay prevout prefetching; #35751 carries the actual benefit and should be reviewed first, #36496 is an unmeasured micro-optimization on top.
  • Same problem class: #31989, #32247, #29247, #36122 and #35793 are all non-mainnet implementations of proposed consensus changes; they were previously spread across P1/P2 without a distinguishing reason and are now banded together.

Band and position changes

  • #35524: P2 alone, P1 after comparison. Raised to P1: silent destruction of block data during reindex on supported platforms (*BSD/OmniOS) is data loss, on par with the other P1 crash/reindex bugs here
  • #36452: Moved up: concrete startup-blocking false-corruption bug on pruned/assumeutxo nodes, and it unblocks pruneassumevalid and pruned-txindex work
  • #36049: Moved up: author observed real std::terminate crashes on disk-full; most certain benefit of the error-handling group
  • #35003: Moved up: silently stuck node on block-storage I/O errors is a reliability bug, ranked with the other storage-error fixes
  • #36280: Moved up: corrupted compressed script silently becoming anyone-can-spend is a fund-safety-adjacent correctness hazard
  • #36000: Moved up: measured 1.15x IBD / 1.53x reindex gain is the largest well-benchmarked validation speedup in this band
  • #36244: Moved up: user-visible responsiveness fix plus ~5% IBD, broader effect than the other speedups below it
  • #35793: Moved down slightly: regtest-only soft-fork implementation ranks below concrete bug/perf fixes, but first among the soft-fork group since it mitigates real attack classes
  • #31989: P1 alone, P2 after comparison. Lowered to P2 to match the other regtest-only proposed-opcode implementations (#32247, #29247, #36122); no consensus change ships to users
  • #32247: Grouped with the other regtest-only opcode proposals
  • #29247: Grouped with the other proposed-opcode implementations rather than ahead of concrete fixes
  • #29491: Moved down: benefit is real but gated on unmerged upstream secp256k1 work and explicitly experimental
  • #35861: Moved down: value is contingent on BIP 54 (#35793) landing first
  • #36543: Moved up: closes a real trust gap in hardcoded snapshot commitments, comparable to other assumeutxo correctness work
  • #35751: Moved down: ~10% gain confined to mining template validation, narrower than the other P2 performance work
  • #36555: Moved up: fixes a reported bug (#36546) where invalidateblock reports success after a partial rollback, more concrete than the rest of P3
  • #36542: Moved up: removes a manual-intervention recovery step after interrupted snapshot loads, grouped with the other assumeutxo robustness fixes
  • #36500: Moved up: grouped with the other assumeutxo input-validation fixes it overlaps with
  • #35195: Moved up: measured IBD and assumeutxo-loading gains make it the most tangible P3 item after the bug fixes
  • #35906: Moved down: first step of a modularization project with no user-visible effect yet; ranks below measured fixes and speedups
  • #35570: Moved up: placed directly after its enabling work so the #35646 -> #35570 chain is reviewed in order
  • #35662: Moved down: hardening of an error-prone pattern, no active bug, sits with the other defensive validation refactors
  • #34864: Moved down: UTXO cache state hygiene with no active bug, grouped with the other invariant-tightening refactors
  • #34254: Moved down: redundant work only in a rare invalid-block path, least consequential of the refactor group
  • #35187: P2 alone, P3 after comparison. Lowered to P3: primarily a libbitcoinkernel API addition for external callers; node-side validation behavior is unchanged, so it ranks below in-node validation work
  • #36598: P2 alone, P3 after comparison. Lowered to P3: explicitly a demo not intended for merge; its value is as a reference for smaller extractions, not as reviewable validation change

About

This pass by claude-opus-5 on 2026-11-01 saw every PR in the category at once and checked the bands given to each PR alone against each other, ordered the PRs, and noted chains and overlaps. Back to the category.