I'm also running into this assert with the workload, I think my patch is not handling the case where the action is add items on the last segment of the page correctly. I'm still investigating the issue further to find the source of the bug.
Meanwhile I reviewed your patch and it looks good to me. I agree that copying out the entire tail out to the scratch space in one shot vs copying out every segment reduces the number of memcpy calls and simplifies the solution overall. Let us go ahead with this patch.
Thank you for review! Pushed with minor beautification.
------ Alexander Korotkov Postgres Professional: http://www.postgrespro.com The Russian Postgres Company