Repurpose the previously-unwired RunFanStressTest into RunFanCheck, a
Load-tier SAT test that drives stressapptest (CPU+memory) and, when a GPU
is present, a GPU burn to 100% simultaneously, then watches every fan
until none has climbed for ~60s. The observed peak RPM per fan is the
"ceiling"; it is persisted through the existing fan-observation store.
MSI G4201 / AMI MegaRAC exposes no host-side fan force (every OEM IPMI
command returns 0xc1; Redfish Thermal is GET-only), so load-driven ramp
is the closest safe equivalent. See
bible-local/decisions/2026-09-04-fan-ceiling-check.md.
- platform.ResolveFanMaxRPM: per-fan max with fallback (persisted peak ->
peer peak -> current RPM), resolved in platform, not the view.
- platform.ErrTestNotApplicable: no load source or no fan sensors ->
task lands as cancelled ("not applicable"), never failed, so an
engineer never sees a false red. executeTaskWithOptions maps the
sentinel; finalizeTaskForResult honours a pre-set TaskCancelled.
- Verdict FAIL only for a fan at 0 RPM / IPMI cr-nr under load.
- /topo: one small spinning square per fan, sized by RPM / resolved max,
clickable through to a new "fan" component-detail type; per-fan status
recorded to the component-status DB from the fan SAT summary.
- Wiring: /api/sat/fan/run route, "fan" task target, Load-page card,
stress-mode Run All.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019VHG21rgTUiR1G3qFHTVmN
11 KiB
11 KiB
API Surface
HTTP endpoints exposed by bee web (binds 0.0.0.0:80).
Handler registration: audit/internal/webui/server.go → NewHandler().
Health & readiness
| Method | Path | Description |
|---|---|---|
| GET | /healthz |
Always 200. Used by load balancers / boot scripts. |
| GET | /api/ready |
200 when audit JSON exists and is readable. |
| GET | /loading |
HTML loading page shown before first audit. |
Audit
| Method | Path | Description |
|---|---|---|
| GET | /audit.json |
Latest audit JSON with SAT overlay applied. |
| GET | /runtime-health.json |
Latest runtime preflight JSON. |
| POST | /api/audit/run |
Enqueue a full bee audit run. Returns task ID. |
| GET | /api/audit/stream |
SSE: audit run log lines (data: + newline per line). |
| GET | /api/preflight |
Run runtime preflight check (synchronous, returns JSON). |
| GET | /api/hardware-summary |
Hardware health summary (status counts + failures). |
| GET | /api/components/{type} |
HTML fragment for component detail dialog (e.g. cpu, memory, storage, pcie). |
SAT (System Acceptance Testing)
All SAT run endpoints enqueue an async task. Response: {"task_id": "..."}.
| Method | Path | Description |
|---|---|---|
| POST | /api/sat/nvidia/run |
NVIDIA DCGM SAT |
| POST | /api/sat/nvidia-targeted-stress/run |
NVIDIA targeted stress validate |
| POST | /api/sat/nvidia-compute/run |
NVIDIA max compute load |
| POST | /api/sat/nvidia-targeted-power/run |
NVIDIA targeted power |
| POST | /api/sat/nvidia-pulse/run |
NVIDIA pulse test |
| POST | /api/sat/nvidia-interconnect/run |
NCCL all_reduce_perf |
| POST | /api/sat/nvidia-bandwidth/run |
NVBandwidth + PCIe link under load |
| POST | /api/sat/nvidia-stress/run |
NVIDIA stress pack |
| POST | /api/sat/memory/run |
Memory acceptance |
| POST | /api/sat/storage/run |
Storage acceptance (smartctl) |
| POST | /api/sat/cpu/run |
CPU acceptance (stress-ng) |
| POST | /api/sat/amd/run |
AMD GPU SAT (ROCm) |
| POST | /api/sat/amd-mem/run |
AMD memory integrity + bandwidth |
| POST | /api/sat/amd-bandwidth/run |
AMD memory bandwidth |
| POST | /api/sat/amd-stress/run |
AMD GPU stress |
| POST | /api/sat/memory-stress/run |
Memory stress |
| POST | /api/sat/sat-stress/run |
Combined storage+memory stress |
| POST | /api/sat/platform-stress/run |
Fan + thermal stress |
| POST | /api/sat/fan/run |
Fan ceiling check (CPU+GPU load until fans plateau; Load tier). Not-applicable → task cancelled, not failed. |
| POST | /api/sat/run-all |
Plan + enqueue the whole validate/check set server-side. Body: {stress_mode, amd_targets[], nvidia_gpu_indices[]} (operator intent only). Response: {task_ids[], task_count, notes[]}. Hardware presence/readiness and which tasks to run are decided by handler.planSATRunAll, not the page. |
| GET | /api/sat/stream |
SSE: live SAT log stream |
| POST | /api/sat/abort |
Abort the running SAT task |
Benchmarks
| Method | Path | Description |
|---|---|---|
| POST | /api/bee-bench/nvidia/perf/run |
NVIDIA performance benchmark |
| POST | /api/bee-bench/nvidia/power/run |
NVIDIA power benchmark |
| POST | /api/bee-bench/nvidia/autotune/run |
Power source autotune (prerequisite for benchmarks) |
| GET | /api/bee-bench/nvidia/autotune/status |
Current autotune result / status |
| GET | /api/benchmark/results |
List completed benchmark result archives |
Tasks (async job queue)
| Method | Path | Description |
|---|---|---|
| GET | /api/tasks |
List all tasks with status |
| POST | /api/tasks/cancel-all |
Cancel all pending/running tasks |
| POST | /api/tasks/kill-workers |
Force-kill worker goroutines |
| POST | /api/tasks/{id}/cancel |
Cancel a specific task |
| POST | /api/tasks/{id}/priority |
Elevate task priority |
| GET | /api/tasks/{id}/stream |
SSE: live log stream for a task |
| GET | /api/tasks/{id}/charts |
List chart names for a task |
| GET | /api/tasks/{id}/chart/ |
SVG chart for a task result |
| GET | /tasks/{id} |
HTML task detail page |
Services
| Method | Path | Description |
|---|---|---|
| GET | /api/services |
List bee-* systemd services and their states |
| POST | /api/services/action |
start/stop/restart a service |
Network
| Method | Path | Description |
|---|---|---|
| GET | /api/network |
List interfaces with state and IPv4 addresses |
| POST | /api/network/dhcp |
Run dhclient on one or all interfaces |
| POST | /api/network/static |
Set static IPv4 address |
| POST | /api/network/toggle |
Bring interface up or down |
| POST | /api/network/confirm |
Confirm pending network change (clears rollback) |
| POST | /api/network/rollback |
Restore pre-change network snapshot |
Export
| Method | Path | Description |
|---|---|---|
| GET | /export/support.tar.gz |
Download support bundle (live-generated) |
| GET | /export/file |
Download a file from the export dir by path param |
| GET | /export/ |
Browse export dir (HTML index) |
| GET | /api/export/list |
JSON list of files in export dir |
| GET | /api/export/usb |
List removable USB targets available for export |
GPU
| Method | Path | Description |
|---|---|---|
| GET | /api/gpu/presence |
{"nvidia", "amd", "nvidia_initializing", "amd_initializing": bool}. *_initializing = PCI GPU present but driver not up yet (distinct from absent). Backed by app.DetectGPUPresence. |
| GET | /api/gpu/nvidia |
List NVIDIA GPUs from nvidia-smi |
| GET | /api/gpu/nvidia-status |
Per-GPU status (ECC, power, throttle) |
| POST | /api/gpu/nvidia-reset |
GPU reset by index |
| GET | /api/gpu/tools |
nvidia-smi / rocm-smi tool availability |
System
| Method | Path | Description |
|---|---|---|
| GET | /api/system/ram-status |
toram boot state and ISO copy status |
| POST | /api/system/install-to-ram |
Copy ISO to RAM and verify active loop backing |
| GET | /api/system/time |
Current host epoch, local wall-clock text, and timezone |
| POST | /api/system/time-sync |
Set host time and timezone from the browser |
| POST | /api/system/reboot |
Reboot the host |
| POST | /api/system/shutdown |
Power off the host |
| GET | /api/install/disks |
List block devices suitable for disk installation |
| POST | /api/install/run |
Install bee to disk (background task) |
Tools & NVMe
| Method | Path | Description |
|---|---|---|
| GET | /api/tools/check |
Check availability of required CLI tools |
| GET | /api/tools/nvme-formats |
List NVMe format options for a device |
| POST | /api/tools/nvme-format/run |
Run nvme-format on a device |
Live metrics
| Method | Path | Description |
|---|---|---|
| GET | /api/metrics/stream |
SSE: live metrics (GPU power, temp, utilization) |
| GET | /api/metrics/latest |
Latest metrics snapshot (JSON) |
| GET | /api/metrics/chart/ |
SVG chart for a metric over time |
| GET | /api/metrics/export.csv |
Download metrics history as CSV |
Blackbox logging
| Method | Path | Description |
|---|---|---|
| GET | /api/blackbox/status |
Blackbox log state (enabled, size, path) |
| POST | /api/blackbox/enable |
Start recording blackbox log |
| POST | /api/blackbox/disable |
Stop recording, flush to disk |
UI pages
| Method | Path | Description |
|---|---|---|
| GET | / |
Main dashboard (serves all page routes) |
| GET | /viewer |
Standalone JSON viewer for uploaded audit files |
All pages are rendered server-side as HTML. The / route handles sub-paths such as
/network, /services, /sat, /benchmark, /install, /validate, /export.