Dead-code sweep. Named exports flagged unused by ts-prune and confirmed
unreferenced by adversarial cross-file verification, removed via a TypeScript
compiler-API codemod (whole-declaration removal by name). tsc --noEmit over the
full project including all test files, and npm run lint (eslint + theme +
canonical-platform audits), both pass.
54 candidates deferred for safety: 1 false positive caught by the type-check
(WizardState is imported by SetupCompletionPanel.tsx), ~20 files whose export
removal orphans secondary imports/helpers (needs a follow-up cascading pass),
and 2 multi-declarator statements.
Dead-code sweep. Functions flagged unreachable by golang.org/x/tools/cmd/deadcode
and confirmed unused across pulse, pulse-enterprise, pulse-pro and pulse-mobile by
adversarial cross-repo verification. Cross-module reachability was checked
explicitly (only pkg/ exported symbols are importable by other modules; internal/
packages and _test.go files are not). go build, go vet and test-compile all pass.
Show an agent install cue on running VM and LXC workloads that lack a merged Pulse Agent, and carry the same action-readiness path into the guest drawer.
Wire Proxmox nodes into the shared outdated-agent notice and add latest-detail copy for hybrid platform pages so Machines, TrueNAS, and Proxmox do not imply baseline data is absent.
Surface the shared outdated-agent notice on Machines, Kubernetes, and TrueNAS, and link platform notices back to Infrastructure settings for upgrade commands.
Extend the unified-agent RC rehearsal with an optional local v5-to-v6 process-swap check.
Record the v5.1.34 to v6.0.0-rc.6 proof result for the upgrade-continuity gate.
A platform page hides its detail tabs (Docker images/storage/networks/swarm)
when the matching inventory is absent. An agent too old to report that
inventory therefore makes the tabs silently disappear, indistinguishable
from a host that genuinely has none. The page gave the user no breadcrumb to
the real cause (a stale agent).
Add a reusable, self-explaining inline notice that appears only when a host on
the page runs a Pulse agent behind the server version, naming the host, its
version, the target version, and what it is missing. It stays invisible in the
healthy case, so the surface stays clean.
- agentVersion.ts: semver-aware version parse/compare (tolerates v-prefix and
+build metadata, ranks rc.N correctly) and collectOutdatedAgentHosts, which
reads docker- or agent-meta agent versions and skips hosts it cannot compare.
- PlatformOutdatedAgentNotice.tsx: shared platformPage notice component.
- DockerPageSurface: compute outdated hosts from the model + server version and
render the notice above the tab content.
- vitest coverage for the comparison logic and the notice copy.
Compares against the server's running version rather than the release-gated
currentAgentTargetVersion(), so the signal also works on dev/rc builds.
When the same physical Ceph cluster is reported by both the Proxmox API
poller and a Pulse host-agent (same FSID), v5 stored it under two pool-ID
namespaces and ran alert evaluation on the raw, un-deduplicated list,
producing duplicate/flapping Ceph pool alerts and a per-pool override that
appeared to revert between identities.
v6 closes this without the v5 'agent:'-prefix patch: both ingest paths
reconcile by FSID before alert evaluation. State.UpsertCephCluster
(host-agent) and State.UpdateCephClustersForInstance (Proxmox) both funnel
through upsertCephClusterInSlice, which collapses same-FSID clusters into a
single reconciled entry, and both call sites run checkCephPoolStorage on the
STORED cluster. The per-pool override resolves across source aliases via
storageThresholdLookupIDs/cephPoolStorageSourceAliasID, and
clearStorageAliasAlerts removes any alias-keyed alert.
This adds a regression test asserting the observable outcome for the exact
dual-source scenario (host-agent + Proxmox API, same FSID, one pool at ~61%
with a 50% per-pool override): exactly one active Ceph pool usage alert,
override honored, no second/flapping alert across either ingest order or
repeated interleaved cycles. No behavior change.
Add a Stripe-free provider-hosted MSP mode with local MSP plan workspace limits and portal behavior that hides hosted billing surfaces when no billing record exists.