From 00da144dd83dc21979dfbeab2deff6842e291ce8 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 17 Apr 2026 20:06:57 +0100 Subject: [PATCH] Remove v6 RC banner from app shell --- .../v6/internal/subsystems/ai-runtime.md | 6 +- .../v6/internal/subsystems/cloud-paid.md | 6 +- .../subsystems/frontend-primitives.md | 18 ++--- frontend-modern/src/AppLayout.tsx | 7 -- .../src/__tests__/App.architecture.test.ts | 8 +- .../__tests__/updateVersion.test.ts | 11 --- .../shared/ReleaseCandidateBanner.tsx | 59 -------------- .../SharedPrimitives.guardrails.test.ts | 14 ---- .../__tests__/ReleaseCandidateBanner.test.tsx | 30 ------- .../src/components/updateVersion.ts | 11 --- .../tests/57-release-candidate-banner.spec.ts | 43 ---------- .../tests/57-release-candidate-shell.spec.ts | 78 +++++++++++++++++++ 12 files changed, 101 insertions(+), 190 deletions(-) delete mode 100644 frontend-modern/src/components/shared/ReleaseCandidateBanner.tsx delete mode 100644 frontend-modern/src/components/shared/__tests__/ReleaseCandidateBanner.test.tsx delete mode 100644 tests/integration/tests/57-release-candidate-banner.spec.ts create mode 100644 tests/integration/tests/57-release-candidate-shell.spec.ts diff --git a/docs/release-control/v6/internal/subsystems/ai-runtime.md b/docs/release-control/v6/internal/subsystems/ai-runtime.md index a6c37f91b..c397c9109 100644 --- a/docs/release-control/v6/internal/subsystems/ai-runtime.md +++ b/docs/release-control/v6/internal/subsystems/ai-runtime.md @@ -237,7 +237,11 @@ they must remain presentation-only. Prerelease banners, billing callouts, or other header-adjacent notices must not fork assistant open state, gate on AI runtime fetches, or move assistant availability logic out of `frontend-modern/src/stores/aiChat.ts` and `frontend-modern/src/useAppRuntimeState.ts` -just because they share the same authenticated shell. +just because they share the same authenticated shell. The remaining +prerelease-shell treatment is the compact `Preview` badge on rc-channel +builds; `frontend-modern/src/AppLayout.tsx` must not revive a standalone +release-candidate banner, release-notes CTA, or feedback CTA that starts +participating in assistant-shell state or modal ownership. That same shared shell boundary must respect blocking modal ownership. `frontend-modern/src/App.tsx` and `frontend-modern/src/AppLayout.tsx` may use the shared dialog runtime to hide the closed assistant launcher and close the diff --git a/docs/release-control/v6/internal/subsystems/cloud-paid.md b/docs/release-control/v6/internal/subsystems/cloud-paid.md index c25026141..d40468a51 100644 --- a/docs/release-control/v6/internal/subsystems/cloud-paid.md +++ b/docs/release-control/v6/internal/subsystems/cloud-paid.md @@ -625,7 +625,11 @@ That same shell framing also owns user-facing prerelease labeling for rc-channel builds. `frontend-modern/src/AppLayout.tsx` may still key off the canonical `rc` channel metadata internally, but the visible badge must frame those builds as a preview/prerelease experience rather than implying a -near-ready release candidate. +near-ready release candidate. That authenticated shell must not pair the +preview label with a second top-of-shell release-candidate warning banner or +release-feedback CTA in `frontend-modern/src/AppLayout.tsx`; prerelease cloud +posture stays a subtle shell label, not a public-RC callout inside the paid +runtime chrome. The shared trial-start runtime is part of that same cloud-paid boundary. Commercial relay, onboarding, setup, Pro settings, and shared paywall surfaces may customize success copy, but they must route hosted handoff, diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index 66f8d732e..05bc6ff37 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -644,15 +644,15 @@ paywall surfaces navigate those destinations. Feature shells may request a commercial destination, but they must not re-decide whether that destination opens in-app or in a new tab once the shared primitive exists. That same shared-primitive floor now also owns prerelease shell guidance. -`frontend-modern/src/components/shared/ReleaseCandidateBanner.tsx` is the -canonical low-key release-candidate callout for authenticated chrome, and -`frontend-modern/src/AppLayout.tsx` may mount it only from resolved release -metadata. Feature pages, settings panels, and route-local shells must not add -duplicate RC modals, hardcoded GitHub release or feedback links, or page-local -prerelease banners once that shared primitive exists. The shared banner copy -must stay version-aware but RC-order-agnostic: later builds like `rc.2` and -beyond may identify the current version, but they must not keep claiming to be -the first public v6 RC once the release line has moved on. +`frontend-modern/src/AppLayout.tsx` is the canonical authenticated-shell owner +for prerelease presentation, and the remaining user-facing treatment is the +compact `Preview` badge keyed from resolved release metadata. Feature pages, +settings panels, shared components, and route-local shells must not add a +second release-candidate banner, hardcoded GitHub release or feedback links, +or page-local prerelease notices once that shared shell contract exists. +Browser proof for that shell rule now lives in +`tests/integration/tests/57-release-candidate-shell.spec.ts`, which must keep +rc-channel builds banner-free while preserving the compact preview badge. The subsystem registry now also requires explicit proof-policy coverage for all shared runtime files, and shared-component guardrails fail if raw table diff --git a/frontend-modern/src/AppLayout.tsx b/frontend-modern/src/AppLayout.tsx index 4734d4b76..a0a416f86 100644 --- a/frontend-modern/src/AppLayout.tsx +++ b/frontend-modern/src/AppLayout.tsx @@ -19,7 +19,6 @@ import SettingsIcon from 'lucide-solid/icons/settings'; import Maximize2Icon from 'lucide-solid/icons/maximize-2'; import Minimize2Icon from 'lucide-solid/icons/minimize-2'; import { MobileNavBar } from '@/components/shared/MobileNavBar'; -import { ReleaseCandidateBanner } from '@/components/shared/ReleaseCandidateBanner'; import { dialogStackHasBlockingDialog } from '@/components/shared/useDialogState'; import { OrgSwitcher } from '@/components/OrgSwitcher'; import { PulsePatrolLogo } from '@/components/Brand/PulsePatrolLogo'; @@ -646,12 +645,6 @@ export function AppLayout(props: AppLayoutProps) { - - - - - -