Harden public manual evidence and release routing
This commit is contained in:
parent
556ad2edf2
commit
de02745b82
9 changed files with 110 additions and 40 deletions
|
|
@ -273,6 +273,18 @@ Latest same-day browser/distribution continuity follow-up still on `2026-06-24`:
|
|||
- protected notices
|
||||
- protected browser-access
|
||||
- protected dashboard
|
||||
- the remaining public pricing, launch-status, and download fallback CTAs now
|
||||
also stop opening generic `/login` or broad support detours when the real
|
||||
next lane is already known:
|
||||
- the free explorer plan now preserves `/register?next=/app`
|
||||
- operator fallback now opens the protected downloads lane directly
|
||||
- studio fallback now opens the protected rollout/browser-access lane
|
||||
- public launch-status and download fallback callouts now point at exact
|
||||
protected release, notices, and dashboard follow-through
|
||||
- the public About and Support pages now also surface the same live launch and
|
||||
packaged-proof evidence already shown on the stronger public manual routes,
|
||||
so those narrative/help surfaces no longer talk about maturity only in the
|
||||
abstract
|
||||
- the public topic cards therefore no longer dead-end on broad public guidance when the real next step is signed-in protected follow-through
|
||||
- the new shared callout posture explicitly separates:
|
||||
- what still works
|
||||
|
|
@ -283,6 +295,18 @@ Latest same-day browser/distribution continuity follow-up still on `2026-06-24`:
|
|||
- protected-route loading with preserved next-target sign-in and support escape hatches
|
||||
- dashboard auth-health and release-authority fallback continuity
|
||||
- public download and protected release-lane fallback continuity
|
||||
- the same bounded follow-up then reran the HyperTwist-owned refactor tools on
|
||||
the current public-route continuity state:
|
||||
- `scripts/run-hypertwist-sentrux-source-only.sh`
|
||||
- `Quality: 6135`
|
||||
- all `7` rules passing
|
||||
- `scripts/run-hypertwist-gitnexus-analyze.sh`
|
||||
- `16,236` nodes
|
||||
- `38,055` edges
|
||||
- `670` clusters
|
||||
- `300` flows
|
||||
- `scripts/run-hypertwist-gitnexus-status.sh`
|
||||
- `Status: up-to-date`
|
||||
- this hardening is still boundary-honest:
|
||||
- degraded browser auth does not become a false production claim
|
||||
- degraded release-manifest lookup does not unlock raw package delivery
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -41,7 +41,7 @@ vi.mock('../site-config', () => ({
|
|||
name: 'Explorer',
|
||||
price: 'Free',
|
||||
ctaLabel: 'Start in the browser',
|
||||
ctaHref: '/register',
|
||||
ctaHref: '/register?next=%2Fapp',
|
||||
notes: 'Preview the browser account shell, operator dashboard, release notes, and desktop onboarding posture.',
|
||||
features: ['Browser account access'],
|
||||
},
|
||||
|
|
@ -49,8 +49,8 @@ vi.mock('../site-config', () => ({
|
|||
key: 'operator',
|
||||
name: 'Operator',
|
||||
price: 'Launch pricing via Paddle',
|
||||
ctaLabel: 'Request operator access',
|
||||
ctaHref: '/support?topic=operator-access',
|
||||
ctaLabel: 'Open protected downloads',
|
||||
ctaHref: '/app/downloads?platform=windows',
|
||||
notes: 'Desktop-first recognition, replay, training, and higher-dimensional runtime ownership for active training operators.',
|
||||
features: ['Desktop download access'],
|
||||
},
|
||||
|
|
@ -58,8 +58,8 @@ vi.mock('../site-config', () => ({
|
|||
key: 'studio',
|
||||
name: 'Studio',
|
||||
price: 'Contact for launch readiness',
|
||||
ctaLabel: 'Talk to HyperTwist',
|
||||
ctaHref: '/support?topic=studio-rollout',
|
||||
ctaLabel: 'Open protected rollout lane',
|
||||
ctaHref: '/app/browser-access',
|
||||
notes: 'Higher-dimensional families, operator deployment support, and packaging/validation coordination for production lanes.',
|
||||
features: ['Magic120Cell and 5D operator posture'],
|
||||
},
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ vi.mock('../site-config', () => ({
|
|||
name: 'Explorer',
|
||||
price: 'Free',
|
||||
ctaLabel: 'Start in the browser',
|
||||
ctaHref: '/register',
|
||||
ctaHref: '/register?next=%2Fapp',
|
||||
notes: 'Preview the browser account shell, operator dashboard, release notes, and desktop onboarding posture.',
|
||||
features: ['Browser account access'],
|
||||
},
|
||||
|
|
@ -69,8 +69,8 @@ vi.mock('../site-config', () => ({
|
|||
key: 'operator',
|
||||
name: 'Operator',
|
||||
price: 'Launch pricing via Paddle',
|
||||
ctaLabel: 'Request operator access',
|
||||
ctaHref: '/support?topic=operator-access',
|
||||
ctaLabel: 'Open protected downloads',
|
||||
ctaHref: '/app/downloads?platform=windows',
|
||||
notes: 'Desktop-first recognition, replay, training, and higher-dimensional runtime ownership for active training operators.',
|
||||
features: ['Desktop download access'],
|
||||
},
|
||||
|
|
@ -78,8 +78,8 @@ vi.mock('../site-config', () => ({
|
|||
key: 'studio',
|
||||
name: 'Studio',
|
||||
price: 'Contact for launch readiness',
|
||||
ctaLabel: 'Talk to HyperTwist',
|
||||
ctaHref: '/support?topic=studio-rollout',
|
||||
ctaLabel: 'Open protected rollout lane',
|
||||
ctaHref: '/app/browser-access',
|
||||
notes: 'Higher-dimensional families, operator deployment support, and packaging/validation coordination for production lanes.',
|
||||
features: ['Magic120Cell and 5D operator posture'],
|
||||
},
|
||||
|
|
@ -303,7 +303,7 @@ describe('public marketing pages', () => {
|
|||
expect(await screen.findByText(/public release fallback/i)).toBeTruthy()
|
||||
expect(screen.getByText(/direct package delivery stays intentionally withheld until that authority returns/i)).toBeTruthy()
|
||||
expect(screen.getByText('What stays intentionally withheld')).toBeTruthy()
|
||||
expect(screen.getByRole('link', { name: 'Sign in to inspect access' }).getAttribute('href')).toBe('/login')
|
||||
expect(screen.getByRole('link', { name: 'Open protected downloads' }).getAttribute('href')).toBe('/app/downloads?platform=windows')
|
||||
expect(screen.getByRole('link', { name: 'Open support' }).getAttribute('href')).toBe('/support?topic=operator-access')
|
||||
})
|
||||
|
||||
|
|
@ -524,6 +524,10 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getByText('Generates desktop-link tokens for safe browser-to-desktop handoff')).toBeTruthy()
|
||||
expect(screen.getByText('Must prove its own runtime and backend contract before being marketed as live')).toBeTruthy()
|
||||
expect(screen.getByText('Release and deployment maturity')).toBeTruthy()
|
||||
expect(screen.getByText('Current public rollout posture')).toBeTruthy()
|
||||
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()
|
||||
})
|
||||
|
||||
it('renders the public feature atlas with capability tiers and route-aware metadata', async () => {
|
||||
|
|
@ -638,7 +642,7 @@ describe('public marketing pages', () => {
|
|||
expect(document.head.querySelector('meta[property="og:url"]')?.getAttribute('content')).toBe('https://hypertwist.app/features')
|
||||
})
|
||||
|
||||
it('uses useful support fallback routes for plans that do not yet have live checkouts', () => {
|
||||
it('uses exact protected fallback routes for plans that do not yet have live checkouts', () => {
|
||||
mockGetAuthHealth.mockResolvedValue({
|
||||
ok: true,
|
||||
service: 'hypertwist-auth-server',
|
||||
|
|
@ -696,8 +700,8 @@ describe('public marketing pages', () => {
|
|||
})
|
||||
renderWithProviders(<PricingPage />)
|
||||
|
||||
expect(screen.getByRole('link', { name: /request operator access/i }).getAttribute('href')).toBe('/support?topic=operator-access')
|
||||
expect(screen.getByRole('link', { name: /talk to hypertwist/i }).getAttribute('href')).toBe('/support?topic=studio-rollout')
|
||||
expect(screen.getByRole('link', { name: /open protected downloads/i }).getAttribute('href')).toBe('/app/downloads?platform=windows')
|
||||
expect(screen.getByRole('link', { name: /open protected rollout lane/i }).getAttribute('href')).toBe('/app/browser-access')
|
||||
})
|
||||
|
||||
it('prefers runtime checkout URLs and live plan prices on the pricing page when the manifest provides them', async () => {
|
||||
|
|
@ -897,6 +901,10 @@ describe('public marketing pages', () => {
|
|||
expect(screen.getAllByText('Manual and route focus').length).toBeGreaterThan(0)
|
||||
expect(screen.getByText('Recovery and degraded-state guidance')).toBeTruthy()
|
||||
expect(screen.getByText('Desktop-first continuity during recovery')).toBeTruthy()
|
||||
expect(screen.getByText('Current release and package posture')).toBeTruthy()
|
||||
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('Digital delivery workflow')).toBeTruthy()
|
||||
expect(screen.getByText('Post-install operator workflow')).toBeTruthy()
|
||||
expect(screen.getByText('Privacy and compliance boundary')).toBeTruthy()
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import { Link } from 'react-router-dom'
|
|||
import { getAuthHealth } from '../../auth/auth-api'
|
||||
import { resolvePublicLaunchStatusSummary } from '../../public-launch'
|
||||
import { launchReadiness } from '../../site-config'
|
||||
import { buildSupportPath } from '../../site-routes'
|
||||
import { buildProtectedDownloadPath } from '../../site-routes'
|
||||
|
||||
function usePublicLaunchStatus() {
|
||||
const authHealthQuery = useQuery({
|
||||
|
|
@ -58,8 +58,8 @@ export function MarketingLaunchStatusBanner() {
|
|||
<Link className="inline-link" to="/pricing">
|
||||
View launch posture
|
||||
</Link>
|
||||
<Link className="inline-link" to={buildSupportPath('launch-readiness')}>
|
||||
Get launch help
|
||||
<Link className="inline-link" to={buildProtectedDownloadPath('windows')}>
|
||||
Open protected release lane
|
||||
</Link>
|
||||
</div>
|
||||
</article>
|
||||
|
|
@ -105,11 +105,11 @@ export function PublicLaunchStatus({
|
|||
) : null}
|
||||
{!ready ? (
|
||||
<div className="button-row top-gap">
|
||||
<Link className="button button--ghost" to={buildSupportPath('launch-readiness')}>
|
||||
Contact launch support
|
||||
<Link className="button button--ghost" to={buildProtectedDownloadPath('windows')}>
|
||||
Open protected release lane
|
||||
</Link>
|
||||
<Link className="button button--ghost" to="/open-source-notices">
|
||||
Review notices
|
||||
<Link className="button button--ghost" to="/app/notices">
|
||||
Open protected notices
|
||||
</Link>
|
||||
</div>
|
||||
) : null}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ import {
|
|||
resolveReleaseCommerceView,
|
||||
resolveReleaseManifestView,
|
||||
} from '../release-manifest'
|
||||
import { buildProtectedDownloadPath, buildSupportPath } from '../site-routes'
|
||||
import { buildLoginPath, buildProtectedDownloadPath, buildSupportPath } from '../site-routes'
|
||||
import {
|
||||
desktopFirstLaunchCards,
|
||||
desktopDownloadSteps,
|
||||
|
|
@ -65,14 +65,14 @@ export function PricingPage() {
|
|||
{
|
||||
...operatorFallbackPlan,
|
||||
price: releaseCommerce.plan_price_operator,
|
||||
ctaLabel: releaseCommerce.operator_checkout_url ? 'Open Paddle checkout' : 'Request operator access',
|
||||
ctaHref: releaseCommerce.operator_checkout_url || buildSupportPath('operator-access'),
|
||||
ctaLabel: releaseCommerce.operator_checkout_url ? 'Open Paddle checkout' : operatorFallbackPlan.ctaLabel,
|
||||
ctaHref: releaseCommerce.operator_checkout_url || operatorFallbackPlan.ctaHref,
|
||||
},
|
||||
{
|
||||
...studioFallbackPlan,
|
||||
price: releaseCommerce.plan_price_studio,
|
||||
ctaLabel: releaseCommerce.studio_checkout_url ? 'Open Paddle checkout' : 'Talk to HyperTwist',
|
||||
ctaHref: releaseCommerce.studio_checkout_url || buildSupportPath('studio-rollout'),
|
||||
ctaLabel: releaseCommerce.studio_checkout_url ? 'Open Paddle checkout' : studioFallbackPlan.ctaLabel,
|
||||
ctaHref: releaseCommerce.studio_checkout_url || studioFallbackPlan.ctaHref,
|
||||
},
|
||||
]), [releaseCommerce])
|
||||
|
||||
|
|
@ -261,7 +261,7 @@ export function DownloadPage() {
|
|||
},
|
||||
]}
|
||||
actions={[
|
||||
{ label: 'Sign in to inspect access', to: '/login' },
|
||||
{ label: 'Open protected downloads', to: buildProtectedDownloadPath('windows') },
|
||||
{ label: 'Open support', to: buildSupportPath('operator-access') },
|
||||
]}
|
||||
/>
|
||||
|
|
@ -443,8 +443,8 @@ export function DownloadPage() {
|
|||
download links live behind the protected dashboard where plan and entitlement
|
||||
state are resolved.
|
||||
</p>
|
||||
<Link className="button button--ghost" to="/login">
|
||||
Sign in to check access
|
||||
<Link className="button button--ghost" to={buildProtectedDownloadPath('windows')}>
|
||||
Open protected download lane
|
||||
</Link>
|
||||
</article>
|
||||
</Section>
|
||||
|
|
@ -455,8 +455,8 @@ export function DownloadPage() {
|
|||
After sign-in, open the operator dashboard to generate a desktop-link token.
|
||||
That token is designed to hand browser identity and plan posture over to the local desktop app without exposing your password.
|
||||
</p>
|
||||
<Link className="button button--ghost" to="/app">
|
||||
Open dashboard
|
||||
<Link className="button button--ghost" to={buildLoginPath('/app')}>
|
||||
Open protected dashboard
|
||||
</Link>
|
||||
</article>
|
||||
</Section>
|
||||
|
|
|
|||
|
|
@ -428,6 +428,8 @@ export function HomeLanding() {
|
|||
}
|
||||
|
||||
export function AboutPage() {
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-about')
|
||||
|
||||
return (
|
||||
<>
|
||||
<SiteMetadata
|
||||
|
|
@ -549,6 +551,21 @@ export function AboutPage() {
|
|||
))}
|
||||
</div>
|
||||
</Section>
|
||||
|
||||
<Section
|
||||
title="Current public rollout posture"
|
||||
description="Narrative claims stay more credible when this page also shows the live public launch posture and the current packaged desktop proof."
|
||||
>
|
||||
<PublicLaunchStatus title="About-page launch and release posture" />
|
||||
</Section>
|
||||
|
||||
<PublicPackagedDesktopProofSection
|
||||
platform={windowsValidationPlatform}
|
||||
actions={[
|
||||
{ to: '/download', label: 'Open download center' },
|
||||
{ to: '/docs', label: 'Open public manual' },
|
||||
]}
|
||||
/>
|
||||
</MarketingShell>
|
||||
</>
|
||||
)
|
||||
|
|
@ -901,6 +918,7 @@ export function SupportPage() {
|
|||
const supportTopic = searchParams.get('topic')
|
||||
const selectedSupportTopicKey = supportTopic && supportTopicGuidance[supportTopic] ? supportTopic : null
|
||||
const selectedSupportTopic = selectedSupportTopicKey ? supportTopicGuidance[selectedSupportTopicKey] : null
|
||||
const { windowsValidationPlatform } = usePublicReleaseManifestView('public-support')
|
||||
|
||||
return (
|
||||
<>
|
||||
|
|
@ -932,6 +950,21 @@ export function SupportPage() {
|
|||
/>
|
||||
) : null}
|
||||
|
||||
<Section
|
||||
title="Current release and package posture"
|
||||
description="Support gets easier when current launch-readiness truth and current packaged desktop proof remain visible beside the help lanes themselves."
|
||||
>
|
||||
<PublicLaunchStatus title="Current support-facing launch posture" />
|
||||
</Section>
|
||||
|
||||
<PublicPackagedDesktopProofSection
|
||||
platform={windowsValidationPlatform}
|
||||
actions={[
|
||||
{ to: '/download', label: 'Open download center' },
|
||||
{ to: '/changelog', label: 'Review release notes' },
|
||||
]}
|
||||
/>
|
||||
|
||||
<Section title="Contact">
|
||||
<article className="card">
|
||||
<p>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import type { DownloadPlatformKey } from './site-routes'
|
||||
import { buildSupportPath } from './site-routes'
|
||||
import { buildProtectedDownloadPath, buildRegisterPath } from './site-routes'
|
||||
|
||||
const env = import.meta.env as Record<string, string | undefined>
|
||||
|
||||
|
|
@ -54,7 +54,7 @@ export const planCatalog = [
|
|||
name: 'Explorer',
|
||||
price: 'Free',
|
||||
ctaLabel: 'Start in the browser',
|
||||
ctaHref: '/register',
|
||||
ctaHref: buildRegisterPath('/app'),
|
||||
notes: 'Preview the browser account shell, operator dashboard, release notes, and desktop onboarding posture.',
|
||||
features: [
|
||||
'Browser account access',
|
||||
|
|
@ -67,8 +67,8 @@ export const planCatalog = [
|
|||
key: 'operator',
|
||||
name: 'Operator',
|
||||
price: readTrimmedEnv('VITE_PLAN_PRICE_OPERATOR', 'Launch pricing via Paddle'),
|
||||
ctaLabel: operatorCheckoutUrl ? 'Open Paddle checkout' : 'Request operator access',
|
||||
ctaHref: operatorCheckoutUrl || buildSupportPath('operator-access'),
|
||||
ctaLabel: operatorCheckoutUrl ? 'Open Paddle checkout' : 'Open protected downloads',
|
||||
ctaHref: operatorCheckoutUrl || buildProtectedDownloadPath('windows'),
|
||||
notes: 'Desktop-first recognition, replay, training, and higher-dimensional runtime ownership for active training operators.',
|
||||
features: [
|
||||
'Desktop download access',
|
||||
|
|
@ -81,8 +81,8 @@ export const planCatalog = [
|
|||
key: 'studio',
|
||||
name: 'Studio',
|
||||
price: readTrimmedEnv('VITE_PLAN_PRICE_STUDIO', 'Contact for launch readiness'),
|
||||
ctaLabel: studioCheckoutUrl ? 'Open Paddle checkout' : 'Talk to HyperTwist',
|
||||
ctaHref: studioCheckoutUrl || buildSupportPath('studio-rollout'),
|
||||
ctaLabel: studioCheckoutUrl ? 'Open Paddle checkout' : 'Open protected rollout lane',
|
||||
ctaHref: studioCheckoutUrl || '/app/browser-access',
|
||||
notes: 'Higher-dimensional families, operator deployment support, and packaging/validation coordination for production lanes.',
|
||||
features: [
|
||||
'Magic120Cell and 5D operator posture',
|
||||
|
|
|
|||
|
|
@ -762,6 +762,11 @@ export const resourceCollections = [
|
|||
] as const
|
||||
|
||||
export const changelogEntries = [
|
||||
{
|
||||
date: 'June 24, 2026',
|
||||
title: 'About and Support now surface live launch posture plus packaged desktop proof',
|
||||
details: 'The public About and Support pages no longer talk about maturity only in abstract terms. They now expose the same current launch-readiness callout and Windows packaged-proof section already used by the other public manual surfaces, so narrative, rollout, and help pages stay anchored to current native release evidence.',
|
||||
},
|
||||
{
|
||||
date: 'June 24, 2026',
|
||||
title: 'Public support topics now preserve exact protected destinations through auth',
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue