The tool schema is the contract. A loose one tells the model to guess.
When a function-calling tool's input schema has no required list, open additionalProperties, or an untyped field, the model fills the gaps with hallucinated arguments. Here is why loose schemas are a correctness bug, and toolstrict, a static gate that fails the build before they ship.
