SIGN IN SIGN UP

feat(rustd): the validated host travels with the URL it was validated from

`endpoint::resolve` derived the host to make its SSRF ruling and then threw it
away — `validate(url).map(|_host| Some(url))`. Every consumer downstream would
have had to re-derive it, and a second derivation is a second chance to
disagree with the one that actually cleared the host. `Dialled` pairs them from
the ruling to the wire, so the run cannot dial a URL whose host the allowlist
never passed.

`Resolved::base_url` had no production reader yet, so this fixes the shape
rather than bolting a second field beside it.

`Wire` derives the provider triple in one function, and that is the whole point:
the engine classifies on the provider STRING, and `openai-compatible` paired
with a URL maps to no documented provider at all. `service_endpoint.zig` needs a
fourth outcome to hold that — an allocation failure building the prefixed name,
degrading to the named-provider shape so the undefined pairing cannot escape.
`format!` does not fail, so the branch and the reasoning it needed are gone and
the pairing is unrepresentable instead of defended.

The platform default now validates its endpoint too, which the Zig does not —
`hostFromUrl` there takes whatever the column held. It degrades rather than
refusing, because that row is an operator's and refusing it would stop every
fleet on the platform default rather than one tenant's: an endpoint that will
not validate yields no host, so the allowlist admits nothing and the run fails
closed where it dials.

`endpoint` splits into the pairing rule and the URL check, which answer
different questions and fail for different reasons — a credential can satisfy
either and fail the other.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
K
Kishore Kumar committed
38578e11478a574e99aedb041195f67f7a50b571
Parent: 469db85