From 3b21d4c257a5e140af05af0973ce6cb1f1effc4d Mon Sep 17 00:00:00 2001 From: "pulse-triage[bot]" <249995291+pulse-triage[bot]@users.noreply.github.com> Date: Thu, 27 Aug 2026 00:55:23 +0100 Subject: [PATCH] Prepare v6.4.0-rc.5 release Package the atomic API-token deletion fix, alert delivery evidence, reducer-backed lifecycle cutover, separated agent install tokens, and filesystem history feedback for the next release candidate. Change-source: pulse-maintainer --- VERSION | 2 +- deploy/helm/pulse/Chart.yaml | 8 ++-- deploy/helm/pulse/README.md | 2 +- docker-compose.yml | 2 +- docs/RELEASE_NOTES.md | 10 +++-- docs/UPGRADE_v6.md | 10 +++-- .../subsystems/deployment-installability.md | 37 ++++++++++--------- docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md | 30 +++++++++++++++ docs/releases/V6_CHANGELOG_v6.4.0-rc.5.md | 37 +++++++++++++++++++ frontend-modern/public/docs/UPGRADE_v6.md | 10 +++-- scripts/install-docker.sh | 2 +- .../installtests/build_release_assets_test.go | 22 +++++------ .../installtests/install_docker_sh_test.go | 1 + 13 files changed, 125 insertions(+), 48 deletions(-) create mode 100644 docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md create mode 100644 docs/releases/V6_CHANGELOG_v6.4.0-rc.5.md diff --git a/VERSION b/VERSION index 90ff953f1..e05d0f31c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.4.0-rc.4 +6.4.0-rc.5 diff --git a/deploy/helm/pulse/Chart.yaml b/deploy/helm/pulse/Chart.yaml index 3f9810206..3ccb37bcd 100644 --- a/deploy/helm/pulse/Chart.yaml +++ b/deploy/helm/pulse/Chart.yaml @@ -2,9 +2,9 @@ apiVersion: v2 name: pulse description: Helm chart for deploying the Pulse hub and optional Docker, Kubernetes, or OpenShift monitoring agent. type: application -version: 6.4.0-rc.4 -appVersion: "6.4.0-rc.4" -icon: https://raw.githubusercontent.com/rcourtman/Pulse/v6.4.0-rc.4/docs/images/pulse-logo.svg +version: 6.4.0-rc.5 +appVersion: "6.4.0-rc.5" +icon: https://raw.githubusercontent.com/rcourtman/Pulse/v6.4.0-rc.5/docs/images/pulse-logo.svg keywords: - monitoring - proxmox @@ -32,7 +32,7 @@ annotations: description: Smoke tests with kind cluster deployment artifacthub.io/links: | - name: Documentation - url: https://github.com/rcourtman/Pulse/blob/v6.4.0-rc.4/docs/KUBERNETES.md + url: https://github.com/rcourtman/Pulse/blob/v6.4.0-rc.5/docs/KUBERNETES.md - name: Support url: https://github.com/rcourtman/Pulse/discussions artifacthub.io/maintainers: | diff --git a/deploy/helm/pulse/README.md b/deploy/helm/pulse/README.md index c5cb873b1..6b28f87fa 100644 --- a/deploy/helm/pulse/README.md +++ b/deploy/helm/pulse/README.md @@ -1,6 +1,6 @@ # pulse -![Version: 6.4.0-rc.4](https://img.shields.io/badge/Version-6.4.0--rc.4-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 6.4.0-rc.4](https://img.shields.io/badge/AppVersion-6.4.0--rc.4-informational?style=flat-square) +![Version: 6.4.0-rc.5](https://img.shields.io/badge/Version-6.4.0--rc.5-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 6.4.0-rc.5](https://img.shields.io/badge/AppVersion-6.4.0--rc.5-informational?style=flat-square) Helm chart for deploying the Pulse hub and optional Docker, Kubernetes, or OpenShift monitoring agent. diff --git a/docker-compose.yml b/docker-compose.yml index a15280a6b..95555697a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.8' services: pulse: - image: ${PULSE_IMAGE:-rcourtman/pulse:6.4.0-rc.4} + image: ${PULSE_IMAGE:-rcourtman/pulse:6.4.0-rc.5} container_name: pulse restart: unless-stopped logging: diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index e91f4dbd2..c7e9fc024 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -7,8 +7,8 @@ For historical v4 notes that previously lived in this repo, see: `docs/releases/RELEASE_NOTES_v4.md` For the current v6 release candidate packet (the current v6 support release candidate packet), see: -- `docs/releases/RELEASE_NOTES_v6.4.0-rc.4.md` -- `docs/releases/V6_CHANGELOG_v6.4.0-rc.4.md` +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.5.md` For the current stable v6 packet, see: - `docs/releases/RELEASE_NOTES_v6.3.2.md` @@ -19,10 +19,12 @@ For the preceding stable v6 packet, see: - `docs/releases/V6_CHANGELOG_v6.3.1.md` For the preceding v6.4 release candidate packet, see: -- `docs/releases/RELEASE_NOTES_v6.4.0-rc.3.md` -- `docs/releases/V6_CHANGELOG_v6.4.0-rc.3.md` +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.4.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.4.md` For earlier v6.4 release candidate packets, see: +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.3.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.3.md` - `docs/releases/RELEASE_NOTES_v6.4.0-rc.2.md` - `docs/releases/V6_CHANGELOG_v6.4.0-rc.2.md` - `docs/releases/RELEASE_NOTES_v6.4.0-rc.1.md` diff --git a/docs/UPGRADE_v6.md b/docs/UPGRADE_v6.md index c9798e7ad..757138a31 100644 --- a/docs/UPGRADE_v6.md +++ b/docs/UPGRADE_v6.md @@ -4,8 +4,8 @@ This guide covers practical upgrade steps for existing Pulse installs moving to For the current v6 release candidate packet (the current v6 support release candidate packet), see: -- `docs/releases/RELEASE_NOTES_v6.4.0-rc.4.md` -- `docs/releases/V6_CHANGELOG_v6.4.0-rc.4.md` +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.5.md` For the current stable v6 packet, see: @@ -19,11 +19,13 @@ For the preceding stable v6 packet, see: For the preceding v6.4 release candidate packet, see: -- `docs/releases/RELEASE_NOTES_v6.4.0-rc.3.md` -- `docs/releases/V6_CHANGELOG_v6.4.0-rc.3.md` +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.4.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.4.md` For earlier v6.4 release candidate packets, see: +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.3.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.3.md` - `docs/releases/RELEASE_NOTES_v6.4.0-rc.2.md` - `docs/releases/V6_CHANGELOG_v6.4.0-rc.2.md` - `docs/releases/RELEASE_NOTES_v6.4.0-rc.1.md` diff --git a/docs/release-control/v6/internal/subsystems/deployment-installability.md b/docs/release-control/v6/internal/subsystems/deployment-installability.md index 36fdc6a4d..fb01dde32 100644 --- a/docs/release-control/v6/internal/subsystems/deployment-installability.md +++ b/docs/release-control/v6/internal/subsystems/deployment-installability.md @@ -1782,22 +1782,20 @@ diagnostics. The same release workflow also executes the generated self-signed and custom-CA Windows installer commands through Windows PowerShell 5.1 before release assembly, so the first HTTPS fetch is release proof rather than a string-shape assertion. -The active prerelease `v6.4.0-rc.4` cut sets the repo-root `VERSION`, repo-root +The active prerelease `v6.4.0-rc.5` cut sets the repo-root `VERSION`, repo-root `docker-compose.yml` image default, `scripts/install-docker.sh` fallback, and -Helm chart release metadata to the same `6.4.0-rc.4` release version. It follows -`v6.4.0-rc.3` on the published `v6.4.0` candidate line. This prerelease keeps +Helm chart release metadata to the same `6.4.0-rc.5` release version. It follows +`v6.4.0-rc.4` on the published `v6.4.0` candidate line. This prerelease keeps `rollback_version=v6.3.2`, publishes a versioned public GitHub prerelease plus versioned Docker and Helm artifacts, and does not move stable/latest -install pointers or stable semver aliases. The candidate moves resources, -Connected infrastructure, and active alerts onto keyed per-client deltas; -defers expensive realtime merges during operator input; preserves windowed-row -identity across reordered snapshots; and isolates REST recovery from the -websocket delta baseline. It also restores Proxmox network details, hardens -backup and drawer history targeting, clears committed notification delivery -warnings immediately, and keeps supported Proxmox VM/LXC lifecycle requests on -the governed action path without a QEMU guest-agent prerequisite or manual -command fallback. The changes since `v6.4.0-rc.3` do not require a Pulse Mobile -client change and preserve +install pointers or stable semver aliases. The candidate makes API-token +deletion atomic across persistence failures; adds append-only alert transition +and notification-decision evidence; exposes delivery outcomes and held reasons +on existing browser surfaces; separates agent install tokens from generated +commands; and moves canonical metric, lifecycle, and stateful alert families +onto the deterministic reducer core with confirmation, recovery, +acknowledgement, and refire parity proof. The changes since `v6.4.0-rc.4` do not +require a Pulse Mobile client change and preserve the existing mobile, Relay, onboarding, and mobile-facing API contracts, so the server cut is classified `no-mobile-impact`; no companion upload or public mobile-store rollout is part of this candidate. The canonical mobile @@ -1813,10 +1811,15 @@ only after the release owner explicitly confirms that production credentials and certificate authorization are ready and a reviewed policy/code change restores it. +The preceding `v6.4.0-rc.4` cut published from exact source SHA +`8fb7b3764183168f93140d83e2b18b4e953b6cd8`. Its tag and versioned artifacts +remain immutable; `v6.4.0-rc.5` supersedes it without moving stable install +pointers or stable semver aliases from `v6.3.2`. + The preceding `v6.4.0-rc.3` cut published from exact source SHA `cf0ca6f127540e9997c2eb97eeed32f27619d242`. Its tag and versioned artifacts -remain immutable; `v6.4.0-rc.4` supersedes it without moving stable install -pointers or stable semver aliases from `v6.3.2`. +remain immutable; later `v6.4.0` prereleases supersede it without moving stable +install pointers or stable semver aliases from `v6.3.2`. The preceding `v6.4.0-rc.2` publication attempt built and staged the exact candidate artifacts but failed release convergence before public activation. @@ -2255,8 +2258,8 @@ For the active stable `v6.1.2` cut, the repo-root compose default and `scripts/install-docker.sh` fallback must both pin `6.1.2` whenever the governed `VERSION` is that stable cut. The stable promotion guard remains in force and rejects leftover `-rc.` defaults. -For the active prerelease `v6.4.0-rc.4` cut, the repo-root compose default and -`scripts/install-docker.sh` fallback must both pin `6.4.0-rc.4` until the next +For the active prerelease `v6.4.0-rc.5` cut, the repo-root compose default and +`scripts/install-docker.sh` fallback must both pin `6.4.0-rc.5` until the next governed stable cut moves them forward. Each new release moves these two pins together with the repo-root `VERSION` and the Helm chart metadata in the same commit; a cut that leaves any of the four on a superseded value is a diff --git a/docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md b/docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md new file mode 100644 index 000000000..459a6149d --- /dev/null +++ b/docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md @@ -0,0 +1,30 @@ +# Pulse v6.4.0-rc.5 Release Notes + +`v6.4.0-rc.5` is a release candidate for the next v6 minor release. It makes API-token removal durable, exposes notification decisions more clearly, and moves alert lifecycle handling onto a deterministic transition core. + +## What's improved + +- **Clearer notification evidence** — Active alerts show delivery status, and the delivery activity view includes held notifications and their suppression reasons. +- **More reliable alert lifecycles** — Metric, availability, health, posture, backup, snapshot, storage, and update alerts now share a deterministic transition core with pinned confirmation, recovery, acknowledgement, and re-fire behavior. +- **Safer agent setup** — Agent install commands reveal their newly generated token separately, making it easier to copy the credential without mixing it with the shell command. +- **Better filesystem feedback** — Filesystem history drawers again show loading progress while a longer range is fetched. + +## Fixes + +- API-token deletion now persists the reduced inventory atomically and restores the complete prior live inventory if saving fails, instead of reporting success with inconsistent credentials ([#1783](https://github.com/rcourtman/Pulse/issues/1783)). +- Alert delivery diagnosis now distinguishes pending, sent, failed, and suppressed outcomes without requiring operators to infer delivery from an active alert alone. +- Confirmation-based alerts retain the first matched observation as their occurrence start, and new confirmation runs no longer inherit stale timestamps. +- Canonically keyed metric alerts resolve through the same identity used to create them instead of remaining stale after recovery. +- Stateful alert manual clears preserve acknowledgement and recent-resolution behavior so a quick refire does not duplicate history. +- Guest and host memory percentages use the same cache-aware basis in operator-facing explanations. + +## Before you upgrade + +- This is a release candidate. Stable installations remain on v6.3.2 unless an operator explicitly selects this version. +- Existing configurations remain valid and no manual data migration is required. +- Pulse Mobile does not consume the changed alert transition internals or browser delivery evidence. Existing mobile, Relay, onboarding, pairing, push, and mobile-facing API contracts are unchanged, so no companion update is required. +- Windows Unified Agent binaries are checksum- and detached-signature-verified but are not Authenticode-signed, so Windows may show an Unknown Publisher warning. + +## Known issues + +- Windows Authenticode signing remains unavailable for this candidate; use the published checksum and detached signature when verifying Windows agent downloads. diff --git a/docs/releases/V6_CHANGELOG_v6.4.0-rc.5.md b/docs/releases/V6_CHANGELOG_v6.4.0-rc.5.md new file mode 100644 index 000000000..e85d6635a --- /dev/null +++ b/docs/releases/V6_CHANGELOG_v6.4.0-rc.5.md @@ -0,0 +1,37 @@ +# Pulse v6.4.0-rc.5 + +_This changelog describes the changes since `v6.4.0-rc.4` included in +`v6.4.0-rc.5`._ + +## Added + +- Active-alert delivery diagnosis exposes pending, sent, failed, and suppressed notification outcomes. +- The append-only alert event log records lifecycle transitions and notification decisions, including suppression mechanisms and reasons. +- Agent install-token responses separate the one-time token value from the generated installation command. + +## Changed + +- Canonical metric, lifecycle, and stateful alert families use the deterministic reducer core for activation, confirmation, recovery, acknowledgement restoration, cooldown refire, and recent-resolution state. +- Legacy tracking maps remain compatibility mirrors while reducer-owned transitions become authoritative. +- Alert delivery evidence and held notifications are projected onto the existing alert overview and delivery activity surfaces. +- Confirmation, intent, recovery, and backup-offline deferral semantics are characterized by composed parity suites before and after family cutover. + +## Fixed + +- API-token deletion snapshots the full inventory, persists the exact reduced inventory, and rolls the live token set and primary-token projection back on persistence failure ([#1783](https://github.com/rcourtman/Pulse/issues/1783)). +- Canonically keyed metric alerts resolve through their canonical identity rather than leaving stale active records after recovery. +- Confirmation-based lifecycle timestamps retain the first matched observation and restart correctly after an interrupted confirmation run. +- Stateful manual clears preserve recent-resolution and acknowledgement retention, preventing duplicate history on a quick refire. +- Filesystem history drawers again render loading progress. +- Guest and host memory explanations use the canonical cache-aware usage basis. + +## Release Metadata + +- Version: `v6.4.0-rc.5` +- Previous candidate tag: `v6.4.0-rc.4` +- Previous stable: `v6.3.2` +- Rollback target: `v6.3.2` +- Rollback command: `./scripts/install.sh --version v6.3.2` +- Promotion path: exact-SHA single-build release candidate from `main` +- Windows signing decision: prereleases publish checksum- and detached-signature-verified Windows agents without Authenticode while SignPath remains unavailable; Windows may show an Unknown Publisher warning +- Mobile decision: `no-mobile-impact`; the changed alert transition internals and browser delivery evidence preserve the existing mobile, Relay, onboarding, route, request/response, pairing, and push contracts, so no companion build or public store rollout is required diff --git a/frontend-modern/public/docs/UPGRADE_v6.md b/frontend-modern/public/docs/UPGRADE_v6.md index c9798e7ad..757138a31 100644 --- a/frontend-modern/public/docs/UPGRADE_v6.md +++ b/frontend-modern/public/docs/UPGRADE_v6.md @@ -4,8 +4,8 @@ This guide covers practical upgrade steps for existing Pulse installs moving to For the current v6 release candidate packet (the current v6 support release candidate packet), see: -- `docs/releases/RELEASE_NOTES_v6.4.0-rc.4.md` -- `docs/releases/V6_CHANGELOG_v6.4.0-rc.4.md` +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.5.md` For the current stable v6 packet, see: @@ -19,11 +19,13 @@ For the preceding stable v6 packet, see: For the preceding v6.4 release candidate packet, see: -- `docs/releases/RELEASE_NOTES_v6.4.0-rc.3.md` -- `docs/releases/V6_CHANGELOG_v6.4.0-rc.3.md` +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.4.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.4.md` For earlier v6.4 release candidate packets, see: +- `docs/releases/RELEASE_NOTES_v6.4.0-rc.3.md` +- `docs/releases/V6_CHANGELOG_v6.4.0-rc.3.md` - `docs/releases/RELEASE_NOTES_v6.4.0-rc.2.md` - `docs/releases/V6_CHANGELOG_v6.4.0-rc.2.md` - `docs/releases/RELEASE_NOTES_v6.4.0-rc.1.md` diff --git a/scripts/install-docker.sh b/scripts/install-docker.sh index 000edcb33..5a6d30938 100755 --- a/scripts/install-docker.sh +++ b/scripts/install-docker.sh @@ -6,7 +6,7 @@ set -euo pipefail SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" DOCKER_IMAGE_REPO="${DOCKER_IMAGE_REPO:-rcourtman/pulse}" -CANONICAL_DEFAULT_PULSE_VERSION="6.4.0-rc.4" +CANONICAL_DEFAULT_PULSE_VERSION="6.4.0-rc.5" resolve_default_pulse_version() { if [ -n "${PULSE_IMAGE_VERSION:-}" ]; then diff --git a/scripts/installtests/build_release_assets_test.go b/scripts/installtests/build_release_assets_test.go index 4910895d1..782dd699b 100644 --- a/scripts/installtests/build_release_assets_test.go +++ b/scripts/installtests/build_release_assets_test.go @@ -887,11 +887,11 @@ func TestCurrentPrereleasePacketTracksInstallMetadata(t *testing.T) { "## Fixes", "## Before you upgrade", "## Known issues", - "keyed per-client deltas", - "Delivery warnings now clear", - "QEMU guest agent", - "Restored Proxmox network details", - "Pulse Mobile does not consume the changed browser resource stream", + "Clearer notification evidence", + "More reliable alert lifecycles", + "API-token deletion now persists the reduced inventory atomically", + "Filesystem history drawers again show loading progress", + "Pulse Mobile does not consume the changed alert transition internals", "not Authenticode-signed", "Unknown Publisher warning", ) @@ -901,12 +901,12 @@ func TestCurrentPrereleasePacketTracksInstallMetadata(t *testing.T) { "Rollback target: `v"+previous+"`", "Promotion path: exact-SHA single-build release candidate from `main`", "This changelog describes the changes since `v"+comparisonVersion+"`", - "Resources, connected-infrastructure entries, and active alerts use per-client keyed deltas", - "REST state recovery is isolated from the websocket baseline", - "Notification queue health is reconciled immediately", - "Proxmox VM/LXC lifecycle actions remain available through the governed action path", - "Proxmox node network details render again", - "Backup recovery data retains the correct source attribution", + "The append-only alert event log records lifecycle transitions and notification decisions", + "Canonical metric, lifecycle, and stateful alert families use the deterministic reducer core", + "API-token deletion snapshots the full inventory", + "Canonically keyed metric alerts resolve through their canonical identity", + "Stateful manual clears preserve recent-resolution and acknowledgement retention", + "Filesystem history drawers again render loading progress", "Windows signing decision: prereleases publish checksum- and detached-signature-verified Windows agents without Authenticode", "Mobile decision: `no-mobile-impact`", "no companion build or public store rollout is required", diff --git a/scripts/installtests/install_docker_sh_test.go b/scripts/installtests/install_docker_sh_test.go index 9e89cd568..1f0fb4231 100644 --- a/scripts/installtests/install_docker_sh_test.go +++ b/scripts/installtests/install_docker_sh_test.go @@ -145,6 +145,7 @@ func TestPreviousStableForPrereleaseVersionCrossesMinorBoundaries(t *testing.T) {version: "6.4.0-rc.2", want: "6.3.2"}, {version: "6.4.0-rc.3", want: "6.3.2"}, {version: "6.4.0-rc.4", want: "6.3.2"}, + {version: "6.4.0-rc.5", want: "6.3.2"}, } for _, test := range tests {