Files
pulse/docs/release-control
rcourtman 91dbc94b5f Colour pulse-relaxed guests by the thresholds their alerts use (#2735)
The `pulse-relaxed` Proxmox tag lifts a guest's CPU, memory and disk
alert triggers to a 95/92/95 floor (applied in
`effectiveAlertPolicyNoLock` since #2705), but the browser coloured bars
from the configured thresholds alone. A relaxed guest at 88% memory
showed a red bar while the alert engine stayed silent until 92%, and the
Alerts thresholds row kept showing 80/85/90 with no sign the tag raised
them. That is the gap a user described on #863 (comment of 2026-01-16):
the tags override the UI settings "but there's no visible indication in
the UI".

## What changes

- **Bars follow the tag.** `resolveMetricDisplayThresholds` takes the
tags the engine reads for a guest and applies the backend's
`applyRelaxedGuestThresholds` step before mapping to display thresholds:
unset gets the floor, a lower trigger is raised and keeps its clear
point (a missing clear is filled five below, as
`ensureHysteresisThreshold` does) unless the raised trigger reaches it,
and Off stays Off. A relaxed guest now turns red where its alert fires.
- **Only Proxmox guests.** `getWorkloadAlertPolicyTags` and
`useThresholdsGuestData` pass tags only for Proxmox VMs and LXCs, the
only guests whose tags reach alert policy. vSphere and TrueNAS VMs (also
`type: vm`) and containers keep their thresholds whatever they are
tagged.
- **The thresholds row says what is in effect.** A relaxed guest's
Alerts → Thresholds row (table and card) adds one line, "Proxmox tag
pulse-relaxed: alerts at CPU 95% · Memory 92% · Disk 95%", listing only
the thresholds the tag actually raises. It follows unsaved edits. The
cells keep the configured values the editor changes.

## Why the row and not the drawer or table

Following the user-lens procedure: the job is "I tagged this noisy VM
pulse-relaxed: is Pulse honouring it, and when will it alert?". Before
this change the bar answered it wrongly at zero clicks, and the only
surface that states thresholds (Alerts → Thresholds → Proxmox → VMs &
Containers, then search) stated the wrong numbers. No user doc describes
the tag, and GitHub comments give conflicting values (95/95/98 in #323,
95/92/95 in #863), so the row has to state the numbers. A badge in the
guest drawer or table row would fail the actionability test: once the
bar colour is right, the user has nothing to do there, and the place to
act is the thresholds row (or the tag in Proxmox).

## Verification

- Private mock stack from this branch with a dev-only overlay tagging
two demo profiles `pulse-relaxed` (68 VMs). Before the change: relaxed
`ci-runner-117` at 88% memory was red. After: every running relaxed row
matches the relaxed band (`analytics-batch-70` at 87% reads warning),
while untagged guests at 86–92% stay red, at desktop and 375px. The
thresholds row line was checked in the card layout, in the table layout
(full-width mode at 2560px), at 375px, and through an unsaved edit
(Memory 96 drops it from the line). Receipt:
`frontend-modern/browser-verification/1f9dcc1c17da6345.json`.
- Proof files: `metricThresholds.test.ts` (relaxed resolution, Off,
unset, clear filling at margins 5 and 10, scope gating),
`workloadTopology.test.ts` (Proxmox-only tags, legacy tag strings),
`ResourceTable.test.tsx` (desktop and mobile line, omitted metrics,
edits, disabled and untagged rows). `GuestRow.test.tsx` gets the new
export in its topology mock.
- On pulse-dev: tsc, `npm run lint` and the Alerts, Workloads, utils,
stores, platformPage, shared and `src/__tests__` suites. The broad run's
only failures were missing repo-root files from a partial sync and 5s
timeouts at load ~65; all 15 affected files pass when rerun with the
full tree.

## Known limits (existing, not widened here)

- The display resolver does not read filter-driven custom rules, which
the engine folds in before the override, so a guest a custom rule
matches can colour by thresholds the engine does not use. Custom rules
have no UI today. The alerts contract now says so.
- The Alerts page's guest list memo compares only id and name, so adding
or removing the tag in Proxmox shows on that page after a reload.
Workloads rows update live.
- The thresholds page reads an unset global default as Off
(`getTriggerValue`), so the line omits the floor the engine would give a
genuinely unset default. A save from the Alerts page always writes these
defaults.
- `pulse-no-alerts` and `pulse-monitor-only` still have no indication on
the row. They are tracked with the rest of the #863 comment in the
demand ledger.
2026-10-08 02:59:25 +01:00
..