3.5 KiB
3.5 KiB
"Run All" SAT planning happens on the backend, not in the browser
Date: 2026-08-31 Status: active
Symptom
Support bundle 210619KUGGXGS2000017 (8x H200 NVL, identical to ...008):
the operator hit "Run All" and only 6 tasks were queued - cpu, memory,
storage, tpm, nvidia-config, pcie-link. No nvidia, nvidia-interconnect,
nvidia-bandwidth, nvidia-pcie-bandwidth. The GPUs were physically present
and nvidia-config (which enumerates them) passed.
Root cause
Task planning lived in page JavaScript:
runAllCheckSAT()/runAllSAT()added the NVIDIA targets onlyif (satSelectedGPUIndices().length).- That list came from
/api/gpu/nvidia(nvidia-smi --query-gpu=...), fetched once per page load and cached insatNvidiaGPUsPromise. - If the page first queried while the driver was still enumerating GPUs (the
two 60-second service timeouts described in
2026-08-31-bee-nvidia-restart-deadlock.md,
plus per-GPU GSP firmware boot), it got an empty list and cached it for the
whole session. "Run All" then silently dropped every GPU test - no banner,
no error.
/api/gpu/presence(a separateos.Stat("/dev/nvidia0")check) meanwhile said "GPU present", so the UI even contradicted itself.
Decision
- New endpoint
POST /api/sat/run-all. The browser sends only operator intent:stress_mode,amd_targets(checkbox selection), and an optionalnvidia_gpu_indicessubset. The server decides what hardware is present/ready and what to enqueue (handler.planSATRunAll).runAllSAT()/runAllCheckSAT()are now thinfetchwrappers and render thenotes[]the server returns ("TPM: no device - skipped", etc.). - GPU planning waits on a readiness gate, not a device probe.
planSATRunAllcallswaitForNvidiaReady, which repeats the freshListNvidiaGPUsquery untilnvidia-smienumerates at least one GPU, the runtime snapshot reportsNvidiaGSPMode == "gsp-stuck", or the 75-second deadline expires. A loaded kernel module is not treated as proof that user-space tools can address a GPU.CUDAReady == falseafter enumeration is a note, not a blocker. - One presence source with a PCI fallback.
app.DetectGPUPresence:- primary - the existing operational vendor result (
DetectGPUVendor); - fallback -
System.PhysicalGPUVendors()(lspci VGA/3D/Display class + vendor id): a GPU on the bus not reported by operational detection setsNvidiaInitializing/AMDInitializing, an explicit state distinct from "absent". For NVIDIA, the page can show that enumeration is still pending instead of reporting no hardware./api/gpu/tools,/api/gpu/presenceand the run-all planner all go through it.
- primary - the existing operational vendor result (
- TPM gate.
tpmis planned only whenapp.TPMPresent()finds a sysfs TPM whose stabletpm_version_majorattribute is exactly2; otherwise a note explains the skip. This matches the pack-level guard already inRunTPMValidationPack.
Consequences
- "Run All" can no longer skip hardware because a browser-cached probe was
early/empty. A genuinely absent or dead GPU still gets skipped - but with a
notes[]entry, andnvidia-configstill runs to capture diagnostics. - The per-card
disableSATCard('...','No NVIDIA GPU detected')hints in the page still use/api/gpu/presence- cosmetic only now, and self-heal on reload. - Automated / headless callers get correct planning for free by POSTing the same endpoint instead of replicating the JS logic.