It has a completely type-safe finite state machine, and it does not require additional programming conventions.
It relies on a special monad: Mcbride Indexed Monad, which can model uncertainty in terms of type.
Are you using this monad here?
Here is a concrete ATM demo https://github.com/sdzx-1/typed-fsm/tree/main/examples/ATM
https://github.com/sdzx-1/typed-session
https://github.com/sdzx-1/typed-session