"You froze which machines. Now freeze what the operation is — so a Low can't grow into a High while your back is turned."
Two things get frozen, not one
The durable-operations track froze which machines an operation targets. This one freezes what the operation is: its kind and its risk class. Both have to hold still from the moment of approval to the moment of execution, because approval is consent to a specific action against a specific set — change either half afterward and the consent no longer means what it said.
Kind and risk are domain-bound
A kind isn't a free-form label you can pick to taste; it's bound to a domain with a fixed risk class. restart_service is Medium; migrate_control_plane is High. You can't quietly relabel a High-risk action as a Low one to skip its ceremony, because the (kind → risk) mapping is defined once, in the domain, not chosen per request.
Re-validated at every boundary
The (kind, risk) pair is checked at three boundaries: when the operation is defined, when a delegate claims it, and when it starts. A delegate can't claim restart_service and quietly start doing purge_host_data; a start whose kind doesn't match the approved one is refused. Approval sticks to a specific action, not a loose category it could later drift within.
Fail closed, in every mode
And the response to any mismatch is the same everywhere: refuse. A kind-or-risk mismatch at any boundary fails the operation closed, in every mutation mode, whether production is locked down or wide open. The default on ambiguity is stop, never proceed — because the one time you let an unclear operation through is the time it turns out to have been the dangerous one.