OK, so the consensus seems to be that the back branches should continue to allow you to set client_min_messages = FATAL/PANIC, but then ignore that and act as though it were ERROR.
Agreed.
We could implement the clamp either in elog.c or in a GUC assignment hook. If we do the latter, then SHOW and pg_settings would report the effective value rather than what you set. That seems a bit cleaner to me, and not without precedent. As far as the backwards compatibility angle goes, you can invent scenarios in which either choice could be argued to break something; but I think the most likely avenue for trouble is if the visible setting doesn't match the actual behavior. So I'm leaning to the assign-hook approach; comments?
My patch used the check hook, but works either way.