Transaction Manager uses two datastructures to manage the invalid list - a List and an array. All updates to invalid list happen to the List, and the list is then sorted and copied over to the array. This is an optimization done so as to not sort the invalid list every time a new transaction is created.
However during a snapshot restore after the Transaction Manager starts up, the invalid list gets correctly restored to the List but does not get copied over to the array. This will lead to transactions started right after a snapshot restore to have empty invalid list. This will make invalid data to become visible to those transactions.
Since the List still contains the right invalid list, any update to the invalid list - like invalidating a transaction, will restore the array back to a good state.
Also compactions will still remove invalid data as expected since new snapshots are searialized using the List