diff --git a/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_CONTENT_AND_OPERATOR_MANUAL_PACKET_2026-06-22.md b/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_CONTENT_AND_OPERATOR_MANUAL_PACKET_2026-06-22.md index 0b82565..e3e8907 100644 --- a/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_CONTENT_AND_OPERATOR_MANUAL_PACKET_2026-06-22.md +++ b/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_CONTENT_AND_OPERATOR_MANUAL_PACKET_2026-06-22.md @@ -760,3 +760,56 @@ Latest website and dependency hardening follow-up later on `2026-06-23`: - current package and auth-server posture is more explicit - unresolved third-party dependency residue is documented honestly instead of being silently ignored + +Latest shared-release-bundle follow-up on `2026-06-25`: + +- the public website now carries a reusable shared release-reference bundle + across the full operator-facing public route family: + - homepage + - about + - features + - resources + - docs + - support + - changelog + - pricing + - download + - open-source notices + - privacy + - terms + - shipping/payment +- that shared bundle keeps public docs, release notes, corresponding source, + public repo/notices reference, and support contact visible together instead + of requiring operators to reconstruct the release follow-through path from + scattered footer or page-local fragments +- the same follow-up also removed duplicated public release-manifest + resolution logic from `PricingPage` and `DownloadPage` by routing both + through the shared `usePublicReleaseManifestView()` helper already used by + the rest of the public route family +- focused validation for that continuation stayed green under: + - `npm --prefix website test -- --run src/__tests__/public-marketing-pages.test.tsx` + - `1` file passed + - `12` tests passed +- the broader owned website/runtime/server umbrella then also stayed green + again under: + - `scripts/run-hypertwist-web-surface-validation.sh` + - focused website route/auth/release validation: `12` files, `64` tests + passed + - `npm --prefix website run build` + - `npm --prefix website/server run type-check` + - `npm --prefix website/server test -- --run` + - `10` website/server files passed, `36` tests passed + - `npm --prefix Content/Browser run verify:shell` + - `npm --prefix Content/Browser run build` + - `website/` and `Content/Browser/` production audits: `found 0 + vulnerabilities` + - `website/server` again retained only the already-documented upstream + `supertokens-node -> nodemailer` residual advisory +- the HyperTwist-owned structural loop remained clean on the same packet: + - `scripts/run-hypertwist-sentrux-source-only.sh` + - `Quality: 6210` + - all `7` rules pass + - `scripts/run-hypertwist-gitnexus-analyze.sh` + - `16,253` nodes, `38,116` edges, `665` clusters, `300` flows + - `scripts/run-hypertwist-gitnexus-status.sh` + - bounded mirror `Status: up-to-date` diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md index 508cae8..a01e30f 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -797,3 +797,54 @@ Current audit note: - `C:\HyperTwist\docs\ops\HYPERTWIST_UNREAL_INPUT_AND_XR_COMPLETENESS_AUDIT_2026-06-22.md` - `C:\HyperTwist\docs\ops\HYPERTWIST_NATIVE_XR_HOST_AND_PLUGIN_DECISION_PACKET_2026-06-24.md` + +## Latest public/manual follow-up (`2026-06-25`) + +- the public website now carries one shared release-reference bundle across the + major operator-facing public routes: + - homepage + - about + - features + - resources + - docs + - support + - changelog + - pricing + - download + - open-source notices + - privacy + - terms + - shipping/payment +- that shared bundle keeps public docs, release notes, corresponding source, + public repo/notices reference, and support contact visible as one coherent + launch surface instead of fragmenting release follow-through by page +- `PricingPage` and `DownloadPage` now also consume the shared + `usePublicReleaseManifestView()` helper rather than duplicating public + release-manifest resolution logic locally +- focused public/manual validation stayed green under: + - `npm --prefix website test -- --run src/__tests__/public-marketing-pages.test.tsx` + - `1` test file passed + - `12` tests passed +- the owned umbrella gate stayed green again under: + - `scripts/run-hypertwist-web-surface-validation.sh` + - focused website route/auth/release validation: `12` files, `64` tests + passed + - `npm --prefix website run build` + - `npm --prefix website/server run type-check` + - `npm --prefix website/server test -- --run` + - `10` website/server files passed, `36` tests passed + - `npm --prefix Content/Browser run verify:shell` + - `npm --prefix Content/Browser run build` + - `website/` and `Content/Browser/` production audits: `found 0 + vulnerabilities` + - `website/server` retained only the already-documented upstream + `supertokens-node -> nodemailer` residual advisory +- the HyperTwist-owned structural loop also stayed healthy after that same + packet: + - `scripts/run-hypertwist-sentrux-source-only.sh` + - `Quality: 6210` + - all `7` rules pass + - `scripts/run-hypertwist-gitnexus-analyze.sh` + - `16,253` nodes, `38,116` edges, `665` clusters, `300` flows + - `scripts/run-hypertwist-gitnexus-status.sh` + - bounded mirror `Status: up-to-date` diff --git a/website/src/__tests__/public-marketing-pages.test.tsx b/website/src/__tests__/public-marketing-pages.test.tsx index 2285ba0..fe40c8b 100644 --- a/website/src/__tests__/public-marketing-pages.test.tsx +++ b/website/src/__tests__/public-marketing-pages.test.tsx @@ -251,6 +251,9 @@ describe('public marketing pages', () => { expect(screen.getByText('Protected entitlement handoff')).toBeTruthy() expect(screen.getByText('Distribution doctrine')).toBeTruthy() expect(screen.getByText('Public pages are distribution surfaces')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy() expect(screen.getByText('Pair desktop access to the browser account')).toBeTruthy() expect(await screen.findByText('Version: 1.0.0')).toBeTruthy() expect(screen.getByText('SHA-256: abc123')).toBeTruthy() @@ -416,6 +419,8 @@ describe('public marketing pages', () => { expect(screen.getAllByText(/public auth runtime posture/i).length).toBeGreaterThan(0) expect(screen.getByText('Current packaged desktop proof')).toBeTruthy() expect(screen.getByText('Packaged validation passed')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy() expect(screen.getByText('How a real first session flows')).toBeTruthy() expect(screen.getByText('Choose the right HyperTwist surface')).toBeTruthy() expect(screen.getByText('Move into the protected dashboard')).toBeTruthy() @@ -540,6 +545,8 @@ describe('public marketing pages', () => { expect(screen.getByText('About-page launch and release posture')).toBeTruthy() expect(screen.getByText('Current packaged desktop proof')).toBeTruthy() expect(screen.getByText('Packaged validation passed')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy() }) it('renders the public feature atlas with capability tiers and route-aware metadata', async () => { @@ -653,6 +660,8 @@ describe('public marketing pages', () => { expect(screen.getByText('Public feature and launch posture')).toBeTruthy() expect(screen.getByText('Current packaged desktop proof')).toBeTruthy() expect(screen.getByText('Packaged validation passed')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy() expect(document.title).toBe('HyperTwist features | HyperTwist') expect(document.head.querySelector('meta[property="og:url"]')?.getAttribute('content')).toBe('https://hypertwist.app/features') }) @@ -833,6 +842,9 @@ describe('public marketing pages', () => { expect(screen.getByText('Owns recognition, replay, coaching, and packaged training behavior')).toBeTruthy() expect(screen.getByText('Commercial distribution doctrine')).toBeTruthy() expect(screen.getByText('Public pages are distribution surfaces')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy() expect(screen.getByText('Terms of access in practice')).toBeTruthy() expect(screen.getByText('Access model')).toBeTruthy() const checkoutLinks = screen.getAllByRole('link', { name: /open paddle checkout/i }) @@ -927,6 +939,8 @@ describe('public marketing pages', () => { expect(screen.getByText('Current support-facing launch posture')).toBeTruthy() expect(screen.getByText('Current packaged desktop proof')).toBeTruthy() expect(screen.getByText('Packaged validation passed')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy() expect(screen.getByText('Digital delivery workflow')).toBeTruthy() expect(screen.getByText('Post-install operator workflow')).toBeTruthy() expect(screen.getByText('Privacy and compliance boundary')).toBeTruthy() @@ -1052,6 +1066,8 @@ describe('public marketing pages', () => { expect(screen.getByText('Deployment readiness snapshot')).toBeTruthy() expect(screen.getAllByText('XR groundwork exists, but the full VR lane is not finished').length).toBeGreaterThan(0) expect(screen.getByText('Higher-dimensional runtime ownership')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy() }) it('renders the public operator manual on the docs page', async () => { @@ -1142,6 +1158,8 @@ describe('public marketing pages', () => { expect(screen.getByText('If the desktop app is primary, why keep the web version?')).toBeTruthy() expect(screen.getByText(/intentionally narrower than the simulator for training and device\/runtime work/i)).toBeTruthy() expect(screen.getByText('Packaged validation passed')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy() expect(await screen.findByRole('link', { name: /open public docs portal/i })).toBeTruthy() }) @@ -1251,6 +1269,8 @@ describe('public marketing pages', () => { expect(screen.getByText(/Pair the release note with the current packaged-validation summary/i)).toBeTruthy() expect(screen.getByText('Current packaged desktop proof')).toBeTruthy() expect(screen.getByText('Packaged validation passed')).toBeTruthy() + expect(screen.getByText('Release references and source availability')).toBeTruthy() + expect(screen.getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy() expect(await screen.findByRole('link', { name: /open release feed/i })).toBeTruthy() expect(document.title).toBe('HyperTwist release notes | HyperTwist') expect(document.head.querySelector('meta[property=\"og:url\"]')?.getAttribute('content')).toBe('https://hypertwist.app/changelog') @@ -1353,6 +1373,9 @@ describe('public marketing pages', () => { const noticesView = renderWithProviders(, ['/open-source-notices']) expect(within(noticesView.container).getByText('Distribution doctrine')).toBeTruthy() expect(within(noticesView.container).getByText('Public pages are distribution surfaces')).toBeTruthy() + expect(within(noticesView.container).getByText('Release and source references')).toBeTruthy() + expect((await within(noticesView.container).findAllByRole('link', { name: 'https://hypertwist.app/open-source/source.zip' })).length).toBeGreaterThan(0) + expect((await within(noticesView.container).findAllByRole('link', { name: 'https://github.com/hypertwist/hypertwist' })).length).toBeGreaterThan(0) expect(within(noticesView.container).getByText('Choose the right HyperTwist surface')).toBeTruthy() expect(within(noticesView.container).getByText('Current packaged desktop proof')).toBeTruthy() expect(within(noticesView.container).getByText('Packaged validation passed')).toBeTruthy() @@ -1366,6 +1389,8 @@ describe('public marketing pages', () => { expect(within(privacyView.container).getByText('Support-safe escalation boundary')).toBeTruthy() expect(within(privacyView.container).getByText('Current packaged desktop proof')).toBeTruthy() expect(within(privacyView.container).getByText('Packaged validation passed')).toBeTruthy() + expect(within(privacyView.container).getByText('Release references and source availability')).toBeTruthy() + expect(within(privacyView.container).getByRole('link', { name: 'https://docs.hypertwist.app' })).toBeTruthy() const termsView = renderWithProviders(, ['/terms']) expect(within(termsView.container).getByText('Terms in practice')).toBeTruthy() @@ -1376,12 +1401,16 @@ describe('public marketing pages', () => { expect(within(termsView.container).getByText('Release and redistribution checklist')).toBeTruthy() expect(within(termsView.container).getByText('Current packaged desktop proof')).toBeTruthy() expect(within(termsView.container).getByText('Packaged validation passed')).toBeTruthy() + expect(within(termsView.container).getByText('Release references and source availability')).toBeTruthy() + expect(within(termsView.container).getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy() const shippingPaymentView = renderWithProviders(, ['/shipping-payment']) expect(within(shippingPaymentView.container).getByText('Digital delivery workflow')).toBeTruthy() expect(within(shippingPaymentView.container).getByText('Protected entitlement handoff')).toBeTruthy() expect(within(shippingPaymentView.container).getByText('What happens after access is granted')).toBeTruthy() expect(within(shippingPaymentView.container).getByText('Choose the right HyperTwist surface')).toBeTruthy() + expect(within(shippingPaymentView.container).getByText('Release references and source availability')).toBeTruthy() + expect(within(shippingPaymentView.container).getByRole('link', { name: 'https://notes.hypertwist.app' })).toBeTruthy() expect(within(shippingPaymentView.container).getByText('Terms of access in practice')).toBeTruthy() expect(within(shippingPaymentView.container).getByText('Distribution doctrine')).toBeTruthy() expect(within(shippingPaymentView.container).getByText('Release and redistribution checklist')).toBeTruthy() diff --git a/website/src/pages/public-page-helpers.tsx b/website/src/pages/public-page-helpers.tsx index d298a95..4e7fbed 100644 --- a/website/src/pages/public-page-helpers.tsx +++ b/website/src/pages/public-page-helpers.tsx @@ -322,6 +322,94 @@ export function PublicPackagedDesktopProofSection({ ) } +export function ReleaseAuthorityBundleSection({ + releaseManifest, + title = 'Release references and source availability', + description = 'Treat public docs, release notes, corresponding source, notices repository, and operator contact as one launch bundle so distribution-critical pages do not fragment the release story.', +}: { + releaseManifest: ReturnType + title?: string + description?: string +}) { + const references = [ + { + title: 'Public manual', + description: + 'The public docs portal is the product-safe manual for browser-versus-desktop boundaries, rollout posture, and simulator truth.', + href: releaseManifest.public_docs_url, + configuredLabel: 'Configured', + missingLabel: 'Configure public docs URL before external launch', + linkLabel: releaseManifest.public_docs_url || 'Configure public docs URL before external launch', + }, + { + title: 'Release notes feed', + description: + 'Release notes keep public launch pages anchored to real browser, package, control-boundary, and distribution changes.', + href: releaseManifest.release_notes_url, + configuredLabel: 'Configured', + missingLabel: 'Configure release notes URL before external launch', + linkLabel: releaseManifest.release_notes_url || 'Configure release notes URL before external launch', + }, + { + title: 'Corresponding source', + description: + 'Any MPL-covered shipped build needs a stable corresponding-source location for the exact distributed material.', + href: releaseManifest.corresponding_source_url, + configuredLabel: 'Configured', + missingLabel: 'Configure corresponding-source URL before external launch', + linkLabel: + releaseManifest.corresponding_source_url || 'Configure corresponding-source URL before external launch', + }, + { + title: 'Open-source repo and notices reference', + description: + 'The public repository and notices reference keeps release, legal, and redistribution follow-through visible outside the simulator.', + href: releaseManifest.open_source_repo_url, + configuredLabel: 'Configured', + missingLabel: 'Configure public repo/notices URL before external launch', + linkLabel: releaseManifest.open_source_repo_url || 'Configure public repo/notices URL before external launch', + }, + { + title: 'Operator support contact', + description: + 'Support contact belongs in the same bundle so release, entitlement, notice, and rollout questions do not force operators to improvise escalation paths.', + href: releaseManifest.support_email ? `mailto:${releaseManifest.support_email}` : null, + configuredLabel: 'Ready', + missingLabel: 'Configure support email before external launch', + linkLabel: releaseManifest.support_email || 'Configure support email before external launch', + }, + ] as const + + return ( +
+
+ {references.map((reference) => { + const configured = Boolean(reference.href) + + return ( +
+

+ {configured ? reference.configuredLabel : 'Pending'} +

+

{reference.title}

+

{reference.description}

+

+ {reference.href ? ( + + {reference.linkLabel} + + ) : ( + reference.missingLabel + )} +

+
+ ) + })} +
+
+ ) +} + export function PlanActionLink({ href, label }: { href: string; label: string }) { if (isExternalHref(href)) { return ( diff --git a/website/src/pages/public-pages-commerce.tsx b/website/src/pages/public-pages-commerce.tsx index 899a2cc..644873d 100644 --- a/website/src/pages/public-pages-commerce.tsx +++ b/website/src/pages/public-pages-commerce.tsx @@ -1,7 +1,5 @@ import { useMemo } from 'react' -import { useQuery } from '@tanstack/react-query' import { Link } from 'react-router-dom' -import { getReleaseManifest } from '../auth/auth-api' import { MarketingShell } from '../components/layout/MarketingShell' import { SiteMetadata } from '../components/seo/SiteMetadata' import { OperationalStatusCallout } from '../components/ui/OperationalStatusCallout' @@ -9,11 +7,7 @@ import { ProductSurfaceMatrix } from '../components/ui/ProductSurfaceMatrix' import { PublicLaunchStatus } from '../components/ui/PublicLaunchStatus' import { ReleaseValidationSummary } from '../components/ui/ReleaseValidationSummary' import { paddleReadyDescription } from '../site-config' -import { - buildReleaseMetadataItems, - resolveReleaseCommerceView, - resolveReleaseManifestView, -} from '../release-manifest' +import { buildReleaseMetadataItems, resolveReleaseCommerceView } from '../release-manifest' import { buildLoginPath, buildProtectedDownloadPath, buildSupportPath } from '../site-routes' import { desktopFirstLaunchCards, @@ -31,12 +25,12 @@ import { } from '../site-data' import { BrowserDesktopRealitySection, - buildPublicReleaseManifestFallback, DeliverySurfaceResponsibilitiesGrid, explorerFallbackPlan, operatorFallbackPlan, PlanActionLink, PublicPackagedDesktopProofSection, + ReleaseAuthorityBundleSection, releaseCommerceFallback, Section, studioFallbackPlan, @@ -45,23 +39,11 @@ import { } from './public-page-helpers' export function PricingPage() { - const releaseManifestQuery = useQuery({ - queryKey: ['release-manifest', 'public'], - queryFn: getReleaseManifest, - retry: false, - }) - const releaseManifest = useMemo( - () => resolveReleaseManifestView(releaseManifestQuery.data?.manifest, buildPublicReleaseManifestFallback()), - [releaseManifestQuery.data?.manifest], - ) + const { releaseManifestQuery, releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-pricing') const releaseCommerce = useMemo( () => resolveReleaseCommerceView(releaseManifestQuery.data?.manifest, releaseCommerceFallback), [releaseManifestQuery.data?.manifest], ) - const windowsValidationPlatform = useMemo( - () => releaseManifest.platforms.find((platform) => platform.platform_key === 'windows') || null, - [releaseManifest.platforms], - ) const runtimePlanCatalog = useMemo(() => ([ explorerFallbackPlan, { @@ -120,6 +102,11 @@ export function PricingPage() { ]} /> + +
resolveReleaseManifestView(releaseManifestQuery.data?.manifest, buildPublicReleaseManifestFallback()), - [releaseManifestQuery.data?.manifest], - ) - const windowsValidationPlatform = useMemo( - () => releaseManifest.platforms.find((platform) => platform.platform_key === 'windows') || null, - [releaseManifest.platforms], - ) + const { releaseManifestQuery, releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-download') return ( <> @@ -407,44 +381,14 @@ export function DownloadPage() {

{signal.description}

))} -
-

Operator rollout references

- -
+ +

@@ -536,6 +480,12 @@ export function OpenSourceNoticesPage() {

+ +
@@ -592,7 +542,7 @@ export function OpenSourceNoticesPage() { } export function PrivacyPage() { - const { windowsValidationPlatform } = usePublicReleaseManifestView('public-privacy') + const { releaseManifest, windowsValidationPlatform } = usePublicReleaseManifestView('public-privacy') return ( <> @@ -659,6 +609,11 @@ export function PrivacyPage() { ]} /> + +
@@ -750,6 +705,11 @@ export function TermsPage() { ]} /> + +
@@ -853,6 +813,11 @@ export function ShippingPaymentPage() { ]} /> + +
@@ -187,6 +188,11 @@ export function FeaturesPage() { ]} /> + +
@@ -401,6 +402,11 @@ export function HomeLanding() { ]} /> + +
@@ -576,6 +582,11 @@ export function AboutPage() { { to: '/docs', label: 'Open public manual' }, ]} /> + + ) @@ -805,6 +816,11 @@ export function ResourcesPage() { { to: '/app', label: 'Open operator dashboard' }, ]} /> + + ) @@ -913,6 +929,11 @@ export function DocsPage() { ]} /> + + @@ -983,6 +1004,11 @@ export function SupportPage() { ]} /> + +

@@ -1180,6 +1206,11 @@ export function ChangelogPage() { ]} /> + + {releaseManifest.release_notes_url ? (

diff --git a/website/src/site-data.ts b/website/src/site-data.ts index 62a8825..be2120a 100644 --- a/website/src/site-data.ts +++ b/website/src/site-data.ts @@ -821,6 +821,16 @@ export const resourceCollections = [ ] as const export const changelogEntries = [ + { + date: 'June 25, 2026', + title: 'Public pages now carry one shared release-reference bundle end to end', + details: 'Home, About, Features, Resources, Docs, Support, Changelog, Privacy, Terms, Pricing, Download, Notices, and Shipping/Payment now all keep the same direct docs, release-notes, corresponding-source, public-repository/notices, and operator-support references visible instead of fragmenting release follow-through by route.', + }, + { + date: 'June 25, 2026', + title: 'Public commerce pages now use the shared release-manifest view', + details: 'Pricing and Download now consume the same public release-manifest helper used across the rest of the site, removing duplicated manifest-resolution logic while keeping platform proof, fallback posture, and operator handoff behavior unchanged.', + }, { date: 'June 24, 2026', title: 'Feature atlas and support now carry the full browser-versus-desktop reality section too',