Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
aea180f
fix(onboard): restore N1x standard onboarding
sandl99 Sep 4, 2026
393f741
fix(onboard): harden N1x standard admission
sandl99 Sep 4, 2026
cb8844e
fix(onboard): close N1x review gaps
sandl99 Sep 4, 2026
f0b6497
fix(rebuild): preserve N1x standard provider intent
sandl99 Sep 4, 2026
5ee613c
Merge branch 'main' into fix/n1x-non-express-onboarding-11041
sandl99 Sep 4, 2026
b074586
fix(onboard): limit N1x fallback to accepted scope
sandl99 Sep 4, 2026
0391b03
fix(onboard): simplify N1x standard fallback
sandl99 Sep 4, 2026
17ace52
Merge branch 'main' into fix/n1x-non-express-onboarding-11041
sandl99 Sep 4, 2026
aa25dda
Merge branch 'main' into fix/n1x-non-express-onboarding-11041
sandl99 Sep 4, 2026
aee4a24
merge: integrate main into N1x onboarding fix
ericksoa Sep 4, 2026
a840302
fix(onboard): close N1x standard fallback review gaps
ericksoa Sep 4, 2026
fa5ac84
fix(onboard): preserve validated N1x provider intent
ericksoa Sep 4, 2026
ea14fe3
test(installer): prove N1x decline reaches onboarding
ericksoa Sep 4, 2026
1519c57
fix(rebuild): preserve standard N1x provider intent
ericksoa Sep 4, 2026
30db99c
refactor(onboard): unify persisted provider mapping
ericksoa Sep 4, 2026
b9c1f1f
refactor(onboard): centralize provider definitions
ericksoa Sep 4, 2026
e253c20
fix(ci): read shared provider definitions
ericksoa Sep 4, 2026
96ae71e
refactor(onboard): preserve provider identity owners
ericksoa Sep 4, 2026
8fa6ac1
merge: integrate current main before N1x approval
ericksoa Sep 4, 2026
525ce43
fix(onboard): finish N1x ownership and guidance
ericksoa Sep 4, 2026
1263985
fix(onboard): preserve providerless N1x resume intent
ericksoa Sep 4, 2026
732b2bb
Merge remote-tracking branch 'origin/main' into codex/pr11046-remediate
ericksoa Sep 4, 2026
9423023
test(onboard): prove the N1x decline transition
ericksoa Sep 4, 2026
93fd953
test(ci): own installer provider parity
ericksoa Sep 4, 2026
60226d0
docs(onboard): distinguish N1x preview intent
ericksoa Sep 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions scripts/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3718,6 +3718,9 @@ run_installer_host_preflight() {
// authoritative onboarding gate apply supported storage remediation,
// but only when the gateway declaration confirms NemoClaw ownership.
allowStorageRemediation,
allowDeferredN1xManagedVllm:
process.env.NEMOCLAW_PROVIDER === "install-vllm" ||
process.env.NEMOCLAW_NO_EXPRESS === "1",
});
const infoLines = [];
const actionLines = [];
Expand Down Expand Up @@ -6053,9 +6056,6 @@ maybe_offer_express_install() {
# On a detected Express platform but a skip condition applies — explain why so
# the user understands they could have gotten express otherwise.
if [ "${NEMOCLAW_NO_EXPRESS:-}" = "1" ]; then
if [ "$platform" = "N1x" ] && [ "${NEMOCLAW_PROVIDER:-}" != "install-vllm" ]; then
error "N1x onboarding currently requires explicit Deferred managed-vLLM preview intent. Remove NEMOCLAW_NO_EXPRESS=1 and accept the preview, or set NEMOCLAW_PROVIDER=install-vllm."
fi
if [ "$platform" = "DGX Station" ]; then
station_dual_pair_resume_pending \
&& error "A dual-DGX Station pair resume is pending; finish exact pair revalidation before disabling Station setup."
Expand All @@ -6066,7 +6066,7 @@ maybe_offer_express_install() {
fi
if [ -n "${NEMOCLAW_PROVIDER:-}" ]; then
if [ "$platform" = "N1x" ] && [ "$NEMOCLAW_PROVIDER" != "install-vllm" ]; then
error "N1x onboarding currently accepts only the Deferred managed-vLLM preview. Set NEMOCLAW_PROVIDER=install-vllm or use another host for provider ${NEMOCLAW_PROVIDER}."
export NEMOCLAW_NO_EXPRESS=1
fi
if [ "$platform" = "DGX Station" ] && [ "$NEMOCLAW_PROVIDER" = "install-vllm" ]; then
# An explicit managed-vLLM provider selects the same Station host/pair
Expand Down Expand Up @@ -6160,7 +6160,7 @@ maybe_offer_express_install() {
;;
*)
if [ "$platform" = "N1x" ]; then
error "N1x onboarding currently requires the Deferred managed-vLLM preview. Re-run the installer and accept the preview, or set NEMOCLAW_PROVIDER=install-vllm."
export NEMOCLAW_NO_EXPRESS=1
fi
info "Skipping express install. Continuing with interactive flow."
;;
Expand Down
11 changes: 10 additions & 1 deletion src/lib/onboard/fatal-runtime-preflight.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ afterEach(() => {
});

describe("report-backed runtime readiness (#7411)", () => {
it("requires explicit managed-vLLM intent and lets rebuild reject ambient intent (#9292)", () => {
it("requires explicit N1x intent and lets rebuild reject ambient intent (#9292)", () => {
const readiness: SystemReadinessReport = {
schemaVersion: "1.1.0",
status: "incompatible",
Expand Down Expand Up @@ -214,6 +214,15 @@ describe("report-backed runtime readiness (#7411)", () => {
}),
).toBe(readiness);

vi.stubEnv("NEMOCLAW_PROVIDER", "");
vi.stubEnv("NEMOCLAW_NO_EXPRESS", "1");
expect(
assertOnboardSystemReadiness(readiness, hostWithRuntime("docker"), {
explicitlyOptedOutGpuPassthrough: false,
exitProcess: exit as never,
}),
).toBe(readiness);

expect(() =>
assertOnboardSystemReadiness(readiness, hostWithRuntime("docker"), {
explicitlyOptedOutGpuPassthrough: false,
Expand Down
3 changes: 2 additions & 1 deletion src/lib/onboard/fatal-runtime-preflight.ts
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ export function assertOnboardSystemReadiness(
allowPortableHostPreparation: options.allowPortableHostPreparation,
allowDeferredN1xManagedVllm:
options.allowDeferredN1xManagedVllm ??
process.env.NEMOCLAW_PROVIDER === MANAGED_VLLM_PROVIDER_KEY,
(process.env.NEMOCLAW_PROVIDER === MANAGED_VLLM_PROVIDER_KEY ||
process.env.NEMOCLAW_NO_EXPRESS === "1"),
});
const advisories = planHostAdvisories(host, {
providerOwnsHostReadiness: selectedRuntimeOwnsHostReadiness,
Expand Down
27 changes: 12 additions & 15 deletions test/install/install-express-n1x.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,29 +30,26 @@ describe("installer N1x Express preview", () => {
);
});

it("stops before onboarding when the Deferred preview is declined (#8574)", () => {
it("continues with ordinary onboarding when the Deferred preview is declined (#11041)", () => {
// Model curl | bash: stdin is the script pipe, while the reply reaches the controlling /dev/tty.
const result = runExpressPromptWithTty("n\n", "pipe", "N1x");
const output = `${result.stdout}${result.stderr}`;

expect(result.status, output).toBe(1);
expect(output).toMatch(/N1x onboarding currently requires the Deferred managed-vLLM preview/);
expect(output).toMatch(/accept the preview, or set NEMOCLAW_PROVIDER=install-vllm/);
expect(output).not.toMatch(/Continuing with interactive flow/);
expect(output).not.toMatch(/RESULT /);
expect(result.status, output).toBe(0);
expect(output).toMatch(/Skipping express install\. Continuing with interactive flow/);
expect(output).toMatch(/RESULT /);
Comment thread
sandl99 marked this conversation as resolved.
Resolved
});

it("rejects NEMOCLAW_NO_EXPRESS without explicit managed-vLLM intent (#8574)", () => {
const result = runExpressPromptWithTty("", "pipe", "N1x", {
NEMOCLAW_NO_EXPRESS: "1",
});
it.each([
["NEMOCLAW_NO_EXPRESS", { NEMOCLAW_NO_EXPRESS: "1" }],
["an explicit provider", { NEMOCLAW_PROVIDER: "ollama" }],
])("continues with ordinary onboarding for %s (#11041)", (_scenario, env) => {
const result = runExpressPromptWithTty("", "pipe", "N1x", env);
const output = `${result.stdout}${result.stderr}`;

expect(result.status, output).toBe(1);
expect(output).toMatch(/explicit Deferred managed-vLLM preview intent/);
expect(output).toMatch(/Remove NEMOCLAW_NO_EXPRESS=1 and accept the preview/);
expect(output).toMatch(/set NEMOCLAW_PROVIDER=install-vllm/);
expect(output).not.toMatch(/RESULT /);
expect(result.status, output).toBe(0);
expect(output).toMatch(/Skipping express prompt/);
expect(output).toMatch(/RESULT /);
});

it("allows the N1x prompt bypass with explicit managed-vLLM intent (#8574)", () => {
Expand Down
Loading