Finalize v6 GA release packet

This commit is contained in:
rcourtman
2026-06-03 17:15:00 +01:00
parent 1f84fd3dd0
commit 4ef6caaa9d
8 changed files with 60 additions and 25 deletions
+2 -2
View File
@@ -2,7 +2,7 @@
> **This migration has been reverted as of `v6.0.0-rc.6`.** Pulse v6 ships
> with the platform-shaped top-level navigation existing v5 operators
> already know (Proxmox, Docker, Kubernetes, TrueNAS, vSphere, Standalone,
> already know (Proxmox, Docker, Kubernetes, TrueNAS, vSphere, Machines,
> plus Alerts, Patrol, and Settings). The unified
> `/infrastructure` / `/workloads` / `/storage` / `/recovery` layout that
> briefly shipped across `rc.1` through `rc.5` is retired. The unified
@@ -21,7 +21,7 @@
> The keyboard shortcuts follow the platform-shaped shape:
>
> - `g p` Proxmox, `g d` Docker, `g k` Kubernetes, `g n` TrueNAS,
> `g v` vSphere, `g s` Standalone
> `g v` vSphere, `g s` Machines
> - `g a` Alerts, `g r` Patrol, `g t` Settings, `?` shortcuts help
>
> The "Classic shortcuts" bar referenced in the historical content below
+3 -3
View File
@@ -102,8 +102,8 @@ servers.
### Can I keep Pulse v5 stable while I test Pulse v6?
Pulse v5 entered maintenance-only support on `2026-04-20` and remains eligible
only for critical maintenance fixes until `2026-07-19`.
Pulse v5 entered maintenance-only support on `2026-06-03` and remains eligible
only for critical maintenance fixes until `2026-09-01`.
If you want extra caution, use a staging or otherwise controlled upgrade first
and keep a rollback path available, but v6 is now the supported stable line.
@@ -114,7 +114,7 @@ and keep a rollback path available, but v6 is now the supported stable line.
Pulse v6.0.0-rc.6 and later ship with the platform-shaped top-level
navigation existing v5 operators already know: Proxmox, Docker, Kubernetes,
TrueNAS, vSphere, Standalone, Alerts, Patrol, and Settings.
TrueNAS, vSphere, Machines, Alerts, Patrol, and Settings.
The backend unified resource model and `/api/resources` contract remain
canonical, but the retired rc.1 through rc.5 `/infrastructure`, `/workloads`,
@@ -64,8 +64,8 @@ These do not qualify as v5 maintenance work:
The first stable `v6.0.0` release must publish this exact notice:
> Pulse v5 entered maintenance-only support on 2026-04-20. I will ship only
> Pulse v5 entered maintenance-only support on 2026-06-03. I will ship only
> critical security, data-loss, licensing or billing blocker, installer or
> updater failure, and safe migration blocker fixes for existing v5 users until
> 2026-07-19. After 2026-07-19, Pulse v5 is end-of-support and new fixes land
> 2026-09-01. After 2026-09-01, Pulse v5 is end-of-support and new fixes land
> on v6 unless I publish an explicit exception.
@@ -6,8 +6,8 @@
## Blocking Facts
1. The latest shipped Pulse v6 prerelease tag is `v6.0.0-rc.5`.
2. That shipped prerelease tag resolves to commit `e32db04543c7fb20f2cac782dafbf3422a13dfe3`.
1. The latest shipped Pulse v6 prerelease tag is `v6.0.0-rc.6`.
2. That shipped prerelease tag resolves to commit `c25e95cb2b071551df95c8add62773905ba0628b`.
3. The selected remote ref `origin/pulse/v6-release` is still behind the current
local governed branch state, so `Release Dry Run` would exercise stale remote
control-plane metadata instead of the intended candidate.
@@ -24,20 +24,20 @@
8. `docs/releases/RELEASE_NOTES_v6.md` and
`docs/release-control/v6/internal/V5_MAINTENANCE_SUPPORT_POLICY.md` now carry the
currently proposed exact dates for the eventual GA notice:
- `v6` GA date: `2026-04-20`
- `v5` end-of-support date: `2026-07-19`
- `v6` GA date: `2026-06-03`
- `v5` end-of-support date: `2026-09-01`
9. There is still no governed `Release Dry Run` artifact or rehearsal record
exercising stable inputs for:
- `version=6.0.0`
- `promoted_from_tag=v6.0.0-rc.5`
- `promoted_from_tag=v6.0.0-rc.6`
- the artifact-owned candidate stable tag for that rehearsal
- the artifact-owned promotion channel for that rehearsal
- the artifact-owned promoted prerelease tag for that rehearsal
- the artifact-owned rollback target for that stable candidate
- `ga_date=2026-04-20`
- `ga_date=2026-06-03`
- an explicit `rollback_version`
- the exact derived rollback command that artifact will publish
- `v5_eos_date=2026-07-19`
- `v5_eos_date=2026-09-01`
## Why The Gate Cannot Be Cleared Yet
@@ -57,16 +57,16 @@ users would still be the first real cohort for the final promotion path.
change and release-control records, to `origin/pulse/v6-release`.
3. Run `Release Dry Run` from `pulse/v6-release` with:
- `version=6.0.0`
- `promoted_from_tag=v6.0.0-rc.5`
- `promoted_from_tag=v6.0.0-rc.6`
- an artifact-owned candidate stable tag matching that rehearsal
- an artifact-owned promotion channel matching that rehearsal
- an artifact-owned promoted prerelease tag matching that rehearsal
- an artifact-owned rollback target for the stable candidate
- the exact planned GA and v5 end-of-support dates for the publish notice
- `ga_date=2026-04-20`
- `ga_date=2026-06-03`
- an explicit stable `rollback_version`
- the exact derived rollback command that artifact will publish
- `v5_eos_date=2026-07-19`
- `v5_eos_date=2026-09-01`
4. Capture the `rc-to-ga-rehearsal-summary` artifact and run URL.
5. Materialize the final rehearsal record from that artifact without
hand-repairing any missing candidate tag, promoted prerelease tag, rollback
@@ -510,6 +510,13 @@ TLS floor in the dynamic config.
`docs/RELEASE_NOTES.md` index keeps both the stable packet and the preserved
RC packet discoverable, and `docs/UPGRADE_v6.md` points operators at the
live stable support transition instead of a retired prerelease packet.
The first stable `6.0.0` GA packet must keep the promoted prerelease tag,
rollback target, exact GA date, and exact v5 end-of-support date aligned
across release notes, upgrade guidance, support policy, promotion records,
and release-promotion resolver proof before workflow dispatch. For the
2026-06-03 cutover candidate, that packet is
`promoted_from_tag=v6.0.0-rc.6`, `rollback_version=v5.1.34`,
`ga_date=2026-06-03`, and `v5_eos_date=2026-09-01`.
7. Preserve release-matched installer and Helm operator documentation links through `scripts/install.sh`, `.github/workflows/helm-pages.yml`, `.github/workflows/publish-helm-chart.yml`, and the chart metadata itself so deployment guidance and packaged chart metadata do not drift back to branch-tip `main` docs when a release line or promoted tag already exists.
The same governed Helm boundary also owns `deploy/helm/pulse/` itself:
chart metadata, default values, templates, and generated chart docs must
+7 -6
View File
@@ -1,7 +1,7 @@
# Pulse v6.0.0 Release Notes
`v6.0.0` is the first stable release of Pulse v6. It promotes the validated
`v6.0.0-rc.1` and `v6.0.0-rc.2` line into the default supported v6 release.
`v6.0.0-rc.6` candidate into the default supported v6 release.
Pulse v6 keeps the platform-shaped top-level navigation existing v5 operators
already know (Proxmox, Docker, Kubernetes, TrueNAS, vSphere, Machines, plus
@@ -9,8 +9,8 @@ Alerts, Patrol, and Settings), rebuilds the runtime behind it on a unified
resource model and contract (`/api/resources`), ships first-class vSphere and
TrueNAS support, adds the Patrol intelligence and agent-substrate surfaces,
keeps the governed v5-to-v6 upgrade and Unified Agent continuity path, and
ships the corrected self-hosted commercial model that was validated during
`rc.2`.
ships the corrected self-hosted commercial model that was validated across the
RC line.
The v6 line briefly shipped a unified `Infrastructure` / `Workloads` /
`Storage` / `Recovery` top-level layout across `rc.1` through `rc.5`. Operator
@@ -21,9 +21,10 @@ backend, the navigation shape you already know.
## Pulse v5 Support Transition
Pulse v5 entered maintenance-only support on `2026-04-20`.
I will ship only critical security, data-loss, licensing or billing blocker, installer or updater failure, and safe migration blocker fixes for existing v5 users until `2026-07-19`.
After `2026-07-19`, Pulse v5 is end-of-support and new fixes land on v6 unless
Pulse v5 entered maintenance-only support on `2026-06-03`.
I will ship only critical security, data-loss, licensing or billing blocker,
installer or updater failure, and safe migration blocker fixes for existing v5 users until `2026-09-01`.
After `2026-09-01`, Pulse v5 is end-of-support and new fixes land on v6 unless
I publish an explicit exception.
## What Is In v6.0.0
+2 -2
View File
@@ -1,8 +1,8 @@
# Pulse v6.0.0
_This changelog describes the shipped stable `v6.0.0` release compared with
`v5.1.27`. It includes the corrective changes that were validated across
`v6.0.0-rc.1` and `v6.0.0-rc.2`._
`v5.1.34`. It includes the corrective changes that were validated across
`v6.0.0-rc.1` through `v6.0.0-rc.6`._
## What v6 changes at a high level
@@ -3,10 +3,13 @@
from __future__ import annotations
from pathlib import Path
import unittest
import resolve_release_promotion as resolver
REPO_ROOT = Path(__file__).resolve().parents[2]
class ResolveReleasePromotionTest(unittest.TestCase):
def test_dev_prerelease_uses_prerelease_path(self) -> None:
@@ -82,6 +85,30 @@ class ResolveReleasePromotionTest(unittest.TestCase):
now_unix_fn=lambda: 100 + (73 * 3600),
)
def test_current_stable_v6_packet_resolves_with_publish_dates(self) -> None:
release_notes = (REPO_ROOT / "docs/releases/RELEASE_NOTES_v6.md").read_text(encoding="utf-8")
metadata = resolver.resolve_metadata(
version="6.0.0",
promoted_from_tag_input="v6.0.0-rc.6",
rollback_version_input="v5.1.34",
ga_date_input="2026-06-03",
v5_eos_date_input="2026-09-01",
hotfix_exception=False,
hotfix_reason_input="",
release_notes_input=release_notes,
tag_exists_fn=lambda tag: tag in {"v6.0.0-rc.6", "v5.1.34"},
tag_commit_fn=lambda tag: "rc6-commit",
head_descends_from_fn=lambda commit: commit == "rc6-commit",
tag_created_unix_fn=lambda tag: 100,
now_unix_fn=lambda: 100 + (163 * 3600),
)
self.assertEqual(metadata["promoted_from_tag"], "v6.0.0-rc.6")
self.assertEqual(metadata["rollback_tag"], "v5.1.34")
self.assertEqual(metadata["rollback_command"], "./scripts/install.sh --version v5.1.34")
self.assertEqual(metadata["ga_date"], "2026-06-03")
self.assertEqual(metadata["v5_eos_date"], "2026-09-01")
def test_stable_hotfix_requires_reason(self) -> None:
with self.assertRaisesRegex(ValueError, "hotfix_reason is required"):
resolver.resolve_metadata(