Files
pulse/docs
rcourtman cbedbc7edf Stop serving retained disk temperatures as current readings (#2609)
Follow-up to #2593 (silent agent SMART readings), which made retained
disk temperatures carry a non-available collection state and kept them
out of history.

## Why

Normalization may keep a disk temperature it did not collect (a disk in
standby, a host agent past its reporting lease), provided the collection
state says so. #2593 stopped the history writers recording those values.
Two consumers still presented them as current:

- **History live point.** When a disk range has no samples,
`/api/metrics-store/history` answered with the disk's temperature as a
`source: "live"` point at now, whatever its state. Now that retained
temperatures never reach history, a short-range chart for a silent
agent's disk or a sleeping disk showed the retained value as a fresh
reading. Mock mode also seeded synthetic series from it, and padded
sparse stored series out to now.
- **Unraid inventory temperatures.** Unraid array rows carry no
per-field provenance, so a temperature taken from one (the Unraid-native
disk row, or a SMART row falling back to the inventory reading) could
not be told apart from a collected one once the agent went silent.
`ExpireHostTelemetry` only marks SMART rows.

## What

- `diskinventory.TemperatureCollected` is the shared form of the rule
the history writers apply (no state, or `available`). The router's disk
live point, the mock synthetic seed and the mock padding all require it.
- The unified-resources adapter derives the state of an Unraid inventory
temperature from the host lease that `ExpireHostTelemetry` already
records atomically, and from the disk's spin state: `unavailable` from
`unraid` ("host agent stopped reporting", or "disk is reported spun
down"), otherwise `available`. The value stays as last-known context.
- A SMART row that borrows the inventory reading takes that state,
including `available`.
- The Unraid-native row records only the withdrawing states. The
registry picks a merged disk's temperature and its state separately, so
an `available` claim from the provenance-less row would mask the SMART
row's own state for the same disk.
- A withdrawn inventory temperature no longer counts as heat in the
disk's risk assessment.
- Storing per-row state on `models.HostUnraidDisk` instead would have
added a model field, a read-state round trip and a frontend type change
just to duplicate `host.Status`.

## Tests

- `TestContract_MetricsHistoryDiskLivePointOnlyForCollectedTemperature`:
a silent agent's disk (through the real `ExpireHostTelemetry` and
registry path) and a standby disk get no live point in single-metric or
all-metrics responses, and no value-derived mock series. Sparse stored
samples are not padded to now for a retained, absent or unknown disk. A
collected disk still gets its live point and mock series. Each router
gate was reverted individually and the test failed each time.
- `TestSilentUnraidAgentDiskTemperatureIsRetainedButNotCollected`: three
Unraid disks (inventory only, SMART row without a temperature, SMART row
whose temperature is unsupported) go collected, then retained but not
collected after `evaluateHostAgents` expires the lease, then collected
again.
- `TestUnraidDiskTemperatureFollowsTheHostLease`: reporting, silent and
spun-down hosts across the native row, the borrowed reading and a SMART
row with its own reading, including risk.
- `TestUnraidInventoryRowDoesNotMaskTheSMARTRowState`: the
merged-registry case, which fails if the native row claims `available`.
- `TestTemperatureCollectedOnlyForAReadingTakenByThisObservation`: the
helper.
2026-10-06 21:34:16 +01:00
..
2026-10-05 21:53:41 +01:00
2026-10-05 21:53:41 +01:00
2026-10-05 21:53:41 +01:00

Pulse documentation

Start here for installation, platform setup, security, operations, and Pulse Intelligence. Commands, configuration keys, image names, API fields, and product identifiers remain untranslated in localized guides.

Start here

  • Install Pulse — signed Proxmox/Linux installation, Docker, Docker Compose, Kubernetes, and first-run setup.
  • Production deployment and security — least-privilege Proxmox setup, root-agent boundaries, discovery, supply-chain verification, plan limits, scale evidence, and a rollout checklist.
  • Upgrade from Pulse v5 — migration prerequisites, rollback, agent continuity, and post-upgrade checks.
  • Releases and update channels: choosing Stable or Preview, beta and RC expectations, and how releases are tested and promoted.
  • Configure Pulse — authentication, notifications, discovery, retention, and system settings.
  • Deployment models — data locations, lifecycle, and differences between supported deployment paths.
  • Troubleshooting and FAQ — common failures, diagnostics, and operator questions.

Localized getting started guides: Deutsch · Español

Platforms and agents

VMware vSphere support is early access. Current builds expose dedicated vSphere inventory and recovery context, but operators should validate the integration against their own vCenter before production use.

Monitoring and operations

Pulse Intelligence

Patrol watch-only analysis is available on Community with a local model or the operator's own provider. Investigation and governed fixes require the relevant Pulse Pro capabilities.

Security, privacy, and access

Plans and managed access

Pulse Cloud is not generally available. Ordinary self-hosted Pulse remains the primary installation path; MSP and Enterprise access are explicit commercial paths rather than defaults in self-hosted setup.

Development and reference

Detailed design notes and dated migration specifications may remain in this directory for maintainers, but they are not operator setup guides unless they are linked from the sections above.

Previous versions and migrations

Found a bug? Use the issue forms. For setup questions, use GitHub Discussions.