@@ -145,12 +145,27 @@ The core policy — without it, the Gateway has no AI routing.
145145
146146Providers and models are separate concepts:
147147
148- - ** Providers** define shared connection configuration: endpoint, API
149- schema, and credentials. A provider is referenced by name from model
150- backend entries. Each provider generates one Backend, one
151- AIServiceBackend, and (if credentials are set) one
148+ - ** Providers** define shared connection configuration: endpoint,
149+ protocol, API schema, and credentials. A provider is referenced by
150+ name from model backend entries. Each provider generates one
151+ Backend, one AIServiceBackend, and (if credentials are set) one
152152 BackendSecurityPolicy.
153153
154+ Providers distinguish two layers:
155+
156+ | Field | Layer | Examples |
157+ | -------| -------| ----------|
158+ | ` protocol ` | Transport | ` HTTP ` , ` HTTP2 ` , ` gRPC ` |
159+ | ` schema ` | Application format | ` OpenAI ` , ` AWSBedrock ` , ` MCP ` , ` A2A ` |
160+
161+ The WG AI Gateway's [ Proposal 10: Egress Gateways] combines both
162+ into a single ` BackendProtocol ` enum. We separate them
163+ intentionally — MCP and A2A are application-layer schemas
164+ (JSON-RPC over HTTP/SSE, HTTP respectively), not transport
165+ protocols. A provider's protocol determines the generated
166+ ` Backend ` transport configuration; its schema determines the
167+ ` AIServiceBackend ` API translation.
168+
154169- ** Models** define the client-facing routing unit. Each model has a
155170 ` name ` (the virtual name clients request), a list of ` backends `
156171 (provider references with the actual model name and failover
@@ -428,6 +443,9 @@ status:
428443 - type: RoutingActive # AIGatewayRoute + BTP created and accepted
429444 status: "True"
430445 reason: Applied
446+ - type: Programmed # aggregate: all sub-conditions True
447+ status: "False"
448+ reason: ProvidersNotReady
431449
432450 providers:
433451 - name: ollama
@@ -451,6 +469,14 @@ status:
451469| `GatewayBound` | Target Gateway exists in namespace | `GatewayNotFound` |
452470| `ProvidersConfigured` | All Backend + AIServiceBackend + BSP resources created | `PartialFailure`, `ApplyFailed`, `CredentialSecretNotFound` |
453471| `RoutingActive` | AIGatewayRoute + BackendTrafficPolicy created and accepted | `ApplyFailed` |
472+ | `Programmed` | All of the above are True | Mirrors the failing sub-condition's reason |
473+
474+ ` Programmed` is an aggregate signal per [GEP-713][]. It goes True
475+ when `Accepted`, `GatewayBound`, `ProvidersConfigured`, and
476+ ` RoutingActive` are all True, giving a single condition suitable for
477+ ` kubectl wait --for=condition=Programmed` .
478+
479+ [GEP-713] : https://gateway-api.sigs.k8s.io/geps/gep-713/
454480
455481The `status.providers[]` list mirrors `spec.providers[]` and reports
456482per-provider readiness. When `ProvidersConfigured` is False, the
@@ -479,6 +505,9 @@ status:
479505 - type: MTLSActive # CA Secret + server cert + CTP created
480506 status: "True"
481507 reason: Applied
508+ - type: Programmed # aggregate: all sub-conditions True
509+ status: "True"
510+ reason: Programmed
482511` ` `
483512
484513| Condition | True when | False reasons |
@@ -487,6 +516,7 @@ status:
487516| `GatewayBound` | Target Gateway exists in namespace | `GatewayNotFound` |
488517| `BundleReady` | Trust bundle ConfigMap read and parsed with ≥1 valid cert | `BundleNotFound`, `BundleEmpty`, `BundleParseError` |
489518| `MTLSActive` | CA Secret, server cert, and ClientTrafficPolicy created | `ApplyFailed`, `CertGenerationFailed` |
519+ | `Programmed` | All of the above are True | Mirrors the failing sub-condition's reason |
490520
491521` BundleReady` is re-evaluated on every requeue (default 5 minutes),
492522so it reflects trust bundle rotations. The message includes the
0 commit comments