From c63533790ce7f87bc6097b670dd88bc81c74293d Mon Sep 17 00:00:00 2001 From: rcourtman Date: Wed, 1 Jul 2026 23:20:27 +0100 Subject: [PATCH] Add Proxmox filter route regression coverage Refs #1510 --- docs/release-control/control_plane.json | 2 +- .../release-control/internal/CONTROL_PLANE.md | 15 ++++---- ...ent-branch-ga-release-policy-2026-07-01.md | 20 +++++++++++ docs/release-control/v6/internal/status.json | 24 +++++++++++-- .../src/__tests__/AppLayout.test.tsx | 36 ++++++++++++++++++- 5 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 docs/release-control/v6/internal/records/current-branch-ga-release-policy-2026-07-01.md diff --git a/docs/release-control/control_plane.json b/docs/release-control/control_plane.json index 9ee346e35..f8bb48af4 100644 --- a/docs/release-control/control_plane.json +++ b/docs/release-control/control_plane.json @@ -55,7 +55,7 @@ "profile_id": "v6", "kind": "release", "status": "active", - "summary": "Execute Pulse v6 GA from the RC7 soak candidate unless telemetry or newly reported RC7 issues expose a release blocker; readiness gates are already cleared, so remaining work is release-day execution, public cutover approval, and final artifact publication rather than another default RC.", + "summary": "Prepare Pulse v6 GA from the current pulse/v6-release branch after accumulated post-RC7 fixes and final current-branch validation. Do not promote the published RC7 candidate unchanged, and do not plan another RC by default; remaining release-day execution and public cutover approval require fresh current-branch proof, while newly reported RC7 issues stay regression signals unless a release-owner decision changes direction.", "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 32afe4a03..d9c90623c 100644 --- a/docs/release-control/internal/CONTROL_PLANE.md +++ b/docs/release-control/internal/CONTROL_PLANE.md @@ -237,17 +237,18 @@ user language should update the control plane. 1. v6 is the current active release profile. 2. `v6-ga-promotion` is the current active engineering target. - The shipped RC line has already reached `release_ready`, so the target is - now a human-held GA launch-execution target: RC7 is the final soak candidate - unless telemetry or newly reported RC7 issues expose a blocker, and the next - public release is GA rather than another default RC. + The next public v6 release target is GA from the current + `pulse/v6-release` branch after accumulated post-RC7 fixes and final + current-branch validation. The published RC7 candidate must not be promoted + unchanged, and another RC is not planned by default unless a release-owner + decision changes that. 3. `v6-product-lane-expansion` remains planned behind the GA launch target. Its candidate-lane surface remains available in the linked `candidate_lanes` and `coverage_gaps`, but it should not displace release execution while GA is the current objective. -4. The GA readiness gates are passed 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. +4. The older RC line reached the historical `release_ready` floor, but the + current GA target now requires fresh current-branch validation because the + release will include accumulated fixes and changes after RC7. 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/records/current-branch-ga-release-policy-2026-07-01.md b/docs/release-control/v6/internal/records/current-branch-ga-release-policy-2026-07-01.md new file mode 100644 index 000000000..6513d9185 --- /dev/null +++ b/docs/release-control/v6/internal/records/current-branch-ga-release-policy-2026-07-01.md @@ -0,0 +1,20 @@ +# Current Branch GA Release Policy + +## Direction + +The next public Pulse v6 release target is GA from the current +`pulse/v6-release` branch after accumulated post-RC7 fixes and final +current-branch validation. + +The published RC7 candidate must not be promoted unchanged. Another RC is not +planned by default; seven RC releases are enough unless the release owner +explicitly changes direction. + +## Release-control impact + +The historical RC7 readiness evidence remains useful as prerelease lineage +evidence, but it no longer proves the final GA candidate by itself because the +current branch intentionally contains additional fixes and changes after RC7. + +The GA promotion readiness gate therefore stays pending until the current +branch has final GA validation and publication approval. diff --git a/docs/release-control/v6/internal/status.json b/docs/release-control/v6/internal/status.json index 25beb83d5..9d9e0e06f 100644 --- a/docs/release-control/v6/internal/status.json +++ b/docs/release-control/v6/internal/status.json @@ -6597,11 +6597,11 @@ }, { "id": "rc-to-ga-promotion-readiness", - "summary": "Confirm stable or GA promotion is coming from an exercised RC with live release-pipeline proof, rollback instructions, and a written v5 maintenance-only policy.", + "summary": "Confirm Pulse v6 GA promotion is coming from the current pulse/v6-release branch after accumulated post-RC7 fixes, final current-branch validation, rollback instructions, and a written v5 maintenance-only policy.", "owner": "project-owner", "blocking_level": "release-ready", "minimum_evidence_tier": "real-external-e2e", - "status": "passed", + "status": "pending", "verification_doc": "docs/release-control/v6/internal/HIGH_RISK_RELEASE_VERIFICATION_MATRIX.md", "lane_ids": [ "L1", @@ -6610,6 +6610,12 @@ "L12" ], "evidence": [ + { + "repo": "pulse", + "path": "docs/release-control/v6/internal/records/current-branch-ga-release-policy-2026-07-01.md", + "kind": "file", + "evidence_tier": "local-rehearsal" + }, { "repo": "pulse", "path": "docs/release-control/v6/internal/records/rc-to-ga-promotion-readiness-blocked-2026-03-13.md", @@ -8160,6 +8166,20 @@ "lane_ids": [ "L6" ] + }, + { + "id": "current-branch-ga-no-rc8-default", + "summary": "The next public v6 release target is GA from current pulse/v6-release after accumulated post-RC7 fixes and final validation. Do not promote RC7 unchanged, and do not plan RC8 by default unless the release owner changes direction.", + "kind": "release-policy", + "decided_at": "2026-07-01", + "subsystem_ids": [], + "lane_ids": [ + "L1", + "L2", + "L5", + "L9", + "L12" + ] } ] } diff --git a/frontend-modern/src/__tests__/AppLayout.test.tsx b/frontend-modern/src/__tests__/AppLayout.test.tsx index 99134ec0b..b4611000a 100644 --- a/frontend-modern/src/__tests__/AppLayout.test.tsx +++ b/frontend-modern/src/__tests__/AppLayout.test.tsx @@ -1,5 +1,5 @@ import { cleanup, fireEvent, render, screen, waitFor, within } from '@solidjs/testing-library'; -import { Route, Router } from '@solidjs/router'; +import { Route, Router, useNavigate } from '@solidjs/router'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import type { State } from '@/types/api'; import type { Resource } from '@/types/resource'; @@ -56,6 +56,17 @@ describe('AppLayout navigation icons', () => { const renderLayout = (resources: Resource[] = [], initialPath = '/settings/infrastructure') => { window.history.replaceState({}, '', initialPath); + const RouteStateProbe = () => { + const navigate = useNavigate(); + return ( + + ); + }; const LayoutRoute = () => ( ({ @@ -91,6 +102,7 @@ describe('AppLayout navigation icons', () => { onSwitchOrg={() => {}} >
Infrastructure body
+
); return render(() => ( @@ -229,6 +241,28 @@ describe('AppLayout navigation icons', () => { }); }); + it('restores Proxmox route state changed after the page has loaded', async () => { + renderLayout(platformResources(), '/proxmox/overview'); + + await fireEvent.click(screen.getByRole('button', { name: 'Set Proxmox running filter' })); + await waitFor(() => { + expect(window.location.pathname).toBe('/proxmox/overview'); + expect(window.location.search).toBe('?status=running'); + }); + + await fireEvent.click(getInfrastructureTab('Docker')); + await waitFor(() => { + expect(window.location.pathname).toBe('/docker/overview'); + expect(window.location.search).toBe(''); + }); + + await fireEvent.click(getInfrastructureTab('Proxmox')); + await waitFor(() => { + expect(window.location.pathname).toBe('/proxmox/overview'); + expect(window.location.search).toBe('?status=running'); + }); + }); + it('keeps remembered route state scoped to the platform tab that owns it', async () => { renderLayout(platformResources(), '/docker/overview?host=docker-1');