So I added some debug prints to the GC and upon looking at the outputs I *immediately*, intuitively understood what was wrong and how to fix it (you'll be unsurprised to learn it was an off-by-one error… every pointer was being updated to its correct new value minus one).
I made the fix. I reran the test.
It failed in the exact same way.
¯\_(ツ)_/¯