Most teams have a router that picks the first model, and then a fallback block that "just in case" moves the request to a bigger model. That conflates two different jobs. Routing answers "which model should serve this request by default?" Escalation answers "what happens when the answer comes back unusable?" The second question deserves its own explicit policy, because the default behavior (retry until something works) has no ceiling on cost or latency.
The routing literature is consistent on the vocabulary: error fallback moves a request after an explicit failure, while a latency fallback moves when a model has not begun responding within a threshold (Inworld on routing strategies). Those are two conditions, not one. A model can fail fast with a 500, fail slowly with a 9 second time to first token, or return 200 OK with JSON that fails your schema. Only one of those three is what most retry loops actually watch.
The useful framing comes from gateway work on model cascades: cheap-first, escalate-on-failure routing can cut blended cost substantially when most traffic resolves on the cheap tier, but the savings depend entirely on how often the escalation fires (TrueFoundry on cost and quality aware routing). Which means the escalation condition is not a detail. It is the whole design.
The distinction also matters for observability. If routing and retry share one code path, your logs record "model X answered" but not "model X was chosen at rung 2 after model Y failed schema validation twice." Inworld's guidance is to keep the attempt chain and routing reason visible in request logs precisely so you can see when the ladder, not the router, is doing the work (Inworld).



