Why is my LLM suddenly returning broken JSON?
Three common causes. (1) The provider tightened or loosened response-format handling — OpenAI's response_format={"type": "json_object"} and Anthropic's tool-use JSON have both had silent behavioral changes (extra prose around the JSON, schema-violation rates moving). (2) Sampler change — temperature, top-p, or speculative-decoding tweaks affect format adherence even with the same prompt. (3) System-prompt defaults — providers sometimes inject or alter their own system instructions in ways that perturb output format.
Diagnostics: run the exact same call N=100 times with temperature=0, count json.loads() success rate, count cases with leading/trailing prose, log the diff against a saved baseline from last week. If you don't have last week's baseline, you can't tell whether you're seeing drift or your own prompt change. ModelWatch tracks "JSON-schema validity rate" as a first-class daily metric per model and alerts when it drops more than 2 percentage points day-over-day.