chat_upstream_failed
Every link in the resolved chain refused before streaming began. The chain is the draft's routed providers only - deliberately no hosted fallback: chat runs the platform's own model, reached from the control plane through the chat-plane base_url override (VOCAPABLE_CHAT_PROVIDER_BASE_URL_OVERRIDES_JSON), and a dead link refuses honestly rather than switching brains. When a stream fails mid-turn the same shape arrives as a final problem SSE event instead, because the 200 status line has already left. Send the turn again; nothing was saved.
Problem shape
Every non-2xx response is an RFC 9457 application/problem+json body. The type URI below is stable and machine-matchable, so branch on the final path segment (the code) and treat the status as redundant confirmation. See the error-handling guide.
{
"type": "https://docs.vocapable.com/errors/chat_upstream_failed",
"title": "…",
"status": 502,
"detail": "…",
"instance": "/v1/…"
}