Looking at the event logs I (eventually) found this:
Event ID 7000:
The MSSQLSERVER service failed to start due to the following error:
The account name is invalid or does not exist, or the password is invalid for the account name specified.
Which is bizarre – as the service account had been used for months – but after each reboot the services had to be manually started. GPO and other things had been blamed but no one could actually find out why.
I’ve never used @ naming for service accounts, so until I read this I didn’t even know it was possible. Now I’m going to forget again because apparently it’s not a good idea.