Fixes the "Sisyphus randomly drops to claude-opus-4.7" bug
If you're on 3.17.x and noticed Sisyphus silently jumping back to claude-opus-4-7 while you were running it on GPT-5.4, GLM, Kimi, or any non-Claude model: this release fixes that.
What was happening
Commit 034744cb (Apr 22, "retry forbidden provider errors") added bare "403" and "forbidden" substrings to the retryable-error pattern list. The intent was to retry the specific Forbidden: Selected provider is forbidden case from PR #3706, but bare-substring matching is greedy: it caught any error message containing those tokens, including:
- Tool-level 403s (e.g. webfetch hitting a guarded URL)
- File-permission "forbidden" messages
- Unrelated upstream errors that happened to spell "forbidden" / "403"
When the classifier returned true on those false positives, event.ts armed setPendingModelFallback("sisyphus", ...), which immediately advanced to the first entry of Sisyphus' fallback chain, claude-opus-4-7. So a non-Claude run would silently jump to opus 4.7 with no visible model-level error.
Fix
Replaced the bare patterns with the specific phrases the original PR was actually targeting:
- "403",
- "forbidden",
+ "selected provider is forbidden",
+ "provider is forbidden",The original "Selected provider is forbidden" case still retries correctly. Unrelated 403 / forbidden messages now stay non-retryable, so your configured model is no longer hijacked. Two regression tests lock the new behavior down.
Reported by ilove_borshch in #omo-help. Thanks for the precise repro.
- f7270a0 fix(model-error-classifier): scope forbidden-provider retry to specific phrase