A lab gave 40 customer messages to two small models, qwen2.5:3b and llama3.2:3b, at temperature 0, asking for three fields: category (one of billing, delivery, returns, account), summary (at most 12 words) and needs_human (true or false). Asked in words, with JSON mode, or with a schema, every way produced valid JSON 40 of 40 times on both models. JSON mode replies were identical, character for character, to the replies asked for in words.
The schema changed one reply out of 80, and that reply is the one that matters. For 'Do you ship to Iceland?', a delivery question, qwen2.5:3b asked in words answered with the category 'travel', which is not allowed, so a code check rejects it. With the schema, 'travel' was impossible, so the model wrote 'billing', then stayed consistent with it: the summary became 'Iceland trip billing discrepancy detected' and needs_human became true. Every format check passed. The answer was wrong. Format passes rose from 39 to 40; right categories stayed at 39.
Dropping the written rules and sending the schema alone showed what a schema cannot say. On qwen2.5:3b, median summary length grew from 6 to 11.5 words, and only 24 of 40 stayed within 12 words, against 40 of 40 with the words. needs_human went from true on 38 of 40 messages to true on none. JSON Schema cannot count words at all; its maxLength rule counts characters.