A bank transaction export is a long tail of easy and hard rows. Most rows have a complete description, a single matching amount, and a counterparty name that points at one obvious category. A minority are genuinely ambiguous: a merchant description that fits two categories, a missing reference, a sign that could be a refund or a charge, an amount that does not match any invoice. If you send all of them to one large model, you pay large-model prices for the easy majority. If you send all of them to a small model, you get cheap output with silent errors on the hard minority.
Confidence-threshold escalation is the pattern that resolves this. The cheap model answers first and produces a confidence signal, and only requests that fall below a threshold move to the stronger model. The structural advantage over deciding difficulty before generation is that you never have to guess how hard a row is before anyone has tried it: you look at what came back. See the write-up on confidence thresholds for escalating requests for the three routing families (rule-based, classifier-based and cascade) and where each one breaks.
The same logic that makes contribution margin the number to watch in a growing business applies here. Revenue per row is fixed. What changes with routing is the variable cost per row, so the only question worth optimizing is how much of each row's value you keep after the model bill.



