Context
The public health report from #673 classifies model routing as unavailable when LiteLLM is reachable but has no registered models. A freshly installed silo with no provider credentials is not broken — it is unconfigured, the same state integrations: disabled already expresses.
This matters because the k3d smoke has no provider credentials, so it could never satisfy a gate that required models: available. Two workarounds were tried and rejected:
- Seeding a placeholder provider key made the server fetch
byok-provider-key-openai through the Kubernetes API at startup and exit fatally when that call failed on the loaded CI runner, turning one unavailable probe into a CrashLoopBackOff (evidence: run 32256272448).
- The smoke now asserts the report as-is and permits
models: unavailable, which keeps every other probe strict but leaves model routing uncovered in CI.
What to do
- Report
disabled when no model is configured at all, distinct from unavailable when a configured estate cannot be reached. LiteLLM answers GET /model/info with 500 on an empty estate, so the probe needs to distinguish "no models registered" from "LiteLLM unhealthy" — likely by treating a reachable LiteLLM with an empty model list as disabled and only a transport/auth failure as unavailable.
- Restore the strict
status == "ok" assertion in apps/_infra/deploy-k8s/platform/tests/develop-smoke.sh once the report can reach a fully non-degraded state without provider credentials.
- Separately: a transient Kubernetes API failure while reading a BYOK Secret at startup should be retried rather than exiting the process. A single API blip currently costs a full pod restart cycle.
Pointers
apps/opencrane/src/infra/health/public-health.ts (_CreateModelHealthProbe wiring)
apps/opencrane/src/infra/health/public-health-probe.ts (_HttpHealthProbe, _UnavailableHealthProbe)
apps/_infra/deploy-k8s/platform/tests/develop-smoke.sh (_assert_ingress_health)
Context
The public health report from #673 classifies model routing as
unavailablewhen LiteLLM is reachable but has no registered models. A freshly installed silo with no provider credentials is not broken — it is unconfigured, the same stateintegrations: disabledalready expresses.This matters because the k3d smoke has no provider credentials, so it could never satisfy a gate that required
models: available. Two workarounds were tried and rejected:byok-provider-key-openaithrough the Kubernetes API at startup and exit fatally when that call failed on the loaded CI runner, turning one unavailable probe into a CrashLoopBackOff (evidence: run 32256272448).models: unavailable, which keeps every other probe strict but leaves model routing uncovered in CI.What to do
disabledwhen no model is configured at all, distinct fromunavailablewhen a configured estate cannot be reached. LiteLLM answersGET /model/infowith 500 on an empty estate, so the probe needs to distinguish "no models registered" from "LiteLLM unhealthy" — likely by treating a reachable LiteLLM with an empty model list asdisabledand only a transport/auth failure asunavailable.status == "ok"assertion inapps/_infra/deploy-k8s/platform/tests/develop-smoke.shonce the report can reach a fully non-degraded state without provider credentials.Pointers
apps/opencrane/src/infra/health/public-health.ts(_CreateModelHealthProbewiring)apps/opencrane/src/infra/health/public-health-probe.ts(_HttpHealthProbe,_UnavailableHealthProbe)apps/_infra/deploy-k8s/platform/tests/develop-smoke.sh(_assert_ingress_health)