diff --git a/docs/MIGRATION_UNIFIED_NAV.md b/docs/MIGRATION_UNIFIED_NAV.md index 84cc2578a..e8cb6f055 100644 --- a/docs/MIGRATION_UNIFIED_NAV.md +++ b/docs/MIGRATION_UNIFIED_NAV.md @@ -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 diff --git a/docs/UPGRADE_v6.md b/docs/UPGRADE_v6.md index 1bf452ef3..47aa0636f 100644 --- a/docs/UPGRADE_v6.md +++ b/docs/UPGRADE_v6.md @@ -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`, diff --git a/docs/release-control/v6/internal/V5_MAINTENANCE_SUPPORT_POLICY.md b/docs/release-control/v6/internal/V5_MAINTENANCE_SUPPORT_POLICY.md index 70a4f3c78..e533ec66c 100644 --- a/docs/release-control/v6/internal/V5_MAINTENANCE_SUPPORT_POLICY.md +++ b/docs/release-control/v6/internal/V5_MAINTENANCE_SUPPORT_POLICY.md @@ -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. diff --git a/docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-04-04.md b/docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-04-04.md index 7b85afb98..ffd3998da 100644 --- a/docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-04-04.md +++ b/docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-04-04.md @@ -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 diff --git a/docs/release-control/v6/internal/subsystems/deployment-installability.md b/docs/release-control/v6/internal/subsystems/deployment-installability.md index a0604c56c..3ec159414 100644 --- a/docs/release-control/v6/internal/subsystems/deployment-installability.md +++ b/docs/release-control/v6/internal/subsystems/deployment-installability.md @@ -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 diff --git a/docs/releases/RELEASE_NOTES_v6.md b/docs/releases/RELEASE_NOTES_v6.md index 55bff132c..f8249f34a 100644 --- a/docs/releases/RELEASE_NOTES_v6.md +++ b/docs/releases/RELEASE_NOTES_v6.md @@ -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 diff --git a/docs/releases/V6_CHANGELOG.md b/docs/releases/V6_CHANGELOG.md index 10add31d7..17240a331 100644 --- a/docs/releases/V6_CHANGELOG.md +++ b/docs/releases/V6_CHANGELOG.md @@ -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 diff --git a/scripts/release_control/resolve_release_promotion_test.py b/scripts/release_control/resolve_release_promotion_test.py index 0f99dead7..64c72dbce 100644 --- a/scripts/release_control/resolve_release_promotion_test.py +++ b/scripts/release_control/resolve_release_promotion_test.py @@ -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(