How to stop a form loop

Weird, it should work. You can use a FormValidationAction to return an empty list in the required_slot() method if the intent is ‘cancel’`:

def required_slots(self, dom_slots, dispatcher, tracker, domain):
    if tracker.latest_message['intent'] == 'cancel':
        return []
    else:
        return dom_slots # Or whatever your original required_slot() did

See this for more and alternatives: How can i have a rule to cancel a form?