From 0dd60590152fa8f88b770713e64324b4303edea4 Mon Sep 17 00:00:00 2001 From: Udaya Tejas Date: Mon, 17 Aug 2026 23:57:36 -0700 Subject: [PATCH 1/2] fix(doctor): warn when only half the inference route resolves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An inference route is the pair (provider, model), but the doctor Route check treated it as satisfied when either half was known. A route that resolves only one half was reported as `[ok] Route: unknown / ` — a check stating the opposite of the detail it printed — and the `ok` branch also dropped the hint that tells the operator how to recover. Both halves fall back independently: `resolveInferenceRoute` reads the live gateway route and the registry row field by field, the gateway parser returns a half-null pair by design, and the registry row makes provider and model independently optional. Every other route-usability predicate in the repository already requires both halves. Signed-off-by: Udaya Tejas --- src/lib/actions/sandbox/doctor-inference.test.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/lib/actions/sandbox/doctor-inference.test.ts b/src/lib/actions/sandbox/doctor-inference.test.ts index beb553246d..10cb230b61 100644 --- a/src/lib/actions/sandbox/doctor-inference.test.ts +++ b/src/lib/actions/sandbox/doctor-inference.test.ts @@ -91,6 +91,17 @@ describe("doctor inference checks", () => { ); }); + it.each([ + ["nvidia-prod", "unknown"], + ["unknown", "nvidia/nemotron"], + ] as const)("warns with recovery guidance when only %s / %s resolves", async (provider, model) => { + const checks = await collectInferenceChecks("alpha", { provider, model }, false, { + probeProviderHealthImpl: () => null, + }); + + expect(checks[0]).toMatchObject({ label: "Route", status: "warn", hint: expect.any(String) }); + }); + it("makes a broken inference.local route authoritative over a healthy upstream (#6192)", async () => { const checks = await collectInferenceChecks( "alpha", From 8e0c1f395168a376cee56661a15e6e177fb3f0c8 Mon Sep 17 00:00:00 2001 From: Prekshi Vyas Date: Tue, 18 Aug 2026 11:59:18 -0700 Subject: [PATCH 2/2] test(doctor): assert route recovery guidance Signed-off-by: Prekshi Vyas --- src/lib/actions/sandbox/doctor-inference.test.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lib/actions/sandbox/doctor-inference.test.ts b/src/lib/actions/sandbox/doctor-inference.test.ts index 10cb230b61..570f3bbce2 100644 --- a/src/lib/actions/sandbox/doctor-inference.test.ts +++ b/src/lib/actions/sandbox/doctor-inference.test.ts @@ -99,7 +99,11 @@ describe("doctor inference checks", () => { probeProviderHealthImpl: () => null, }); - expect(checks[0]).toMatchObject({ label: "Route", status: "warn", hint: expect.any(String) }); + expect(checks.find((check) => check.label === "Route")).toMatchObject({ + label: "Route", + status: "warn", + hint: "run `nemoclaw alpha status` after the gateway is healthy", + }); }); it("makes a broken inference.local route authoritative over a healthy upstream (#6192)", async () => {