A Question with its cross-field rules applied during pydantic parsing.
Only the cross-field choices rules are scoped to this alias. The field-level
rules on Question.question and on Question.choices are unconditional, so
they also apply wherever Question itself is pydantic-parsed — notably
TypeAdapter(AskUserRequest) in tui.textual_adapter, which re-validates the
interrupt payload client-side and re-raises on failure. Keep that in mind
before adding another field-level rule here.
Where a ValueError from one of these validators ends up depends on the path.
On the tool path it becomes a tool-call ValidationError, which ToolNode
turns into an error ToolMessage the model can correct and retry from. On the
client re-validation path there is no tool call and textual_adapter logs and
re-raises instead.