The problem was that I had the first row frozen. It will get an exception as shown above if you try to insert before a frozen row.
If not frozen, then I can insert at 0, and it works. This gives me the most-recent-first insertion I want to show history.
I can see that it’s not obvious what the “correct” behaviour might be. It depends on the full definition of what you consider to be “frozen”.
I think anyway I didn’t need to freeze, as I just want to freeze the headers. I supposed the headers are automatically frozen anyway.