Prepare v6.4.0-rc.9 release

This commit is contained in:
Richard Courtman
2026-08-28 01:36:53 +01:00
parent f5f854afa2
commit dac72894a2
13 changed files with 137 additions and 36 deletions
+1 -1
View File
@@ -1 +1 @@
6.4.0-rc.8
6.4.0-rc.9
+4 -4
View File
@@ -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.8
appVersion: "6.4.0-rc.8"
icon: https://raw.githubusercontent.com/rcourtman/Pulse/v6.4.0-rc.8/docs/images/pulse-logo.svg
version: 6.4.0-rc.9
appVersion: "6.4.0-rc.9"
icon: https://raw.githubusercontent.com/rcourtman/Pulse/v6.4.0-rc.9/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.8/docs/KUBERNETES.md
url: https://github.com/rcourtman/Pulse/blob/v6.4.0-rc.9/docs/KUBERNETES.md
- name: Support
url: https://github.com/rcourtman/Pulse/discussions
artifacthub.io/maintainers: |
+1 -1
View File
@@ -1,6 +1,6 @@
# pulse
![Version: 6.4.0-rc.8](https://img.shields.io/badge/Version-6.4.0--rc.8-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 6.4.0-rc.8](https://img.shields.io/badge/AppVersion-6.4.0--rc.8-informational?style=flat-square)
![Version: 6.4.0-rc.9](https://img.shields.io/badge/Version-6.4.0--rc.9-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 6.4.0-rc.9](https://img.shields.io/badge/AppVersion-6.4.0--rc.9-informational?style=flat-square)
Helm chart for deploying the Pulse hub and optional Docker, Kubernetes, or OpenShift monitoring agent.
+1 -1
View File
@@ -2,7 +2,7 @@ version: '3.8'
services:
pulse:
image: ${PULSE_IMAGE:-rcourtman/pulse:6.4.0-rc.8}
image: ${PULSE_IMAGE:-rcourtman/pulse:6.4.0-rc.9}
container_name: pulse
restart: unless-stopped
logging:
+6 -4
View File
@@ -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.8.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.8.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.9.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.9.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.7.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.7.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.8.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.8.md`
For earlier v6.4 release candidate packets, see:
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.7.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.7.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.6.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.6.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.5.md`
+6 -4
View File
@@ -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.8.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.8.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.9.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.9.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.7.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.7.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.8.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.8.md`
For earlier v6.4 release candidate packets, see:
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.7.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.7.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.6.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.6.md`
@@ -1811,12 +1811,13 @@ 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.8` cut sets the repo-root `VERSION`, repo-root
The active prerelease `v6.4.0-rc.9` 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.8` release version. It follows
`v6.4.0-rc.7` on the published `v6.4.0` candidate line. That candidate was
quarantined before activation, so `v6.4.0-rc.8` follows `v6.4.0-rc.6` as the
next publicly activated candidate. This prerelease keeps
Helm chart release metadata to the same `6.4.0-rc.9` release version. The
`v6.4.0-rc.8` qualification attempt stopped before a public tag or GitHub
release was created, while `v6.4.0-rc.7` remains an immutable failed candidate.
Consequently `v6.4.0-rc.9` follows `v6.4.0-rc.6` as the next publicly activated
candidate. 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 makes the append-only
@@ -1827,6 +1828,7 @@ keeps informational alert severity distinct across configuration, persistence,
API responses, filters, email, ntfy, and mobile push presentation;
adds rolling-window metric policy and predictive storage-capacity alerts;
makes host SMART policy configurable without duplicating Proxmox disk risk;
keeps empty Unraid storage slots neutral instead of degrading array health;
converges infrastructure detail presentation; and strengthens independently
verified Docker actions plus atomic deployment enrollment and credential
persistence. The changes since `v6.4.0-rc.6` add the canonical `alert_fired`
@@ -1849,10 +1851,25 @@ 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.8` qualification attempt used exact source SHA
`bac7e5d9526d76a6b4e34738511b07609dda80ed`. Release run `33128595650`
passed preparation, frontend bundle, Windows installer smoke, release smoke,
private staging, immutable candidate assembly, and macOS signing and
notarization, then failed the frontend gate because stale severity coverage
treated the newly first-class `info` value as an unknown warning. Review also
found that the overview presentation sent truly unknown severity strings to
the informational palette instead of the contract's warning fallback. The run
was cancelled before a public tag or GitHub release was created. Exact fix
commit `fcf872fb5` gives `info` an explicit blue branch, fails unknown values
safe to warning, adds canonical and coverage proof, and carries the corrected
browser receipt. `v6.4.0-rc.9` fixes forward from that failed immutable
qualification without moving stable install pointers or stable semver aliases
from `v6.3.2`.
The preceding `v6.4.0-rc.7` publication attempt built and staged exact candidate
artifacts from source SHA `595c369d85796f86855b4cf8335b9bb371d28462`,
but the backend release gate failed before public activation. Its tag and
versioned artifacts remain immutable, and `v6.4.0-rc.8` supersedes the failed
versioned artifacts remain immutable, and `v6.4.0-rc.9` supersedes the failed
candidate without moving stable install pointers or stable semver aliases from
`v6.3.2`.
@@ -2313,8 +2330,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.8` cut, the repo-root compose default and
`scripts/install-docker.sh` fallback must both pin `6.4.0-rc.8` until the next
For the active prerelease `v6.4.0-rc.9` cut, the repo-root compose default and
`scripts/install-docker.sh` fallback must both pin `6.4.0-rc.9` 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
@@ -0,0 +1,24 @@
# Pulse v6.4.0-rc.9 Release Notes
`v6.4.0-rc.9` strengthens alerting as an operational system. Histories survive restarts, alerts can be scheduled and routed more precisely, and new forecasting detects storage risk earlier.
## What's improved
- **Durable alert lifecycles** - Alert history and active state now rebuild from the event log after restarts, with persisted identities migrated automatically and false all-clear states prevented during hydration.
- **Better notification control** - Alerts can be snoozed individually, maintenance can recur by scope, escalation repeats can target specific destinations, delivery routes can filter by severity, and informational events remain distinct from warnings.
- **Earlier capacity warnings** - Rolling metric windows and predictive storage forecasts surface sustained pressure and likely exhaustion before a single threshold breach becomes an outage.
- **More accurate host disk health** - SMART sector, media, endurance, spare, and CRC thresholds can be tuned per host, while empty Unraid slots remain neutral and Proxmox-linked agents avoid duplicate disk-risk alerts.
- **External availability monitoring** - Dead-man checks can notify when an expected external signal stops arriving, with configuration and recovery state persisted.
- **Clearer infrastructure details** - Resource drawers, Proxmox backup views, and alert timelines present more complete and consistent context across desktop and narrow layouts.
- **Safer governed actions** - Docker action results now carry independently observed post-action state, while deployment enrollment and credential changes persist atomically.
## 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. Alert identity and history migrations run automatically, with no manual data migration required.
- Existing Pulse Mobile iOS build 12 and Android versionCode 9 remain compatible. The new `alert_fired` push uses the already-supported `view_alert` action and existing informational severity presentation, so no companion update is required for this candidate.
- 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.
+46
View File
@@ -0,0 +1,46 @@
# Pulse v6.4.0-rc.9
_The `v6.4.0-rc.8` qualification attempt stopped before a public tag or GitHub release was created. This candidate therefore carries the complete customer-visible change set forward from `v6.4.0-rc.6`._
## Added
- Rolling-window metric evaluation supports sustained CPU and memory policies, including workload inheritance from host defaults.
- Predictive storage-capacity alerts estimate exhaustion risk from retained usage history and recover when the forecast clears.
- Per-alert snooze, recurring scoped maintenance, destination severity routing, repeatable escalation schedules, and external dead-man monitoring expand operator control over alert delivery.
- Resolved host SMART policy covers health failure, sector counters, media errors, remaining life, NVMe spare, and CRC growth without creating duplicate Proxmox disk alerts.
- Canonical `alert_fired` push events use the existing mobile `view_alert` navigation action.
- Informational alerts now retain an explicit `info` severity through configuration, persistence, API responses, filtering, notification routing, and display.
## Changed
- The append-only event log is the authority for alert history and active lifecycle reconstruction, including restart recovery, acknowledgement, resolution, suppression, notification, and migration evidence.
- Alert identities and persisted history migrate to canonical resource keys, while active state uses durable atomic snapshots and ordered recovery.
- Escalation and delivery decisions are destination-specific, repeated holds are coalesced, and destination updates persist before the active runtime changes.
- Resource detail drawers use shared information-card and detail-table primitives across infrastructure, Docker, storage, and Proxmox backup surfaces.
- Docker lifecycle results distinguish command acceptance from independently observed post-action state, and deployment enrollment plus credential updates commit atomically.
- Email, ntfy, and mobile push presentation preserve informational priority instead of elevating non-warning events to warning treatment.
- Active-alert cards give informational severity an explicit blue presentation while preserving warning as the fail-safe for unknown values.
## Fixed
- Alert hydration no longer exposes a false all-clear state before persisted incidents are restored.
- Restart recovery, history queries, and mock alert timelines preserve lifecycle order, observation time, and complete incident evidence.
- Fresh rolling-window metric data remains authoritative, including when older samples or counter resets are present.
- Offline mock hosts remain on the normal host-alert lifecycle instead of losing active incidents during refresh.
- API token watcher updates remain ordered across successive persistence mutations.
- Proxmox backup health, inventory refresh, offline fixtures, and drawer detail presentation retain complete current context.
- Informational active-alert cards use the blue severity palette, while unknown severity values fail safe to warning presentation.
- Empty Unraid storage slots no longer make an otherwise healthy array report a degraded state.
## Release Metadata
- Version: `v6.4.0-rc.9`
- Previous qualification attempt: `v6.4.0-rc.8` (not published)
- Previous candidate tag: `v6.4.0-rc.7`
- Previous published candidate: `v6.4.0-rc.6`
- 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: `existing-mobile-build-compatible`. Published iOS build 12 and Android versionCode 9 already route `action_type=view_alert`, accept severity as a string, and render informational severity, so no companion upload is required.
+6 -4
View File
@@ -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.8.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.8.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.9.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.9.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.7.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.7.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.8.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.8.md`
For earlier v6.4 release candidate packets, see:
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.7.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.7.md`
- `docs/releases/RELEASE_NOTES_v6.4.0-rc.6.md`
- `docs/releases/V6_CHANGELOG_v6.4.0-rc.6.md`
+1 -1
View File
@@ -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.8"
CANONICAL_DEFAULT_PULSE_VERSION="6.4.0-rc.9"
resolve_default_pulse_version() {
if [ -n "${PULSE_IMAGE_VERSION:-}" ]; then
@@ -891,7 +891,7 @@ func TestCurrentPrereleasePacketTracksInstallMetadata(t *testing.T) {
"Better notification control",
"informational events remain distinct from warnings",
"Earlier capacity warnings",
"Host disk policies",
"More accurate host disk health",
"External availability monitoring",
"Clearer infrastructure details",
"Safer governed actions",
@@ -901,12 +901,16 @@ func TestCurrentPrereleasePacketTracksInstallMetadata(t *testing.T) {
"Unknown Publisher warning",
)
assertFileDoesNotContain(t, releaseNotesPath, "## Fixes")
comparisonSummary := "This changelog describes the changes since `v" + comparisonVersion + "`"
if version == "6.4.0-rc.9" {
comparisonSummary = "The `v6.4.0-rc.8` qualification attempt stopped before a public tag or GitHub release was created."
}
assertFileContainsAllNormalized(t, changelogPath,
"Version: `v"+version+"`",
"Previous stable: `v"+previous+"`",
"Rollback target: `v"+previous+"`",
"Promotion path: exact-SHA single-build release candidate from `main`",
"This changelog describes the changes since `v"+comparisonVersion+"`",
comparisonSummary,
"Rolling-window metric evaluation supports sustained CPU and memory policies",
"Predictive storage-capacity alerts estimate exhaustion risk",
"Per-alert snooze, recurring scoped maintenance, destination severity routing",
@@ -3099,11 +3103,11 @@ func TestReleaseNotesGeneratorResolvesChannelSpecificComparisonRanges(t *testing
commit("stable 6.3.2 hotfix")
runGit("tag", "v6.3.2")
runGit("checkout", "main")
for rc := 1; rc <= 7; rc++ {
for rc := 1; rc <= 8; rc++ {
commit("release candidate " + strconv.Itoa(rc))
runGit("tag", "v6.4.0-rc."+strconv.Itoa(rc))
}
commit("release candidate 8 changes")
commit("release candidate 9 changes")
generator, err := filepath.Abs(repoFile("scripts", "generate-release-notes.sh"))
if err != nil {
@@ -3141,8 +3145,8 @@ func TestReleaseNotesGeneratorResolvesChannelSpecificComparisonRanges(t *testing
return strings.TrimSpace(string(output))
}
if got := resolve("6.4.0-rc.8"); got != "v6.4.0-rc.7" {
t.Fatalf("RC comparison base = %q, want v6.4.0-rc.7", got)
if got := resolve("6.4.0-rc.9"); got != "v6.4.0-rc.8" {
t.Fatalf("RC comparison base = %q, want v6.4.0-rc.8", got)
}
if got := resolve("6.4.0-rc.1"); got != "v6.3.2" {
t.Fatalf("RC1 comparison base = %q, want v6.3.2", got)
@@ -3151,13 +3155,13 @@ func TestReleaseNotesGeneratorResolvesChannelSpecificComparisonRanges(t *testing
t.Fatalf("GA comparison base = %q, want v6.3.2", got)
}
cmd := exec.Command("bash", generator, "6.4.0-rc.8", "v6.4.0-rc.6")
cmd := exec.Command("bash", generator, "6.4.0-rc.9", "v6.4.0-rc.7")
cmd.Dir = repo
output, err := cmd.CombinedOutput()
if err == nil {
t.Fatal("generator accepted a comparison tag older than the immediately preceding RC")
}
if !strings.Contains(string(output), "expected 'v6.4.0-rc.7'") {
if !strings.Contains(string(output), "expected 'v6.4.0-rc.8'") {
t.Fatalf("unexpected comparison-range rejection:\n%s", output)
}
}
@@ -149,6 +149,7 @@ func TestPreviousStableForPrereleaseVersionCrossesMinorBoundaries(t *testing.T)
{version: "6.4.0-rc.6", want: "6.3.2"},
{version: "6.4.0-rc.7", want: "6.3.2"},
{version: "6.4.0-rc.8", want: "6.3.2"},
{version: "6.4.0-rc.9", want: "6.3.2"},
}
for _, test := range tests {
@@ -375,6 +376,9 @@ func TestInstallDockerProofTracksPrereleaseContract(t *testing.T) {
} else {
comparisonLine = "It follows `v" + comparisonVersion + "` on the published `v" + stableTarget + "` candidate line."
}
if version == "6.4.0-rc.9" {
comparisonLine = "The `v6.4.0-rc.8` qualification attempt stopped before a public tag or GitHub release was created"
}
assertFileContainsAllNormalized(t, repoFile("docs", "release-control", "v6", "internal", "subsystems", "deployment-installability.md"),
"The active prerelease `v"+version+"` 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 `"+version+"` release version.",