Prepare v6.0.0-rc.4 release packet

This commit is contained in:
rcourtman
2026-05-05 15:32:32 +01:00
parent 3f16d7845a
commit f149c5d643
14 changed files with 664 additions and 19 deletions
+1 -1
View File
@@ -1 +1 @@
6.0.0-rc.3
6.0.0-rc.4
+6 -1
View File
@@ -16,7 +16,12 @@ For the historical shipped v6 `rc.1` packet, see:
- `docs/releases/V6_CHANGELOG_RC1.md`
- `docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md`
For the current in-repo v6 `rc.3` draft packet, see:
For the current in-repo v6 `rc.4` draft packet, see:
- `docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md`
- `docs/releases/V6_CHANGELOG_RC4_DRAFT.md`
- `docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md`
For the historical in-repo v6 `rc.3` draft packet, see:
- `docs/releases/RELEASE_NOTES_v6_RC3_DRAFT.md`
- `docs/releases/V6_CHANGELOG_RC3_DRAFT.md`
- `docs/releases/V6_RC3_OPERATOR_SUPPORT_PACK_DRAFT.md`
+3 -3
View File
@@ -9,9 +9,9 @@ For current stable release notes and rollout references, see:
For the current v6 prerelease packet, see:
- `docs/releases/RELEASE_NOTES_v6_RC3_DRAFT.md`
- `docs/releases/V6_CHANGELOG_RC3_DRAFT.md`
- `docs/releases/V6_RC3_OPERATOR_SUPPORT_PACK_DRAFT.md`
- `docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md`
- `docs/releases/V6_CHANGELOG_RC4_DRAFT.md`
- `docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md`
## Before You Upgrade
@@ -0,0 +1,114 @@
# Documentation Currentness And Legacy Cleanup v6 RC4 Packet Record
- Date: `2026-05-05`
- Gate: `documentation-currentness-and-legacy-cleanup`
- Scope:
- `pulse`
- lane `L9`
## Context
Before publishing `v6.0.0-rc.4`, the current release packet needed to move from
the shipped `rc.3` packet to a new packet that describes the exact
post-`rc.3` release-branch delta. The local `v6.0.0-rc.3` tag was stale during
the initial check, so the local tag was first refreshed from origin and the
packet audit was based on the published GitHub prerelease tag target.
## Reviewed Range
- From tag: `v6.0.0-rc.3`
- From commit: `f1744d36d0bde3c8735ae75a190af45c35087841`
- To candidate commit: `3f16d7845a92d6bf0c5700728bd70e1f4fe32966`
- Git range: `v6.0.0-rc.3..3f16d7845a92d6bf0c5700728bd70e1f4fe32966`
- Commit count: `51`
- Date span in the range: `2026-05-03` through `2026-05-05`
- Changed scope: `325` files, `15911` insertions, `11356` deletions
## Review Method
The audit checked the remote `v6.0.0-rc.3` tag target, corrected the stale local
tag reference, read the full commit subject range in chronological order,
reviewed the aggregate diff scope, and grouped the commits by changed surface
and release risk.
Commands used for the coverage pass:
- `git ls-remote origin 'refs/tags/v6.0.0-rc.3*'`
- `git fetch origin +refs/tags/v6.0.0-rc.3:refs/tags/v6.0.0-rc.3`
- `git rev-list -n1 v6.0.0-rc.3`
- `git rev-list --count v6.0.0-rc.3..HEAD`
- `git log --reverse --format='%h%x09%H%x09%ad%x09%s' --date=short v6.0.0-rc.3..HEAD`
- `git diff --shortstat v6.0.0-rc.3..HEAD`
- `git diff --name-only v6.0.0-rc.3..HEAD`
## Commit Coverage Summary
The 51 commits were covered by these release-note buckets:
- hosted tenant identity keys, hosted signup owner IDs, hosted handoff
identity, SSO stable principals, checkout magic-link principals, blank
magic-link handling, ambiguous email principal handling, contact-email
takeover prevention, API token owner metadata, organization runtime access,
workspace-owner proof, Stripe webhook principal fixtures, and strict
organization identity invariants
- API-first action planning, action-decision API, CLI action planning, CLI
action capability discovery, CLI action audit reads, CLI fleet connection
reads, persisted action plans, action execution safety contract, AI action
audit lifecycle alignment, and fail-closed dry-run execution
- self-hosted licensing continuity, removal of monitored-system volume caps,
and prevention of raw-cap writes in continuity state
- root-agent service defaults, API-first Proxmox onboarding, Proxmox setup and
runtime token ACLs, Proxmox snapshot polling, Proxmox guest memory fallback,
TrueNAS CORE agent supervisor restart, mdadm fallback discovery, Ceph pool
threshold identity, storage primary issue impact handling, and metrics
rollup write amplification
- Workloads empty-state source detection, Patrol mobile header controls, public
demo admin read hiding, mock-mode legacy sidecar cleanup, mobile Relay docs
label cleanup, release key helper module path, and Agent Security docs
currentness
## Packet Updates
The current RC packet now points at `v6.0.0-rc.4`:
- `VERSION`
- records `6.0.0-rc.4`
- `docs/RELEASE_NOTES.md`
- points current v6 prerelease readers at the RC4 packet
- keeps RC3 as historical in-repo packet context
- `docs/UPGRADE_v6.md`
- points upgrade readers at the RC4 release notes, changelog, and operator
support pack
- `docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md`
- records the exact post-`rc.3` commit range and candidate head
- summarizes identity, API/CLI, action governance, self-hosted licensing,
agent setup, monitoring, storage, Patrol, and mock-mode changes
- `docs/releases/V6_CHANGELOG_RC4_DRAFT.md`
- groups the 51-commit release range into release-risk buckets
- `docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md`
- gives support staff the current rollback, trust-root, identity, action,
Proxmox, and escalation language
- `docs/releases/V6_PRERELEASE_RUNBOOK.md`
- updates the active RC example to `6.0.0-rc.4`
- `docs/release-control/v6/internal/subsystems/deployment-installability.md`
- records that RC4 follows the later-corrective-RC packet requirements for
rollback, trust-root continuity, and release-control evidence
## Outcome
The audit did not identify a new unhandled code blocker from the commit range.
It did identify a release-packet currentness gap because the repo still pointed
operators at `rc.3` while the branch had moved beyond the published `rc.3`
tag. The gap is addressed by the RC4 packet before release workflow dispatch.
No public issue comment, retitle, closure, or customer-facing message was made
as part of this packet update.
## Verification
- `git diff --check -- VERSION docs/RELEASE_NOTES.md docs/UPGRADE_v6.md docs/releases/V6_PRERELEASE_RUNBOOK.md docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md docs/releases/V6_CHANGELOG_RC4_DRAFT.md docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-v6-rc4-packet-2026-05-05.md docs/release-control/v6/internal/subsystems/deployment-installability.md`
- `python3 scripts/release_control/documentation_currentness_test.py`
- `python3 scripts/release_control/render_release_body_test.py`
- `PYTHONPATH=scripts/release_control python3 -m unittest scripts.release_control.release_promotion_policy_test.ReleasePromotionPolicyTest.test_release_notes_index_points_at_current_rc_packet scripts.release_control.release_promotion_policy_test.ReleasePromotionPolicyTest.test_operator_support_packs_keep_free_first_paid_continuity_wording scripts.release_control.release_promotion_policy_test.ReleasePromotionPolicyTest.test_version_file_matches_current_rc_packet scripts.release_control.release_promotion_policy_test.ReleasePromotionPolicyTest.test_upgrade_guide_points_at_current_rc_support_pack -q`
- `python3 scripts/release_control/resolve_release_promotion.py --version 6.0.0-rc.4 --rollback-version v5.1.29 --release-notes-file docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md`
- `python3 scripts/release_control/status_audit.py --pretty`
@@ -6,8 +6,8 @@
## Blocking Facts
1. The latest shipped Pulse v6 prerelease tag is `v6.0.0-rc.2`.
2. That shipped prerelease tag resolves to commit `7b0bdebdff8127228708e84eb836cfd3d7214c08`.
1. The latest shipped Pulse v6 prerelease tag is `v6.0.0-rc.3`.
2. That shipped prerelease tag resolves to commit `f1744d36d0bde3c8735ae75a190af45c35087841`.
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.
@@ -16,7 +16,7 @@
`pulse/v6-release`.
5. The active control-plane target is still `v6-product-lane-expansion`, not
`v6-ga-promotion`.
6. The active local `pulse/v6-release` branch currently reports `VERSION=6.0.0-rc.3`, so the
6. The active local `pulse/v6-release` branch currently reports `VERSION=6.0.0-rc.4`, so the
working line is still prerelease and there is not yet a governed local stable
`6.0.0` candidate.
7. There is still no governed `Prerelease-to-GA Rehearsal Record` proving a successful
@@ -29,7 +29,7 @@
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.2`
- `promoted_from_tag=v6.0.0-rc.3`
- 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
@@ -43,7 +43,7 @@
The blocker is no longer missing governance text. The remaining problem is that
the control plane still holds v6 on the pre-GA prerelease line, the working
version is still prerelease (`6.0.0-rc.3`), and there is still no exercised
version is still prerelease (`6.0.0-rc.4`), and there is still no exercised
`Release Dry Run` record proving the eventual stable `6.0.0`
candidate is ready for GA-style promotion. Until that rehearsal exists, stable
users would still be the first real cohort for the final promotion path.
@@ -57,7 +57,7 @@ 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.2`
- `promoted_from_tag=v6.0.0-rc.3`
- 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
@@ -4461,6 +4461,12 @@
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-v6-rc3-packet-2026-05-01.md",
"kind": "file",
"evidence_tier": "local-rehearsal"
},
{
"repo": "pulse",
"path": "docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-v6-rc4-packet-2026-05-05.md",
"kind": "file",
"evidence_tier": "local-rehearsal"
}
]
},
@@ -171,7 +171,7 @@ server-side update execution surfaces.
operator support packet must describe that same candidate instead of leaving
the branch on a newer version string while the in-repo packet still speaks
for an older RC.
Later corrective RCs such as `rc.3` must also carry the live stable
Later corrective RCs such as `rc.3` and `rc.4` must also carry the live stable
rollback target and any prerelease trust-root continuity caveat in the
current release notes, changelog, operator support pack, upgrade guide, and
release-control evidence record before the release workflow is dispatched.
+144
View File
@@ -0,0 +1,144 @@
# Pulse v6.0.0-rc.4 Draft Release Notes
_Draft only. Do not treat this as published until the governed
`v6.0.0-rc.4` tag and GitHub prerelease exist._
`v6.0.0-rc.4` is a targeted hardening RC after the published `rc.3` prerelease.
Pulse v5.1.29 remains the current stable line.
The purpose of this RC is to carry the latest post-`rc.3` release-branch
hardening into a retestable v6 candidate:
- hosted, checkout, magic-link, SSO, Stripe webhook, and organization identity
paths now rely on stable principals and fail closed instead of falling back
to ambiguous email-shaped identifiers
- agent-ready operations now have API-first and CLI-first action planning,
capability discovery, fleet connection reads, action-decision, execution,
and audit surfaces
- self-hosted v6 licensing continuity keeps monitored-system and child-resource
volume unmetered under the current public policy rather than writing raw
monitored-system caps back into runtime state
- Proxmox onboarding, setup-token ACLs, runtime-token ACLs, snapshot polling,
guest memory fallback handling, TrueNAS CORE agent restart handling, mdadm
fallback discovery, and Ceph pool threshold identity were tightened
- Workloads empty-state detection, Patrol mobile header controls, mock-mode
legacy sidecar cleanup, and agent-security guidance were refreshed
This packet was audited against all `51` commits in the exact `rc.3` to `rc.4`
candidate range, from the published `v6.0.0-rc.3` tag commit
`f1744d36d0bde3c8735ae75a190af45c35087841` through candidate commit
`3f16d7845a92d6bf0c5700728bd70e1f4fe32966`.
## Support Stance
- Pulse v5.1.29 remains the current stable line.
- Pulse v6 `rc.4` is still an opt-in evaluation build, not the default
production recommendation.
- Existing v5 users should still prefer staging, lab, or otherwise controlled
evaluation first.
- Hosts already pinned to the historical `rc.2` update trust root should not
assume unattended auto-update continuity into later prerelease or GA builds.
Use a manual reinstall or an explicit trust migration path for `rc.4`.
- The stable rollback target for this candidate is `v5.1.29`:
`./scripts/install.sh --version v5.1.29`
## What Changed Since `rc.3`
### Identity, Auth, And Hosted Trust Boundaries
- Hosted tenant keys, hosted signup owners, hosted handoff identities, and
workspace-owner proof now use stable user and organization principals.
- Blank, ambiguous, or contact-email-derived principals fail closed in
magic-link, checkout, and contact-email resolution paths.
- API token minting records owner metadata and binds owner identity across
token creation.
- Stripe webhook fixtures and organization identity invariants now use stable
principals, matching the production identity contract.
- SSO runtime paths use stable principals, preserving the Community-tier SSO
posture from `rc.3`.
### Agent-Ready Operations, CLI, And Auditability
- Pulse now exposes API-first action planning and action-decision paths.
- The CLI can plan actions, discover action capabilities, read action audits,
and read fleet connection state.
- Action plans persist into the audit trail, AI action audits align with the
execution lifecycle, and dry-run action execution fails closed when a request
cannot be safely represented.
- The release-control record now pins the API/CLI-first agent-ready operations
direction so MCP remains an adapter over the governed API and CLI contracts.
### Self-Hosted Licensing Continuity
- Current public self-hosted v6 plans keep monitored-system and child-resource volume unmetered.
- Legacy continuity paths avoid writing raw monitored-system caps back into
runtime state.
- Relay wording remains the `rc.2` model: secure remote access to the Pulse web
UI, Pulse Mobile pairing for handoff, push notifications, and 14-day history.
### Agent, Proxmox, TrueNAS, RAID, Ceph, And Monitoring Correctness
- Root agent service defaults were hardened.
- Proxmox onboarding is API-first, setup-token and runtime-token ACLs are
tightened, guest snapshots survive transient polling gaps, and guest memory
fallback handling is more reliable.
- TrueNAS CORE agent supervisor restart handling was corrected.
- mdadm RAID fallback discovery is more robust.
- Ceph pool threshold checks now preserve the resource identity needed for
correct alert attribution.
- Metrics rollup writes are less noisy after duplicate or repeated rollup
opportunities.
### Product Surface And Operator Guidance
- Workloads empty-state source detection is corrected.
- Patrol header controls behave better on mobile viewports.
- Mock mode no longer leaves legacy sidecar drift in the primary runtime path.
- The Agent Security documentation entry now points operators at the current
privilege guidance without leaving a stale support-pack reference.
- Public demo admin reads stay hidden from the demo surface.
## What Existing v5 Users Should Re-Test In `rc.4`
1. Server upgrade from the current v5 stable line to v6, including the manual
or explicit trust-migration path needed for builds after `rc.2`.
2. Fresh Proxmox LXC install and rollback to v5.1.29.
3. Proxmox host onboarding, setup-token handling, runtime-token handling,
snapshots, and guest memory reporting.
4. TrueNAS CORE agent restart handling, mdadm RAID fallback discovery, Ceph
pool thresholds, and storage issue impact reporting.
5. Hosted signup, checkout, SSO, magic-link, webhook, and organization-admin
flows that depend on stable user and organization principals.
6. CLI action planning, capability discovery, action audit reads, fleet
connection reads, and dry-run action execution.
7. Workloads empty states, Patrol header controls on mobile, and mock-mode
toggling.
8. Release asset download, checksum/signature, installer, and draft-release
validation paths before broader retesting.
## Feedback
Use the `Pulse v6 pre-release feedback` issue template for regressions, upgrade
failures, licensing continuity problems, platform-specific breakage, or
actionable UX friction:
- `https://github.com/rcourtman/Pulse/issues/new?template=v6_rc_feedback.yml`
When reporting an `rc.4` problem, include:
- Pulse version
- upgrade path or fresh-install path
- installation type
- whether the host was previously on `rc.1`, `rc.2`, `rc.3`, or v5
- whether a manual reinstall or trust migration was used after `rc.2`
- what you expected
- what happened instead
- sanitized logs, screenshots, or diagnostics when helpful
## Operator References
- `docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md`
- `docs/releases/V6_CHANGELOG_RC4_DRAFT.md`
- `docs/UPGRADE_v6.md`
- `docs/AGENT_SECURITY.md`
- `docs/MIGRATION_UNIFIED_NAV.md`
+152
View File
@@ -0,0 +1,152 @@
# Pulse v6.0.0-rc.4 Draft Changelog
_Draft only. This changelog describes the current `pulse/v6-release` delta
since the published `v6.0.0-rc.3` tag. Do not treat it as published until the
governed `v6.0.0-rc.4` prerelease exists._
## What `rc.4` changes compared with `rc.3`
`v6.0.0-rc.4` is a targeted release-branch hardening RC. It does not reopen the
`rc.2` commercial model or replace v5.1.29 as the stable line. It carries the
post-`rc.3` identity, API/CLI, action governance, self-hosted licensing
continuity, agent setup, monitoring, storage, and frontend corrections into a
single retestable candidate.
The main release risk addressed here is identity drift: hosted, checkout,
magic-link, SSO, webhook, token, and organization paths should not use
email-shaped fallbacks where stable user and organization principals are
required. The secondary risk is operational drift: agent-ready operations,
Proxmox onboarding, storage attribution, and mobile Patrol controls should
match the current governed v6 architecture before wider RC retesting.
## Commit Coverage Audit
The changelog was audited against every commit in the exact release range for
the current candidate head:
- `v6.0.0-rc.3`: `f1744d36d0bde3c8735ae75a190af45c35087841`
- candidate commit: `3f16d7845a92d6bf0c5700728bd70e1f4fe32966`
- range: `v6.0.0-rc.3..3f16d7845a92d6bf0c5700728bd70e1f4fe32966`
- commit count: `51`
- changed scope: `325` files, `15911` insertions, `11356` deletions
Those commits are grouped in this changelog rather than listed one by one. The
range includes identity hardening, hosted signup and checkout principal
cleanup, API-first action planning, CLI action and fleet reads, action audit
execution proof, self-hosted licensing continuity, root-agent and Proxmox
setup hardening, TrueNAS/RAID/Ceph/storage correctness, Workloads empty-state
handling, Patrol mobile controls, mock-mode cleanup, and release-control
evidence.
## Major Changes
### 1. Hosted and organization identity paths use stable principals
The post-`rc.3` range hardens identity ownership across hosted and local
runtime paths:
- hosted tenant keys and hosted signup owner IDs are canonicalized
- hosted handoff, checkout magic-link, and blank magic-link principal paths
fail closed instead of deriving authority from weak email fallback state
- contact-email principal takeover and ambiguous email principal resolution
are blocked
- API token minting records owner metadata and binds tokens to stable owner
identity
- organization runtime access and workspace-owner proof use stable user IDs
- Stripe webhook fixtures and strict organization identity invariants now
match the stable-principal model
- SSO paths use stable principals while keeping SSO as a Community-tier
capability
### 2. Agent-ready operations are API-first and CLI-first
The candidate now carries the governed action surface needed for agent-ready
operations:
- API-first action planning endpoint
- action-decision API
- CLI action planning
- CLI action capability discovery
- CLI action audit reads
- CLI fleet connection reads
- persisted action plans in the audit trail
- action execution safety contract
- AI action audits aligned with the execution lifecycle
- dry-run action execution that fails closed when the requested operation
cannot be represented safely
The release-control direction is explicit: MCP may remain as a compatibility
adapter, but the stable HTTP API and CLI contracts own the product behavior.
### 3. Self-hosted licensing continuity stays free-first
`rc.4` preserves the public self-hosted v6 policy:
- monitored-system and child-resource volume are not metered in the current
public self-hosted plans
- continuity paths do not write raw monitored-system caps back into runtime
state
- Relay remains secure remote access to the Pulse web UI, Pulse Mobile pairing for handoff,
push notifications, and 14-day history
- Pro remains Relay plus AI operations, automation, advanced admin features,
and 90-day history
### 4. Agent setup and infrastructure polling are safer
The RC includes additional infrastructure and agent hardening:
- root agent service defaults are stricter
- Proxmox onboarding follows the API-first path
- Proxmox setup-token and runtime-token ACLs are tightened
- Proxmox snapshot polling preserves guest snapshots through transient polling
gaps
- Proxmox guest memory fallback behavior is corrected
- TrueNAS CORE agent supervisor restart handling is fixed
- mdadm RAID fallback discovery is more robust
### 5. Monitoring, storage, and alert attribution are corrected
The range also includes:
- reduced metrics rollup write amplification
- storage primary issue impact handling
- Ceph pool threshold resource identity preservation
- Workloads empty-state source detection
- mock-mode legacy sidecar cleanup
### 6. Patrol and docs are aligned with the current RC
Patrol header controls now fit mobile viewports more reliably. The Agent
Security documentation entry points to the current guidance instead of leaving
operators with a stale RC support-pack reference. Public demo admin reads stay
hidden.
## What existing v5 users should re-test in `rc.4`
1. v5.1.29 to v6 server upgrade and rollback to v5.1.29.
2. The explicit post-`rc.2` trust migration or manual reinstall path.
3. Hosted signup, checkout, SSO, magic-link, token, webhook, and organization
ownership flows.
4. CLI action planning, capability discovery, action audit reads, fleet
connection reads, and dry-run action execution.
5. Proxmox onboarding, setup-token ACLs, runtime-token ACLs, snapshots, and
guest memory reporting.
6. TrueNAS CORE, mdadm RAID fallback, Ceph pool thresholds, and storage issue
impact presentation.
7. Workloads empty states, Patrol header controls on mobile, and mock-mode
toggling.
8. Release artifact download, checksum/signature, and installer validation
paths before broad retesting.
## Evidence Appendix
For the code-backed evidence packet that maps these claims to the current
release line, see:
- `docs/release-control/v6/internal/records/documentation-currentness-and-legacy-cleanup-v6-rc4-packet-2026-05-05.md`
- `docs/release-control/v6/internal/IDENTITY_INVARIANTS.md`
- `docs/release-control/v6/internal/records/agent-lifecycle-root-agent-hardening-2026-05-05.md`
- `docs/release-control/v6/internal/records/agent-lifecycle-proxmox-api-first-onboarding-2026-05-05.md`
- `docs/release-control/v6/internal/records/agent-lifecycle-proxmox-setup-permission-proof-2026-05-05.md`
- `docs/release-control/v6/internal/records/agent-lifecycle-proxmox-runtime-token-permission-proof-2026-05-05.md`
- `docs/release-control/v6/internal/records/known-rc-issue-closure-for-ga-metrics-write-amplification-2026-05-03.md`
+3 -3
View File
@@ -63,7 +63,7 @@ artifacts, or to an explicitly verified paid container image, rather than the pu
## Versioning Rules
- v5 stable examples: `5.1.14`
- v6 prerelease examples: `6.0.0-rc.1`, `6.0.0-rc.2`, `6.0.0-rc.3`
- v6 prerelease examples: `6.0.0-rc.1`, `6.0.0-rc.2`, `6.0.0-rc.3`, `6.0.0-rc.4`
- v6 GA example: `6.0.0`
The workflow auto-marks `-rc.N`/`-alpha.N`/`-beta.N` as prerelease.
@@ -93,7 +93,7 @@ The workflow auto-marks `-rc.N`/`-alpha.N`/`-beta.N` as prerelease.
1. Update version on `pulse/v6-release`:
```bash
export RC_VERSION="6.0.0-rc.3"
export RC_VERSION="6.0.0-rc.4"
git checkout pulse/v6-release
git pull --ff-only
@@ -139,7 +139,7 @@ git push origin pulse/v6-release
6. Canary rollout:
- Upgrade a small user subset first.
- Collect regressions, fix on `pulse/v6-release`, then cut `rc.2`/`rc.3` as needed.
- Collect regressions, fix on `pulse/v6-release`, then cut later RCs as needed.
## Keep v5 Stable During v6 RC
@@ -0,0 +1,192 @@
# Pulse v6 RC4 Draft Operator Support Pack
_Draft only. Use this as the working support brief for the planned
`v6.0.0-rc.4` candidate until the final prerelease notes are published._
## Support Stance
- Pulse v5.1.29 remains the current stable line.
- Pulse v6 `rc.4` is an opt-in evaluation build, not the default production
recommendation.
- `rc.4` should be described as a targeted post-`rc.3` hardening RC covering
stable identity principals, agent-ready API/CLI operations, action audit
execution, self-hosted licensing continuity, Proxmox and root-agent
hardening, storage/monitoring corrections, Workloads empty states, and
Patrol mobile controls.
- Self-hosted SSO is included with Community and higher tiers. Do not describe
SAML or multi-provider SSO as a Pro-only upgrade path for this RC.
- Stable-channel installer resolution must stay on the latest stable semver
tag even if GitHub's floating latest-release redirect currently points at an
RC.
- Systems pinned to the historical `rc.2` update trust root should use a manual
reinstall or explicit trust migration for later prerelease or GA builds.
## Short Answers
### Is `rc.4` the stable release?
No. The current stable release is v5.1.29. `rc.4` is still a v6 prerelease for
controlled evaluation.
### Should production v5 users upgrade immediately?
No. The recommended RC posture is still staging, lab, or controlled evaluation
first.
### What is the rollback target?
Use v5.1.29:
`./scripts/install.sh --version v5.1.29`
### Can `rc.2` systems auto-update directly to `rc.4`?
Do not promise unattended continuity from `rc.2` to `rc.4`. Hosts pinned to the
historical `rc.2` update trust root need a manual reinstall or explicit trust
migration path for later prerelease or GA builds.
### Does self-hosted v6 still cap monitored systems?
No for the current public self-hosted plans. Community, Relay, and Pro include
core self-hosted monitoring by default.
Current plan shorthand:
- Community:
core monitoring included, OIDC/SAML SSO with multi-provider support, 7-day
history
- Relay:
core monitoring included, secure remote access to the Pulse web UI,
Pulse Mobile pairing for handoff, push notifications, and 14-day history
- Pro:
Relay plus AI operations, automation, advanced admin features, and 90-day
history
### What happens to existing paid Pulse Pro customers in v6?
Use this cohort breakdown:
- Legacy recurring monthly or annual subscribers from v5 or earlier who were
already active before the public v6 pricing cutover:
keep the current recurring price, with self-hosted monitoring and
child-resource volume not metered while the subscription remains continuously
active under the current v6 policy.
- Existing lifetime customers:
remain permanently valid, with self-hosted monitoring and child-resource
volume not metered under the current v6 policy.
- Legacy paid v5 licenses migrated into v6 outside the recurring grandfathered
path:
can still exchange into the v6 activation model without repurchasing.
- Former recurring subscribers who already canceled or later lapse:
any later return uses current public v6 pricing rather than resuming the old
grandfathered terms.
### What changed from `rc.3` that users should notice immediately?
- hosted signup, checkout, magic-link, SSO, webhook, API token, and
organization ownership paths now depend on stable principals
- ambiguous email fallback, contact-email takeover, and blank principal paths
fail closed
- action planning, capability discovery, action audit reads, fleet connection
reads, and action decisions are available through governed API/CLI surfaces
- action plans persist into the audit trail and dry-run action execution fails
closed when unsafe
- monitored-system volume caps are removed from the current self-hosted v6
runtime model
- Proxmox onboarding is API-first, token ACLs are tightened, snapshots are more
stable through polling gaps, and guest memory fallbacks are corrected
- TrueNAS CORE agent restart handling, mdadm fallback discovery, Ceph pool
threshold identity, and storage issue impact handling are corrected
- Workloads empty states and Patrol header controls behave better
- mock mode no longer leaves legacy sidecar drift in the primary runtime path
### What if a hosted, checkout, magic-link, or SSO flow still keys access by email?
Escalate it as an identity regression. `rc.4` expects stable user and
organization principals at those trust boundaries.
### What if CLI action planning or dry-run execution fails?
Collect the CLI command, API response, action plan ID if present, audit entry
if present, current Pulse version, and sanitized server logs. Dry-run execution
should fail closed when the request cannot be represented safely, but the
failure should still be inspectable.
### What if a fresh Proxmox LXC stable install lands on a v6 RC?
Treat that as a release-blocking install regression. The stable path should
resolve to v5.1.29 unless the user intentionally chose a v6 prerelease.
### What if a Docker agent duplicates or loses identity after recreation?
Collect logs and escalate. `rc.4` keeps the prior reconnect-token and
host-identity binding work and adds stricter root-agent and Proxmox token ACL
hardening.
### Are public issue comments or closures required for the RC?
No public GitHub state changes are required just to prepare this packet. Draft
comments, closures, or retitles still need explicit maintainer approval before
posting.
## Recommended Evaluation Path
1. Back up the current system and keep direct console access available.
2. Confirm the current stable rollback command:
`./scripts/install.sh --version v5.1.29`
3. If the host was on `rc.2`, use a manual reinstall or explicit trust
migration path rather than assuming unattended auto-update continuity.
4. Upgrade the Pulse server in a staging or otherwise controlled environment.
5. Verify server health, version, logs, and update UI before upgrading agents.
6. Re-test hosted signup, checkout, SSO, magic-link, token, webhook, and
organization ownership flows.
7. Re-test CLI action planning, capability discovery, action audit reads, fleet
connection reads, and dry-run execution.
8. Re-test Proxmox onboarding, setup-token ACLs, runtime-token ACLs, snapshots,
guest memory, TrueNAS CORE agent restart, mdadm fallback discovery, Ceph
thresholds, and storage issue impact presentation.
9. Re-test Workloads empty states, Patrol header controls on mobile, and mock
mode toggling.
10. Re-test release artifact download, checksum/signature, installer, and
draft validation paths before broader retesting.
11. Upgrade agents separately only when the user is explicitly testing the
v5-to-v6 agent path.
## Ask For These Details
When a user reports an `rc.4` problem, ask for:
- current version and prior version
- install type
- whether the host was previously on v5, `rc.1`, `rc.2`, or `rc.3`
- whether a manual reinstall or trust migration was used after `rc.2`
- whether the issue happened during server upgrade, agent upgrade, identity
handoff, checkout, SSO, action planning, alerting, backup/recovery, platform
inventory, or first use
- whether Unified Agents were upgraded yet
- expected result
- actual result
- sanitized logs, screenshots, and diagnostics
## Escalate Immediately
Escalate without asking the user to keep experimenting when the report involves:
- failed install or failed upgrade with no recovery path
- stable install path unexpectedly landing on a v6 prerelease
- duplicate or missing agent identity after a v5-to-v6 upgrade
- hosted, checkout, magic-link, SSO, webhook, or token access granted to the
wrong principal
- action execution that proceeds when dry-run or plan validation failed
- monitoring or reporting that stops entirely after upgrade
- rollback failure or inability to return to v5.1.29
- SSO setup or login blocked by an unexpected paid-license requirement
- data-loss, destructive behavior, or security-sensitive regressions
## Canonical References
- `docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md`
- `docs/releases/V6_CHANGELOG_RC4_DRAFT.md`
- `docs/UPGRADE_v6.md`
- `docs/AGENT_SECURITY.md`
- `docs/MIGRATION_UNIFIED_NAV.md`
@@ -173,7 +173,7 @@ def build_blocked_record(*, record_date: str) -> str:
active_target_id = str(control_plane["active_target_id"])
accidental_tags = excluded_accidental_rc_tags(status, stable_version)
rc_tag = latest_matching_rc_tag(stable_version, excluded_tags=accidental_tags)
rc_commit = _run_git("rev-parse", rc_tag) if rc_tag else ""
rc_commit = _run_git("rev-list", "-n1", rc_tag) if rc_tag else ""
ga_date, v5_eos_date = parse_release_dates()
target_is_ga_promotion = active_target_id == "v6-ga-promotion"
remote_stable_branch_release_dry_run = branch_release_dry_run_workflow(stable_branch)
@@ -136,12 +136,16 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
self.assertIn("docs/releases/RELEASE_NOTES_v6_RC3_DRAFT.md", release_index)
self.assertIn("docs/releases/V6_CHANGELOG_RC3_DRAFT.md", release_index)
self.assertIn("docs/releases/V6_RC3_OPERATOR_SUPPORT_PACK_DRAFT.md", release_index)
self.assertIn("docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md", release_index)
self.assertIn("docs/releases/V6_CHANGELOG_RC4_DRAFT.md", release_index)
self.assertIn("docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md", release_index)
def test_operator_support_packs_keep_free_first_paid_continuity_wording(self) -> None:
for rel in (
"docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md",
"docs/releases/V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md",
"docs/releases/V6_RC3_OPERATOR_SUPPORT_PACK_DRAFT.md",
"docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md",
):
with self.subTest(rel=rel):
support_pack = read(rel)
@@ -217,6 +221,11 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
"docs/releases/V6_CHANGELOG_RC3_DRAFT.md",
"docs/releases/V6_RC3_OPERATOR_SUPPORT_PACK_DRAFT.md",
),
"6.0.0-rc.4": (
"docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md",
"docs/releases/V6_CHANGELOG_RC4_DRAFT.md",
"docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md",
),
}
self.assertIn(current_version, packets)
@@ -254,8 +263,9 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
self.assertIn("docs/releases/V6_CHANGELOG.md", upgrade_guide)
self.assertNotIn("docs/releases/V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md", upgrade_guide)
else:
self.assertEqual(current_version, "6.0.0-rc.3")
self.assertIn("docs/releases/V6_RC3_OPERATOR_SUPPORT_PACK_DRAFT.md", upgrade_guide)
self.assertEqual(current_version, "6.0.0-rc.4")
self.assertIn("docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md", upgrade_guide)
self.assertNotIn("docs/releases/V6_RC3_OPERATOR_SUPPORT_PACK_DRAFT.md", upgrade_guide)
self.assertNotIn("docs/releases/V6_RC2_OPERATOR_SUPPORT_PACK_DRAFT.md", upgrade_guide)
self.assertNotIn("docs/releases/V6_RC_OPERATOR_SUPPORT_PACK.md", upgrade_guide)
@@ -507,7 +517,7 @@ class ReleasePromotionPolicyTest(unittest.TestCase):
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.3"', runbook)
self.assertIn('export RC_VERSION="6.0.0-rc.4"', 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)
@@ -99,6 +99,9 @@ Old metadata section.
"docs/releases/RELEASE_NOTES_v6_RC3_DRAFT.md",
"docs/releases/V6_CHANGELOG_RC3_DRAFT.md",
"docs/releases/V6_RC3_OPERATOR_SUPPORT_PACK_DRAFT.md",
"docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md",
"docs/releases/V6_CHANGELOG_RC4_DRAFT.md",
"docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md",
)
for relative_path in packet_paths:
@@ -131,6 +134,25 @@ Old metadata section.
support_pack,
)
def test_rc4_packet_records_commit_coverage_and_identity_hardening(self) -> None:
repo_root = Path(__file__).resolve().parents[2]
release_notes = (repo_root / "docs/releases/RELEASE_NOTES_v6_RC4_DRAFT.md").read_text(
encoding="utf-8"
)
changelog = (repo_root / "docs/releases/V6_CHANGELOG_RC4_DRAFT.md").read_text(
encoding="utf-8"
)
support_pack = (
repo_root / "docs/releases/V6_RC4_OPERATOR_SUPPORT_PACK_DRAFT.md"
).read_text(encoding="utf-8")
self.assertIn("3f16d7845a92d6bf0c5700728bd70e1f4fe32966", release_notes)
self.assertIn("commit count: `51`", changelog)
self.assertIn("stable identity principals", support_pack)
self.assertIn("API-first action planning", changelog)
self.assertIn("monitored-system and child-resource volume unmetered", release_notes)
self.assertIn("Pulse Mobile pairing for handoff", support_pack)
if __name__ == "__main__":
unittest.main()