Some steps only make sense to be used in certain stages (currently execution_plan and teardown). For example, the gradescope.results step must be in teardown to ensure results are written, even in the presence of a step that interrupted execution earlier.