Free-form language is an excellent interface for people. It is usually a bad interface between software components.
If a model is selecting an action, creating a database record or passing arguments to another service, I want its output expressed as a contract: known fields, known types, controlled enums and explicit required values.
Asking for JSON in a prompt is only the weak version of this. Schema-constrained generation goes further by restricting what can be generated so that an entire class of failures disappears: missing braces, invented fields, invalid types and parsers whose main purpose is extracting JSON from markdown fences.
But syntactic validity solves only one boundary.
A model can produce an object that perfectly satisfies the schema and is still wrong. An account ID can have the correct type and refer to the wrong account. Two valid fields can contradict one another. A legal enum value can be inappropriate for the current state.
So I treat structured generation as one validation layer.
The schema constrains what the model can express. Deterministic application code still enforces business rules, permissions, cross-field invariants and whether the proposed action is allowed at all.
This distinction matters even more for agents: producing a well-formed action is not the same thing as being authorized to execute it.
