-reindex leaves the node unable to start when the genesis block in blk00000.dat has a valid header but an invalid body. With -checkblockindex, the default on regtest, it aborts on an assert in CheckBlockIndex. Without it, it stays in RPC warmup.
I stop the reindex with a fatal error when the genesis block is found invalid. Its header is already in the block index by then, so the blocks after it could not connect. A new case in feature_reindex.py flips a bit in the genesis block and expects the error, and on master it hits the assert instead. The reindex, loadblock, pruning and assumeutxo functional tests and the unit tests pass.
This is one of several PRs from a large audit of Bitcoin Core that I did with the help of LLM tools. The audit produced its evidence all at once, which is why the PRs arrive together. I understand each change fully and will answer review questions myself.