mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-10-20 11:46:11 +00:00
Clear v6 prerelease-to-GA promotion gate
This commit is contained in:
parent
6f60732f92
commit
0c47b2ada1
7 changed files with 146 additions and 55 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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`.
|
||||
```
|
||||
|
|
@ -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": [
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue