diff --git a/VERSION b/VERSION index 798e38995..dc0208aba 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.3.0 +6.3.1 diff --git a/deploy/helm/pulse/Chart.yaml b/deploy/helm/pulse/Chart.yaml index a891dfaba..b651d3a79 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.3.0 -appVersion: "6.3.0" -icon: https://raw.githubusercontent.com/rcourtman/Pulse/v6.3.0/docs/images/pulse-logo.svg +version: 6.3.1 +appVersion: "6.3.1" +icon: https://raw.githubusercontent.com/rcourtman/Pulse/v6.3.1/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.3.0/docs/KUBERNETES.md + url: https://github.com/rcourtman/Pulse/blob/v6.3.1/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 fef8c08af..0f0aa7fff 100644 --- a/deploy/helm/pulse/README.md +++ b/deploy/helm/pulse/README.md @@ -1,6 +1,6 @@ # pulse -![Version: 6.3.0](https://img.shields.io/badge/Version-6.3.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 6.3.0](https://img.shields.io/badge/AppVersion-6.3.0-informational?style=flat-square) +![Version: 6.3.1](https://img.shields.io/badge/Version-6.3.1-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 6.3.1](https://img.shields.io/badge/AppVersion-6.3.1-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 38579c63f..bbecb4ca4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3.8' services: pulse: - image: ${PULSE_IMAGE:-rcourtman/pulse:6.3.0} + image: ${PULSE_IMAGE:-rcourtman/pulse:6.3.1} container_name: pulse restart: unless-stopped logging: diff --git a/docs/RELEASE_NOTES.md b/docs/RELEASE_NOTES.md index 360962c0f..cc83cac7c 100644 --- a/docs/RELEASE_NOTES.md +++ b/docs/RELEASE_NOTES.md @@ -7,10 +7,14 @@ For historical v4 notes that previously lived in this repo, see: `docs/releases/RELEASE_NOTES_v4.md` For the current stable v6 packet, see: +- `docs/releases/RELEASE_NOTES_v6.3.1.md` +- `docs/releases/V6_CHANGELOG_v6.3.1.md` + +For the preceding stable v6 packet, see: - `docs/releases/RELEASE_NOTES_v6.3.0.md` - `docs/releases/V6_CHANGELOG_v6.3.0.md` -For the preceding stable v6 packet, see: +For earlier stable v6.2 packets, see: - `docs/releases/RELEASE_NOTES_v6.2.1.md` - `docs/releases/V6_CHANGELOG_v6.2.1.md` @@ -18,7 +22,6 @@ For historical v6.3 release candidate packets, see: - `docs/releases/RELEASE_NOTES_v6.3.0-rc.6.md` - `docs/releases/V6_CHANGELOG_v6.3.0-rc.6.md` -For earlier stable v6.2 packets, see: - `docs/releases/RELEASE_NOTES_v6.2.0.md` - `docs/releases/V6_CHANGELOG_v6.2.0.md` diff --git a/docs/UPGRADE_v6.md b/docs/UPGRADE_v6.md index 9e36b1b17..d5639d3ec 100644 --- a/docs/UPGRADE_v6.md +++ b/docs/UPGRADE_v6.md @@ -4,10 +4,15 @@ This guide covers practical upgrade steps for existing Pulse installs moving to For the current stable v6 packet, see: +- `docs/releases/RELEASE_NOTES_v6.3.1.md` +- `docs/releases/V6_CHANGELOG_v6.3.1.md` + +For the preceding stable v6 packet, see: + - `docs/releases/RELEASE_NOTES_v6.3.0.md` - `docs/releases/V6_CHANGELOG_v6.3.0.md` -For the preceding stable v6 packet, see: +For earlier stable v6.2 packets, see: - `docs/releases/RELEASE_NOTES_v6.2.1.md` - `docs/releases/V6_CHANGELOG_v6.2.1.md` @@ -17,8 +22,6 @@ For historical v6.3 release candidate packets, see: - `docs/releases/RELEASE_NOTES_v6.3.0-rc.6.md` - `docs/releases/V6_CHANGELOG_v6.3.0-rc.6.md` -For earlier stable v6.2 packets, see: - - `docs/releases/RELEASE_NOTES_v6.2.0.md` - `docs/releases/V6_CHANGELOG_v6.2.0.md` diff --git a/docs/release-control/v6/internal/subsystems/deployment-installability.md b/docs/release-control/v6/internal/subsystems/deployment-installability.md index 6f6587fa6..c41c4e7fc 100644 --- a/docs/release-control/v6/internal/subsystems/deployment-installability.md +++ b/docs/release-control/v6/internal/subsystems/deployment-installability.md @@ -1660,7 +1660,23 @@ 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 stable `v6.3.0` cut sets the repo-root `VERSION`, +The active stable `v6.3.1` 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.3.1` release version. This patch +release uses the stable hotfix path with `rollback_version=v6.3.0`, +`hotfix_exception=true`, a release-owner reason, and no fabricated same-version +RC tag. The emergency reason is active customer harm across notification +delivery recovery, Docker command continuity, local subscription setup, and +Synology Docker host load. The exact pushed `main` SHA must pass the +no-publication dry run and integrated candidate checks before the same SHA is +dispatched through the single-build publication workflow. No governed +mobile-facing path changed from `v6.3.0`, so the release decision is +`no-mobile-impact` and no companion build or store rollout is required. +Windows Authenticode remains mandatory for `v6.3.1` unless the release owner +records a new explicit version-bound unsigned-Windows exception; the prior +`v6.3.0` decision cannot be reused for this patch. + +The preceding stable `v6.3.0` cut set 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.3.0` release version. This stable minor release uses `promoted_from_tag=v6.3.0-rc.6`, @@ -2036,13 +2052,15 @@ 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 stable `v6.3.0` cut, the repo-root compose default and -`scripts/install-docker.sh` fallback must both pin `6.3.0` until the next +For the active stable `v6.3.1` cut, the repo-root compose default and +`scripts/install-docker.sh` fallback must both pin `6.3.1` until the next governed release moves them forward. The stable promotion guard remains in force and rejects leftover `-rc.` defaults. 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 release-packet blocker. +For the preceding stable `v6.3.0` cut, the repo-root compose default and +`scripts/install-docker.sh` fallback both pinned `6.3.0`. For the preceding stable `v6.2.1` cut, the repo-root compose default and `scripts/install-docker.sh` fallback must both pin `6.2.1`. The stable promotion guard remains in force and rejects leftover `-rc.` defaults. Each diff --git a/docs/releases/RELEASE_NOTES_v6.3.1.md b/docs/releases/RELEASE_NOTES_v6.3.1.md new file mode 100644 index 000000000..f208b91cc --- /dev/null +++ b/docs/releases/RELEASE_NOTES_v6.3.1.md @@ -0,0 +1,72 @@ +# Pulse v6.3.1 Release Notes + +`v6.3.1` is a stable patch release for the Pulse v6 line. It follows stable +`v6.3.0` and contains focused corrections for alert delivery, Unified Agent +control, local subscription providers, and Docker monitoring overhead. + +## Highlights + +- Recover or dismiss terminal notification failures without losing delivery + history, while disabled PBS offline alerts remain silent. +- Docker commands recover safely after token rotation, and Synology hosts avoid + repeated full-daemon storage scans on every report. +- Local subscription providers now resolve and diagnose their CLIs as the + actual Pulse service account. + +## Improved + +- Notification delivery history now exposes confirmed retry and dismiss + operations for terminal failures. Retried items receive a fresh bounded + attempt budget while their prior audit history remains available. +- Refused governed actions record the resource, capability, stable refusal + code, and the specific Docker command-agent lookup that missed. +- Standard systemd installs give the Pulse service account a private CLI home + and a deterministic executable search path. Explicit provider CLI path + overrides remain available for non-standard layouts. +- Docker host storage totals are refreshed on a bounded 15-minute cadence and + retain the last good aggregate when a refresh fails. Live host and container + metrics continue on the configured reporting interval. + +## Fixed + +- Disabled PBS offline alerts no longer enter the notification dispatch path; + enabled alerts and recovery notifications retain their existing lifecycle. +- Docker start, stop, restart, remove, and update commands recover after an + agent reporting-token rotation by proving the exact tenant, agent ID, and + canonical hostname rather than weakening identity matching. +- Docker update preflight once again routes through the Unified Agent, and + terminal digest-drift refusals no longer strand later update attempts. +- Local subscription setup failures now distinguish a CLI that is missing or + not logged in for the Pulse service account from provider network + reachability failures. +- Synology DSM Docker monitoring no longer launches a verbose daemon-wide disk + usage inventory every 30 seconds or immediately retries a slow failed scan. + +## Release Qualification + +- The release uses the emergency stable-patch path because the fixes address + active customer harm across alert delivery, infrastructure control, local AI + setup, and Docker host load without introducing a same-version RC. +- The exact pushed release SHA must pass the no-publication Release Dry Run and + its integrated exact-SHA candidate checks before that same SHA is submitted + to the single-build publication workflow. +- Authenticode signing is required through SignPath. The rehearsal must return + all three Windows Unified Agent binaries with valid signatures from the + configured production signer before the candidate can advance. +- No mobile-facing path changed between `v6.3.0` and this release, so the mobile + decision is `no-mobile-impact`; no companion build or store rollout is + required. + +## Upgrade Notes + +Use the normal v6 install or update flow for `v6.3.1`. Existing configurations +remain valid and no manual data migration is required. + +The rollback target is `v6.3.0`. The exact rollback reinstall command is: + +```bash +./scripts/install.sh --version v6.3.0 +``` + +Paid Pulse Pro, Relay, and eligible legacy customers should continue to use the +private download page and private runtime image for paid runtime features. diff --git a/docs/releases/V6_CHANGELOG_v6.3.1.md b/docs/releases/V6_CHANGELOG_v6.3.1.md new file mode 100644 index 000000000..3389feabf --- /dev/null +++ b/docs/releases/V6_CHANGELOG_v6.3.1.md @@ -0,0 +1,43 @@ +# Pulse v6.3.1 + +_This changelog describes stable `v6.3.1` compared with stable `v6.3.0`._ + +## Changed + +- Terminal notification failures can be retried with a fresh bounded budget or + dismissed while retaining their delivery audit history. +- Governed-action refusals identify the resource, capability, refusal code, and + missed Docker command-agent lookup in the server journal. +- Systemd installs provide a service-account CLI home and deterministic search + path for local subscription providers, with explicit path overrides for + custom installations. +- Full Docker daemon storage inventory is cached for 15 minutes, uses a single + refresh attempt, and retains the last successful aggregate on failure. + +## Fixed + +- Disabled PBS offline alerts no longer dispatch notifications. +- Docker lifecycle and update operations recover safely after reporting-token + rotation through exact tenant, agent-ID, and canonical-hostname admission. +- Docker update preflight again uses the Unified Agent, and terminal + digest-drift receipts no longer block a later attempt. +- Local subscription setup reports missing executable and service-account login + state instead of misclassifying those failures as provider reachability. +- Synology DSM hosts avoid repeated verbose daemon-wide disk-usage scans on the + normal live-report cadence. + +## Release Metadata + +- Version: `v6.3.1` +- Previous stable: `v6.3.0` +- Rollback target: `v6.3.0` +- Rollback command: `./scripts/install.sh --version v6.3.0` +- Promotion path: emergency stable patch from `main`, using the single-build + release workflow after an exact-SHA no-publication dry run +- Emergency reason: active customer harm across notification recovery, Docker + control, local subscription setup, and Synology Docker host load +- Windows signing decision: Authenticode signing is required through SignPath; + the exact candidate must prove the configured production signer before + publication +- Mobile decision: `no-mobile-impact`; no governed mobile-facing path changed + from `v6.3.0`, 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 9e36b1b17..d5639d3ec 100644 --- a/frontend-modern/public/docs/UPGRADE_v6.md +++ b/frontend-modern/public/docs/UPGRADE_v6.md @@ -4,10 +4,15 @@ This guide covers practical upgrade steps for existing Pulse installs moving to For the current stable v6 packet, see: +- `docs/releases/RELEASE_NOTES_v6.3.1.md` +- `docs/releases/V6_CHANGELOG_v6.3.1.md` + +For the preceding stable v6 packet, see: + - `docs/releases/RELEASE_NOTES_v6.3.0.md` - `docs/releases/V6_CHANGELOG_v6.3.0.md` -For the preceding stable v6 packet, see: +For earlier stable v6.2 packets, see: - `docs/releases/RELEASE_NOTES_v6.2.1.md` - `docs/releases/V6_CHANGELOG_v6.2.1.md` @@ -17,8 +22,6 @@ For historical v6.3 release candidate packets, see: - `docs/releases/RELEASE_NOTES_v6.3.0-rc.6.md` - `docs/releases/V6_CHANGELOG_v6.3.0-rc.6.md` -For earlier stable v6.2 packets, see: - - `docs/releases/RELEASE_NOTES_v6.2.0.md` - `docs/releases/V6_CHANGELOG_v6.2.0.md` diff --git a/scripts/install-docker.sh b/scripts/install-docker.sh index 6e273318e..7a91bad7d 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.3.0" +CANONICAL_DEFAULT_PULSE_VERSION="6.3.1" 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 2a135ae73..fe8a18ca6 100644 --- a/scripts/installtests/build_release_assets_test.go +++ b/scripts/installtests/build_release_assets_test.go @@ -742,8 +742,8 @@ func TestCurrentStablePatchReleasePacketTracksInstallMetadata(t *testing.T) { "`v"+previous+"`", "Use the normal v6 install or update flow", "integrated exact-SHA candidate checks", - "not Authenticode-signed", - "Unknown Publisher", + "Authenticode signing is required through SignPath", + "valid signatures from the configured production signer", "`no-mobile-impact`", "rollback target is `v"+previous+"`", ) @@ -751,8 +751,8 @@ func TestCurrentStablePatchReleasePacketTracksInstallMetadata(t *testing.T) { "Version: `v"+version+"`", "Rollback target: `v"+previous+"`", "Promotion path: emergency stable patch from `"+releaseBranch+"`", - "Windows signing decision: version-bound unsigned-Windows exception", - "not Authenticode-signed", + "Windows signing decision: Authenticode signing is required through SignPath", + "configured production signer before publication", "Mobile decision: `no-mobile-impact`", ) assertFileContainsAll(t, repoFile("docs", "RELEASE_NOTES.md"), diff --git a/scripts/installtests/install_docker_sh_test.go b/scripts/installtests/install_docker_sh_test.go index a0e212bce..e25f3179a 100644 --- a/scripts/installtests/install_docker_sh_test.go +++ b/scripts/installtests/install_docker_sh_test.go @@ -302,8 +302,8 @@ func TestInstallDockerProofTracksStablePatchReleaseContract(t *testing.T) { "This patch release uses the stable hotfix path with `rollback_version=v"+previous+"`, `hotfix_exception=true`, a release-owner reason, and no fabricated same-version RC tag.", "active customer harm", "`no-mobile-impact`", - "version-bound unsigned-Windows exception", - "not Authenticode-signed", + "Windows Authenticode remains mandatory for `v"+version+"`", + "prior `v"+previous+"` decision cannot be reused for this patch", "For the active stable `v"+version+"` cut, the repo-root compose default and `scripts/install-docker.sh` fallback must both pin `"+version+"`", ) }