Guards let transitions fire only when a condition holds. The machine advances to the next step only when validation passes — correctness is encoded in the state graph, not scattered across event handlers. The UI just sends events and reads state.