diff --git a/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_AUTH_BILLING_AND_DISTRIBUTION_PACKET_2026-06-22.md b/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_AUTH_BILLING_AND_DISTRIBUTION_PACKET_2026-06-22.md index 910c466..867c3a2 100644 --- a/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_AUTH_BILLING_AND_DISTRIBUTION_PACKET_2026-06-22.md +++ b/docs/ops/HYPERTWIST_PUBLIC_WEBSITE_AUTH_BILLING_AND_DISTRIBUTION_PACKET_2026-06-22.md @@ -115,6 +115,10 @@ That auth/server health surface now also reports: - whether the shared SuperTokens core is merely configured or actually reachable - the reported core API version when reachable - whether fallback posture is currently active and why +- the signed-in auth method plus currently available provider lineup for the + deployment +- the current runtime origins and cookie/public-origin posture that still gate + whether the protected browser lane should be read as fully production-ready The protected dashboard now also has a first-party launch-readiness panel for: @@ -124,6 +128,17 @@ The protected dashboard now also has a first-party launch-readiness panel for: - backend webhook-secret and billing-map configuration posture - public auth runtime posture, cookie-hardening posture, and local-vs-public runtime diagnostics +The adjacent protected account route now also mirrors that same signed-in +auth/session-authority truth instead of reducing the account lane to a thinner +identity-and-billing shell than the main protected dashboard. + +The homepage, docs, and download surfaces now also share a tighter reusable +first-session operator quickstart, and the protected dashboard mirrors that +same end-to-end path after sign-in, so release-target choice, desktop-link +pairing, first native classic-cube verification, higher-dimensional +verification, and the current XR/controller `No-Go` boundary are visible in +one deliberate manual lane instead of being scattered across unrelated cards. + The public pricing, download, and notices routes now also mirror that same bounded launch-truth posture through first-party preview-versus-launch callouts so external-facing copy no longer depends on operators opening the protected diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md index 1d82b67..d1e184c 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -1011,6 +1011,60 @@ Current audit note: - `scripts/run-hypertwist-gitnexus-analyze.sh` - `scripts/run-hypertwist-gitnexus-status.sh` +## Latest protected auth/session authority follow-up (`2026-06-27`) + +- the next same-family protected-shell continuation then brought the signed-in + account and dashboard lanes up to the same auth honesty now visible on the + public docs and auth-entry surfaces: + - the dashboard and account routes now share a fuller protected auth/session + authority surface instead of collapsing signed-in identity down to one thin + `Auth stack` line + - signed-in operators can now see the current auth method, provider lineup, + shared-auth readiness, runtime origins, cookie posture, fallback status, + and deployment diagnostics directly inside the protected shell + - this keeps protected account review, release access, and browser-to-desktop + pairing closer to the real shared-auth/runtime authority instead of making + the public docs more explicit than the signed-in shell itself +- focused protected-surface validation for that continuation stayed green + under: + - `npm --prefix website test -- --run src/__tests__/DashboardOverviewPage.test.tsx src/__tests__/protected-app-pages.test.tsx src/__tests__/app-route-tree.test.tsx` + - `3` test files passed + - `22` tests passed + - `npm --prefix website run type-check` + +## Latest first-session public/protected manual follow-up (`2026-06-27`) + +- the next same-family public/manual continuation then tightened the practical + “how do I actually use HyperTwist end to end?” story instead of leaving that + journey distributed across too many adjacent cards: + - homepage, docs, and download now share a reusable first-session + quickstart covering release-target choice, protected dashboard pairing, + first classic-cube verification, higher-dimensional verification, and the + explicit XR/controller `No-Go` boundary + - the protected dashboard now mirrors that same quickstart after sign-in so + account state, desktop-link pairing, first launch, and native-runtime + boundary truth remain visible together inside the operator shell + - this keeps the public manual professional without inventing browser + simulator parity or widening the native XR branch +- focused validation for that continuation stayed green under: + - `npm --prefix website test -- --run src/__tests__/DashboardOverviewPage.test.tsx src/__tests__/public-marketing-pages.test.tsx` + - `2` test files passed + - `16` tests passed + - `npm --prefix website run type-check` +- the same-family umbrella and tooling gates then stayed green again under: + - `scripts/run-hypertwist-web-surface-validation.sh` + - website focused route/auth/release suite: `12` files, `68` tests passed + - website/server suite: `10` files, `36` tests passed + - website and `Content/Browser` production audits: `found 0 vulnerabilities` + - auth-server retained only the already-documented upstream + `supertokens-node -> nodemailer` residual + - `scripts/run-hypertwist-sentrux-source-only.sh` + - `Quality: 6217` + - `scripts/run-hypertwist-gitnexus-analyze.sh` + - `16,312` nodes, `38,387` edges, `672` clusters, `300` flows + - `scripts/run-hypertwist-gitnexus-status.sh` + - `Status: up-to-date` + ## Latest native/public control-roster parity follow-up (`2026-06-25`) - the same-family native/operator continuity lane then aligned the shipped diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md b/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md index 4ca4a67..c8aee03 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md @@ -268,8 +268,8 @@ repo. | Feature | Status | Primary authority | Notes | |---|---|---|---| -| Public `hypertwist.app` marketing shell | Implemented now | first-party `website/` app + feature registry/roadmap authority | HyperTwist now has a dedicated first-party public web surface for homepage, feature atlas, about, resources, pricing, download, support, and legal routes. This lane is separate from the embedded Unreal browser runtime under `Content/Browser/` and does not claim browser-simulator parity. The same public lane now also serves as a bounded operator/distribution manual through the docs/resources/download/support surfaces, the public feature-atlas route, and related launch/status surfaces, explaining browser-versus-desktop posture, rollout steps, package proof, simulator-use guidance, and current input/device truth without claiming browser ownership of the native runtime or overclaiming unfinished VR/controller posture. The same package now also carries a first-party external runtime-readiness verifier so deploy-time env and live health posture can be checked outside the dashboard, plus separated local-versus-production env templates whose placeholder values are intentionally rejected until real launch config is in place, bootstrap CI now validates both the frontend and auth-server website commands directly, and the auth server can now auto-serve the built `website/dist` bundle with bounded SPA fallback for same-origin public deployment. Request-level server coverage now also proves that public/app shell delivery does not shadow `/api/*`, `/auth*`, `/health`, or missing asset paths, while the pricing/download/notices routes now surface first-party preview-versus-launch posture from the same bounded launch checklist instead of relying on hidden operator-only status. The shared marketing shell now also carries a compact public-site-status banner across public pages, the homepage keeps a fuller status section, and the shared public launch-status component now consumes live auth-health webhook/runtime truth in addition to release-manifest download readiness so public marketing copy does not claim launch posture from static checkout/download config alone. The auth server now also emits an authoritative `launch` summary on `/api/auth/health`, including required blocker labels, billing product/price-map gates, and current checkout targets, so the public banner and protected dashboard no longer duplicate launch-blocker evaluation client-side. A later same-family continuation then widened that release-manifest authority again to carry public runtime commerce config for operator/studio checkout URLs and live plan-price strings, so pricing, notices, and dashboard launch-readiness surfaces no longer depend only on frontend build-time checkout config. The live website lane now also owns route-aware title/description/canonical/Open-Graph/Twitter metadata for the real `hypertwist.app` marketing surface so deployed public pages no longer remain on a single generic SPA title/description, plus first-party `robots.txt` and `sitemap.xml` assets for the public route set while keeping `/app`, `/login`, and `/register` out of crawler posture. The real `check-runtime-readiness` CLI is now also exercised against the checked-in production example env files, and a spawned `website/server` bootstrap proof now verifies the live same-origin process path from production-shaped env into `/health`, `/api/auth/health`, built-shell serving, and the public anonymous release-manifest posture for the shared desktop release lane. The same verifier now also probes the deployed root-shell marker and can explicitly fail when the public origin is still serving the older placeholder rollout page instead of the first-party website/auth-server lane, while the repo now also carries first-party `website/deploy/` `nginx` plus `systemd` handoff templates, a concrete same-origin public-host cutover guide, a deployment-file renderer that emits resolved operator outputs from real checkout paths, and a manifest-driven bundle renderer that lets one authoritative input own the public origin while emitting validated env plus install artifacts together, with the shared-VPS-safe default upstream moved to `3011` after live host inspection confirmed `3001` is already occupied by FamiliarOS. The same deployment lane now also distinguishes `launch` from `preview` posture so honest missing checkout/download/webhook/release values are accepted only for non-public rehearsal while placeholder strings still fail, `runtime.mode: mixed` plus `public_origin_ready: true` counts as valid preview-host proof, and the staging helper can archive either committed `HEAD` or the live worktree through `--archive-source worktree`. An isolated VPS-local staging proof then confirmed that both the committed HyperTwist website lane and the later preview-tier worktree packet can serve green health, release-manifest, and first-party shell responses on that real shared host behind `3011`, and a later root-owned cutover then replaced the public placeholder site with the live first-party same-origin preview deployment on `https://hypertwist.app`. The package now also ships a bounded root-owned live-deploy helper that stages the committed checkout, uploads the rendered bundle, installs env, rebuilds the site, replaces the live `systemd` plus `nginx` files, and validates the public origin; that helper has already been re-proved idempotently against the live host. The repo now also ships that host-proof flow as a first-party staging helper so future sessions can rerun the temp checkout/build/boot verification path directly before or after root-owned cutover. The website lane now also owns a sanitized generated packaged-validation summary for the Windows higher-dimensional desktop proof, rendered from the checked-in authoritative package report into `website/src/shared/generated/windows-package-validation-summary.json`, and the owned web-surface validation gate now checks that generated proof for freshness before approving the current public/auth/download/browser lane. The remaining public conversion seams now also stop dead-ending on generic sign-in/support detours when the next lane is already known: the explorer CTA preserves `/register?next=/app`, operator fallback opens the protected downloads lane, studio fallback opens the protected browser-access rollout lane, and launch/download fallback callouts now point directly at protected release, notices, or dashboard follow-through. The narrative/help surfaces then widened again so the public About and Support pages also surface the same live launch-readiness callout and packaged desktop-proof section already used by the stronger public manual routes, keeping maturity language attached to current native release evidence instead of leaving those pages purely abstract. The same public manual continuation now also adds a direct reusable surface-choice guide across the homepage, About, Pricing, Download, and Support pages so operators no longer have to infer from the larger surface matrix alone when they should stay on the public web surface, move into the protected dashboard, or move into the packaged desktop runtime. A later same-family continuation then propagated that same guide through the remaining public feature/docs/resources/changelog/legal pages as well, so the whole public site now preserves one consistent browser-versus-protected-versus-desktop handoff story instead of leaving those lower-traffic surfaces on older implicit wording. A further same-day manual-clarity continuation then added a reusable direct comparison section across the homepage, About, Docs, and Download routes explaining why the website remains necessary, where it is intentionally narrower than the simulator, why the native Unreal runtime stays primary, and how the current keyboard or mouse versus unfinished XR/controller truth should be read. The latest same-family parity follow-up then widened that exact browser-versus-desktop reality section into Pricing and Resources as well, so commercial and reference-heavy public routes no longer rely only on the lighter surface-choice guide when explaining what stays native and where the current XR/controller boundary still begins. The next adjacent parity follow-up then extended the same direct comparison into the public Feature atlas and Support routes as well, so the remaining major public operator-facing surfaces no longer fall back to the lighter guide alone when capability review or recovery work needs the sharper website-versus-native split. A later same-family continuity follow-up then widened the shared release-decision guide into the remaining public legal/notices routes too, so open-source notices, privacy, terms, and shipping/payment now also tell the operator whether the next honest move is protected desktop access, pricing/provisioning, protected browser/account continuity, or notices/source follow-through instead of leaving those pages on the older lighter handoff only. The same browser shell now also has a first-party top-level runtime-recovery boundary, so unexpected React route failures degrade into a HyperTwist-owned retry/return surface that keeps the browser-versus-desktop product truth explicit instead of collapsing into a blank shell. | -| Browser-based operator/account dashboard | Implemented now | first-party `website/` app + shared auth/dashboard packet | A protected browser dashboard is now live for operator access, account state, download posture, browser-access boundary explanation, notices review, and bounded billing/entitlement status. It reuses the shared SuperTokens auth posture proven in FamiliarOS and ScriptoriumAI while remaining HyperTwist-specific in product content and boundary claims, the current auth-health surface now truthfully distinguishes configured versus reachable or ready shared-core posture while exposing fallback-active reason instead of hardcoding readiness, and the same dashboard now also surfaces launch-readiness truth for download URLs, checkout links, source/notices URLs, billing-secret/map configuration, and local-versus-public runtime deployment posture. The same shared-auth lane now also carries end-to-end optional provider parity for GitHub, Google, and bounded ORCID sign-in: the auth server owns the ORCID custom-provider path, the same-origin bundle emits matching ORCID frontend/server env truth, auth-health reports ORCID readiness alongside the other providers, and the public docs route now exposes the current browser-account method lineup instead of leaving provider truth visible only on the form pages. The same protected overview now also consumes the server-backed Windows packaged-validation summary that the release-manifest authority exposes, so operators can see current higher-dimensional desktop proof without drilling into the dedicated downloads screen. The adjacent protected `/app/browser-access` and `/app/notices` routes now also reuse the bounded escalation-map and release-follow-through guidance from the public support/manual lane, so sign-in does not degrade operator troubleshooting quality into a thinner shell than the public surface. The protected overview and protected download center now also mirror the same launch-readiness, operator-access, and studio-rollout help lanes as the public support/manual surface, but translate those actions into direct signed-in dashboard, downloads, browser-access, account, notices, pricing, and release-notes targets instead of sending the operator back through anonymous auth detours. A later same-family parity follow-up then added the same blunt browser-versus-desktop reality explanation to the protected dashboard, protected downloads, and browser-access routes as well, so sign-in no longer makes the product boundary or unfinished XR/controller truth less explicit than the public manual. The next adjacent parity follow-up then extended that same compact reality panel into the protected account and notices routes too, so entitlement review and distribution/compliance work no longer soften the browser-support versus native-simulator split after sign-in. The auth entry pages now also render the same browser-versus-desktop truth before sign-in is even complete, so login and register no longer rely only on next-step routing plus later dashboard surfaces to explain what stays native and where the current XR/controller boundary still begins. The protected fallback path now also preserves signed-in viewer plan/access posture from local session truth when live manifest authority is temporarily unavailable, while still keeping download authority conservative until the auth server returns. The shared browser auth layer now also has a bounded release-authority reconciliation path that refreshes and persists the local browser session snapshot from fresher manifest viewer truth, while the dashboard and account surfaces expose a compact live-authority sync notice summarizing what changed so operators can see the session catch-up clearly. That same auth layer now also clears stale stored sessions when shared auth is configured and `/api/auth/me` returns `401`, while still preserving the intended offline/local-fallback posture when the account API is merely unreachable or shared auth is not configured. Focused frontend coverage now also protects deep-link login redirect preservation, safe `next`-path normalization across auth entry points, fallback/email auth-bootstrap normalization, login/register continuation behavior, public download-gating behavior, protected-route/shell behavior, real lazy-route tree behavior for key public and protected paths, top-level app-bootstrap and SuperTokens-wrapper posture, login/register unhappy-path and OAuth-button behavior, support-topic fallback routing when live checkout is not configured, desktop-link verify-url/dashboard readiness behavior, and explicit `noindex,nofollow` posture on protected/auth browser surfaces. The validation lane now also has a bounded signed test-session harness under `TEST_MODE=testing` that proves `/api/auth/me`, stale-session invalidation, release-authority reconciliation, and `/api/auth/desktop-link` behavior through the live spawned auth-server process without widening production auth posture. | +| Public `hypertwist.app` marketing shell | Implemented now | first-party `website/` app + feature registry/roadmap authority | HyperTwist now has a dedicated first-party public web surface for homepage, feature atlas, about, resources, pricing, download, support, and legal routes. This lane is separate from the embedded Unreal browser runtime under `Content/Browser/` and does not claim browser-simulator parity. The same public lane now also serves as a bounded operator/distribution manual through the docs/resources/download/support surfaces, the public feature-atlas route, and related launch/status surfaces, explaining browser-versus-desktop posture, rollout steps, package proof, simulator-use guidance, and current input/device truth without claiming browser ownership of the native runtime or overclaiming unfinished VR/controller posture. The same package now also carries a first-party external runtime-readiness verifier so deploy-time env and live health posture can be checked outside the dashboard, plus separated local-versus-production env templates whose placeholder values are intentionally rejected until real launch config is in place, bootstrap CI now validates both the frontend and auth-server website commands directly, and the auth server can now auto-serve the built `website/dist` bundle with bounded SPA fallback for same-origin public deployment. Request-level server coverage now also proves that public/app shell delivery does not shadow `/api/*`, `/auth*`, `/health`, or missing asset paths, while the pricing/download/notices routes now surface first-party preview-versus-launch posture from the same bounded launch checklist instead of relying on hidden operator-only status. The shared marketing shell now also carries a compact public-site-status banner across public pages, the homepage keeps a fuller status section, and the shared public launch-status component now consumes live auth-health webhook/runtime truth in addition to release-manifest download readiness so public marketing copy does not claim launch posture from static checkout/download config alone. The auth server now also emits an authoritative `launch` summary on `/api/auth/health`, including required blocker labels, billing product/price-map gates, and current checkout targets, so the public banner and protected dashboard no longer duplicate launch-blocker evaluation client-side. A later same-family continuation then widened that release-manifest authority again to carry public runtime commerce config for operator/studio checkout URLs and live plan-price strings, so pricing, notices, and dashboard launch-readiness surfaces no longer depend only on frontend build-time checkout config. The live website lane now also owns route-aware title/description/canonical/Open-Graph/Twitter metadata for the real `hypertwist.app` marketing surface so deployed public pages no longer remain on a single generic SPA title/description, plus first-party `robots.txt` and `sitemap.xml` assets for the public route set while keeping `/app`, `/login`, and `/register` out of crawler posture. The real `check-runtime-readiness` CLI is now also exercised against the checked-in production example env files, and a spawned `website/server` bootstrap proof now verifies the live same-origin process path from production-shaped env into `/health`, `/api/auth/health`, built-shell serving, and the public anonymous release-manifest posture for the shared desktop release lane. The same verifier now also probes the deployed root-shell marker and can explicitly fail when the public origin is still serving the older placeholder rollout page instead of the first-party website/auth-server lane, while the repo now also carries first-party `website/deploy/` `nginx` plus `systemd` handoff templates, a concrete same-origin public-host cutover guide, a deployment-file renderer that emits resolved operator outputs from real checkout paths, and a manifest-driven bundle renderer that lets one authoritative input own the public origin while emitting validated env plus install artifacts together, with the shared-VPS-safe default upstream moved to `3011` after live host inspection confirmed `3001` is already occupied by FamiliarOS. The same deployment lane now also distinguishes `launch` from `preview` posture so honest missing checkout/download/webhook/release values are accepted only for non-public rehearsal while placeholder strings still fail, `runtime.mode: mixed` plus `public_origin_ready: true` counts as valid preview-host proof, and the staging helper can archive either committed `HEAD` or the live worktree through `--archive-source worktree`. An isolated VPS-local staging proof then confirmed that both the committed HyperTwist website lane and the later preview-tier worktree packet can serve green health, release-manifest, and first-party shell responses on that real shared host behind `3011`, and a later root-owned cutover then replaced the public placeholder site with the live first-party same-origin preview deployment on `https://hypertwist.app`. The package now also ships a bounded root-owned live-deploy helper that stages the committed checkout, uploads the rendered bundle, installs env, rebuilds the site, replaces the live `systemd` plus `nginx` files, and validates the public origin; that helper has already been re-proved idempotently against the live host. The repo now also ships that host-proof flow as a first-party staging helper so future sessions can rerun the temp checkout/build/boot verification path directly before or after root-owned cutover. The website lane now also owns a sanitized generated packaged-validation summary for the Windows higher-dimensional desktop proof, rendered from the checked-in authoritative package report into `website/src/shared/generated/windows-package-validation-summary.json`, and the owned web-surface validation gate now checks that generated proof for freshness before approving the current public/auth/download/browser lane. The remaining public conversion seams now also stop dead-ending on generic sign-in/support detours when the next lane is already known: the explorer CTA preserves `/register?next=/app`, operator fallback opens the protected downloads lane, studio fallback opens the protected browser-access rollout lane, and launch/download fallback callouts now point directly at protected release, notices, or dashboard follow-through. The narrative/help surfaces then widened again so the public About and Support pages also surface the same live launch-readiness callout and packaged desktop-proof section already used by the stronger public manual routes, keeping maturity language attached to current native release evidence instead of leaving those pages purely abstract. The same public manual continuation now also adds a direct reusable surface-choice guide across the homepage, About, Pricing, Download, and Support pages so operators no longer have to infer from the larger surface matrix alone when they should stay on the public web surface, move into the protected dashboard, or move into the packaged desktop runtime. A later same-family continuation then propagated that same guide through the remaining public feature/docs/resources/changelog/legal pages as well, so the whole public site now preserves one consistent browser-versus-protected-versus-desktop handoff story instead of leaving those lower-traffic surfaces on older implicit wording. A further same-day manual-clarity continuation then added a reusable direct comparison section across the homepage, About, Docs, and Download routes explaining why the website remains necessary, where it is intentionally narrower than the simulator, why the native Unreal runtime stays primary, and how the current keyboard or mouse versus unfinished XR/controller truth should be read. The latest same-family parity follow-up then widened that exact browser-versus-desktop reality section into Pricing and Resources as well, so commercial and reference-heavy public routes no longer rely only on the lighter surface-choice guide when explaining what stays native and where the current XR/controller boundary still begins. The next adjacent parity follow-up then extended the same direct comparison into the public Feature atlas and Support routes as well, so the remaining major public operator-facing surfaces no longer fall back to the lighter guide alone when capability review or recovery work needs the sharper website-versus-native split. A later same-family continuity follow-up then widened the shared release-decision guide into the remaining public legal/notices routes too, so open-source notices, privacy, terms, and shipping/payment now also tell the operator whether the next honest move is protected desktop access, pricing/provisioning, protected browser/account continuity, or notices/source follow-through instead of leaving those pages on the older lighter handoff only. The same browser shell now also has a first-party top-level runtime-recovery boundary, so unexpected React route failures degrade into a HyperTwist-owned retry/return surface that keeps the browser-versus-desktop product truth explicit instead of collapsing into a blank shell. A later same-family quickstart/manual continuation then added a reusable first serious-session guide across homepage, docs, and download so operators can see the real path from release-target choice through desktop-link pairing, first native verification, higher-dimensional verification, and the current XR/controller `No-Go` boundary in one place instead of reconstructing that flow from scattered adjacent sections. | +| Browser-based operator/account dashboard | Implemented now | first-party `website/` app + shared auth/dashboard packet | A protected browser dashboard is now live for operator access, account state, download posture, browser-access boundary explanation, notices review, and bounded billing/entitlement status. It reuses the shared SuperTokens auth posture proven in FamiliarOS and ScriptoriumAI while remaining HyperTwist-specific in product content and boundary claims, the current auth-health surface now truthfully distinguishes configured versus reachable or ready shared-core posture while exposing fallback-active reason instead of hardcoding readiness, and the same dashboard now also surfaces launch-readiness truth for download URLs, checkout links, source/notices URLs, billing-secret/map configuration, and local-versus-public runtime deployment posture. The same shared-auth lane now also carries end-to-end optional provider parity for GitHub, Google, and bounded ORCID sign-in: the auth server owns the ORCID custom-provider path, the same-origin bundle emits matching ORCID frontend/server env truth, auth-health reports ORCID readiness alongside the other providers, and the public docs route now exposes the current browser-account method lineup instead of leaving provider truth visible only on the form pages. The same protected overview now also consumes the server-backed Windows packaged-validation summary that the release-manifest authority exposes, so operators can see current higher-dimensional desktop proof without drilling into the dedicated downloads screen. The adjacent protected `/app/browser-access` and `/app/notices` routes now also reuse the bounded escalation-map and release-follow-through guidance from the public support/manual lane, so sign-in does not degrade operator troubleshooting quality into a thinner shell than the public surface. The protected overview and protected download center now also mirror the same launch-readiness, operator-access, and studio-rollout help lanes as the public support/manual surface, but translate those actions into direct signed-in dashboard, downloads, browser-access, account, notices, pricing, and release-notes targets instead of sending the operator back through anonymous auth detours. A later same-family parity follow-up then added the same blunt browser-versus-desktop reality explanation to the protected dashboard, protected downloads, and browser-access routes as well, so sign-in no longer makes the product boundary or unfinished XR/controller truth less explicit than the public manual. The next adjacent parity follow-up then extended that same compact reality panel into the protected account and notices routes too, so entitlement review and distribution/compliance work no longer soften the browser-support versus native-simulator split after sign-in. The auth entry pages now also render the same browser-versus-desktop truth before sign-in is even complete, so login and register no longer rely only on next-step routing plus later dashboard surfaces to explain what stays native and where the current XR/controller boundary still begins. A later same-family protected-shell continuation then widened signed-in auth truth itself, so the dashboard and account routes now surface the auth method, current provider lineup, shared-auth readiness, runtime origins, cookie/public-origin posture, fallback state, and deployment diagnostics directly instead of collapsing that truth down to a thin stack label. The protected fallback path now also preserves signed-in viewer plan/access posture from local session truth when live manifest authority is temporarily unavailable, while still keeping download authority conservative until the auth server returns. The shared browser auth layer now also has a bounded release-authority reconciliation path that refreshes and persists the local browser session snapshot from fresher manifest viewer truth, while the dashboard and account surfaces expose a compact live-authority sync notice summarizing what changed so operators can see the session catch-up clearly. That same auth layer now also clears stale stored sessions when shared auth is configured and `/api/auth/me` returns `401`, while still preserving the intended offline/local-fallback posture when the account API is merely unreachable or shared auth is not configured. Focused frontend coverage now also protects deep-link login redirect preservation, safe `next`-path normalization across auth entry points, fallback/email auth-bootstrap normalization, login/register continuation behavior, public download-gating behavior, protected-route/shell behavior, real lazy-route tree behavior for key public and protected paths, top-level app-bootstrap and SuperTokens-wrapper posture, login/register unhappy-path and OAuth-button behavior, support-topic fallback routing when live checkout is not configured, desktop-link verify-url/dashboard readiness behavior, and explicit `noindex,nofollow` posture on protected/auth browser surfaces. The validation lane now also has a bounded signed test-session harness under `TEST_MODE=testing` that proves `/api/auth/me`, stale-session invalidation, release-authority reconciliation, and `/api/auth/desktop-link` behavior through the live spawned auth-server process without widening production auth posture. | | Desktop download posture and browser-to-desktop pairing | Implemented now | first-party `website/` app + `website/server` desktop-link endpoints | Public download targets, dashboard-side release posture, and short-lived desktop-link token generation/verification are now first-party owned. The current server posture now enforces exact website-origin matching, bounded per-user issuance, one-time token consumption, and billing-backed plan/download entitlement resolution with focused `website/server` tests green on `2026-06-22`, and the verify handshake now returns the same resolved download-entitlement posture the dashboard sees instead of only identity plus plan/role. The same lane now also owns a shared `GET /api/releases/manifest` runtime authority for release version/channel/build/published/file-size/checksum/docs/source metadata, with anonymous callers intentionally denied raw download URLs while entitled session-backed callers receive the configured direct platform URL. That manifest now also carries first-party packaged-validation summary truth for the Windows higher-dimensional desktop lane, so the public `/download` page, the public `/resources` reference page, and the protected `/app/downloads` surface can project real package evidence for the dedicated-family `Magic120Cell` / `MagicCube5D` maps even while launch-tier release URLs remain unconfigured. That website-facing packaged proof is now sourced through a sanitized generated summary rendered from the checked-in authoritative `phase6c_dedicated_family_package_validation_report.json`, and the owned web-surface validation gate now checks that generated summary for freshness before approving the current public/auth/download/browser lane. The public `/download` page now keeps raw download URLs behind the protected dashboard instead of exposing them directly, preserves requested platform continuity through `/app/downloads?platform=...`, and surfaces that requested target again after auth handoff inside the protected release lane. The public download fallbacks now also open exact protected download and dashboard follow-through instead of stopping at a generic anonymous login hop. When live manifest authority is unavailable, the protected fallback path now still reflects the signed-in viewer posture from local session truth while continuing to withhold raw delivery authority. When live manifest authority resolves fresher entitled viewer truth than the local browser auth snapshot, the protected download-center lane now also follows that server-backed viewer posture for the actual download action instead of leaving the operator blocked behind stale local session state. Both the public and protected download surfaces now also carry first-party rollout steps, first-launch desktop setup guidance, browser-to-desktop pairing follow-through, and release/notices/source references so the desktop setup lane is more than a generic link bucket, while the support surface now carries an explicit escalation map separating account, package, runtime, and rollout/compliance problems. The protected dashboard overview and protected account surface now also mirror that same first-launch follow-through, and the protected browser-access/notices routes now mirror the same escalation separation, so post-sign-in operator guidance does not collapse back into a thinner release-only shell. The protected download center now also mirrors the same three help-topic lanes used by the public support/manual surface, but with direct signed-in actions for downloads, dashboard, account, browser access, notices, and release notes so entitled operators can stay inside the protected rollout lane once auth has already succeeded. The dashboard plus public launch-status callouts now consume the same manifest-backed Windows download truth instead of only static frontend config. Actual release URLs remain deployment configuration rather than hardcoded product truth. | | Paddle-ready pricing and billing webhook seam | Implemented now | first-party `website/` app + `website/server` billing endpoint | The public pricing surface now exists with plan structure, checkout-link configuration seams, and the same `/api/billing/paddle/webhook` endpoint family used by the broader product website lane. The current server now verifies `Paddle-Signature` against `PADDLE_WEBHOOK_SECRET` using the documented raw-body HMAC flow, persists a bounded first-party billing state file, and applies verified Paddle events into account/download entitlement state that the browser dashboard consumes, with focused `website/server` tests green on `2026-06-22`. The shared `GET /api/releases/manifest` authority now also carries public runtime commerce config for operator/studio checkout URLs and live plan-price strings, allowing the pricing page to switch from frontend build-time checkout assumptions to auth-server runtime truth when those values are configured. The fallback plan CTAs now also use exact protected release/browser-access targets when live checkout URLs are absent, instead of routing operators back into a vague public support detour. A spawned live-process proof now also verifies that a real signed webhook updates processed-event health and persisted billing state through the actual auth-server runtime, not only helper-level store tests, and transaction events no longer leak their id into stored `subscriptionId` state. Production checkout URLs, secret management, and broader operator/admin billing workflows remain deployment/application tasks, not shipped-code omissions. | | Public open-source notices and corresponding-source surface | Implemented now | first-party `website/` app + `HYPERTWIST_MPL_DISTRIBUTION_PLACEMENT_CHECKLIST_2026-05-25.md` | HyperTwist now has a stable public `Open Source Notices` route linked from pricing, download, and footer surfaces, satisfying the requirement that public distribution surfaces expose notice and corresponding-source guidance when shipped builds contain `MPL`-covered material. The exact public corresponding-source URL still must be configured before external launch. | diff --git a/website/README.md b/website/README.md index c1b4589..269acca 100644 --- a/website/README.md +++ b/website/README.md @@ -71,6 +71,11 @@ manual: that same native control/settings roster after sign-in, so entitled users do not lose the current simulator-control truth when they move from the public manual into the operator shell +- the homepage, docs, and download surfaces now also share a tighter first + serious-session quickstart, and the protected dashboard mirrors that same + end-to-end operator path after sign-in so access, pairing, first launch, and + the current XR/controller boundary do not have to be reconstructed from + scattered cards - the protected app shell now also carries richer operator-facing browser boundary, account, entitlement, and notices guidance instead of treating those routes as thin placeholders beside the main dashboard @@ -230,6 +235,37 @@ Latest protected control-roster follow-up later on `2026-06-24`: - `41` test files passed - `168` tests passed +Latest first-session quickstart/manual follow-up on `2026-06-27`: + +- the public and protected manual lane now explains the first real operator + journey more directly instead of forcing users to stitch it together from + several adjacent page sections: + - homepage, docs, and download now share a reusable first-session + quickstart covering release-target choice, protected pairing, first native + classic-cube verification, higher-dimensional verification, and the + explicit XR/controller `No-Go` boundary + - the protected dashboard now mirrors that same first-session path after + sign-in so browser account work, desktop-link pairing, first launch, and + runtime-boundary truth remain visible together +- focused validation for that continuation stayed green under: + - `npm --prefix website test -- --run src/__tests__/DashboardOverviewPage.test.tsx src/__tests__/public-marketing-pages.test.tsx` + - `2` test files passed + - `16` tests passed + - `npm --prefix website run type-check` +- the same-family umbrella, structural, and analysis gates then stayed green + again under: + - `scripts/run-hypertwist-web-surface-validation.sh` + - website focused route/auth/release suite: `12` files, `68` tests passed + - website/server suite: `10` files, `36` tests passed + - website and `Content/Browser` production audits: `found 0 vulnerabilities` + - `scripts/run-hypertwist-sentrux-source-only.sh` + - `Quality: 6217` + - `All rules pass` + - `scripts/run-hypertwist-gitnexus-analyze.sh` + - `16,312` nodes, `38,387` edges, `672` clusters, `300` flows + - `scripts/run-hypertwist-gitnexus-status.sh` + - `Status: up-to-date` + Current dependency-health truth from the `2026-06-23` hardening pass: - `website/` production audit is clean diff --git a/website/src/__tests__/DashboardOverviewPage.test.tsx b/website/src/__tests__/DashboardOverviewPage.test.tsx index ffdbbda..9bac13e 100644 --- a/website/src/__tests__/DashboardOverviewPage.test.tsx +++ b/website/src/__tests__/DashboardOverviewPage.test.tsx @@ -184,6 +184,10 @@ describe('DashboardOverviewPage', () => { expect(screen.getByText(/This session is currently using local fallback posture/i)).toBeTruthy() expect(screen.getByText(/Shared auth core is not fully ready right now/i)).toBeTruthy() + expect(screen.getByText('Auth and session authority')).toBeTruthy() + expect(screen.getByText('Signed-in method: Email and password')).toBeTruthy() + expect(screen.getByText('Available provider routes: Email/password on, GitHub off, Google off, ORCID off')).toBeTruthy() + expect(screen.getByText('API domain: http://localhost:3001')).toBeTruthy() expect(screen.getByText('What stays intentionally bounded')).toBeTruthy() expect(screen.getByText('Recommended recovery order')).toBeTruthy() expect(screen.getByText(/Public launch is not fully configured yet:/i)).toBeTruthy() @@ -199,11 +203,14 @@ describe('DashboardOverviewPage', () => { expect(screen.getByText('Protected browser-versus-desktop reality')).toBeTruthy() expect(screen.getByText('Current input, XR, and settings truth')).toBeTruthy() expect(screen.getByRole('link', { name: 'Open account' }).getAttribute('href')).toBe('/app/account') - expect(screen.getByRole('link', { name: 'Open browser access' }).getAttribute('href')).toBe('/app/browser-access') + expect(screen.getAllByRole('link', { name: 'Open browser access' }).every((link) => link.getAttribute('href') === '/app/browser-access')).toBe(true) expect(screen.getAllByRole('link', { name: 'Open notices' }).length).toBeGreaterThan(0) expect(screen.getByText('Current packaged desktop proof')).toBeTruthy() expect(screen.getByText('Packaged validation passed')).toBeTruthy() expect(screen.getByText(/Magic120Cell dedicated-family training map: passed/i)).toBeTruthy() + expect(screen.getByText('First simulator session')).toBeTruthy() + expect(screen.getByText('1. Resolve access and choose the right build')).toBeTruthy() + expect(screen.getByText('4. Open the higher-dimensional lanes and read the control boundary honestly')).toBeTruthy() expect(screen.getByText('Native control and settings roster')).toBeTruthy() expect(screen.getAllByText(/classic-wca-keyboard\/v1/i).length).toBeGreaterThan(0) expect(screen.getByText('XR groundwork exists, but the full VR lane is not finished')).toBeTruthy() diff --git a/website/src/__tests__/protected-app-pages.test.tsx b/website/src/__tests__/protected-app-pages.test.tsx index fc88cd5..71a3c72 100644 --- a/website/src/__tests__/protected-app-pages.test.tsx +++ b/website/src/__tests__/protected-app-pages.test.tsx @@ -237,6 +237,10 @@ describe('protected app pages', () => { renderPage(, '/app/account') expect(await screen.findByText('Session profile')).toBeTruthy() + expect(screen.getByText('Auth and session authority')).toBeTruthy() + expect(await screen.findByText(byExactTextContent('Signed-in method: Email and password', 'LI'))).toBeTruthy() + expect(await screen.findByText(byExactTextContent('Available provider routes: Email/password on, GitHub off, Google off, ORCID off', 'LI'))).toBeTruthy() + expect(await screen.findByText(byExactTextContent('API domain: https://hypertwist.app', 'LI'))).toBeTruthy() expect(await screen.findByRole('link', { name: 'Download Windows package' })).toBeTruthy() expect(screen.getByText('Current packaged desktop proof')).toBeTruthy() expect(screen.getByText('Packaged validation passed')).toBeTruthy() diff --git a/website/src/__tests__/public-marketing-pages.test.tsx b/website/src/__tests__/public-marketing-pages.test.tsx index c35f231..544314d 100644 --- a/website/src/__tests__/public-marketing-pages.test.tsx +++ b/website/src/__tests__/public-marketing-pages.test.tsx @@ -275,6 +275,8 @@ describe('public marketing pages', () => { expect(within(downloadDecisionGuideSection as HTMLElement).getByText('Need the protected desktop-download lane?')).toBeTruthy() expect(within(downloadDecisionGuideSection as HTMLElement).getByText('Need notices, corresponding source, or release follow-through?')).toBeTruthy() expect(screen.getByText('First launch and desktop setup')).toBeTruthy() + expect(screen.getByText('First desktop session after install')).toBeTruthy() + expect(screen.getByText('2. Pair the installed runtime without password reuse')).toBeTruthy() expect(screen.getByText('Digital delivery workflow')).toBeTruthy() expect(screen.getByText('Protected entitlement handoff')).toBeTruthy() expect(screen.getByText('Distribution doctrine')).toBeTruthy() @@ -455,6 +457,8 @@ describe('public marketing pages', () => { 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('What the first serious session should look like')).toBeTruthy() + expect(screen.getByText('1. Resolve access and choose the right build')).toBeTruthy() expect(screen.getByText('Choose the right HyperTwist surface')).toBeTruthy() expect(screen.getByText('Move into the protected dashboard')).toBeTruthy() expect(screen.getAllByText('Current surface authority map').length).toBeGreaterThan(0) @@ -1261,6 +1265,7 @@ describe('public marketing pages', () => { expect(screen.getByText('Current shipped capability')).toBeTruthy() expect(screen.getByText('Native training and coaching core')).toBeTruthy() expect(screen.getByText('Operator manual')).toBeTruthy() + expect(screen.getByText('First real desktop session')).toBeTruthy() expect(screen.getByText('Recovery and degraded-state manual')).toBeTruthy() expect(screen.getByText('Support topic quick routes')).toBeTruthy() expect(screen.getAllByText('Current surface authority map').length).toBeGreaterThan(0) @@ -1278,6 +1283,7 @@ describe('public marketing pages', () => { expect(screen.getAllByText('Selectable control and settings roster').length).toBeGreaterThan(0) expect(screen.getAllByText('Keyboard and mouse ship today').length).toBeGreaterThan(0) expect(screen.getAllByText(/classic-wca-keyboard\/v1/i).length).toBeGreaterThan(0) + expect(screen.getByText('4. Open the higher-dimensional lanes and read the control boundary honestly')).toBeTruthy() expect(screen.getByText(/I\/K = R\/R', J\/F = U\/U', H\/G = F\/F'/i)).toBeTruthy() expect(screen.getByText(/OpenXR plugin disabled/i)).toBeTruthy() expect(screen.getByText(/R scramble, H hint, Enter submit, F mode, V hold-to-talk, C cycle voice/i)).toBeTruthy() diff --git a/website/src/pages/app-pages.tsx b/website/src/pages/app-pages.tsx index c991d07..d4412c9 100644 --- a/website/src/pages/app-pages.tsx +++ b/website/src/pages/app-pages.tsx @@ -23,6 +23,7 @@ import { desktopDownloadSteps, desktopFirstLaunchCards, inputAndDevicePostureCards, + operatorDesktopQuickstartCards, productSurfaceMatrixRows, roadmapHonestyCards, supportEscalationCards, @@ -152,6 +153,144 @@ function isUnauthorizedAuthApiError(error: unknown) { && Number((error as { status?: number }).status) === 401 } +function formatAuthMethodLabel(method: PlatformUser['authMethod'] | undefined) { + switch (method) { + case 'email': + return 'Email and password' + case 'github': + return 'GitHub' + case 'google': + return 'Google' + case 'orcid': + return 'ORCID' + case 'supertokens': + return 'Shared SuperTokens session' + default: + return 'Unknown' + } +} + +function ProtectedAuthSessionAuthorityPanel({ + title, + kicker, + user, + superTokensConfigured, + healthQuery, +}: { + title: string + kicker: string + user: PlatformUser | null | undefined + superTokensConfigured: boolean + healthQuery: ReturnType +}) { + return ( + +
    +
  • Signed-in method: {formatAuthMethodLabel(user?.authMethod)}
  • +
  • Auth stack: {superTokensConfigured ? 'SuperTokens-backed' : 'Local fallback mode'}
  • + {healthQuery.data ? ( + <> +
  • Shared auth configured: {healthQuery.data.supertokens.configured ? 'yes' : 'no'}
  • +
  • Shared auth core reachable: {healthQuery.data.supertokens.reachable ? 'yes' : 'no'}
  • +
  • Shared auth ready: {healthQuery.data.supertokens.ready ? 'yes' : 'no'}
  • +
  • Core API version: {healthQuery.data.supertokens.apiVersion || 'unavailable'}
  • +
  • + Available provider routes: Email/password on, GitHub {healthQuery.data.supertokens.oauth?.github ? 'on' : 'off'}, Google {healthQuery.data.supertokens.oauth?.google ? 'on' : 'off'}, ORCID {healthQuery.data.supertokens.oauth?.orcid ? 'on' : 'off'} +
  • +
  • + Fallback posture: {healthQuery.data.fallback.active + ? `active${healthQuery.data.fallback.reason ? ` (${healthQuery.data.fallback.reason})` : ''}` + : 'inactive'} +
  • +
  • Runtime mode: {healthQuery.data.runtime.mode}
  • +
  • API domain: {healthQuery.data.runtime.api_domain}
  • +
  • Website domain: {healthQuery.data.runtime.website_domain}
  • +
  • Cookie secure: {healthQuery.data.runtime.cookie_secure ? 'yes' : 'no'}
  • +
  • Public auth origin ready: {healthQuery.data.runtime.public_origin_ready ? 'yes' : 'no'}
  • + + ) : null} +
+ {healthQuery.isLoading ?

Checking auth server health...

: null} + {healthQuery.isError ? ( + + ) : null} + {healthQuery.data?.fallback.active ? ( + + ) : null} + {healthQuery.data && (healthQuery.data.runtime.errors.length > 0 || healthQuery.data.runtime.warnings.length > 0) ? ( +
+

Runtime deployment diagnostics

+ {healthQuery.data.runtime.errors.length > 0 ? ( +
    + {healthQuery.data.runtime.errors.map((item) => ( +
  • Error: {item}
  • + ))} +
+ ) : null} + {healthQuery.data.runtime.warnings.length > 0 ? ( +
    + {healthQuery.data.runtime.warnings.map((item) => ( +
  • Warning: {item}
  • + ))} +
+ ) : null} +
+ ) : null} +
+ ) +} + function ReleaseAuthorityLinks({ releaseManifest, includePublicNoticesLink = false, @@ -661,6 +800,46 @@ function DesktopFirstLaunchChecklist({ title, kicker }: { title: string; kicker: ) } +function OperatorDesktopQuickstartPanel({ + title, + kicker, + description, +}: { + title: string + kicker: string + description: string +}) { + return ( + +

{description}

+
+ {operatorDesktopQuickstartCards.map((card) => ( +
+

{card.title}

+

{card.description}

+
    + {card.bullets.map((bullet) => ( +
  • {bullet}
  • + ))} +
+
+ ))} +
+
+ + Open downloads + + + Open browser access + + + Open public manual + +
+
+ ) +} + function SupportEscalationChecklist({ title, kicker, @@ -897,9 +1076,9 @@ export function DashboardOverviewPage() {

This session is currently using local fallback posture, not fully shared production auth.

- ) : null} - {releaseManifestQuery.data?.manifest && releaseAuthoritySyncItems.length > 0 ? ( -
+ ) : null} + {releaseManifestQuery.data?.manifest && releaseAuthoritySyncItems.length > 0 ? ( +

Live authority sync

The protected browser session was refreshed from live release authority so the local dashboard view catches up to current account-access truth. @@ -913,100 +1092,13 @@ export function DashboardOverviewPage() { ) : null} - - {healthQuery.isLoading ?

Checking auth server health...

: null} - {healthQuery.isError ? ( - - ) : null} - {healthQuery.data ? ( -
    -
  • Service: {healthQuery.data.service}
  • -
  • SuperTokens configured: {healthQuery.data.supertokens.configured ? 'yes' : 'no'}
  • -
  • SuperTokens core reachable: {healthQuery.data.supertokens.reachable ? 'yes' : 'no'}
  • -
  • SuperTokens ready: {healthQuery.data.supertokens.ready ? 'yes' : 'no'}
  • -
  • Fallback enabled: {healthQuery.data.fallback.enabled ? 'yes' : 'no'}
  • -
  • Fallback active: {healthQuery.data.fallback.active ? 'yes' : 'no'}
  • -
  • Core API version: {healthQuery.data.supertokens.apiVersion || 'unavailable'}
  • -
  • OAuth routes: GitHub {healthQuery.data.supertokens.oauth?.github ? 'on' : 'off'}, Google {healthQuery.data.supertokens.oauth?.google ? 'on' : 'off'}, ORCID {healthQuery.data.supertokens.oauth?.orcid ? 'on' : 'off'}
  • -
  • Runtime mode: {healthQuery.data.runtime.mode}
  • -
  • Cookie secure: {healthQuery.data.runtime.cookie_secure ? 'yes' : 'no'}
  • -
  • Public auth origin ready: {healthQuery.data.runtime.public_origin_ready ? 'yes' : 'no'}
  • -
- ) : null} - {healthQuery.data?.fallback.active ? ( - - ) : null} - {healthQuery.data && (healthQuery.data.runtime.errors.length > 0 || healthQuery.data.runtime.warnings.length > 0) ? ( -
-

Runtime deployment diagnostics

- {healthQuery.data.runtime.errors.length > 0 ? ( -
    - {healthQuery.data.runtime.errors.map((item) => ( -
  • Error: {item}
  • - ))} -
- ) : null} - {healthQuery.data.runtime.warnings.length > 0 ? ( -
    - {healthQuery.data.runtime.warnings.map((item) => ( -
  • Warning: {item}
  • - ))} -
- ) : null} -
- ) : null} - +

Generate a short-lived token so the local desktop runtime can verify your browser session without exposing account credentials.

@@ -1030,6 +1122,12 @@ export function DashboardOverviewPage() { ) : null}
+ +
  • Source: {user?.billing?.source || 'session'}
  • @@ -1478,6 +1576,7 @@ export function AccountPage() { releaseManifest, releaseManifestQuery, } = useProtectedReleaseSurface('account') + const healthQuery = useProtectedAuthHealthQuery('account') const configuredPlatforms = useMemo( () => releaseManifest.platforms.filter((platform) => platform.configured), [releaseManifest.platforms], @@ -1501,7 +1600,6 @@ export function AccountPage() {
  • Desktop downloads: {user?.canDownload ? 'enabled' : 'not yet entitled'}
  • Billing status: {user?.billing?.accessStatus || 'session-default'}
  • Billing source: {user?.billing?.source || 'session'}
  • -
  • Auth stack: {superTokensConfigured ? 'SuperTokens-backed' : 'Local fallback mode'}
{releaseManifestQuery.data?.manifest && releaseAuthoritySyncItems.length > 0 ? (
@@ -1517,6 +1615,13 @@ export function AccountPage() {
) : null}
+ {releaseManifestQuery.isLoading ?

Refreshing release-access posture from the live manifest...

: null} {releaseManifestQuery.isError ? ( diff --git a/website/src/pages/public-page-helpers.tsx b/website/src/pages/public-page-helpers.tsx index 0b784c7..1e36d47 100644 --- a/website/src/pages/public-page-helpers.tsx +++ b/website/src/pages/public-page-helpers.tsx @@ -15,7 +15,11 @@ import { publicDocsUrl, releaseNotesUrl, } from '../site-config' -import { browserDesktopRealityCards, deliverySurfaceCards } from '../site-data' +import { + browserDesktopRealityCards, + deliverySurfaceCards, + operatorDesktopQuickstartCards, +} from '../site-data' import { buildLoginPath, buildProtectedDownloadPath, @@ -296,6 +300,43 @@ export function SurfaceChoiceGuideSection({ ) } +export function OperatorDesktopQuickstartSection({ + title = 'First real desktop session', + description = 'This is the shortest honest path from browser discovery into the native simulator: resolve access, pair the installed runtime safely, verify the first training lane, and keep the current XR/controller boundary visible.', +}: { + title?: string + description?: string +}) { + return ( +
+
+ {operatorDesktopQuickstartCards.map((card) => ( +
+

{card.title}

+

{card.description}

+
    + {card.bullets.map((bullet) => ( +
  • {bullet}
  • + ))} +
+
+ ))} +
+
+ + Open download center + + + Open operator dashboard + + + Open public manual + +
+
+ ) +} + export function PublicPackagedDesktopProofSection({ platform, actions = [], diff --git a/website/src/pages/public-pages-commerce.tsx b/website/src/pages/public-pages-commerce.tsx index a99f2a2..b0b83eb 100644 --- a/website/src/pages/public-pages-commerce.tsx +++ b/website/src/pages/public-pages-commerce.tsx @@ -27,6 +27,7 @@ import { BrowserDesktopRealitySection, DeliverySurfaceResponsibilitiesGrid, explorerFallbackPlan, + OperatorDesktopQuickstartSection, operatorFallbackPlan, PlanActionLink, PublicPackagedDesktopProofSection, @@ -327,6 +328,8 @@ export function DownloadPage() {
+ +
diff --git a/website/src/pages/public-pages-marketing.tsx b/website/src/pages/public-pages-marketing.tsx index 04109d1..37393af 100644 --- a/website/src/pages/public-pages-marketing.tsx +++ b/website/src/pages/public-pages-marketing.tsx @@ -37,6 +37,7 @@ import { import { BrowserDesktopRealitySection, DeliverySurfaceResponsibilitiesGrid, + OperatorDesktopQuickstartSection, PublicPackagedDesktopProofSection, PublicReleaseDecisionGuideSection, ReleaseAuthorityBundleSection, @@ -433,6 +434,8 @@ export function HomeLanding() {
+ +
+ +