v0.7.1
Violations represent an incorrect course of action that the user can take. When a violation is triggered, the trainee is penalized by a certain amount of points, and a Question is activated in the After-Action Report. For particularly dangerous violations, the trainee might even see a popup warning explaining immediately that what they did was incorrect and how to fix it.

A Dangerous Action prompt appearing in the Transmission simulator after the trainee decreases power from Mulungushi Generator 1, which is found north of the constraint in this scenario.
Name
Look at Leopard but not at Kabwe
Deduction
8
Question
DoNotLookAtOneline
Trigger
Skipped:GainSA:Kabwe:FINISH:ALL
Danger Prompt
<no content>
Inputs
Kabwe
In this example, the violation is triggered when they skip the Kabwe requirement of the GainSA accomplishment, and do not complete that requirement before completing the FINISH accomplishment.
This example also has an Input. The question's Content might be something like:
You did not look at $1. Why is it important to look at all onelines with alarms?
So if this violation is triggered and that input is filled in, it becomes:
You did not look at Kabwe. Why is it important to look at all onelines with alarms?
Whenever the trainee takes an action in the scenario, it's recorded with a special string of text called an action string. Action strings are in a strict format, and we use violation triggers to match that format. If a violation's trigger matches an action string, the violation gets triggered.
For example, enabling AGC at Mulungushi Generator 1 creates the following action string:
Changed:sMLNG_G1_GEN:Mode:1 - changing the mode of Mulungushi Generator 1 to Enabled
You might notice that this looks very similar to the violation trigger format. This is because GOAT checks for matches essentially by directly comparing the strings, and then trying to make any relevant substitutions. We could create a violation with this exact trigger to match this exact action. If they enable AGC at this generator, this violation would be triggered.. We could also introduce a substitution to make it more general:
Changed:sMLNG_G1_GEN:Mode:ANY - changing the mode of Mulungushi Generator 1 to any value
Now it will trigger if they modify AGC at all on that generator. Or:
Changed:SOL:Mode:1 - changing the mode of any solution target generator to Enabled
This will trigger if they enable AGC in any solution target generator. These substitutions allow violations to match a very general set of actions.
The violation trigger editor has been constructed to try and make it as easy as possible to understand each action type, segment, and substitution, but there is still a significant learning curve. The Violation Triggers page goes into much more detail on how to construct these.