Demo ready. Play it or move one step at a time.
Reveal the actual middleware rule
This readable rule is checked against the same Rust built-in and deterministic fixture used by Alex.
{
"id": "example.fable-overload-to-sol",
"name": "Move overloaded Fable chats to Sol",
"description": "Reroute selected failed Anthropic Fable requests to OpenAI Sol.",
"enabled": true,
"priority": 100,
"hook": "attempt_result",
"capabilities": [
"attempt.read_error_body",
"route.override",
"session.pin",
"response.prepend_text"
],
"when": {
"harness_names": [
"claude",
"codex",
"pi"
],
"models": [
"claude-fable-5",
"fable-*"
],
"providers": [
"anthropic"
],
"status": [
429,
"500-599"
],
"error_classes": [
"capacity",
"server"
],
"body_contains_any": [
"model is currently overloaded",
"subscription is unavailable"
]
},
"then": {
"reroute": {
"model": "gpt-5.6-sol",
"providers": [
"openai"
],
"provider_mode": "only",
"scope": "session",
"ttl_seconds": 86400,
"notice": "We moved this chat from Fable 5 to GPT 5.6 Sol.",
"reason": "Fable failed with a selected overload or availability error",
"max_attempts": 3,
"required_capabilities": {
"portable_history": true
}
}
}
}