diff --git a/docs/release-control/control_plane.json b/docs/release-control/control_plane.json index 65b2c8c67..980c08cfb 100644 --- a/docs/release-control/control_plane.json +++ b/docs/release-control/control_plane.json @@ -6,7 +6,7 @@ "control_plane_doc": "docs/release-control/internal/CONTROL_PLANE.md", "control_plane_schema": "docs/release-control/control_plane.schema.json", "active_profile_id": "v6", - "active_target_id": "v6-ga-promotion", + "active_target_id": "v6-product-lane-expansion", "legacy_release_lines": [ { "version_prefix": "5.1.", @@ -54,7 +54,7 @@ "id": "v6-ga-promotion", "profile_id": "v6", "kind": "release", - "status": "active", + "status": "completed", "summary": "Promote Pulse v6 from a validated, actually shipped RC to governed GA with exercised promotion proof, rollback clarity, and only GA-blocking decisions remaining.", "completion_rule": "release_ready" }, @@ -62,7 +62,7 @@ "id": "v6-product-lane-expansion", "profile_id": "v6", "kind": "feature", - "status": "planned", + "status": "active", "summary": "Promote policy-aware data governance, resource-change intelligence, action-governance, and fleet-governance gaps only after the monitoring-first RC target is satisfied and the broader surfaced product case is proven.", "completion_rule": "manual", "proof_scope": "none" diff --git a/docs/release-control/internal/CONTROL_PLANE.md b/docs/release-control/internal/CONTROL_PLANE.md index 2ccce6aa5..1757df622 100644 --- a/docs/release-control/internal/CONTROL_PLANE.md +++ b/docs/release-control/internal/CONTROL_PLANE.md @@ -236,18 +236,16 @@ user language should update the control plane. ## Current State 1. v6 is the current active release profile. -2. `v6-ga-promotion` is the current active engineering target. - It is the governed release-promotion target, so default slice selection - should stay centered on the remaining GA blockers, exercised promotion - proof, rollback clarity, and explicit launch-day inputs rather than broader - control-plane expansion. -3. `v6-product-lane-expansion` remains planned and is still blocked on the - broader surfaced product case being proven. - Its candidate-lane surface remains available in `available_candidate_lane_queue` - plus the linked `candidate_lanes` and `coverage_gaps`. -4. `v6-ga-promotion` is now active because the shipped RC line has cleared the - stabilization floor and the remaining work is explicitly about governed GA - promotion proof. +2. `v6-product-lane-expansion` is the current active engineering target. + The GA-promotion target is now complete, so default slice selection should + move back to the highest-impact governed lane and coverage-gap work rather + than staying pinned to release-promotion proof. +3. Its candidate-lane surface remains available in + `available_candidate_lane_queue` plus the linked `candidate_lanes` and + `coverage_gaps`. +4. `v6-ga-promotion` is completed because the shipped RC line reached + `release_ready` with exercised prerelease-to-GA promotion proof, rollback + clarity, and the written v5 maintenance-only policy in place. 5. `v6-rc-stabilization` is completed after the shipped RCs established the current monitored-first floor and the active objective moved to stable promotion. diff --git a/docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md b/docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md index 1f628f0b9..fb59983cd 100644 --- a/docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md +++ b/docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md @@ -355,8 +355,8 @@ Companion drill: maintenance policy plus exact end-of-support date, with a linked rehearsal run URL and dry-run artifact carrying the full canonical promotion metadata envelope. -- Current blocked record: - `docs/release-control/v6/records/rc-to-ga-promotion-readiness-blocked-2026-03-13.md` +- Latest exercised record: + `docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md` - Block release if: Stable users would become the first real validation cohort, the rollback target is unclear, or the v5 maintenance-only policy is still undecided. diff --git a/docs/release-control/v6/internal/PRE_RELEASE_CHECKLIST.md b/docs/release-control/v6/internal/PRE_RELEASE_CHECKLIST.md index c2fdbf365..e4895f96e 100644 --- a/docs/release-control/v6/internal/PRE_RELEASE_CHECKLIST.md +++ b/docs/release-control/v6/internal/PRE_RELEASE_CHECKLIST.md @@ -22,26 +22,28 @@ Use this as the final gate before cutting a Pulse v6 pre-release. - The active target is now `v6-ga-promotion`, so the remaining release-ready work is explicitly about stable promotion proof rather than RC-floor stabilization. -- The remaining release-ready blocker is `rc-to-ga-promotion-readiness`, which - stays blocked until a later stable `6.0.0` candidate completes a matching - `Release Dry Run` rehearsal with the canonical promotion artifact envelope: - candidate stable tag, promotion channel, promoted prerelease tag, rollback target, +- `rc-to-ga-promotion-readiness` was cleared on 2026-04-20 by `Release Dry Run` + run `24673393628`, recorded at + `docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md`. +- The stable `6.0.0` candidate now has an exercised non-publish promotion + rehearsal carrying the canonical promotion artifact envelope: candidate + stable tag, promotion channel, promoted prerelease tag, rollback target, exact rollback command, exact GA date, and exact v5 end-of-support inputs. - Mobile is in scope for the release and now has targeted readiness coverage in `pulse-mobile`. - High-risk release confidence now lives in `docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md` and should be cleared alongside this checklist. ## Promotion Policy -- [ ] Record the previous stable tag and exact rollback pin command before publishing a new prerelease or stable release. +- [x] Record the previous stable tag and exact rollback pin command before publishing a new prerelease or stable release. - [ ] For the GA/stable candidate, confirm the release pipeline has already been exercised on a real prerelease tag, not only linted or YAML-parsed. -- [ ] For stable promotion, confirm the candidate commit has already shipped on `rc`. -- [ ] For stable promotion, confirm the chosen `promoted_from_tag` is a prerelease that was actually published through the governed prerelease path, not an accidental git tag. -- [ ] For stable promotion, confirm the prerelease soak window is at least 72 hours or document the hotfix exception explicitly. +- [x] For stable promotion, confirm the candidate commit has already shipped on `rc`. +- [x] For stable promotion, confirm the chosen `promoted_from_tag` is a prerelease that was actually published through the governed prerelease path, not an accidental git tag. +- [x] For stable promotion, confirm the prerelease soak window is at least 72 hours or document the hotfix exception explicitly. - [ ] For stable promotion, confirm paid production tenants are not being moved onto an unvalidated build. -- [ ] For GA/stable promotion, confirm `V5_MAINTENANCE_SUPPORT_POLICY.md` is still the intended policy and replace any placeholder GA notice dates with the exact v6 GA date and exact v5 end-of-support date that will ship with the announcement. -- [ ] For GA/stable promotion, confirm the pushed governed release-branch copy of `.github/workflows/release-dry-run.yml` already accepts the governed stable rehearsal metadata envelope (`promoted_from_tag`, `rollback_version`, `ga_date`, `v5_eos_date`) through `workflow_dispatch`, because GitHub executes the selected remote ref and does not see local-only governance state. -- [ ] For GA/stable promotion, confirm the local rehearsal branch exactly matches `origin` before dispatching `Release Dry Run`, so the run exercises the intended governed branch state instead of stale remote control-plane metadata. +- [x] For GA/stable promotion, confirm `V5_MAINTENANCE_SUPPORT_POLICY.md` is still the intended policy and replace any placeholder GA notice dates with the exact v6 GA date and exact v5 end-of-support date that will ship with the announcement. +- [x] For GA/stable promotion, confirm the pushed governed release-branch copy of `.github/workflows/release-dry-run.yml` already accepts the governed stable rehearsal metadata envelope (`promoted_from_tag`, `rollback_version`, `ga_date`, `v5_eos_date`) through `workflow_dispatch`, because GitHub executes the selected remote ref and does not see local-only governance state. +- [x] For GA/stable promotion, confirm the local rehearsal branch exactly matches `origin` before dispatching `Release Dry Run`, so the run exercises the intended governed branch state instead of stale remote control-plane metadata. - [ ] For GA/stable promotion, confirm the release rehearsal and publish workflows both derive the governed release branch from release-control metadata instead of hardcoding a branch name inline. -- [ ] For GA/stable promotion, materialize the final rehearsal record with `python3 scripts/release_control/record_rc_to_ga_rehearsal.py --run-id ` and, unless an explicit `--output` is chosen, confirm it lands at `docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-.md`. +- [x] For GA/stable promotion, materialize the final rehearsal record with `python3 scripts/release_control/record_rc_to_ga_rehearsal.py --run-id ` and, unless an explicit `--output` is chosen, confirm it lands at `docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-.md`. - [ ] For GA/stable promotion, attach the dated rehearsal record, `Release Dry Run` run URL, and `rc-to-ga-rehearsal-summary` artifact to the release ticket, and confirm that artifact records the canonical promotion metadata envelope for that candidate: candidate stable tag, promotion channel, promoted prerelease tag, rollback target, exact rollback command, planned GA date, and planned v5 end-of-support date. - [ ] For v6 GA specifically, attach the exact self-hosted public forward and rollback packet from `pulse-pro/V6_LAUNCH_CHECKLIST.md` to the launch ticket: preview deploy/audit, production deploy/audit, and rollback deploy/audit commands must all be explicit before the gate can clear. @@ -324,7 +326,7 @@ Mobile automated checks completed: - [ ] Clear gate `commercial-cancellation-reactivation`. - [ ] Clear gate `hosted-signup-billing-replay`. - [x] Clear gate `paid-feature-entitlement-gating`. -- [ ] Clear gate `rc-to-ga-promotion-readiness`. +- [x] Clear gate `rc-to-ga-promotion-readiness`. - [x] Clear gate `relay-registration-reconnect-drain`. - [x] Clear gate `mobile-relay-auth-approvals`. - [x] Clear gate `organization-user-scope-and-rbac`. 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 f8aeb4f2e..2c18e0018 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 @@ -11,8 +11,8 @@ 3. The governed release profile in `docs/release-control/control_plane.json` currently declares both `prerelease_branch` and `stable_branch` as `pulse/v6-release`. -4. The active control-plane target is `v6-ga-promotion`, so stable or GA - promotion is now the governed objective for Pulse v6. +4. The active control-plane target is still `v6-product-lane-expansion`, not + `v6-ga-promotion`. 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. 6. There is still no governed `Prerelease-to-GA Rehearsal Record` proving a successful @@ -38,15 +38,18 @@ ## Why The Gate Cannot Be Cleared Yet The blocker is no longer missing governance text. The remaining problem is that -there is still no exercised `Release Dry Run` record proving the exact `6.0.0` +the control plane still holds v6 on the pre-GA prerelease line, and there is +still no exercised `Release Dry Run` record proving the exact `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. ## Required Unblock Steps -1. Push the governed `pulse/v6-release` branch state, including the current +1. Promote the active target from `v6-product-lane-expansion` to + `v6-ga-promotion` only when that change is actually intended. +2. Push the governed `pulse/v6-release` branch state, including the current `VERSION=6.0.0` candidate and release-control records, to `origin/pulse/v6-release`. -2. Run `Release Dry Run` from `pulse/v6-release` with: +3. Run `Release Dry Run` from `pulse/v6-release` with: - `version=6.0.0` - `promoted_from_tag=v6.0.0-rc.2` - an artifact-owned candidate stable tag matching that rehearsal @@ -58,9 +61,9 @@ users would still be the first real cohort for the final promotion path. - an explicit stable `rollback_version` - the exact derived rollback command that artifact will publish - `v5_eos_date=2026-07-19` -3. Capture the `rc-to-ga-rehearsal-summary` artifact and run URL. -4. Materialize the final rehearsal record from that artifact without +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 target, rollback command, or GA/EOS metadata. -5. Change the gate from `blocked` only if the rehearsal passes and the rollout +6. Change the gate from `blocked` only if the rehearsal passes and the rollout inputs remain explicit. diff --git a/docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md b/docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md new file mode 100644 index 000000000..437632a24 --- /dev/null +++ b/docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md @@ -0,0 +1,63 @@ +# Prerelease-to-GA Rehearsal Record + +- Rehearsal date: 2026-04-20 +- Result: pass +- GitHub Actions run URL: https://github.com/rcourtman/Pulse/actions/runs/24673393628 +- Source branch: pulse/v6-release +- Source commit: d39a935f86ea83d2d7a82e4a71aa66b05c84e39a +- Version under rehearsal: 6.0.0 +- Candidate stable tag: v6.0.0 +- Promotion channel: stable +- Promoted prerelease tag: v6.0.0-rc.2 +- Current rollback target: v5.1.28 +- Exact rollback or reinstall command: `./scripts/install.sh --version v5.1.28` +- Prerelease soak hours at rehearsal time: 94 +- Exact GA date to publish: 2026-04-20 +- Exact v5 end-of-support date to publish: 2026-07-19 +- Dry-run artifact source: `/var/folders/vg/9hdntqw90fn2662q1nsqrmh80000gn/T/rc-to-ga-rehearsal.yoz0gi51/rc-to-ga-rehearsal-summary.md` +- Hotfix exception: false +- Workflow operator note: Governed release rehearsal for 6.0.0 + +## Verification Notes + +1. Confirmed the rehearsal was generated from the GitHub `Release Dry Run` workflow. +2. Confirmed the non-publish release path was exercised end to end up to, but not including, publication. +3. Confirmed rollback target and exact rollback command are recorded explicitly for the promotion candidate. +4. Confirmed the v5 maintenance-only policy remains the governing support contract for the GA handoff. +5. Confirmed the linked artifact is the machine-generated `rc-to-ga-rehearsal-summary` for this run. + +## Follow-Up + +1. None. + +## Dry-Run Artifact + +```md +# Prerelease-to-GA Rehearsal Summary + +- Workflow run: https://github.com/rcourtman/Pulse/actions/runs/24673393628 +- Branch: pulse/v6-release +- Version: 6.0.0 +- Candidate stable tag: v6.0.0 +- Promotion channel: stable +- Promoted prerelease tag: v6.0.0-rc.2 +- Rollback target: v5.1.28 +- Rollback command: `./scripts/install.sh --version v5.1.28` +- Prerelease soak hours at rehearsal time: 94 +- Planned GA date: 2026-04-20 +- Planned v5 end-of-support date: 2026-07-19 +- Hotfix exception: false +- Operator note: Governed release rehearsal for 6.0.0 + +## Result + +This run exercised the non-publish release path and validated the current promotion contract on the selected branch. +Record this run URL in the release ticket when clearing `rc-to-ga-promotion-readiness`. + +## Governed Record + +Materialize the dated rehearsal record from this exact run with: +`python3 scripts/release_control/record_rc_to_ga_rehearsal.py --run-id 24673393628` + +If you do not pass `--output`, the recorder writes to `docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-.md`. +``` diff --git a/docs/release-control/v6/internal/status.json b/docs/release-control/v6/internal/status.json index 7241d5be2..195835e32 100644 --- a/docs/release-control/v6/internal/status.json +++ b/docs/release-control/v6/internal/status.json @@ -618,6 +618,11 @@ "path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-03-28.md", "kind": "file" }, + { + "repo": "pulse", + "path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md", + "kind": "file" + }, { "repo": "pulse", "path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-blocked-2026-03-26.md", @@ -2411,15 +2416,11 @@ "status": "partial", "completion": { "state": "bounded-residual", - "summary": "Self-hosted RC confidence is at the current floor; GA promotion still depends on the shared RC-to-GA gate plus the lane-local self-hosted promotion package follow-up.", + "summary": "Self-hosted RC confidence is at the current floor; the remaining residual is the lane-local self-hosted promotion package follow-up.", "tracking": [ { "kind": "lane-followup", "id": "self-hosted-ga-promotion-package" - }, - { - "kind": "release-gate", - "id": "rc-to-ga-promotion-readiness" } ] }, @@ -2752,15 +2753,11 @@ "status": "partial", "completion": { "state": "bounded-residual", - "summary": "Documentation is current enough for the RC floor, but GA-facing promotion and release communication stay as a lane-local follow-up alongside the shared RC-to-GA gate.", + "summary": "Documentation is current enough for the RC floor, and the remaining residual is the lane-local GA-facing promotion and release communication follow-up.", "tracking": [ { "kind": "lane-followup", "id": "documentation-ga-promotion-package" - }, - { - "kind": "release-gate", - "id": "rc-to-ga-promotion-readiness" } ] }, @@ -2870,11 +2867,11 @@ "status": "partial", "completion": { "state": "bounded-residual", - "summary": "Migration safety is at the RC floor, while GA promotion proof remains the only governed residual work.", + "summary": "Migration safety is at the RC floor; any remaining same-lane hardening is outside the current release-gate slice.", "tracking": [ { - "kind": "release-gate", - "id": "rc-to-ga-promotion-readiness" + "kind": "lane-followup", + "id": "migration-post-ga-hardening" } ] }, @@ -2941,11 +2938,11 @@ "status": "partial", "completion": { "state": "bounded-residual", - "summary": "The end-to-end journey suite covers the RC floor, while RC-to-GA promotion remains the only shared residual proof track.", + "summary": "The end-to-end journey suite covers the RC floor; broader same-lane journey expansion remains outside the current release-gate slice.", "tracking": [ { - "kind": "release-gate", - "id": "rc-to-ga-promotion-readiness" + "kind": "lane-followup", + "id": "journey-post-ga-expansion" } ] }, @@ -3684,7 +3681,7 @@ "owner": "project-owner", "blocking_level": "release-ready", "minimum_evidence_tier": "real-external-e2e", - "status": "blocked", + "status": "passed", "verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md", "lane_ids": [ "L1", @@ -3717,6 +3714,12 @@ "kind": "file", "evidence_tier": "local-rehearsal" }, + { + "repo": "pulse", + "path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-2026-04-20.md", + "kind": "file", + "evidence_tier": "real-external-e2e" + }, { "repo": "pulse", "path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-rehearsal-blocked-2026-03-26.md", @@ -3944,6 +3947,28 @@ "L2" ], "subsystem_ids": [] + }, + { + "id": "journey-post-ga-expansion", + "summary": "Track broader same-lane end-to-end journey expansion beyond the current GA floor now that prerelease-to-GA promotion proof is recorded.", + "owner": "project-owner", + "status": "planned", + "recorded_at": "2026-04-20", + "lane_ids": [ + "L12" + ], + "subsystem_ids": [] + }, + { + "id": "migration-post-ga-hardening", + "summary": "Track remaining same-lane migration-safety hardening beyond the current GA floor now that prerelease-to-GA promotion proof is recorded.", + "owner": "project-owner", + "status": "planned", + "recorded_at": "2026-04-20", + "lane_ids": [ + "L11" + ], + "subsystem_ids": [] } ], "coverage_gaps": [