This is happening in UK2Node_DoOnceMultiInput::ExpandNode. It creates a node of the type UK2Node_TemporaryVariable which is the same as the local boolean node you see in the Do Once macro (the one commented “Is Closed”. Everything else is just versions of the assignments and branches to make it work and the tying of them together.
One alternative (though it’ll sound crazy) is to do your ensure/check as a straight up UFUNCTION, no custom node. You would get your ‘do once’ behavior by keeping a static container (probably TSet though) in the function and tracking the messages that have been tripped. I know it sounds a little crazy, but realistically you don’t want ensures or checks to be tripping anyway so that container should basically always be empty anyway. You’d also run into issues if multiple ensures have the same message, but again the reality shouldn’t be an issue because each ensure should be a unique issue it’s reporting.