Most agent failures described in the wild are not model failures. They are loop failures: the model proposes an action, a guardrail blocks it, and the string handed back to the model is either empty, a stack trace, or a vague sentence like "not permitted." The model then does the only thing it can with an unexplained block: it tries a near-identical action, apologizes to the user, or fabricates a result.
The reliability literature is blunt about this. A 60% single-trial success rate does not translate into 60% of production traffic succeeding, and rate limits are the single most common error class in deployed LLM applications, with a measured drop from 96.9% baseline success to 88.1% under rate-limit stress (fallback design as an architecture problem). That source also flags the dangerous failure: a tool call that times out causes agents to improvise and fill the gap with fabricated data. A well-typed outcome record removes the improvisation surface.
The architectural rule that follows is simple. The model proposes; a policy decision point decides. That separation is how policy-as-code for agents is described in practice: the model should never be the authority that decides whether a tool call is allowed, and model output should be treated as a request for authorization, not as authorization (policy-as-code for enterprise AI agents). Once you accept that, the question becomes what the decision layer hands back.
Silent fallbacks are the worst version of this. One documented incident involved a system where every response came back fast, with no errors in logs and no alerts, because a caught exception fired a template on every single call; the only visible signal was zero tokens used per response (silent LLM fallbacks). An outcome record that names its deciding policy and reason code makes that class of bug impossible to hide, because the record appears in the trace on every request where the fallback fired.



