I eventually worked this out[0].I had previously tried using a message-hook to set alternative_order, but that didn't work because I didn't realise that alternative_order *appends*, it doesn't overwrite the existing alternative_order.
So, the basic solution is to call unalternative_order every time before the message-hook is executed.
0: https://github.com/cdown/dotfiles/commit/c5927d