In-flight proposal state on the disk-backed SMT path wasn't durable: a node that crashed or lost leadership between sending a block to BFT and finalizing it had nothing to recover from - causing recovery gaps, restart loops, and Mongo↔RocksDB-root divergence.
Fix: stage the proposed block + proposalId-tagged records in Mongo before the BFT request; on restart, resume uncertified proposals or finalize certified ones, and abandon superseded ones with their records kept invisible; validate the disk-SMT root on replay; and guard HA activate/deactivate so a stale round can't finalize into the wrong block.
Result: a disk-backed node can crash or lose leadership at any point in propose → certify → finalize and recover with no data loss, root mismatch, or proof corruption.
In-flight proposal state on the disk-backed SMT path wasn't durable: a node that crashed or lost leadership between sending a block to BFT and finalizing it had nothing to recover from - causing recovery gaps, restart loops, and Mongo↔RocksDB-root divergence.
Fix: stage the proposed block + proposalId-tagged records in Mongo before the BFT request; on restart, resume uncertified proposals or finalize certified ones, and abandon superseded ones with their records kept invisible; validate the disk-SMT root on replay; and guard HA activate/deactivate so a stale round can't finalize into the wrong block.
Result: a disk-backed node can crash or lose leadership at any point in propose → certify → finalize and recover with no data loss, root mismatch, or proof corruption.