diff --git a/website/src/__tests__/DashboardOverviewPage.test.tsx b/website/src/__tests__/DashboardOverviewPage.test.tsx
index ce0700c..2bc6ab0 100644
--- a/website/src/__tests__/DashboardOverviewPage.test.tsx
+++ b/website/src/__tests__/DashboardOverviewPage.test.tsx
@@ -223,6 +223,8 @@ describe('DashboardOverviewPage', () => {
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('Software workflows after access is resolved')).toBeTruthy()
+ expect(screen.getByText('2. Run a recognition and correction workflow')).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 db2635a..ba6286a 100644
--- a/website/src/__tests__/protected-app-pages.test.tsx
+++ b/website/src/__tests__/protected-app-pages.test.tsx
@@ -198,6 +198,8 @@ describe('protected app pages', () => {
expect(screen.getByText(/Magic120Cell dedicated-family training map: passed/i)).toBeTruthy()
expect(screen.getByText('Protected browser-versus-desktop reality')).toBeTruthy()
expect(screen.getByText('Why the browser is intentionally narrower')).toBeTruthy()
+ expect(screen.getByText('Desktop workflows behind the browser handoff')).toBeTruthy()
+ expect(screen.getByText('4. Open the higher-dimensional family lanes')).toBeTruthy()
expect(screen.getByText('Native control and XR boundary')).toBeTruthy()
expect(screen.getByText('Shipped classic control profile')).toBeTruthy()
expect(await screen.findByText(byExactTextContent('Auth runtime mode: public', 'LI'))).toBeTruthy()
@@ -390,10 +392,12 @@ describe('protected app pages', () => {
expect(screen.getByText('Current packaged desktop proof')).toBeTruthy()
expect(screen.getAllByText('Packaged validation passed').length).toBeGreaterThan(0)
expect(screen.getByText('Protected operator quick routes')).toBeTruthy()
+ expect(screen.getByText('What the downloaded software already supports')).toBeTruthy()
+ expect(screen.getByText('3. Review replay, coaching, and analytics')).toBeTruthy()
expect(screen.getByText('Protected browser-versus-desktop reality')).toBeTruthy()
expect(screen.getByText('What the desktop runtime is for')).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.getByText('Download and rollout escalation')).toBeTruthy()
expect(screen.getByText('Current product-surface map')).toBeTruthy()
expect(screen.getByText('Protected browser dashboard')).toBeTruthy()
@@ -419,6 +423,8 @@ describe('protected app pages', () => {
expect(screen.getByText('Current simulator control ownership')).toBeTruthy()
expect(screen.getByText('Current release action')).toBeTruthy()
expect(screen.getByRole('link', { name: 'Download Windows package' }).getAttribute('href')).toBe('https://downloads.hypertwist.app/windows.exe')
+ expect(screen.getByText('Desktop workflows available to this account')).toBeTruthy()
+ expect(screen.getByText('2. Run a recognition and correction workflow')).toBeTruthy()
expect(screen.getAllByText(/classic-wca-keyboard\/v1/i).length).toBeGreaterThan(0)
expect(screen.getByText('XR reopen requirements')).toBeTruthy()
expect(screen.getByText('It would also need user-facing settings and controller-rebinding ownership instead of leaving that lane at inspect-surface truth only.')).toBeTruthy()
diff --git a/website/src/pages/app-pages.tsx b/website/src/pages/app-pages.tsx
index ce350c8..9e0fce9 100644
--- a/website/src/pages/app-pages.tsx
+++ b/website/src/pages/app-pages.tsx
@@ -22,6 +22,7 @@ import {
controlProfileRosterCards,
desktopDownloadSteps,
desktopFirstLaunchCards,
+ desktopWorkflowTracks,
inputAndDevicePostureCards,
operatorDesktopQuickstartCards,
productSurfaceMatrixRows,
@@ -1027,6 +1028,50 @@ function OperatorDesktopQuickstartPanel({
)
}
+function ProtectedSoftwareWorkflowPanel({
+ title,
+ kicker,
+ description,
+ limit,
+}: {
+ title: string
+ kicker: string
+ description: string
+ limit?: number
+}) {
+ const cards = typeof limit === 'number' ? desktopWorkflowTracks.slice(0, limit) : desktopWorkflowTracks
+
+ return (
+
+
{description}
+
+ {cards.map((card) => (
+
+
{card.title}
+
{card.description}
+
+ {card.steps.map((step) => (
+
{step}
+ ))}
+
+
+ ))}
+
+
+
+ Open downloads
+
+
+ Open browser access
+
+
+ Open public manual
+
+
+
+ )
+}
+
function SupportEscalationChecklist({
title,
kicker,
@@ -1313,6 +1358,13 @@ export function DashboardOverviewPage() {
description="The protected dashboard now also condenses the real operator journey into one place so account state, desktop-link pairing, first launch, native training verification, and the current XR/controller boundary can be reviewed together instead of reconstructed from scattered cards."
/>
+
+
Source: {user?.billing?.source || 'session'}
@@ -1627,6 +1679,13 @@ export function DownloadCenterPage() {
/>