Add Proxmox filter route regression coverage

Refs #1510
This commit is contained in:
rcourtman 2026-07-01 23:20:27 +01:00
parent df67c01a64
commit c63533790c
5 changed files with 86 additions and 11 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -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 (
<button
type="button"
onClick={() => navigate('/proxmox/overview?status=running', { replace: true })}
>
Set Proxmox running filter
</button>
);
};
const LayoutRoute = () => (
<AppLayout
connectionStatus={() => ({
@ -91,6 +102,7 @@ describe('AppLayout navigation icons', () => {
onSwitchOrg={() => {}}
>
<div>Infrastructure body</div>
<RouteStateProbe />
</AppLayout>
);
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');