When a tool returns JSON, the easy design is to make every field that could be yes or no a JSON boolean. JSON booleans accept exactly two values, true and false, and values that merely evaluate to true or false, such as 1 and 0, are rejected by a {"type": "boolean"} schema (JSON Schema boolean reference). That precision is the problem: a boolean has no room for "I do not know" or "this does not apply."
Consider a user lookup tool. A model asks for a user and the tool returns {"active": false}. Does that mean the user exists and is deactivated, or that the lookup failed, or that the caller was not permitted to read the active flag? All three collapse into the same token. Downstream code cannot recover the difference, and a model reading the result will invent one.
This matters because structured outputs are the default in production pipelines. Schema-constrained generation guarantees syntactic validity and reduces parsing errors compared with prompted JSON, but it does not ensure value correctness, so teams are advised to pair constrained generation with runtime validation and a fallback path (MLflow on structured outputs). The yes, no, not applicable pattern is a way to make value correctness checkable.
A concrete failure rate helps. When DataChain tested Anthropic's Claude with a structured prompt that asked for JSON, it found roughly 14 to 20 percent of requests returned the JSON prefixed by commentary, which broke parsing (DataChain on enforcing JSON outputs). Format failures get noticed because they are loud. Silent semantic failures, where false means three different things, do not.



