Root cause: builder created plain Node instances for the state machine and states, so _machine.player = self in PlayerMovementController crashed with 'Invalid assignment ... on base object of type Node'. Now each node gets its real script attached before _ready() runs.