diff --git a/.github/workflows/release-dry-run.yml b/.github/workflows/release-dry-run.yml index 4598bb755..652b29439 100644 --- a/.github/workflows/release-dry-run.yml +++ b/.github/workflows/release-dry-run.yml @@ -168,6 +168,9 @@ jobs: - name: Lint frontend run: npm --prefix frontend-modern run lint + - name: Audit header composition + run: npm --prefix frontend-modern run lint:headers + - name: Check frontend copy-paste duplication run: npm --prefix frontend-modern run lint:cpd diff --git a/docs/release-control/v6/internal/subsystems/cloud-paid.md b/docs/release-control/v6/internal/subsystems/cloud-paid.md index 7eb44ba06..d14692267 100644 --- a/docs/release-control/v6/internal/subsystems/cloud-paid.md +++ b/docs/release-control/v6/internal/subsystems/cloud-paid.md @@ -241,6 +241,15 @@ ledger reads until that policy resolves and suppress them while commercial surfaces are hidden. Public demo mode therefore renders a redacted presentation-policy state instead of creating a fake entitlement, probing hidden commercial endpoints, or showing monitored-system usage pressure. +That same commercial/public browser boundary also owns pricing-handoff +framing. `frontend-modern/src/pages/PricingHandoff.tsx` may keep the +operator-visible handoff on `/pricing`, but it must render the shared +`PageHeader` shell while `frontend-modern/src/utils/pricingHandoff.ts` +continues to own destination resolution, self-hosted Pulse Account handoff, +and public-pricing fallback truth. The route must not fork a raw top-level +heading, duplicate destination logic in the page shell, or let commercial +handoff framing drift away from the same shared browser chrome used by the +rest of the product. The governed browser proof for that posture lives in `tests/integration/tests/53-demo-mode-commercial-boundary.spec.ts` and is expected to stay runnable through diff --git a/docs/release-control/v6/internal/subsystems/deployment-installability.md b/docs/release-control/v6/internal/subsystems/deployment-installability.md index 8605b67c1..8c6aec2df 100644 --- a/docs/release-control/v6/internal/subsystems/deployment-installability.md +++ b/docs/release-control/v6/internal/subsystems/deployment-installability.md @@ -186,6 +186,11 @@ state. When `.github/workflows/create-release.yml` runs in `draft_only` mode, it must pass the real draft state into `.github/workflows/validate-release-assets.yml` so validation blocks or annotates the draft release as a draft, rather than misclassifying the run as post-publish revalidation. +That same frontend-release boundary also owns shared header-composition proof. +`.github/workflows/release-dry-run.yml` and `.github/workflows/create-release.yml` +must both run the same `lint:headers` audit so a branch that would be rejected +by the real publish workflow cannot pass the governed dry run only because the +rehearsal skipped that header-composition gate. That same governed demo-deployment boundary now owns target separation between the public stable demo and the opt-in v6 preview demo. `.github/workflows/create-release.yml`, `.github/workflows/update-demo-server.yml`, and `.github/workflows/deploy-demo-server.yml` diff --git a/docs/release-control/v6/internal/subsystems/frontend-primitives.md b/docs/release-control/v6/internal/subsystems/frontend-primitives.md index c51c58fdc..92a27be23 100644 --- a/docs/release-control/v6/internal/subsystems/frontend-primitives.md +++ b/docs/release-control/v6/internal/subsystems/frontend-primitives.md @@ -373,6 +373,17 @@ connections` visible as the API-backed alternative for Proxmox and such as `truenas_checked` instead of letting feature-local fixtures or fallback objects collapse API-backed TrueNAS systems back into generic agent-host presentation. + That same shared route-shell boundary also owns header-composition audit. + `frontend-modern/scripts/header-audit.mjs`, + `.github/workflows/release-dry-run.yml`, and + `.github/workflows/create-release.yml` must prove the same shared + top-level page-header contract before publication. The audit may follow + local imports when a route shell composes `PageHeader` through a nested + surface, and settings coverage must stay limited to top-level registry + panels rather than every helper `*Panel.tsx` file. Route shells such as + `frontend-modern/src/features/operations/OperationsPageSurface.tsx` must + therefore keep the shared `PageHeader` above owned subtabs instead of + drifting back to page-local `
- If the handoff does not start automatically,{' '} - - {handoffLinkLabel()} - - . -
+