An error envelope is the one payload every caller parses, and usually the one payload that gets the least schema discipline. Success responses get reviewed because the product depends on them; failures get a try/catch and a JSON.parse. That asymmetry is where breakage hides.
Production agents make this worse. Most tool call failures are silent: no exception, no crash, no alert, and the agent moves on as if the action happened in this failure taxonomy. A consumer that throws on an unrecognized class value turns a recoverable tool error into a dropped step, and the orchestrator never learns why. 401 from an expired token and 401 from a revoked token look identical at the execution layer but need different responses, and the same is true of your own error classes: they only help if the reader can handle a class it has never seen.
The base article on the error envelope assumes the class set is stable. It is not. Every quarter someone adds rate_limited, quota_exceeded, content_policy, or provider_timeout, and every addition is a chance to break an orchestrator you do not control.



