One engine, two machines. Fire events to drive transitions — watch invalid events get rejected, not swallowed.