A tool specification is the contract between your model and your code: it says what the tool does, what inputs it accepts and what shape those inputs follow the tool specification discussion. Most teams test the happy path of that contract and leave the failure path unexamined. That is where drift lives.
Drift is rarely a deliberate breaking change. It shows up as a validation error that used to return hint: "INVALID_DATE" and now returns hint: "validation_error", or a transient timeout that gets reclassified as permanent because someone added a broad except block. Retrying a permanent failure wastes time and resources, because a malformed request body or a revoked key will be rejected identically on every attempt Temporal's non-retryable errors pattern.
The same problem exists at the platform level. In one reported case, a response reader threw a network error that a shared classifier already recognized as transient, but the catch path only routed one specific exception type into bounded recovery, so the turn was terminalized instead of retried the Cloudflare agents issue. That is a retryability flag bug wearing a different costume. A fixture asserting retryable: true for that class would have failed the build.



