From 3dfac7df168c041a76f3bfb8f8e027598ec4cb2b Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 3 Jul 2026 21:14:29 +0100 Subject: [PATCH] Align v6 GA publication dates - set the GA packet to 2026-07-03 - set the v5 maintenance end date to 2026-10-01 --- docs/UPGRADE_v6.md | 14 +++----- .../internal/V5_MAINTENANCE_SUPPORT_POLICY.md | 4 +-- ...ent-branch-ga-owner-approval-2026-07-02.md | 8 ++--- ...-promotion-readiness-blocked-2026-04-04.md | 35 +++++++++---------- .../subsystems/deployment-installability.md | 6 ++-- docs/releases/RELEASE_NOTES_v6.md | 6 ++-- .../release_promotion_policy_test.py | 8 ++--- .../resolve_release_promotion_test.py | 8 ++--- 8 files changed, 41 insertions(+), 48 deletions(-) diff --git a/docs/UPGRADE_v6.md b/docs/UPGRADE_v6.md index 2955da39e4..93b5f1778c 100644 --- a/docs/UPGRADE_v6.md +++ b/docs/UPGRADE_v6.md @@ -2,17 +2,13 @@ This guide covers practical upgrade steps for existing Pulse installs moving to v6. -For the current v6 prerelease packet and rollout references, see: +For the current stable v6 packet and rollout references, see: -- `docs/releases/RELEASE_NOTES_v6_RC7_DRAFT.md` -- `docs/releases/V6_CHANGELOG_RC7_DRAFT.md` -- `docs/releases/V6_RC7_OPERATOR_SUPPORT_PACK_DRAFT.md` +- `docs/releases/RELEASE_NOTES_v6.md` +- `docs/releases/V6_CHANGELOG.md` -The prepared stable v6 packet remains in `docs/releases/RELEASE_NOTES_v6.md` -and `docs/releases/V6_CHANGELOG.md`, but the published GitHub release is the -authority for what users can install as stable. Until the stable `v6.0.0` -release exists, treat v6 as prerelease and keep v5.1.35 as the stable rollback -target. +The published GitHub release is the authority for what users can install as +stable. Keep v5.1.35 as the explicit rollback target for the v6.0.0 cutover. ## Before You Upgrade 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 957901c18d..a2a7f8323d 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-07-02. I will ship only +> Pulse v5 entered maintenance-only support on 2026-07-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-30. After 2026-09-30, Pulse v5 is end-of-support and new fixes land +> 2026-10-01. After 2026-10-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/current-branch-ga-owner-approval-2026-07-02.md b/docs/release-control/v6/internal/records/current-branch-ga-owner-approval-2026-07-02.md index 3a04515339..3887cfc0a6 100644 --- a/docs/release-control/v6/internal/records/current-branch-ga-owner-approval-2026-07-02.md +++ b/docs/release-control/v6/internal/records/current-branch-ga-owner-approval-2026-07-02.md @@ -6,8 +6,8 @@ - Scope decision: include accumulated post-RC7 changes in the GA release - Additional RC or soak required: no - Additional current-branch validation required before GA: no -- GA date for publication packet: 2026-07-02 -- v5 end-of-support date for publication packet: 2026-09-30 +- GA date for publication packet: 2026-07-03 +- v5 end-of-support date for publication packet: 2026-10-01 ## Owner Direction @@ -18,8 +18,8 @@ soak cycle. This record is risk acceptance, not validation evidence. The release record must not describe the post-RC7 changes as RC-tested. The public release packet must describe v6.0.0 as the current branch GA after seven release candidates, -with the exact GA and v5 end-of-support dates updated for the actual July 2, -2026 launch decision. +with the exact GA and v5 end-of-support dates updated for the actual July 3, +2026 publication. ## Release-Control Impact 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 97f861c856..c37916c79d 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,37 +6,34 @@ ## Blocking Facts -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. -4. The governed release profile in `docs/release-control/control_plane.json` +1. The latest shipped Pulse v6 prerelease tag is `v6.0.0-rc.7`. +2. That shipped prerelease tag resolves to commit `2900e41b2db95561471d17bb9f4fdf097b56b8ac`. +3. The governed release profile in `docs/release-control/control_plane.json` currently declares both `prerelease_branch` and `stable_branch` as `pulse/v6-release`. -5. The active control-plane target is `v6-ga-promotion`, so stable or GA +4. The active control-plane target is `v6-ga-promotion`, so stable or GA promotion is now the governed objective for Pulse v6. -6. The active local `pulse/v6-release` branch currently reports `VERSION=6.0.0`, so a +5. The active local `pulse/v6-release` branch currently reports `VERSION=6.0.0`, so a local GA candidate exists on the governed stable line. -7. There is still no governed `Prerelease-to-GA Rehearsal Record` proving a successful +6. There is still no governed `Prerelease-to-GA Rehearsal Record` proving a successful non-publish `Release Dry Run` for the current `6.0.0` candidate. -8. `docs/releases/RELEASE_NOTES_v6.md` and +7. `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-06-04` - - `v5` end-of-support date: `2026-09-02` -9. There is still no governed `Release Dry Run` artifact or rehearsal record + - `v6` GA date: `2026-07-03` + - `v5` end-of-support date: `2026-10-01` +8. 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.6` + - `promoted_from_tag=v6.0.0-rc.7` - 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-06-04` + - `ga_date=2026-07-03` - an explicit `rollback_version` - the exact derived rollback command that artifact will publish - - `v5_eos_date=2026-09-02` + - `v5_eos_date=2026-10-01` ## Why The Gate Cannot Be Cleared Yet @@ -51,16 +48,16 @@ users would still be the first real cohort for the final promotion path. `VERSION=6.0.0` candidate and release-control records, to `origin/pulse/v6-release`. 2. Run `Release Dry Run` from `pulse/v6-release` with: - `version=6.0.0` - - `promoted_from_tag=v6.0.0-rc.6` + - `promoted_from_tag=v6.0.0-rc.7` - 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-06-04` + - `ga_date=2026-07-03` - an explicit stable `rollback_version` - the exact derived rollback command that artifact will publish - - `v5_eos_date=2026-09-02` + - `v5_eos_date=2026-10-01` 3. Capture the `rc-to-ga-rehearsal-summary` artifact and run URL. 4. 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 b9f39566ab..ec1a97099a 100644 --- a/docs/release-control/v6/internal/subsystems/deployment-installability.md +++ b/docs/release-control/v6/internal/subsystems/deployment-installability.md @@ -588,9 +588,9 @@ TLS floor in the dynamic config. 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-07-02 cutover candidate, that packet is + 2026-07-03 cutover candidate, that packet is `promoted_from_tag=v6.0.0-rc.7`, `rollback_version=v5.1.35`, - `ga_date=2026-07-02`, and `v5_eos_date=2026-09-30`. + `ga_date=2026-07-03`, and `v5_eos_date=2026-10-01`. That stable cut must also move the repo-root Docker compose default and `scripts/install-docker.sh` fallback from the final RC image tag to the stable `6.0.0` image tag in the same commit as `VERSION=6.0.0`. @@ -761,7 +761,7 @@ The active stable `v6.0.0` cut sets the repo-root `VERSION`, repo-root `docker-compose.yml` image default, and `scripts/install-docker.sh` fallback to the same `6.0.0` release version. The GA promotion metadata for this cut is `promoted_from_tag=v6.0.0-rc.7`, `rollback_version=v5.1.35`, -`ga_date=2026-07-02`, and `v5_eos_date=2026-09-30`. +`ga_date=2026-07-03`, and `v5_eos_date=2026-10-01`. The shell-installer boundary carries root-agent service hardening for Linux installs. Installer-rendered agent units must keep the health/metrics listener diff --git a/docs/releases/RELEASE_NOTES_v6.md b/docs/releases/RELEASE_NOTES_v6.md index e8ae09fe36..14590f858f 100644 --- a/docs/releases/RELEASE_NOTES_v6.md +++ b/docs/releases/RELEASE_NOTES_v6.md @@ -23,10 +23,10 @@ already know. ## Pulse v5 Support Transition -Pulse v5 entered maintenance-only support on `2026-07-02`. +Pulse v5 entered maintenance-only support on `2026-07-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-30`. -After `2026-09-30`, Pulse v5 is end-of-support and new fixes land on v6 unless +installer or updater failure, and safe migration blocker fixes for existing v5 users until `2026-10-01`. +After `2026-10-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/scripts/release_control/release_promotion_policy_test.py b/scripts/release_control/release_promotion_policy_test.py index ff45d88f4c..ee5a85914d 100644 --- a/scripts/release_control/release_promotion_policy_test.py +++ b/scripts/release_control/release_promotion_policy_test.py @@ -162,10 +162,10 @@ class ReleasePromotionPolicyTest(unittest.TestCase): self.assertIn("current `pulse/v6-release` branch", normalized_release_notes) self.assertIn("seven release candidates and accumulated post-RC7 fixes", normalized_release_notes) - self.assertIn("Pulse v5 entered maintenance-only support on `2026-07-02`.", normalized_release_notes) - self.assertIn("existing v5 users until `2026-09-30`.", normalized_release_notes) - self.assertIn("Pulse v5 entered maintenance-only support on 2026-07-02.", normalized_v5_policy) - self.assertIn("2026-09-30. After 2026-09-30", normalized_v5_policy) + self.assertIn("Pulse v5 entered maintenance-only support on `2026-07-03`.", normalized_release_notes) + self.assertIn("existing v5 users until `2026-10-01`.", normalized_release_notes) + self.assertIn("Pulse v5 entered maintenance-only support on 2026-07-03.", normalized_v5_policy) + self.assertIn("2026-10-01. After 2026-10-01", normalized_v5_policy) gate = next(gate for gate in status["release_gates"] if gate["id"] == "rc-to-ga-promotion-readiness") self.assertEqual(gate["status"], "passed") diff --git a/scripts/release_control/resolve_release_promotion_test.py b/scripts/release_control/resolve_release_promotion_test.py index 9878c3d894..bd8e18d955 100644 --- a/scripts/release_control/resolve_release_promotion_test.py +++ b/scripts/release_control/resolve_release_promotion_test.py @@ -92,8 +92,8 @@ class ResolveReleasePromotionTest(unittest.TestCase): version="6.0.0", promoted_from_tag_input="v6.0.0-rc.7", rollback_version_input="v5.1.35", - ga_date_input="2026-07-02", - v5_eos_date_input="2026-09-30", + ga_date_input="2026-07-03", + v5_eos_date_input="2026-10-01", hotfix_exception=False, hotfix_reason_input="", release_notes_input=release_notes, @@ -107,8 +107,8 @@ class ResolveReleasePromotionTest(unittest.TestCase): self.assertEqual(metadata["promoted_from_tag"], "v6.0.0-rc.7") self.assertEqual(metadata["rollback_tag"], "v5.1.35") self.assertEqual(metadata["rollback_command"], "./scripts/install.sh --version v5.1.35") - self.assertEqual(metadata["ga_date"], "2026-07-02") - self.assertEqual(metadata["v5_eos_date"], "2026-09-30") + self.assertEqual(metadata["ga_date"], "2026-07-03") + self.assertEqual(metadata["v5_eos_date"], "2026-10-01") def test_stable_hotfix_requires_reason(self) -> None: with self.assertRaisesRegex(ValueError, "hotfix_reason is required"):