On a pruned node, dumptxoutset with rollback checks that the blocks it needs haven't been pruned by calling GetFirstBlock(*current_tip, BLOCK_HAVE_MASK) (blockchain.cpp:3194). GetFirstBlock asserts that the block it starts from has both block and undo data (blockstorage.cpp:638).
Right after loadtxoutset, the active tip is the snapshot base block, and that has neither until it's downloaded. So on a -prune node:
loadtxoutset <snapshot>
dumptxoutset <path> rollback=<height>
aborts bitcoind:
Assertion failed: ((last_block->nStatus & status_mask) == status_mask), function GetFirstBlock, file blockstorage.cpp, line 638.
The GetPruneHeight helper already guards against a tip without data (blockchain.cpp:934), this call site doesn't.
This returns the existing "Could not roll back to requested height since necessary block data is already pruned." error when the tip itself has no data, before calling GetFirstBlock.
The test goes in feature_assumeutxo.py, right after the snapshot is loaded on the pruned node (node 1): dumptxoutset with a rollback to the start height must return that error. On master the RPC times out because the node aborted. With the fix feature_assumeutxo.py and rpc_dumptxoutset.py pass.