From 2e5cf09d1dc2fec40b4b571d7378020b500f9ef4 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Tue, 30 Jun 2026 10:10:24 +0000 Subject: [PATCH] Ship HyperTwist offline operator manual surface --- website/README.md | 3 + .../manual/hypertwist-operator-manual.md | 242 ++++++++++++++++++ .../__tests__/public-marketing-pages.test.tsx | 10 + website/src/pages/public-page-helpers.tsx | 72 +++++- website/src/pages/public-pages-commerce.tsx | 5 + website/src/pages/public-pages-marketing.tsx | 19 +- 6 files changed, 346 insertions(+), 5 deletions(-) create mode 100644 website/public/manual/hypertwist-operator-manual.md diff --git a/website/README.md b/website/README.md index c3d9509..52a85ac 100644 --- a/website/README.md +++ b/website/README.md @@ -64,6 +64,9 @@ manual: - the docs and resources pages now also carry a practical simulator-use manual for recognition, replay, higher-dimensional runtime ownership, and operator diagnostics without overclaiming browser or VR parity +- the website now also ships a same-origin downloadable operator manual at + `website/public/manual/hypertwist-operator-manual.md` so the desktop-first + onboarding and boundary truth can travel offline with the product - the public browser-account method lineup is now also visible on the homepage, pricing, download, support, docs, and getting-started routes so high-traffic decision pages no longer hide provider truth until the auth diff --git a/website/public/manual/hypertwist-operator-manual.md b/website/public/manual/hypertwist-operator-manual.md new file mode 100644 index 0000000..d532f41 --- /dev/null +++ b/website/public/manual/hypertwist-operator-manual.md @@ -0,0 +1,242 @@ +# HyperTwist Operator Manual + +Last updated: 2026-06-30 + +## Purpose + +This manual is the downloadable, public-facing operating guide for HyperTwist. +It mirrors the current browser, protected-dashboard, and desktop-runtime truth +without pretending the optional browser-client branch or unfinished XR lane is +already shipped. + +Use this manual when you need one offline reference for: + +- first-session onboarding +- protected dashboard follow-through +- desktop download and pairing +- current control roster and runtime settings truth +- higher-dimensional runtime ownership +- release, notice, and support follow-through + +## Product topology + +HyperTwist currently has four practical surfaces: + +1. Public website + - product overview + - docs and route atlas + - pricing and launch posture + - notices and release references +2. Protected browser dashboard + - account state + - entitlement and download posture + - browser-to-desktop pairing + - protected launch-status and notices follow-through +3. Native Unreal desktop runtime + - real simulator execution + - recognition, replay, coaching, and training + - packaged runtime behavior + - higher-dimensional family ownership +4. Embedded in-simulator browser shell + - bounded simulator-side browser interaction + - diagnostics and browser-assisted adjunct surfaces + +Important boundary: + +- the website and protected dashboard are not superfluous +- they own access, pricing, entitlement, notices, release posture, and pairing +- the desktop runtime remains the actual simulator authority + +## First session + +1. Start on the public website + - review `/launch-status` if release posture matters + - review `/pricing` if access or provisioning matters + - review `/download` for the current public package posture +2. Sign in or create an account + - continue into `/app` + - use the protected browser shell for account-aware follow-through +3. Open the protected download lane + - use `/app/downloads` + - confirm target platform, entitlement, and current package proof +4. Pair the desktop runtime + - generate the desktop-link token from the protected dashboard + - do not reuse your password inside the desktop handoff flow +5. Verify the first simulator lane + - confirm the current packaged build + - confirm the current runtime lane you intend to use + - confirm the current control boundary before assuming more than the product ships + +## Current desktop runtime scope + +The desktop runtime is the current product center for: + +- classic-cube execution +- recognition-assisted reconstruction +- replay and solve explanation +- coaching and training-session workflows +- training analytics and diagnostics +- higher-dimensional runtime ownership + +This is the current truthful desktop-first posture. Do not collapse it into a +generic browser simulator claim. + +## Control and settings truth + +Current shipped desktop control truth includes: + +- classic keyboard profile `classic-wca-keyboard/v1` +- classic-cube pointer, orbit, zoom, and action shortcuts +- higher-dimensional dedicated-family runtime selectors +- viewer camera settings continuity +- bounded immersive presets and session recall +- native operator/training inspect surfaces that keep these facts visible + +Representative shipped actions include: + +- `LMB` clockwise +- `RMB` counter-clockwise +- `MMB drag` orbit +- `wheel` zoom +- `R` scramble +- `H` hint +- `Enter` submit +- `F` mode +- `V` hold-to-talk +- `C` cycle voice + +## Higher-dimensional runtime truth + +Current higher-dimensional truth includes: + +- dedicated `Magic120Cell` runtime/profile ownership +- dedicated `MagicCube5D` runtime/profile ownership +- first-party session, scene, projection, and persistence ownership +- generated-mode selector recall through native operator and training surfaces +- packaged proof on the maintained Windows Unreal validation lane + +The serious higher-dimensional lanes are not placeholders in the live product +story. They remain part of current product truth. + +## XR and controller truth + +HyperTwist does not currently claim a finished VR/controller product lane. + +Current truthful boundary: + +- desktop-hosted native OpenXR/controller widening is `No-Go` +- the project does not currently market a finished headset/runtime lane +- controller rebinding and broader user-facing XR preferences are not yet shipped +- any future reopen must prove: + - dedicated runtime ownership + - user-facing settings and controller-rebinding ownership + - Windows packaged controller validation with real controller truth + +Do not market the current input groundwork as finished VR support. + +## Browser and dashboard use + +Use the public website when you need: + +- public docs and onboarding +- pricing and launch posture +- release notes +- notices and corresponding-source references +- public route atlas and support guidance + +Use the protected dashboard when you need: + +- account state +- entitlement and plan-aware download posture +- protected launch status +- protected notices +- browser-to-desktop token handoff + +Use the desktop runtime when you need: + +- the actual simulator +- packaged training behavior +- higher-dimensional execution +- native diagnostics or runtime-adjacent operator work + +## Download and release follow-through + +The public `/download` page describes supported targets and release posture. +The actual delivery authority stays in the protected release lane. + +Check these before broader rollout: + +- desktop target configured +- packaged validation proof visible +- corresponding-source URL configured when required +- notices reference configured +- pricing and provisioning posture truthful +- support contact present + +## Degraded-state guidance + +If the auth server or release manifest is degraded: + +- keep public posture and protected fallback guidance separate from live release authority +- do not treat fallback continuity as proof of full production readiness +- use the protected launch-status and support routes for the next truthful move + +## Support lanes + +Use the public or protected support path according to the problem: + +- launch readiness + - checkout wiring + - release target publication + - notice and corresponding-source follow-through +- operator access + - sign-in + - entitlement + - protected download access + - pairing +- studio rollout + - broader deployment planning + - higher-dimensional readiness review + - production-lane coordination + +Primary support contact: + +- `hello@hypertwist.app` + +## Canonical public routes + +- `/` +- `/about` +- `/features` +- `/resources` +- `/getting-started` +- `/docs` +- `/pricing` +- `/download` +- `/support` +- `/changelog` +- `/launch-status` +- `/open-source-notices` +- `/privacy` +- `/terms` +- `/shipping-payment` + +Primary protected routes: + +- `/app` +- `/app/launch-status` +- `/app/downloads` +- `/app/browser-access` +- `/app/account` +- `/app/notices` + +## Final operating rule + +Read HyperTwist as a desktop-first simulator with a necessary browser shell +around it. + +Keep both. + +- keep the browser for access, release, legal, and pairing work +- keep the desktop for simulator authority +- keep the current XR/controller boundary explicit diff --git a/website/src/__tests__/public-marketing-pages.test.tsx b/website/src/__tests__/public-marketing-pages.test.tsx index 3937d5e..099378f 100644 --- a/website/src/__tests__/public-marketing-pages.test.tsx +++ b/website/src/__tests__/public-marketing-pages.test.tsx @@ -286,6 +286,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('Offline operator manual')).toBeTruthy() + expect(screen.getByRole('link', { name: 'Download offline operator manual' }).getAttribute('href')).toBe('/manual/hypertwist-operator-manual.md') 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() @@ -484,6 +486,8 @@ describe('public marketing pages', () => { 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('Which public page should you open next?')).toBeTruthy() + expect(screen.getByText('Offline operator manual')).toBeTruthy() + expect(screen.getByRole('link', { name: 'Download offline operator manual' }).getAttribute('href')).toBe('/manual/hypertwist-operator-manual.md') expect(screen.getByText('Launch status')).toBeTruthy() expect(screen.getByText('Choose the right HyperTwist surface')).toBeTruthy() expect(screen.getByText('Move into the protected dashboard')).toBeTruthy() @@ -1185,6 +1189,8 @@ describe('public marketing pages', () => { expect(screen.getByText('Higher-dimensional runtime ownership')).toBeTruthy() expect(screen.getByText('Public manual route atlas')).toBeTruthy() expect(screen.getByText('Shipping & payment')).toBeTruthy() + expect(screen.getByText('Offline operator manual')).toBeTruthy() + expect(screen.getByRole('link', { name: 'Download offline operator manual' }).getAttribute('href')).toBe('/manual/hypertwist-operator-manual.md') expect(screen.getByText('Choose the next release move')).toBeTruthy() expect(screen.getByText('Need account state, pairing, or protected browser follow-through?')).toBeTruthy() expect(screen.getByText(/The web lane is not superfluous/i)).toBeTruthy() @@ -1325,6 +1331,8 @@ describe('public marketing pages', () => { 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('Offline operator manual')).toBeTruthy() + expect(screen.getByRole('link', { name: 'Download offline operator manual' }).getAttribute('href')).toBe('/manual/hypertwist-operator-manual.md') expect(screen.getByText('Support topic quick routes')).toBeTruthy() expect(screen.getAllByText('Current surface authority map').length).toBeGreaterThan(0) expect(screen.getByText('Why HyperTwist keeps both a website and a desktop runtime')).toBeTruthy() @@ -1463,6 +1471,8 @@ describe('public marketing pages', () => { expect(screen.getByText('The first serious HyperTwist session')).toBeTruthy() expect(screen.getByText('Operator path')).toBeTruthy() + expect(screen.getByText('Offline operator manual')).toBeTruthy() + expect(screen.getByRole('link', { name: 'Download offline operator manual' }).getAttribute('href')).toBe('/manual/hypertwist-operator-manual.md') expect(screen.getByText('Browser account access methods')).toBeTruthy() expect(screen.getByText('First launch and desktop setup')).toBeTruthy() expect(screen.getByText('Simulator use today')).toBeTruthy() diff --git a/website/src/pages/public-page-helpers.tsx b/website/src/pages/public-page-helpers.tsx index 7a38a87..7ebee71 100644 --- a/website/src/pages/public-page-helpers.tsx +++ b/website/src/pages/public-page-helpers.tsx @@ -128,6 +128,8 @@ export const releaseCommerceFallback = { planPriceStudio: studioFallbackPlan.price, } +export const downloadablePublicManualHref = '/manual/hypertwist-operator-manual.md' + export function buildPublicReleaseManifestFallback(supportEmail = brandConfig.contact.email) { return { downloadTargets, @@ -378,6 +380,42 @@ export function OperatorDesktopQuickstartSection({ ) } +export function DownloadableOperatorManualSection({ + title = 'Offline operator manual', + description = 'HyperTwist now ships a same-origin downloadable operator manual so the desktop-first onboarding, control-boundary truth, and rollout guidance can travel with the product instead of living only in live browser routes.', +}: { + title?: string + description?: string +}) { + return ( +
+
+

+ The downloadable manual bundles the current first-session path, browser-versus-desktop + boundary, protected dashboard follow-through, control roster, higher-dimensional runtime + guide, and the current XR/controller truth into one offline reference. +

+
    +
  • Use it for desktop-side onboarding, rollout review, and operator support when the browser shell is not the best reading surface.
  • +
  • It stays aligned with the current public route atlas instead of inventing a separate product story.
  • +
  • It keeps the current desktop-hosted XR/controller `No-Go` boundary explicit instead of flattening it into generic VR support language.
  • +
+
+ + Download offline operator manual + + + Open public manual + + + Open getting started + +
+
+
+ ) +} + export function PrincipleCardSection({ title, description, @@ -728,6 +766,16 @@ export function PublicPackagedDesktopProofSection({ ) } +type ReleaseAuthorityReference = { + title: string + description: string + href: string | null + configuredLabel: string + missingLabel: string + linkLabel: string + download?: boolean +} + export function ReleaseAuthorityBundleSection({ releaseManifest, title = 'Release references and source availability', @@ -737,7 +785,17 @@ export function ReleaseAuthorityBundleSection({ title?: string description?: string }) { - const references = [ + const references: readonly ReleaseAuthorityReference[] = [ + { + title: 'Downloadable operator manual', + description: + 'A same-origin offline manual ships with the website so desktop-first onboarding, protected-release follow-through, and rollout review do not depend on live browsing alone.', + href: downloadablePublicManualHref, + configuredLabel: 'Included', + missingLabel: 'Include the downloadable operator manual before external launch', + linkLabel: 'Download operator manual (.md)', + download: true, + }, { title: 'Public manual', description: @@ -801,9 +859,15 @@ export function ReleaseAuthorityBundleSection({

{reference.description}

{reference.href ? ( - - {reference.linkLabel} - + reference.download ? ( + + {reference.linkLabel} + + ) : ( + + {reference.linkLabel} + + ) ) : ( reference.missingLabel )} diff --git a/website/src/pages/public-pages-commerce.tsx b/website/src/pages/public-pages-commerce.tsx index 1fb40ec..a5bbbf1 100644 --- a/website/src/pages/public-pages-commerce.tsx +++ b/website/src/pages/public-pages-commerce.tsx @@ -30,6 +30,7 @@ import { BrowserAuthMethodsSection, BrowserDesktopRealitySection, DeliverySurfaceResponsibilitiesGrid, + DownloadableOperatorManualSection, explorerFallbackPlan, HigherDimensionalRuntimeGuideSection, OperatorDesktopQuickstartSection, @@ -323,6 +324,10 @@ export function DownloadPage() { cards={desktopFirstLaunchCards} /> + +

diff --git a/website/src/pages/public-pages-marketing.tsx b/website/src/pages/public-pages-marketing.tsx index a08a05f..3e56a2e 100644 --- a/website/src/pages/public-pages-marketing.tsx +++ b/website/src/pages/public-pages-marketing.tsx @@ -35,9 +35,10 @@ import { BrowserAuthMethodsSection, BrowserDesktopDecisionFaqSection, BrowserDesktopRealitySection, + BulletCardSection, ControlProfileRosterSection, DeliverySurfaceResponsibilitiesGrid, - BulletCardSection, + DownloadableOperatorManualSection, FaqCardSection, HigherDimensionalRuntimeGuideSection, InputAndDevicePostureSection, @@ -211,6 +212,10 @@ export function HomeLanding() { limit={8} /> + + + + @@ -631,6 +640,10 @@ function GettingStartedPageContent({ cards={desktopWorkflowTracks} /> + + @@ -756,6 +769,10 @@ export function DocsPage() { description="The manual is easier to use when it also says which public route owns which question, so operators do not have to infer structure from navigation labels alone." /> + +