I always use the GUI to create my automations, but pasted the yaml below to help.
Basically I want to loop around playing some speech until the alarm is disarmed or triggered but the loop keeps repeating forever, even if I manually change the entity state via developer options.
The condition in until isn’t quite what you think it might be.
It’s doing this:
(state == disarmed) AND (state == triggered OR)
Notice how the logical OR should be choosing between two things but it only has one. Therefore the entire template is asking for the state to be simultaneously disarmed and triggered (which isn’t possible and so the repeat loops forever).