diff --git a/docs/UPGRADE_v6.md b/docs/UPGRADE_v6.md index 0114d5964..24ac31fd1 100644 --- a/docs/UPGRADE_v6.md +++ b/docs/UPGRADE_v6.md @@ -29,6 +29,11 @@ sudo /bin/update --version vX.Y.Z `/bin/update` is installed by the supported systemd and Proxmox LXC server installer. If your host does not have it yet, follow the signed server-installer flow in [INSTALL.md](INSTALL.md). Agent updates still use the `/install.sh` command generated in **Settings → Infrastructure → Install on a host**. +Operator note for builds after `v6.0.0-rc.2`: the historical Pulse update +signer was not recovered. Hosts pinned to the `rc.2` trust root should not +assume unattended continuity into newer prerelease or GA artifacts; plan a +manual reinstall or other explicit trust migration before testing those builds. + ### Docker ```bash diff --git a/docs/release-control/v6/internal/subsystems/deployment-installability.md b/docs/release-control/v6/internal/subsystems/deployment-installability.md index e216aae12..1a397d909 100644 --- a/docs/release-control/v6/internal/subsystems/deployment-installability.md +++ b/docs/release-control/v6/internal/subsystems/deployment-installability.md @@ -226,6 +226,11 @@ server-side update execution surfaces. accept the active private signing key only alongside a non-secret expected public key or equivalent pinned identity, and they must fail closed before publication if the signer drifts from that expected trust root. +11. When the governed update signer changes, the canonical operator-facing + release docs under `docs/releases/` and the governed upgrade guide + `docs/UPGRADE_v6.md` must state the continuity impact explicitly. Those docs + must not imply automatic updater continuity from a historical signer unless + the actual trust-migration path is already shipped and exercised. ## Current State diff --git a/docs/releases/V6_PRERELEASE_RUNBOOK.md b/docs/releases/V6_PRERELEASE_RUNBOOK.md index 8b2604f64..520b7c77c 100644 --- a/docs/releases/V6_PRERELEASE_RUNBOOK.md +++ b/docs/releases/V6_PRERELEASE_RUNBOOK.md @@ -64,6 +64,10 @@ The workflow auto-marks `-rc.N`/`-alpha.N`/`-beta.N` as prerelease. - operator support pack - `docs/RELEASE_NOTES.md` points at the current in-repo draft packet 4. `PULSE_LICENSE_PUBLIC_KEY` secret is present in GitHub Actions. +5. For any build after `v6.0.0-rc.2`, operators know the update signer changed. + Hosts pinned to the historical `rc.2` trust root must not assume unattended + continuity into later prerelease or GA artifacts; use a manual reinstall or + other explicit trust-migration path before testing those newer packets. ## RC Release Steps diff --git a/scripts/release_control/release_promotion_policy_test.py b/scripts/release_control/release_promotion_policy_test.py index ee570721c..7a623fc37 100644 --- a/scripts/release_control/release_promotion_policy_test.py +++ b/scripts/release_control/release_promotion_policy_test.py @@ -159,6 +159,8 @@ class ReleasePromotionPolicyTest(unittest.TestCase): current_version = read("VERSION").strip() self.assertIn("sudo /bin/update --version vX.Y.Z", upgrade_guide) self.assertIn("follow the signed server-installer flow in [INSTALL.md](INSTALL.md)", upgrade_guide) + self.assertIn("the historical Pulse update signer was not recovered", normalize_ws(upgrade_guide)) + self.assertIn("manual reinstall or other explicit trust migration", normalize_ws(upgrade_guide)) if current_version == "6.0.0": self.assertIn("docs/releases/RELEASE_NOTES_v6.md", upgrade_guide) self.assertIn("docs/releases/V6_CHANGELOG.md", upgrade_guide) @@ -377,12 +379,15 @@ class ReleasePromotionPolicyTest(unittest.TestCase): self.assertIn("Do not rewrite shipped RC notes in place", runbook) self.assertIn("`rc.1`, `rc.2`, and later prerelease", runbook) self.assertIn("The current RC release packet is prepared and internally linked", runbook) + self.assertIn("operators know the update signer changed", normalize_ws(runbook)) + self.assertIn("manual reinstall or other explicit trust-migration path", normalize_ws(runbook)) self.assertIn("points at the current in-repo draft packet", runbook) self.assertIn('export RC_VERSION="6.0.0-rc.2"', runbook) self.assertIn("printf '%s\\n' \"$RC_VERSION\" > VERSION", runbook) self.assertIn("markdown text from the current release-notes packet", runbook) self.assertIn("Keep the current release-notes, changelog, and operator-support packet in", runbook) self.assertIn("Published release bodies must also stay publication-safe", contract) + self.assertIn("must state the continuity impact explicitly", normalize_ws(contract)) self.assertIn( "append the standardized installation and promotion metadata sections exactly once", normalize_ws(contract),