412d0e3b42
A ThinkingLoop abort is the loop guard asking for a same-model resample (it injects a thinking-loop-redirect notice that only makes sense on the model that looped), not a provider failure. #handleRetryableError routed it through the generic retryable-error branch, so on attempt 1 it called noteRetryFallbackCooldown + #tryRetryModelFallback and could switch to another family from retry.fallbackChains while parking the original selector on a 5-minute cooldown. A healthy Grok 4.6 planning turn got replaced by whatever the chain listed next. Carve ThinkingLoop out of the model-fallback branch and out of the Fireworks Fast->base degrade so the loop guard always re-samples the same model; the retry budget still bounds a genuinely stuck stream. Fixes #8760