diff --git a/audit/internal/webui/api_sat_runall.go b/audit/internal/webui/api_sat_runall.go
index 871e9e0..21ce3c9 100644
--- a/audit/internal/webui/api_sat_runall.go
+++ b/audit/internal/webui/api_sat_runall.go
@@ -103,18 +103,21 @@ func (h *handler) planSATRunAll(ctx context.Context, req satRunAllRequest) ([]sa
satRunAllSpec{target: "storage", params: taskParams{StressMode: req.StressMode}},
)
- if h.opts.App.TPMPresent() {
- specs = append(specs, satRunAllSpec{target: "tpm", params: taskParams{}})
- } else {
- skip("TPM: no TPM device on this host; check skipped")
+ if !req.StressMode {
+ if h.opts.App.TPMPresent() {
+ specs = append(specs, satRunAllSpec{target: "tpm", params: taskParams{}})
+ } else {
+ skip("TPM: no TPM device on this host; check skipped")
+ }
}
gp := h.opts.App.DetectGPUPresence()
if gp.Nvidia || gp.NvidiaInitializing {
- // nvidia-config only collects inventory and NVLink state; safe to run
- // even while the compute stack is still coming up.
- specs = append(specs, satRunAllSpec{target: "nvidia-config", params: taskParams{}})
+ // nvidia-config is a read-only Check task, not a load test.
+ if !req.StressMode {
+ specs = append(specs, satRunAllSpec{target: "nvidia-config", params: taskParams{}})
+ }
health, gpus, ready := h.waitForNvidiaReady(ctx)
switch {
@@ -138,10 +141,12 @@ func (h *handler) planSATRunAll(ctx context.Context, req satRunAllRequest) ([]sa
if !health.CUDAReady {
notes = append(notes, "NVIDIA: CUDA runtime not confirmed ready; GPU tests queued anyway")
}
- gpuTargets := []string{"nvidia", "nvidia-interconnect", "nvidia-bandwidth"}
+ gpuTargets := []string{"nvidia", "nvidia-bandwidth"}
if req.StressMode {
// Stress tier adds the targeted dcgmi diag load tests.
gpuTargets = append(gpuTargets, "nvidia-targeted-stress", "nvidia-targeted-power", "nvidia-pulse")
+ } else {
+ gpuTargets = append(gpuTargets, "nvidia-interconnect")
}
for _, target := range gpuTargets {
specs = append(specs, satRunAllSpec{
@@ -152,7 +157,7 @@ func (h *handler) planSATRunAll(ctx context.Context, req satRunAllRequest) ([]sa
}
}
- if gp.AMD {
+ if gp.AMD && !req.StressMode {
for _, target := range req.AMDTargets {
switch target {
case "amd", "amd-mem", "amd-bandwidth":
diff --git a/audit/internal/webui/api_sat_runall_test.go b/audit/internal/webui/api_sat_runall_test.go
index 2fc0136..8fcdd2b 100644
--- a/audit/internal/webui/api_sat_runall_test.go
+++ b/audit/internal/webui/api_sat_runall_test.go
@@ -3,6 +3,7 @@ package webui
import (
"context"
"reflect"
+ "strings"
"testing"
"time"
@@ -88,3 +89,21 @@ func TestPlanSATRunAllNoAcceleratorNoTPM(t *testing.T) {
t.Fatalf("expected a note about TPM being skipped")
}
}
+
+func TestPlanSATRunAllLoadOmitsReadOnlyTPMCheck(t *testing.T) {
+ h := &handler{opts: HandlerOptions{App: app.New(&platform.System{})}}
+ specs, notes := h.planSATRunAll(context.Background(), satRunAllRequest{StressMode: true})
+
+ var targets []string
+ for _, s := range specs {
+ targets = append(targets, s.target)
+ }
+ if want := []string{"cpu", "memory", "storage"}; !reflect.DeepEqual(targets, want) {
+ t.Fatalf("targets=%v want %v", targets, want)
+ }
+ for _, note := range notes {
+ if strings.Contains(note, "TPM") {
+ t.Fatalf("load plan must not inspect or report TPM: notes=%v", notes)
+ }
+ }
+}
diff --git a/audit/internal/webui/page_validate.go b/audit/internal/webui/page_validate.go
index 80afa65..dd7f5f3 100644
--- a/audit/internal/webui/page_validate.go
+++ b/audit/internal/webui/page_validate.go
@@ -149,12 +149,12 @@ func renderValidateMode(opts HandlerOptions, stressDefault bool) string {
`lsblk; NVMe: nvme id-ctrl, nvme smart-log, nvme device-self-test -s 1; SATA/SAS: smartctl -H -A, smartctl -t short`,
`~2 min per device (NVMe short self-test; SATA/SAS short self-test — duration device-dependent).`,
)) +
- renderSATCard("tpm", "TPM", "runSAT('tpm')", "", renderValidateCardBody(
+ renderCheckOnlySATCard(stressDefault, renderSATCard("tpm", "TPM", "runSAT('tpm')", "", renderValidateCardBody(
inv.TPM,
`Checks TPM 2.0 communication and reports its fixed properties, allocated PCR banks, current PCR values, and the result of self-tests already performed by the TPM. It does not start a new self-test or change TPM state.`,
`tpm2_getcap properties-fixed, tpm2_getcap pcrs, tpm2_pcrread, tpm2_gettestresult`,
`Seconds - read-only queries; no ownership, NV, PCR, or key changes.`,
- )) +
+ ))) +
`
all_reduce_perf (NCCL tests)`,
validateFmtDur(platform.SATEstimatedNvidiaInterconnectSec)+` (all GPUs simultaneously, requires ≥2).`,
- )) +
+ ))) +
renderSATCard("nvidia-bandwidth", "NVIDIA Bandwidth + PCIe Link", "runNvidiaFabricValidate('nvidia-bandwidth')", "", renderValidateCardBody(
inv.NVIDIA,
`Validates GPU memory copy and peer-to-peer bandwidth paths, then samples each GPU's negotiated PCIe speed and width immediately after real traffic. Idle or forced-retrain Gen1 readings do not fail the test.`,
@@ -197,12 +197,12 @@ func renderValidateMode(opts HandlerOptions, stressDefault bool) string {
)) +
`rocm-smi, dmidecode; MEM Integrity: rvs mem; MEM Bandwidth: rocm-bandwidth-test, rvs babel`,
``,
- )) +
+ ))) +
`