Streaming transcription now honours the provider and language a request asks for

GET /v1/transcribe/stream ignored X-Speko-Allow, X-Speko-Deny, X-Speko-Language, the objective, the price cap and the key's own provider order. Every request was served by whichever stream-capable provider ranked first, so four of the five provider families that implement streaming transcription were unreachable.

The route asked for every routable transcription candidate instead of the caller's allowed set. Measured against the live API: all 13 routable transcription models resolved to the same provider regardless of which one was pinned.

The route now selects from the caller's allowed set, applies the deny list, and preserves the ranked order and failover across candidates.

A request whose constraints leave no streaming-capable provider is refused with 503 no_streaming_provider naming the language, the allow list and the deny list, instead of being served by a provider it did not ask for.

X-Speko-Language and the key's policy language now apply. The language field in the config frame still wins when present, but it no longer defaults to English: a frame that omits it previously transcribed as English no matter what the key or the header requested, which is the common case because both framework plugins omit the field unless the application sets one.

Transcription is accent-independent, so a regional tag is reduced to its base language before it reaches a provider. This is required now that the header and the key language apply: an accent-tagged key carries a tag such as es-PR, and while three providers already reduced it themselves, one forwarded it verbatim to an API that does not list it as a language code.

Action: No migration is required. A client that pinned a transcription provider and silently received a different one now either receives the pinned provider or a 503 naming the constraint.