У меня были случаи когда требовался апгрейд стейта (закончились плейсхолдеры в рекорде или забыл добавить их) - тогда добавляешь handle_{call,cast,info} первыми, которые матчат любые сообщения и старый стейт (его описываешь не в виде рекорда, а в виде кортежа), обновляет стейт и вызывает снова handle_{call,cast,info} с новым стейтом. Но я стараюсь этого избегать. В частности - сейчас чаще использую мэпы для стейта (старое не переписываю пока на мэпы). Случаев когда надо было апгрейдить именно данные в стейте у меня не было, я старался как-то избегать этого. Но это решается таким же способом, только надо тогда в стейте хранить номер "версии" стейта.