Our solution
One config file, different subgraph addresses per environment
Subgraph overrides live in router YAML: per subgraph, you swap the execution-config URL for the hop that actually works on that machine or cluster. The list below is the field reference; anything you omit keeps its value from the execution config.
Overrides cover
routing_urlreplaces the query/mutation URL from the execution configsubscription_urlreplaces the subscription URL independentlysubscription_protocol:ws,sse, orsse_postsubscription_websocket_subprotocol(graphql-ws,graphql-transport-ws, orauto)
Why it works
You publish one execution config; each router applies only the overrides it defines—cluster-internal DNS in Kubernetes, localhost on a laptop, and so on—without forking the whole file per environment.
Canonical URLs stay on the control plane for publishing and validation; overrides change only how that router instance reaches subgraphs at runtime.

