Clear v6 prerelease-to-GA promotion gate

This commit is contained in:
rcourtman 2026-04-20 16:33:03 +01:00
parent 6f60732f92
commit 0c47b2ada1
7 changed files with 146 additions and 55 deletions

View file

@ -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"

View file

@ -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.

View file

@ -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.

View file

@ -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 <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-<record-date>.md`.
- [x] For GA/stable promotion, materialize the final rehearsal record with `python3 scripts/release_control/record_rc_to_ga_rehearsal.py --run-id <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-<record-date>.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`.

View file

@ -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.

View file

@ -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-<record-date>.md`.
```

View file

@ -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": [