Skip to content

Fix install one-liner 404 on NVIDIA hosts without a CUDA toolkit - #1267

Merged
michaelneale merged 1 commit into
mainfrom
fix/installer-driver-only-cuda
Aug 12, 2026
Merged

Fix install one-liner 404 on NVIDIA hosts without a CUDA toolkit#1267
michaelneale merged 1 commit into
mainfrom
fix/installer-driver-only-cuda

Conversation

@michaelneale

@michaelneale michaelneale commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

What this fixes

The documented install one-liner now works on Linux hosts that have an NVIDIA driver but no CUDA toolkit — the normal shape for an inference-only GPU box.

Before, it failed with a 404:

$ curl -fsSL https://meshllm.cloud/install.sh | bash -s -- --no-setup
curl: (22) The requested URL returned error: 404
error: could not download release archive for mesh-llm-x86_64-unknown-linux-gnu-cuda.tar.gz or mesh-bundle.tar.gz

After, it selects the right lane and installs.

Why it happened

detect_cuda_major probed three things — nvcc --version, /usr/local/cuda*/.../libcudart.so.*, and libcudart in ldconfig -p. All three are toolkit artifacts, so a driver-only host returned empty. asset_name then fell back to the legacy bare name mesh-llm-<arch>-unknown-linux-gnu-cuda.tar.gz, which releases stopped publishing when the CUDA lanes were split into -cuda-12 / -cuda-13. The v0.75.1 release publishes only the split names, so that fallback could never resolve — on x86_64 or aarch64.

This is the installer-side counterpart to #1195, which separated driver bound from installed toolkit in host runtime selection. Same underlying confusion (driver ≠ toolkit), different code path: #1195 fixed picking the native runtime after install, this fixes picking the archive to download in the first place. It is not a platform-support limitation — the correct archive exists and is published, the installer just asked for a name that does not.

What changed

  • When toolkit probes find nothing but nvidia-smi is present, take the CUDA major from its header (CUDA Version: 13.0). That is the driver's maximum supported CUDA, which is the correct upper bound for choosing a lane, and clamp it to the newest published lane.
  • Remove the bare--cuda fallback on both the x86_64 and aarch64 branches. If no supported major can be determined, fail with an actionable message instead of fabricating an archive name that cannot exist:
error: detected an NVIDIA GPU but could not determine a supported CUDA major version (expected 12 or 13).
       install a CUDA toolkit, or re-run with --flavor cpu (or --flavor vulkan) to use a non-CUDA build.

Validation

bash -n install.sh passes. detect_cuda_major exercised against a stubbed nvidia-smi on a machine with no CUDA toolkit at all, covering every branch of the new path:

stub nvidia-smi output result
CUDA Version: 13.0 13
CUDA Version: 14.2 (future driver) 13 (clamped to newest published lane)
CUDA Version: 11.8 (too old) empty → actionable error
no nvidia-smi on PATH empty → actionable error

Release-asset names confirmed against v0.75.1 with gh release view: only -cuda-12 and -cuda-13 are published for both x86_64 and aarch64, no bare -cuda.

Partially addresses #1220 — the installer half. Deliberately not using a closing keyword: #1220 also reports a runtime-linkage failure that this does not fix, so the issue should stay open until that half is tracked separately.

Not covered here: the reporter also hit a second, separate problem — after installing, the Linux cuda13 native runtime links libcudart.so.13/libcublas.so.13 without bundling them, while the Windows runtime ships its own CUDA DLLs. That needs its own issue and fix.

Summary by CodeRabbit

  • Bug Fixes
    • Improved CUDA version detection by using the installed NVIDIA driver when toolkit information is unavailable.
    • Limited detected CUDA versions to supported releases.
    • Installation now reports an error when no supported CUDA version can be identified instead of selecting an incompatible archive.

Update after first CI run

CI caught something my local checks did not, and it was a real bug rather than a stale assertion.

scripts/tests/test_install_sh.py asserted the legacy bare -cuda name that this PR removes, so that assertion is updated to require the refusal instead. But running the suite locally then exposed a genuine defect in my own change: install.sh runs under set -euo pipefail, and a non-matching grep inside $(...) aborts the whole script. On a host where the new nvidia-smi probe found no version, the installer would have died mid-detection instead of reaching the actionable error. Every detect_cuda_major probe pipeline now ends in || true, which also hardens the two pre-existing nvcc and ldconfig probes that had the same latent exposure.

Test coverage added:

  • test_detect_cuda_major_falls_back_to_nvidia_smi_driver_version — stubs a driver-only host (no nvcc, no ldconfig) across 13.013, 12.412, 14.213 (clamped), 11.8 → empty.
  • test_asset_name_uses_detected_cuda_major_lane — the -cuda-12/-cuda-13 lane name is built correctly on both x86_64 and aarch64.
  • test_release_target_helpers_keep_linux_aarch64_flavor_surface — now asserts refusal plus the actionable stderr, and asserts the legacy name is never emitted.

python3 -m unittest scripts.tests.test_install_sh → 26 passed.

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2f6aa199-0e0d-42da-80d8-9eb1fbfaffdd

📥 Commits

Reviewing files that changed from the base of the PR and between 3176a14 and 8cbc998.

📒 Files selected for processing (2)
  • install.sh
  • scripts/tests/test_install_sh.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • install.sh
  • scripts/tests/test_install_sh.py

📝 Walkthrough

Walkthrough

The installer now tolerates failed CUDA toolkit and library probes, falls back to nvidia-smi, clamps newer versions to CUDA 13, and rejects unsupported or undetectable CUDA asset selections.

Changes

CUDA detection and asset selection

Layer / File(s) Summary
CUDA detection and versioned archive selection
install.sh
detect_cuda_major tolerates failed probes and uses nvidia-smi as a fallback. aarch64 and x86_64 asset selection now requires supported CUDA 12 or 13 archives.
CUDA detection and asset selection tests
scripts/tests/test_install_sh.py
Tests cover unavailable CUDA evidence, versioned asset names, driver-version fallback, clamping above CUDA 13, unsupported older versions, and isolated CUDA probe paths.

Estimated code review effort: 2 (Simple) | ~10 minutes

Mergeability Score: 🔵 Low · up to 8cbc9

The installer now selects CUDA 12 or 13 archives on NVIDIA hosts without a toolkit, but affected Linux systems may still install successfully and then fail at runtime if the matching CUDA libraries are unavailable. The PR is mergeable with explicit owner awareness and follow-up on runtime library bundling or linkage.

Possibly related issues

Suggested reviewers: ndizazzo

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the installer fix for NVIDIA hosts without a CUDA toolkit.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/installer-driver-only-cuda

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@michaelneale
michaelneale force-pushed the fix/installer-driver-only-cuda branch from e4eeaa0 to 84001ee Compare August 12, 2026 21:28
@github-actions
github-actions Bot requested a review from ndizazzo August 12, 2026 21:29

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@install.sh`:
- Around line 381-384: Update the CUDA-version error message in the aarch64
install path to recommend only --flavor cpu, removing the unsupported --flavor
vulkan suggestion while preserving the existing toolkit guidance and error
behavior.
- Around line 381-386: Align the installer and packaging contract by adding
explicit CUDA 12 and CUDA 13 lanes in check_package_release_assets, setting
deterministic MESH_CUDA_VERSION values for x86_64, aarch64, and Orin checks, and
updating fixture/release exact-name assertions to use versioned cuda-12 or
cuda-13 assets. Update release documentation to describe the versioned asset
names and supported CUDA lanes.
- Around line 353-362: Remove the nvidia-smi fallback that assigns ver from the
driver-reported CUDA version. When toolkit probes are empty, only select a CUDA
lane after verifying matching-major loader-path evidence for libcudart,
libcublas, and libcublasLt, or use an existing verified self-contained bundle
path; do not treat driver_max_major as runtime evidence.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: fd4ce64e-dc86-4aaa-9036-910f6755212c

📥 Commits

Reviewing files that changed from the base of the PR and between 4890efd and e4eeaa0.

📒 Files selected for processing (1)
  • install.sh

Comment thread install.sh
Comment on lines +353 to +362
# Inference-only hosts carry an NVIDIA driver but no CUDA toolkit, so none of
# the probes above find anything. The driver still advertises the highest CUDA
# it supports in the nvidia-smi header ("CUDA Version: 13.0"); use that as an
# upper bound and clamp it to a CUDA lane we actually publish.
if [[ -z "$ver" ]] && command -v nvidia-smi >/dev/null 2>&1; then
ver="$(nvidia-smi 2>/dev/null | grep -oE 'CUDA Version: *[0-9]+' | grep -oE '[0-9]+' | head -n 1)"
if [[ -n "$ver" ]] && (( ver > 13 )); then
ver=13
fi
fi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

rg -n -C 4 \
  'driver_max_major|libcudart|libcublas|libcublasLt|native-runtimes|cuda-12|cuda-13'

Repository: Mesh-LLM/mesh-llm

Length of output: 155


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- install.sh locations ---'
git ls-files | grep -E '(^|/)install\.sh$' || true

printf '%s\n' '--- install.sh relevant symbols ---'
rg -n -C 6 'nvidia-smi|driver_max_major|CUDA Version|cuda-[0-9]+|native|runtime|libcudart|libcublas' install.sh 2>/dev/null || true

printf '%s\n' '--- repository references ---'
rg -n -C 3 'driver_max_major|libcudart|libcublas|libcublasLt|native-runtimes|cuda-12|cuda-13' . --glob '!target/**' --glob '!node_modules/**' 2>/dev/null || true

Repository: Mesh-LLM/mesh-llm

Length of output: 50376


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- install.sh CUDA detection and asset selection ---'
sed -n '300,380p' install.sh
sed -n '520,610p' install.sh

printf '%s\n' '--- hardware profile implementation ---'
sed -n '280,390p' crates/mesh-llm-hardware-profile/src/lib.rs
sed -n '390,475p' crates/mesh-llm-hardware-profile/src/lib.rs

printf '%s\n' '--- resolver/runtime manifest references ---'
rg -n -C 5 'driver_max_major|toolkit_majors|bundled|bundle|cuda|cudart|cublas|windows|target_os' crates --glob '*.rs' | head -n 500

printf '%s\n' '--- focused tests ---'
sed -n '820,900p' crates/mesh-llm-hardware-profile/src/lib.rs
rg -n -C 5 'driver_max_major|toolkit_majors|cuda.*selection|selection.*cuda|runtime.*compatible|bundled' crates --glob '*test*' --glob '*.rs' | head -n 500

Repository: Mesh-LLM/mesh-llm

Length of output: 50373


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- complete install asset selection ---'
sed -n '360,455p' install.sh
rg -n -C 8 'asset_name|detect_cuda_major|preferred_asset|recommended_flavor|INSTALL_FLAVOR' install.sh

printf '%s\n' '--- runtime-related Rust files ---'
git ls-files 'crates/**/*.rs' | while read -r file; do
    if rg -q 'HostCudaProfile|driver_max_major|toolkit_majors|RuntimeSelection|NativeRuntime|runtime.*manifest|manifest.*runtime' "$file"; then
        printf '%s\n' "$file"
    fi
done

printf '%s\n' '--- CUDA profile consumers ---'
rg -n -C 12 'driver_max_major|toolkit_majors|HostCudaProfile|cuda.*compatible|compatible.*cuda|runtime.*candidate|candidate.*runtime' \
  crates/mesh-llm-hardware-profile crates --glob '*.rs' \
  --glob '!crates/mesh-llm-hardware-profile/src/lib.rs' | head -n 700

printf '%s\n' '--- packaging and runtime documentation ---'
rg -n -C 5 'bundl(e|ed).*CUDA|CUDA.*bundl|libcudart|libcublas|libcublasLt|host-linked|host linked|Windows.*CUDA|CUDA.*Windows' \
  docs README.md scripts crates --glob '!*.lock' | head -n 500

Repository: Mesh-LLM/mesh-llm

Length of output: 50374


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- resolver CUDA evaluation and bundling ---'
sed -n '400,530p' crates/mesh-llm-native-runtime/src/resolver.rs
sed -n '700,840p' crates/mesh-llm-native-runtime/src/resolver.rs

printf '%s\n' '--- runtime manifest CUDA requirements ---'
rg -n -C 8 'CudaRuntimeRequirements|bundled_libraries|library|cuda_toolkit|toolkit_major|runtime.*requirements' \
  crates/mesh-llm-native-runtime scripts docs README.md --glob '*.rs' --glob '*.sh' --glob '*.md' \
  | head -n 700

printf '%s\n' '--- Linux CUDA package construction ---'
rg -n -C 10 'cudart|cublas|cublasLt|CUDA.*runtime|runtime.*CUDA|MESH_LLM_CUDA_TOOLKIT_MAJOR|backend.*cuda' \
  scripts/package-native-runtime.sh scripts/package-release.sh docs/cuda-release-lanes.md \
  docs/design/NATIVE_RUNTIMES.md docs/SDK.md README.md | head -n 700

printf '%s\n' '--- focused static behavioral verifier ---'
python3 - <<'PY'
from pathlib import Path

install = Path("install.sh").read_text()
resolver = Path("crates/mesh-llm-native-runtime/src/resolver.rs").read_text()
host = Path("crates/mesh-llm-native-runtime/src/host.rs").read_text()

checks = {
    "installer uses nvidia-smi fallback": 'nvidia-smi 2>/dev/null | grep -oE \'CUDA Version:' in install,
    "installer emits CUDA-major Linux archive": 'unknown-linux-gnu-cuda-%s.tar.gz' in install,
    "resolver rejects host-linked CUDA without toolkit": 'CudaToolkitNotDetected { required }' in resolver,
    "resolver checks complete bundled CUDA set": all(x in resolver for x in ['"cudart"', '"cublas"', '"cublasLt"']),
    "driver bound is separate from toolkit evidence": 'pub driver_max_major' in host and 'pub toolkit_majors' in host,
}
for name, ok in checks.items():
    print(f"{name}: {'yes' if ok else 'no'}")
if not all(checks.values()):
    raise SystemExit(1)
PY

Repository: Mesh-LLM/mesh-llm

Length of output: 50373


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- CUDA release-lane contract ---'
cat -n docs/cuda-release-lanes.md | sed -n '1,180p'

printf '%s\n' '--- release archive composition ---'
rg -n -C 12 'cuda-[0-9]|unknown-linux-gnu-cuda|PRECOMPOSED_PRODUCT|product-manifest|native-runtimes|bundle' \
  scripts/package-release.sh scripts/package-release.ps1 scripts/ci-compose-product-input.sh \
  scripts/build-development-product.sh scripts/build-release.sh 2>/dev/null | head -n 900

printf '%s\n' '--- installer archive validation and setup handoff ---'
sed -n '620,850p' install.sh

printf '%s\n' '--- source-level contract verifier ---'
python3 - <<'PY'
from pathlib import Path
install = Path("install.sh").read_text()
resolver = Path("crates/mesh-llm-native-runtime/src/resolver.rs").read_text()
host = Path("crates/mesh-llm-native-runtime/src/host.rs").read_text()

needles = {
    "nvidia-smi fallback in installer": "nvidia-smi 2>/dev/null" in install,
    "CUDA archive selected from detected major": "unknown-linux-gnu-cuda-%s.tar.gz" in install,
    "installer probes only libcudart": "libcudart.so.*" in install and "libcublas.so.*" not in install,
    "resolver requires host toolkit for nonbundled runtime": "CudaToolkitNotDetected { required }" in resolver,
    "resolver treats driver maximum separately": "driver_max_major" in host and "toolkit_majors" in host,
    "resolver requires cudart/cublas/cublasLt for bundling": all(token in resolver for token in ("cudart", "cublas", "cublas_lt")),
}
for label, result in needles.items():
    print(f"{label}: {result}")
PY

Repository: Mesh-LLM/mesh-llm

Length of output: 50375


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- release asset naming and flavor mapping ---'
sed -n '35,190p' scripts/package-release.sh
rg -n -C 5 'cuda-12|cuda-13|cuda-blackwell|unknown-linux-gnu-cuda|MESH_LLM_INSTALL_FLAVOR|RELEASE_FLAVOR' .github Justfile scripts install.sh docs \
  --glob '!*.lock' | head -n 700

printf '%s\n' '--- native CUDA runtime package manifest generation ---'
rg -n -C 10 'manifest|libraries|CUDA|cudart|cublas|cublasLt|link' scripts/package-native-runtime.sh | head -n 700
sed -n '430,700p' scripts/package-native-runtime.sh

printf '%s\n' '--- runtime selection outcomes for driver-only profiles ---'
sed -n '840,940p' crates/mesh-llm-native-runtime/src/resolver.rs
rg -n -C 8 'select_native_runtime_from_artifacts|CandidateRejection|CudaToolkitNotDetected|fallback.*cpu|no compatible' \
  crates/mesh-llm-native-runtime crates/mesh-llm-commands --glob '*.rs' | head -n 800

Repository: Mesh-LLM/mesh-llm

Length of output: 50376


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '--- runtime package library list and CUDA linkage ---'
sed -n '500,690p' scripts/package-native-runtime.sh
sed -n '300,430p' crates/llama-quant-ffi/build.rs

printf '%s\n' '--- deterministic driver-only scenario probe ---'
python3 - <<'PY'
from pathlib import Path

# Model only the documented branch conditions. Do not execute repository code.
def installer_cuda_major(nvcc_major, libcudart_majors, nvidia_smi_major):
    if nvcc_major:
        return nvcc_major
    if libcudart_majors:
        return max(libcudart_majors)
    return min(nvidia_smi_major, 13) if nvidia_smi_major else None

def resolver_accepts_linux_host_linked(required, toolkit_majors, driver_max):
    if driver_max is not None and required > driver_max:
        return False
    return required in toolkit_majors

selected = installer_cuda_major(None, set(), 13)
accepted = resolver_accepts_linux_host_linked(selected, set(), 13)
print(f"driver-only host: installer_major={selected}, linux_host_linked_runtime_accepted={accepted}")
assert selected == 13
assert accepted is False

install = Path("install.sh").read_text()
resolver = Path("crates/mesh-llm-native-runtime/src/resolver.rs").read_text()
assert "nvidia-smi 2>/dev/null" in install
assert "unknown-linux-gnu-cuda-%s.tar.gz" in install
assert "CudaToolkitNotDetected { required }" in resolver
print("source branches match the driver-only scenario")
PY

Repository: Mesh-LLM/mesh-llm

Length of output: 10888


Do not use nvidia-smi as CUDA runtime evidence.

When toolkit probes are empty, this fallback can select a Linux CUDA archive from the driver upper bound. Linux runtimes require matching-major loader-path evidence for libcudart, libcublas, and libcublasLt; driver_max_major does not provide that evidence. Require all three libraries, or select a verified self-contained bundle.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@install.sh` around lines 353 - 362, Remove the nvidia-smi fallback that
assigns ver from the driver-reported CUDA version. When toolkit probes are
empty, only select a CUDA lane after verifying matching-major loader-path
evidence for libcudart, libcublas, and libcublasLt, or use an existing verified
self-contained bundle path; do not treat driver_max_major as runtime evidence.

Sources: Learnings, MCP tools

Comment thread install.sh
Comment thread install.sh
@michaelneale
michaelneale force-pushed the fix/installer-driver-only-cuda branch from 84001ee to 3176a14 Compare August 12, 2026 21:35

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/tests/test_install_sh.py`:
- Line 85: Make CUDA detection tests independent of host toolkit state by adding
an injectable probe-root or equivalent test-only isolation mechanism to
detect_cuda_major. Apply it at scripts/tests/test_install_sh.py lines 85-85 so
the no-evidence case cannot inspect host CUDA, and at lines 146-164 so detection
uses the supplied nvidia-smi output rather than a host library version.
- Around line 127-168: Update detect_cuda_major and its test expectations so
nvidia-smi driver headers are treated only as a compatibility upper bound, not
sufficient CUDA runtime evidence. Require matching-major libcudart, libcublas,
and libcublasLt evidence before selecting a host-linked CUDA archive, or select
an archive that bundles those dependencies; driver-only cases must not return a
CUDA major.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: dcd72d1f-3009-4b26-8606-d69784577959

📥 Commits

Reviewing files that changed from the base of the PR and between e4eeaa0 and 3176a14.

📒 Files selected for processing (2)
  • install.sh
  • scripts/tests/test_install_sh.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • install.sh

Comment thread scripts/tests/test_install_sh.py
Comment thread scripts/tests/test_install_sh.py
Inference-only Linux hosts carry an NVIDIA driver but no CUDA toolkit, so
detect_cuda_major found nothing (it probed only nvcc, /usr/local/cuda*, and
libcudart in ldconfig) and asset_name fell back to the legacy bare -cuda
archive name, which releases no longer publish. The install one-liner 404'd.

Fall back to the CUDA major advertised in the nvidia-smi header, clamped to a
published lane, and drop the legacy fallback in favour of an actionable error
so a missing lane never becomes a mystery 404.

Refs #1220

Co-authored-by: Michael Neale <14976+michaelneale@users.noreply.github.com>
Signed-off-by: Michael Neale <14976+michaelneale@users.noreply.github.com>
Co-authored-by: Michael Neale <14976+michaelneale@users.noreply.github.com>
Signed-off-by: Michael Neale <14976+michaelneale@users.noreply.github.com>
Co-authored-by: Michael Neale <14976+michaelneale@users.noreply.github.com>
Signed-off-by: Michael Neale <14976+michaelneale@users.noreply.github.com>
@michaelneale
michaelneale force-pushed the fix/installer-driver-only-cuda branch from 3176a14 to 8cbc998 Compare August 12, 2026 21:43
@michaelneale

Copy link
Copy Markdown
Collaborator Author

Thanks — two of these were right and are now fixed; one I am deliberately not addressing here.

Fixed: aarch64 remediation suggested an unavailable flavor. Correct, supported_flavors() returns only cuda cpu on aarch64. That branch now says --flavor cpu only, and the test asserts --flavor vulkan never appears in aarch64 stderr.

Fixed: tests were not isolated from host toolkit state. Also correct — the /usr/local/cuda* glob ran before the PATH wrappers, so a runner with a toolkit installed could bypass the setup and pass for the wrong reason. detect_cuda_major now honours an optional MESH_LLM_TEST_CUDA_PROBE_ROOT prefix on that glob, and the probe tests set it to an empty temp dir. The aarch64 surface test overrides detect_cuda_major outright, since it is exercising asset_name, not detection.

Not fixed here, deliberately: using nvidia-smi as CUDA runtime evidence. You are right that the driver header is only an upper bound and does not prove libcudart/libcublas/libcublasLt are present at a matching major. But requiring that evidence in the installer would leave a driver-only host with no selectable CUDA archive, which is a strictly worse outcome than today and does not match what the release actually publishes — there is no self-contained Linux CUDA bundle to select.

The real defect you are pointing at is that Linux CUDA runtimes are host-linked while the Windows ones bundle their CUDA DLLs. That is a genuine bug, it is the second half of #1220, and it needs a fix in packaging rather than in archive-name selection. This PR is scoped to the 404: the fallback it replaces could never resolve at all. After this change a driver-only host gets the correct archive and then fails at runtime load with a clear error — worse-shaped than a bundled runtime would be, better than a 404, and the packaging fix is tracked separately.

Third comment (release-asset contract / MESH_CUDA_VERSION): the versioned -cuda-12/-cuda-13 lanes are already what releases publish — verified against v0.75.1 with gh release view. This PR does not change the release contract, it stops the installer asking for a name that was retired when the lanes split. Any gap in check_package_release_assets predates this change.

@michaelneale
michaelneale merged commit 602eae7 into main Aug 12, 2026
38 checks passed
@michaelneale
michaelneale deleted the fix/installer-driver-only-cuda branch August 12, 2026 21:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant