An agent tool is a name, a human description and a JSON schema for its inputs; the model reads the description, decides whether the tool fits, and calls it with arguments per Lunar.dev's analysis of tool calling. That framing matters because it tells you what a schema is: not a hint, but the interface the model targets. When you rename path to file_path or turn timeout from a string into a number, you are changing the interface the model writes against.
The same idea shows up in CLI design guidance: the stdout of a command is its API contract, structured output should be consistent, and types should not drift between commands per this guide to agent-friendly CLI tools. Tools built for humans and machines at once keep JSON output as a first-class code path and treat error text as documentation as OpenStatus describes in its CLI rebuild. A tool schema is the same contract one layer up.
Two failure modes follow. First, the model sends arguments in the old shape because that shape is what it saw, and your new parser rejects them with a message the model cannot act on. Second, worse, the new parser accepts them with a silent coercion, so nothing errors and the request goes out with the wrong value. A compatibility test exists to catch the second case, because logging and dashboards catch the first.
There is also a governance reason to care. Evidence that a change was checked, not just asserted, is what separates a real quality gate from an agent saying "done" as the definition-of-done material for coding agents argues. That article cites an audit of 516 agent "done" claims where no passing test run backed 65 to 69% of them, depending on how strictly they were counted. Your schema migration deserves the same skepticism.



