ButtonRenderer
Button -- dispatches its action, and draws its child inside itself.
The child is drawn rather than a label read off the component: the catalog gives a Button a child reference and no text of its own, so an icon-only button is the same shape as a labelled one and neither is a special case here.
The action is resolved at the tap, not here. A2uiComponentScope.dispatch evaluates the action's bindings when it runs, which is what the implementation guide means by "dynamically resolving the context variables at the moment of the interaction" -- a button that captured them at composition time would send the agent whatever the data model held when the screen was drawn.
A button whose action is absent or will not decode still draws and still responds; it just has nothing to dispatch. Disabling it instead would present an agent's malformed payload to the user as a deliberately unavailable action.
A failing check does disable it, because that is the one the protocol asks for by name: "If any check fails, the button is automatically disabled. This allows the button's state to depend on the validity of data in the model." Errors alone -- see hasError -- so a warning result can say something without taking the action away. The button shows no message of its own: the inputs the checks are about carry theirs, and a greyed button captioned with the reason would say it twice.