From da911b07fbf54e1aaad649f1b622b91979c96242 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Thu, 2 Jul 2026 08:02:11 +0000 Subject: [PATCH] Add XR interactive desktop bridge proof --- ...ractive_desktop_task_probe_2026-07-02.json | 31 +++ ..._interactive_desktop_probe_2026-07-02.json | 66 +++++ ...T_AND_PLUGIN_DECISION_PACKET_2026-06-24.md | 12 + ...DOWS_BUILD_LANE_VERIFICATION_2026-06-01.md | 36 ++- ...AND_COMMAND_SURFACE_DOCTRINE_2026-05-21.md | 14 ++ ...BUILD_VALIDATION_REQUIREMENT_2026-06-01.md | 11 + ...UT_AND_XR_COMPLETENESS_AUDIT_2026-06-22.md | 16 +- .../HyperTwist/DEVELOPMENT.md | 38 +++ .../HyperTwist/FEATURE_REGISTRY.md | 2 +- ...nvoke-HyperTwistInteractiveDesktopTask.ps1 | 233 ++++++++++++++++++ 10 files changed, 454 insertions(+), 5 deletions(-) create mode 100644 docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json create mode 100644 docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json create mode 100644 scripts/Invoke-HyperTwistInteractiveDesktopTask.ps1 diff --git a/docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json b/docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json new file mode 100644 index 0000000..f0cbc5d --- /dev/null +++ b/docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json @@ -0,0 +1,31 @@ +{ + "reportVersion": "ht-interactive-desktop-task/v1", + "generatedAtUtc": "2026-07-02T07:55:45.0811556Z", + "taskName": "HyperTwist-InteractiveDesktop-20260702-095545", + "taskRunnerPath": "C:\\Windows\\Temp\\HyperTwist-InteractiveDesktop-20260702-095545.runner.ps1", + "taskResultPath": "C:\\Windows\\Temp\\HyperTwist-InteractiveDesktop-20260702-095545.result.json", + "timeoutSeconds": 210, + "currentSessionId": 0, + "explorerSessionIds": [ + 1 + ], + "createExitCode": 0, + "runExitCode": 0, + "taskOutput": { + "succeeded": true, + "user": "DESKTOP-KS3VGHU\\Anthracite Ace", + "processId": 15760, + "sessionId": 1, + "explorerSessionIds": [ + 1 + ], + "generatedAtUtc": "2026-07-02T07:55:55.5084184Z", + "outputLines": [ + "XR_WINDOWED_EXPECTED_ERROR=Windowed XR validation requires an installed active OpenXR runtime, but no OpenXR ActiveRuntime registry entry was found. Activate SteamVR, Oculus, Windows Mixed Reality, or another local OpenXR runtime on the interactive desktop and rerun.", + "{\r\n \"reportVersion\": \"ht-xr-windowed-live-observation/v1\",\r\n \"generatedAtUtc\": \"2026-07-02T07:55:55.6890920Z\",\r\n \"packageRoot\": \"C:\\\\HyperTwist_worktrees\\\\phase10validate_packaged_xr_20260702_rebuild\",\r\n \"smokeMaps\": [\r\n \"/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining\",\r\n \"/Game/HyperTwistTraining/Maps/L_HyperTwist_ClassicTraining\"\r\n ],\r\n \"observationSeconds\": 120,\r\n \"timeoutSeconds\": 150,\r\n \"runtimeLaunchMode\": \"windowed\",\r\n \"resolution\": {\r\n \"width\": 1600,\r\n \"height\": 900\r\n },\r\n \"smokeReports\": [\r\n {\r\n \"reportVersion\": \"ht-xr-package-smoke/v1\",\r\n \"generatedAtUtc\": \"2026-07-02T07:55:55.8312741Z\",\r\n \"packageRoot\": \"C:\\\\HyperTwist_worktrees\\\\phase10validate_packaged_xr_20260702_rebuild\",\r\n \"executablePath\": \"C:\\\\HyperTwist_worktrees\\\\phase10validate_packaged_xr_20260702_rebuild\\\\Windows\\\\UnrealHyperTwist.exe\",\r\n \"mapAssetPath\": \"/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining\",\r\n \"mapUrl\": \"/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining?game=/Script/UnrealHyperTwist.HyperTwistXrTrainingGameMode\",\r\n \"runtimeLaunchMode\": \"windowed\",\r\n \"observationSeconds\": 120,\r\n \"timeoutSeconds\": 150,\r\n \"resolution\": {\r\n \"width\": 1600,\r\n \"height\": 900\r\n },\r\n \"keepRunning\": false,\r\n \"runtimeReportPath\": \"C:\\\\HyperTwist_worktrees\\\\phase10validate_packaged_xr_20260702_rebuild\\\\validation\\\\windowed-live-interactive-probe\\\\_Game_HyperTwistTraining_Maps_L_HyperTwist_FollowAlongTraining.runtime.json\",\r\n \"preflight\": {\r\n \"currentSessionId\": 1,\r\n \"explorerSessionIds\": [\r\n 1\r\n ],\r\n \"isInteractiveDesktopSession\": true,\r\n \"openXrActiveRuntimePath\": null,\r\n \"openXrActiveRuntimePresent\": false\r\n },\r\n \"result\": \"failed\",\r\n \"processId\": null,\r\n \"processStopped\": false,\r\n \"exitCode\": null,\r\n \"runtimeReport\": null,\r\n \"error\": \"Windowed XR validation requires an installed active OpenXR runtime, but no OpenXR ActiveRuntime registry entry was found. Activate SteamVR, Oculus, Windows Mixed Reality, or another local OpenXR runtime on the interactive desktop and rerun.\"\r\n }\r\n ],\r\n \"preflight\": {\r\n \"currentSessionId\": 1,\r\n \"explorerSessionIds\": [\r\n 1\r\n ],\r\n \"isInteractiveDesktopSession\": true,\r\n \"openXrActiveRuntimePath\": null,\r\n \"openXrActiveRuntimePresent\": false\r\n },\r\n \"packagedHeadMountedDisplaySessionObserved\": false,\r\n \"packagedControllerInputObserved\": false,\r\n \"remainingGateIds\": [\r\n\r\n ],\r\n \"result\": \"failed\",\r\n \"error\": \"Windowed XR validation requires an installed active OpenXR runtime, but no OpenXR ActiveRuntime registry entry was found. Activate SteamVR, Oculus, Windows Mixed Reality, or another local OpenXR runtime on the interactive desktop and rerun.\"\r\n}" + ], + "error": null + }, + "result": "passed", + "error": null +} \ No newline at end of file diff --git a/docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json b/docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json new file mode 100644 index 0000000..a1204cb --- /dev/null +++ b/docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json @@ -0,0 +1,66 @@ +{ + "reportVersion": "ht-xr-windowed-live-observation/v1", + "generatedAtUtc": "2026-07-02T07:55:55.6890920Z", + "packageRoot": "C:\\HyperTwist_worktrees\\phase10validate_packaged_xr_20260702_rebuild", + "smokeMaps": [ + "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining", + "/Game/HyperTwistTraining/Maps/L_HyperTwist_ClassicTraining" + ], + "observationSeconds": 120, + "timeoutSeconds": 150, + "runtimeLaunchMode": "windowed", + "resolution": { + "width": 1600, + "height": 900 + }, + "smokeReports": [ + { + "reportVersion": "ht-xr-package-smoke/v1", + "generatedAtUtc": "2026-07-02T07:55:55.8312741Z", + "packageRoot": "C:\\HyperTwist_worktrees\\phase10validate_packaged_xr_20260702_rebuild", + "executablePath": "C:\\HyperTwist_worktrees\\phase10validate_packaged_xr_20260702_rebuild\\Windows\\UnrealHyperTwist.exe", + "mapAssetPath": "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining", + "mapUrl": "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining?game=/Script/UnrealHyperTwist.HyperTwistXrTrainingGameMode", + "runtimeLaunchMode": "windowed", + "observationSeconds": 120, + "timeoutSeconds": 150, + "resolution": { + "width": 1600, + "height": 900 + }, + "keepRunning": false, + "runtimeReportPath": "C:\\HyperTwist_worktrees\\phase10validate_packaged_xr_20260702_rebuild\\validation\\windowed-live-interactive-probe\\_Game_HyperTwistTraining_Maps_L_HyperTwist_FollowAlongTraining.runtime.json", + "preflight": { + "currentSessionId": 1, + "explorerSessionIds": [ + 1 + ], + "isInteractiveDesktopSession": true, + "openXrActiveRuntimePath": null, + "openXrActiveRuntimePresent": false + }, + "result": "failed", + "processId": null, + "processStopped": false, + "exitCode": null, + "runtimeReport": null, + "error": "Windowed XR validation requires an installed active OpenXR runtime, but no OpenXR ActiveRuntime registry entry was found. Activate SteamVR, Oculus, Windows Mixed Reality, or another local OpenXR runtime on the interactive desktop and rerun." + } + ], + "preflight": { + "currentSessionId": 1, + "explorerSessionIds": [ + 1 + ], + "isInteractiveDesktopSession": true, + "openXrActiveRuntimePath": null, + "openXrActiveRuntimePresent": false + }, + "packagedHeadMountedDisplaySessionObserved": false, + "packagedControllerInputObserved": false, + "remainingGateIds": [ + + ], + "result": "failed", + "error": "Windowed XR validation requires an installed active OpenXR runtime, but no OpenXR ActiveRuntime registry entry was found. Activate SteamVR, Oculus, Windows Mixed Reality, or another local OpenXR runtime on the interactive desktop and rerun." +} \ No newline at end of file diff --git a/docs/ops/HYPERTWIST_NATIVE_XR_HOST_AND_PLUGIN_DECISION_PACKET_2026-06-24.md b/docs/ops/HYPERTWIST_NATIVE_XR_HOST_AND_PLUGIN_DECISION_PACKET_2026-06-24.md index 558b0bd..b0715eb 100644 --- a/docs/ops/HYPERTWIST_NATIVE_XR_HOST_AND_PLUGIN_DECISION_PACKET_2026-06-24.md +++ b/docs/ops/HYPERTWIST_NATIVE_XR_HOST_AND_PLUGIN_DECISION_PACKET_2026-06-24.md @@ -243,3 +243,15 @@ widening. 1. activate a real local `OpenXR` runtime on the Windows desktop 2. run the first-party windowed observation wrapper from that interactive desktop session rather than through the reverse-SSH/OpenSSH session +- the next same-day bridge continuation then tightened that host reading again: + - the repo now also carries + `scripts\Invoke-HyperTwistInteractiveDesktopTask.ps1` + - checked-in bridge proof + `docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json` + now proves the reverse-SSH Session `0` lane can launch a bounded first- + party task into the real Explorer desktop Session `1` + - the XR lane then reran through that bridge and checked in + `docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json` + - that rerun shows the interactive-desktop requirement is now satisfied and + the remaining blocker has narrowed further to one host fact only: + `OpenXR` still has no active runtime registered on the desktop diff --git a/docs/ops/HYPERTWIST_REVERSE_SSH_WINDOWS_BUILD_LANE_VERIFICATION_2026-06-01.md b/docs/ops/HYPERTWIST_REVERSE_SSH_WINDOWS_BUILD_LANE_VERIFICATION_2026-06-01.md index 6a89a05..f5d53f1 100644 --- a/docs/ops/HYPERTWIST_REVERSE_SSH_WINDOWS_BUILD_LANE_VERIFICATION_2026-06-01.md +++ b/docs/ops/HYPERTWIST_REVERSE_SSH_WINDOWS_BUILD_LANE_VERIFICATION_2026-06-01.md @@ -750,14 +750,44 @@ Operational rules reinforced by this proof: - the reverse-SSH lane is **not** the authoritative live windowed XR proof lane while it is entering Session `0` rather than the interactive desktop Session `1` - - the remaining headset/controller observation gate must be run locally on - the logged-in Windows desktop after an `OpenXR` runtime is actually active -- canonical local Windows desktop command for that remaining gate: + - that left the remaining headset/controller observation gate temporarily + blocked on the interactive-desktop launch context +- the next same-day continuation then closed that launch-context gap without + widening beyond the XR proof lane: + - the repo now also carries + `scripts\Invoke-HyperTwistInteractiveDesktopTask.ps1` + - checked-in bridge proof: + `docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json` + - that bridge proof shows: + - scheduler task creation from Session `0`: passed + - scheduler task run from Session `0`: passed + - resulting task session id: `1` + - resulting task explorer-session parity: `1` + - a later same-day XR rerun through that new bridge then produced: + `docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json` + with: + - `currentSessionId: 1` + - `isInteractiveDesktopSession: true` + - `openXrActiveRuntimePresent: false` + - error narrowed to missing active `OpenXR` runtime +- operational reading after the bridge continuation: + - the reverse-SSH lane plus first-party interactive-desktop task bridge can + now initiate the real Session `1` windowed XR proof path + - the remaining blocker is no longer the desktop-session bridge + - the remaining blocker is the absent active `OpenXR` runtime on the logged- + in Windows desktop +- canonical local Windows desktop command for that remaining gate is still: ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File C:\HyperTwist_worktrees\phase10validate\scripts\Invoke-HyperTwistXrWindowedObservation.ps1 -PackageRoot C:\HyperTwist_worktrees\phase10validate_packaged_xr_20260702_rebuild ``` +- canonical Session `0` bridge-assisted command shape is now: + +```powershell +& 'C:\HyperTwist_worktrees\phase10validate\scripts\Invoke-HyperTwistInteractiveDesktopTask.ps1' -InlineCommand "& 'C:\HyperTwist_worktrees\phase10validate\scripts\Invoke-HyperTwistXrWindowedObservation.ps1' -PackageRoot 'C:\HyperTwist_worktrees\phase10validate_packaged_xr_20260702_rebuild'" +``` + - that local desktop run writes the aggregate live-observation report beneath: `C:\HyperTwist_worktrees\phase10validate_packaged_xr_20260702_rebuild\validation\windowed-live\` diff --git a/docs/ops/HYPERTWIST_SKILLIZATION_AND_COMMAND_SURFACE_DOCTRINE_2026-05-21.md b/docs/ops/HYPERTWIST_SKILLIZATION_AND_COMMAND_SURFACE_DOCTRINE_2026-05-21.md index f18a50c..16a2ff7 100644 --- a/docs/ops/HYPERTWIST_SKILLIZATION_AND_COMMAND_SURFACE_DOCTRINE_2026-05-21.md +++ b/docs/ops/HYPERTWIST_SKILLIZATION_AND_COMMAND_SURFACE_DOCTRINE_2026-05-21.md @@ -631,3 +631,17 @@ But the mature path is: - skills second - clean-room command specs for restrictive lanes - no donor command surface promoted into product truth by accident + +## Update - 2026-07-02 - reverse-SSH interactive desktop bridge wrapper + +- the current repo-local wrapper family now also includes a bounded first-party + Windows-side interactive-desktop bridge command surface: + `scripts\Invoke-HyperTwistInteractiveDesktopTask.ps1` +- this wrapper does not create a new product feature by itself +- it exists so a Session `0` reverse-SSH operator lane can trigger a bounded + first-party task inside the real logged-in Windows desktop Session `1`, + collect structured JSON output, and keep the bridge truth source-controlled +- current checked-in proof for that wrapper is: + `docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json` +- the wrapper therefore belongs to the bounded workflow/review or provider/ops + command-surface family, not to the shippable gameplay feature layer diff --git a/docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md b/docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md index 212ba84..26c296c 100644 --- a/docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md +++ b/docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md @@ -411,6 +411,17 @@ scripts/run-hypertwist-remote-unreal-automation-sequence.sh \ `scripts\Invoke-HyperTwistXrWindowedObservation.ps1` exists specifically so that gate can fail fast with preflight evidence when the launcher is not on the interactive desktop or when no `OpenXR` active runtime is present +- later same-day `2026-07-02` continuation proof then added + `scripts\Invoke-HyperTwistInteractiveDesktopTask.ps1`, which lets the + reverse-SSH Session `0` lane trigger a bounded first-party task inside the + logged-in Explorer desktop Session `1`; checked-in proof now lives at + `docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json` +- after that bridge landed, the remaining live packaged XR blocker narrowed + again: current checked-in rerun + `docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json` + proves the session-context requirement is satisfied and that the only + remaining blocker is an absent active `OpenXR` runtime on the Windows + desktop - for reverse-SSH/headless classic-cube replay-export validation, use `-NullRHI` only for the asset-authoring leg and `-RenderOffScreen` for the actual `MovieRenderQueue` render leg; they solve different failure modes diff --git a/docs/ops/HYPERTWIST_UNREAL_INPUT_AND_XR_COMPLETENESS_AUDIT_2026-06-22.md b/docs/ops/HYPERTWIST_UNREAL_INPUT_AND_XR_COMPLETENESS_AUDIT_2026-06-22.md index 94df44c..f670b75 100644 --- a/docs/ops/HYPERTWIST_UNREAL_INPUT_AND_XR_COMPLETENESS_AUDIT_2026-06-22.md +++ b/docs/ops/HYPERTWIST_UNREAL_INPUT_AND_XR_COMPLETENESS_AUDIT_2026-06-22.md @@ -418,6 +418,18 @@ truthfully claim: interactive Explorer desktop is Session `1` - that same probe also keeps the local runtime blocker explicit by recording that no `OpenXR` active runtime is currently registered on the host +- a later same-day bridge continuation then removed the session-context part of + that blocker: + - the repo now also carries + `scripts\Invoke-HyperTwistInteractiveDesktopTask.ps1` + - checked-in bridge proof: + `docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json` + - checked-in bridged XR rerun: + `docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json` + - that bridged rerun proves the remaining live XR lane can now be launched in + Session `1` with `isInteractiveDesktopSession: true` + - the remaining blocker is therefore narrowed to absent active `OpenXR` + runtime, not to the Windows desktop-session bridge anymore - the current remaining unproven pieces therefore are: - live packaged headset-session observation on the Windows lane - live packaged controller-input observation on the Windows lane @@ -500,5 +512,7 @@ first clean remaining implementation packet should be: owner plus controller settings/rebinding substrate and above the already- shipped headless `nullrhi` packaged structural proof, and run from the interactive logged-in Windows desktop session with an active local `OpenXR` - runtime rather than from the reverse-SSH/OpenSSH Session `0` lane + runtime; that session may now be reached either directly on the desktop or + through the new first-party interactive-desktop task bridge above the + reverse-SSH Session `0` lane 2. public/product copy update only after that live packaged proof exists diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md index 99cac6c..91aba64 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -2502,6 +2502,44 @@ Latest same-family responsive public-route expansion follow-up on `2026-06-29`: powershell -NoProfile -ExecutionPolicy Bypass -File C:\HyperTwist_worktrees\phase10validate\scripts\Invoke-HyperTwistXrWindowedObservation.ps1 -PackageRoot C:\HyperTwist_worktrees\phase10validate_packaged_xr_20260702_rebuild ``` +## XR interactive desktop bridge continuation (`2026-07-02`) + +- the next same-family continuation then closed the remaining Session `0` + versus Session `1` launcher gap instead of leaving the final XR gate as + manual-desktop-only lore +- current exact-source truth is now source-backed through: + - `scripts/Invoke-HyperTwistInteractiveDesktopTask.ps1` + - checked-in bridge proof: + `docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json` + - checked-in bridged XR rerun: + `docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json` +- the new helper now lets the reverse-SSH Session `0` lane create and run a + bounded `INTERACTIVE` scheduled task on the same logged-in Windows desktop, + then wait for a structured JSON result instead of leaving that desktop hop to + manual operator timing +- the helper proof established: + - launcher session before bridge: `0` + - Explorer desktop session: `1` + - scheduled task creation: passed + - scheduled task run: passed + - resulting bridged task session: `1` +- the XR windowed observation wrapper was then rerun through that bridged + Session `1` path and the current remaining blocker narrowed again: + - `isInteractiveDesktopSession: true` + - `openXrActiveRuntimePresent: false` + - failure reason now points only to the missing active `OpenXR` runtime +- current truthful reading after this continuation: + - HyperTwist now owns a first-party reverse-SSH-to-desktop bridge for the + remaining live XR observation lane + - the session-context blocker is closed + - the remaining live XR blocker is the absent active `OpenXR` runtime on the + logged-in Windows desktop +- canonical bridged command shape from Session `0` is now: + +```powershell +& 'C:\HyperTwist_worktrees\phase10validate\scripts\Invoke-HyperTwistInteractiveDesktopTask.ps1' -InlineCommand "& 'C:\HyperTwist_worktrees\phase10validate\scripts\Invoke-HyperTwistXrWindowedObservation.ps1' -PackageRoot 'C:\HyperTwist_worktrees\phase10validate_packaged_xr_20260702_rebuild'" +``` + ## Latest protected launch-status responsive recovery plus tooling rerun (`2026-06-29`) - the next same-family browser pass fixed a real small-screen regression on the 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 47c84ae..9fb7426 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md @@ -145,7 +145,7 @@ Do not collapse those three tiers into one undifferentiated "features" voice. | Analytics/reporting surfaces | Implemented now | landed analytics/reporting packets | Reporting is real, but bounded to accepted retained slices. | | Rewritten training analytics and report reference grounding | Implemented now | `apache/echarts` retained permissive lane + first-party current code | Current live `Training Analytics` reference side includes four rewritten first-party targets grounded in retained `apache/echarts`: session outcome and progress reporting, analytics data-view and export, timing-trend history and overview interaction, and the optional richer explainer or sidecar boundary. This does not displace the landed `Phase 3R-C` first-party analytics/reporting owner or elevate `ecomfe/echarts-gl` and `ecomfe/zrender` beyond support-only sidecars. | | Browser/spatial/media adjunct surfaces | Implemented now | landed `three.js`, `react-three-fiber`, `xr`, `model-viewer`, `remotion` packets | These are implemented bounded families, and the current Phase 1 browser-runtime landing now includes a first-party authoritative `Content/Browser/index.html` shell, bundled-runtime upgrade path, committed clean-checkout plain-JS fallback runtime, embedded `UHyperTwistBrowserWidget` bridge, the `2026-06-19` runtime-ready queue hardening that retains outbound Unreal shell traffic until the browser runtime is ready, a same-day first-party `Browser Runtime Status` surface with shared boot-state ownership across bundled and fallback shells, a follow-on typed Unreal-side `browser-runtime-status` capture seam that retains the last valid runtime snapshot across unrelated later envelope traffic until explicit reset, a second follow-on typed Unreal-side `hypertwist-runtime-ready` capture seam that raises the original handshake payload out of raw JSON-only handling without changing queue flush behavior, a third same-day native/operator-facing status surface that consumes those typed seams inside Unreal while clearing retained runtime ownership on shell-authority change, a fourth same-day native training/operator diagnostics-panel continuation that wires that typed status ownership into `UHyperTwistTrainingPanelWidget` and the coach dashboard without making the dashboard inspect seam depend on stale rendered strings, a fifth same-day diagnostics-fidelity continuation that now carries bootstrap/runtime-ready timestamps, last command/shell-state receipt timestamps, and fallback reason through the same native operator/training seams, and a later `2026-06-23` control/input readiness continuation that projects shipped keyboard/input truth and unfinished XR/preferences truth through the same native training/operator surfaces. This still is not proof of unlimited browser-shell parity. | -| Bounded native OpenXR runtime-owner substrate | Implemented now | landed first-party `2026-07-01` bounded XR continuation | The desktop-hosted branch now enables `OpenXR` plus `XRBase`, ships first-party runtime-owner/profile ownership through `UHyperTwistXrRuntimeLibrary` and `AHyperTwistXrTrainingPawn`, and keeps the stable ids `xr/openxr-desktop-training-runtime-owner`, `xr-openxr-training-preferences/v1`, and `xr-openxr-motion-controllers/v1` visible through both native XR code and the operator/training inspect surfaces. The current same-family hardening pass also clamps invalid preference values back into bounded ranges, wires bounded manual vertical-adjust input into the XR training pawn instead of leaving that preference field inert, and clears stale desktop-fallback rotation when headset runtime becomes active so desktop look-pitch does not leak forward into live HMD posture. The maintained reverse-SSH Windows lane revalidated the exact-source state on `C:\HyperTwist_worktrees\phase10validate` with final editor build `Result: Succeeded` at UnrealBuildTool `3672.35 seconds`, focused XR automation report `XR-BoundedRuntimeOwner-Hardening-20260701` with `4/4` green, and full browser automation report `Browser-XrHardening-20260701` with all `26` `HyperTwist.Browser.*` tests green. The current same-family continuation source now also adds first-party controller-settings/rebinding ownership above that substrate, while broader controller widening and live packaged headset/controller proof remain explicitly unfinished. A later exact-source semantics hardening follow-up on `2026-07-02` then rebuilt the same maintained root with `Result: Succeeded` at UnrealBuildTool `3104.63 seconds`, re-exported `XR-ControllerSettingsOwnership-Semantics-20260702` with all `4` `HyperTwist.FirstParty.XR.*` tests green plus `Browser-XrControllerSettingsOwnership-Semantics-20260702` with all `26` `HyperTwist.Browser.*` tests green, and kept first-party controller-settings/rebinding ownership distinct from legacy finished packaged-proof state so the bounded lane now says `owned` without overstating `shipping complete`. The next same-family packaged-validation continuation on that same date then added first-party packaged XR launch-surface/game-mode/report ownership through `UHyperTwistXrPackageValidationLibrary`, `AHyperTwistXrTrainingGameMode`, `scripts\Invoke-HyperTwistXrPackage.ps1`, and `scripts\Launch-HyperTwistXrPackage.ps1`; after repairing stale `-SkipBuild` semantics with a truthful full packaged rebuild (`Result: Succeeded`, UnrealBuildTool `2499.70 seconds`, `BuildCookRun time: 2593.82 s`), the final exact-source rerun stayed green in headless `nullrhi` mode with `BuildCookRun time: 85.47 s`, both XR smoke maps passed, and checked-in aggregate proof now lives at `docs/generated/xr/xr_packaged_validation_report_2026-07-02.json`. That package seam proves first-party Windows packaged structural launch and ownership truth, while the remaining live gates stay explicit as `xr/windows-packaged-headset-session-observation` and `xr/windows-packaged-controller-input-observation`. A final same-day preflight continuation then tightened the last live gate itself by adding interactive-session and active-`OpenXR` preflight reporting to `scripts\Launch-HyperTwistXrPackage.ps1`, adding the dedicated live wrapper `scripts\Invoke-HyperTwistXrWindowedObservation.ps1`, and checking in `docs/generated/xr/xr_windowed_live_observation_probe_2026-07-02.json`, which truthfully records that the current reverse-SSH/OpenSSH launcher is Session `0`, the Explorer desktop remains Session `1`, and no active `OpenXR` runtime is currently registered on the host. | +| Bounded native OpenXR runtime-owner substrate | Implemented now | landed first-party `2026-07-01` bounded XR continuation | The desktop-hosted branch now enables `OpenXR` plus `XRBase`, ships first-party runtime-owner/profile ownership through `UHyperTwistXrRuntimeLibrary` and `AHyperTwistXrTrainingPawn`, and keeps the stable ids `xr/openxr-desktop-training-runtime-owner`, `xr-openxr-training-preferences/v1`, and `xr-openxr-motion-controllers/v1` visible through both native XR code and the operator/training inspect surfaces. The current same-family hardening pass also clamps invalid preference values back into bounded ranges, wires bounded manual vertical-adjust input into the XR training pawn instead of leaving that preference field inert, and clears stale desktop-fallback rotation when headset runtime becomes active so desktop look-pitch does not leak forward into live HMD posture. The maintained reverse-SSH Windows lane revalidated the exact-source state on `C:\HyperTwist_worktrees\phase10validate` with final editor build `Result: Succeeded` at UnrealBuildTool `3672.35 seconds`, focused XR automation report `XR-BoundedRuntimeOwner-Hardening-20260701` with `4/4` green, and full browser automation report `Browser-XrHardening-20260701` with all `26` `HyperTwist.Browser.*` tests green. The current same-family continuation source now also adds first-party controller-settings/rebinding ownership above that substrate, while broader controller widening and live packaged headset/controller proof remain explicitly unfinished. A later exact-source semantics hardening follow-up on `2026-07-02` then rebuilt the same maintained root with `Result: Succeeded` at UnrealBuildTool `3104.63 seconds`, re-exported `XR-ControllerSettingsOwnership-Semantics-20260702` with all `4` `HyperTwist.FirstParty.XR.*` tests green plus `Browser-XrControllerSettingsOwnership-Semantics-20260702` with all `26` `HyperTwist.Browser.*` tests green, and kept first-party controller-settings/rebinding ownership distinct from legacy finished packaged-proof state so the bounded lane now says `owned` without overstating `shipping complete`. The next same-family packaged-validation continuation on that same date then added first-party packaged XR launch-surface/game-mode/report ownership through `UHyperTwistXrPackageValidationLibrary`, `AHyperTwistXrTrainingGameMode`, `scripts\Invoke-HyperTwistXrPackage.ps1`, and `scripts\Launch-HyperTwistXrPackage.ps1`; after repairing stale `-SkipBuild` semantics with a truthful full packaged rebuild (`Result: Succeeded`, UnrealBuildTool `2499.70 seconds`, `BuildCookRun time: 2593.82 s`), the final exact-source rerun stayed green in headless `nullrhi` mode with `BuildCookRun time: 85.47 s`, both XR smoke maps passed, and checked-in aggregate proof now lives at `docs/generated/xr/xr_packaged_validation_report_2026-07-02.json`. That package seam proves first-party Windows packaged structural launch and ownership truth, while the remaining live gates stay explicit as `xr/windows-packaged-headset-session-observation` and `xr/windows-packaged-controller-input-observation`. A final same-day preflight continuation then tightened the last live gate itself by adding interactive-session and active-`OpenXR` preflight reporting to `scripts\Launch-HyperTwistXrPackage.ps1`, adding the dedicated live wrapper `scripts\Invoke-HyperTwistXrWindowedObservation.ps1`, and checking in `docs/generated/xr/xr_windowed_live_observation_probe_2026-07-02.json`, which truthfully records that the current reverse-SSH/OpenSSH launcher is Session `0`, the Explorer desktop remains Session `1`, and no active `OpenXR` runtime is currently registered on the host. The next same-day bridge continuation then added `scripts\Invoke-HyperTwistInteractiveDesktopTask.ps1`, checked in `docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json`, and re-ran the XR windowed observation through a real Session `1` desktop bridge with resulting proof in `docs/generated/xr/xr_windowed_interactive_desktop_probe_2026-07-02.json`, so the remaining live blocker is now narrowed from “desktop-session bridge plus runtime” down to the absent active `OpenXR` runtime alone. | | Native control/input readiness inspect surface | Implemented now | landed first-party `2026-06-23` browser/native operator continuation | `UHyperTwistTrainingPanelWidget` and `UHyperTwistCoachDashboardWidget` now expose `FHyperTwistTrainingControlInputReadinessInspectSurface`, including the shipped `classic-wca-keyboard/v1` mapping, exact classic-cube pointer, orbit, zoom, and action-shortcut truth, higher-dimensional dedicated-family runtime ownership truth, project-level `EnhancedInput` plus motion-controller groundwork facts, immersive-presence contract presence, and explicit bounded XR/runtime plus controller-settings truth. The rendered detail line now also carries the fixed desktop-hosted `No-Go` decision on native OpenXR/controller widening instead of leaving that truth stranded in a non-rendered follow-up field. A later same-day structured-boundary hardening follow-up then promoted that same XR/controller boundary into stable inspect-surface fields as well, including decision id `desktop-hosted-openxr-controller-widening-no-go` plus explicit reopen requirements for dedicated runtime owners, user-facing settings or rebinding ownership, and Windows packaged controller validation, so native operator automation no longer depends only on rendered prose to verify the boundary. The recovered primary reverse-SSH `localhost:22022` lane rebuilt maintained validation worktree `C:\HyperTwist_worktrees\phase10validate` on `2026-06-23` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 1563.53 seconds`, and exported `Saved\AutomationReports\Browser-ControlInputReadiness-Verify\index.json` with all `16` `HyperTwist.Browser.*` tests passing, including `CoachDashboard.ControlInputReadinessInspectSurface` and `TrainingPanel.ControlInputReadinessInspectSurface`. A later same-day quality follow-up then moved the project-input-groundwork inspection behind that surface from raw text scanning into structured Unreal config reads, rebuilt the same maintained validation worktree again with `Result: Succeeded`, UnrealBuildTool `Total execution time: 158.13 seconds`, and re-exported focused browser proof to `Saved\AutomationReports\Browser-ControlInputReadiness-StructuredConfig-Verify` with all `16` `HyperTwist.Browser.*` tests green again. The latest same-family truth-render follow-up on `2026-06-24` then rebuilt that same maintained validation root with `Result: Succeeded`, UnrealBuildTool `Total execution time: 172.52 seconds`, and exported `Saved\AutomationReports\Browser-XrNoGoRendered-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests green again, explicitly covering both training-panel and coach-dashboard control-input detail-line visibility for the `No-Go` host decision. A later same-day post-build structured-boundary follow-up then rebuilt that same maintained validation root once more with `Result: Succeeded`, UnrealBuildTool `Total execution time: 2323.18 seconds`, and exported `Saved\AutomationReports\Browser-XrBoundaryStructured-PostBuild-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests green again, now explicitly covering the stable decision-id and reopen-requirement fields on both control-input inspect surfaces alongside the sibling control/settings and control/profile seams. A later same-day `2026-06-25` parity follow-up then widened the same surface from general readiness truth into literal roster truth by rendering dedicated classic-cube pointer and action-shortcut lines, rebuilding the maintained validation root with `Result: Succeeded` at `5278.57 seconds` and exact-source rerun `70.76 seconds`, and exporting `Saved\AutomationReports\Browser-ControlRosterParity-Verify\index.json` with all `21` `HyperTwist.Browser.*` tests green, including both training-panel and coach-dashboard control-input surfaces plus the structured dashboard artifact seam. The latest same-family `2026-06-28` ownership-truth follow-up then tightened higher-dimensional readiness again by resolving the shipped `Magic120Cell` and `MagicCube5D` dedicated-family host, view-context, session, and interactive-scene surfaces explicitly by activation profile id instead of treating broad catalog validity as equivalent proof. That exact-source-state follow-up rebuilt maintained validation root `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 109.14 seconds`, then passed all three focused browser filters `TrainingPanel.ControlInputReadinessInspectSurface`, `CoachDashboard.ControlInputReadinessInspectSurface`, and `CoachDashboard.ControlSurfaceStructuredTextArtifacts`, so both the inspect surfaces and the rendered structured dashboard row now keep concrete family ownership ids such as `phase6c/magic120cell/runtime-host-surface` and `phase6c/magiccube5d/interactive-scene-surface` visible to operators. A later same-day bounded preferences-continuity follow-up then tightened the non-`XR` seam again without reopening the controller lane: the preferences line now resolves the first valid viewer camera-export artifact instead of trusting only the first listed id, keeps `artifact/camera-export-json` plus `immersive-training-session-recall-boundary` visible with recall-scope and preference-field counts, and preserves the honest boundary that packaged controller proof and broader XR completion are still not shipped. That exact-source continuity follow-up then rebuilt maintained validation root `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 3372.27 seconds`, and exported `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.TrainingPanel.ControlInputReadinessInspectSurface`, `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.CoachDashboard.ControlInputReadinessInspectSurface`, and `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.CoachDashboard.ControlSurfaceStructuredTextArtifacts`, each with `index.json` `State=Success`, while the accepted unattended `Failed to create the web browser window.` dialog remained a non-blocking Windows editor lane artifact. The current same-family XR hardening follow-up then widened that same inspect truth again without widening the broader `No-Go` decision: the native/operator surface now also proves the dedicated vertical-adjust axis is present in project input config, and the XR preference line now keeps vertical-adjust plus pointer-length ownership explicit instead of burying those bounded controls inside the profile only. The current controller-settings continuation source now also carries `xr-openxr-controller-settings-owner/v1`, `xr-openxr-controller-rebinding-surface/v1`, `xr-openxr-controller-layout-default/v1`, exact field/input/layout counts, and explicit truth that packaged controller validation is the remaining reopen gate. | | Native control/settings ownership inspect surface | Implemented now | landed first-party `2026-06-24` browser/native operator continuation | `UHyperTwistTrainingPanelWidget` and `UHyperTwistCoachDashboardWidget` now expose `FHyperTwistTrainingControlSettingsOwnershipInspectSurface`, including the shipped viewer camera-settings owner `tool/camera-settings`, the immersive-presence control contract, dedicated-family `magic120cell-focus-view-profile` and `magiccube5d-projection-view-profile` view ownership, higher-dimensional selector ownership, persisted generated-mode selector recall when a structurally valid launch request is present, and bounded XR/controller settings plus rebinding ownership truth while packaged proof remains unfinished. A later same-day structured-boundary hardening follow-up then carried the same `desktop-hosted-openxr-controller-widening-no-go` decision id plus the explicit reopen requirements for dedicated runtime owners, polished user-facing settings or rebinding ownership, and Windows packaged controller validation into this surface’s structured state as well, so control-settings diagnostics no longer have to prove the boundary only by substring matching their rendered detail line. The same primary reverse-SSH `localhost:22022` lane rebuilt maintained validation worktree `C:\HyperTwist_worktrees\phase10validate` on `2026-06-24` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 4331.11 seconds`, and then exported `Saved\AutomationReports\Browser-ControlSettingsOwnership-Verify\index.json` with all `18` `HyperTwist.Browser.*` tests passing, including `CoachDashboard.ControlSettingsOwnershipInspectSurface`, `TrainingPanel.ControlSettingsOwnershipInspectSurface`, and the previously landed runtime plus control/input inspect seams. A later same-day selector-recall hardening follow-up then rebuilt that same maintained validation root again with `Result: Succeeded`, UnrealBuildTool `Total execution time: 4084.77 seconds`, and exported `Saved\AutomationReports\Browser-SelectorRecall-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests passing, keeping the current control/settings proof aligned with the latest repository-backed selector-recall behavior. A later same-day post-build structured-boundary follow-up then rebuilt that same maintained validation root once more with `Result: Succeeded`, UnrealBuildTool `Total execution time: 2323.18 seconds`, and exported `Saved\AutomationReports\Browser-XrBoundaryStructured-PostBuild-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests green again, now explicitly covering the stable decision-id and reopen-requirement fields on both control/settings inspect surfaces alongside the sibling control/input and control/profile seams. The latest same-family `2026-06-28` ownership-proof follow-up then tightened this settings seam again by resolving the active higher-dimensional session surface, active interactive-scene surface, dedicated-family session surface, dedicated-family interactive-scene surface, persistence-boundary id, and state-semantics id explicitly for both `Magic120Cell` and `MagicCube5D`, while also carrying concrete projection, symmetry, stereo, visibility, and focus tag counts plus persistence-readiness booleans in structured state instead of leaving that ownership implied by broad view-profile validity. That exact-source proof-hardening follow-up synced the tightened browser test source into the already-current maintained validation root, rebuilt it with `Result: Succeeded` and UnrealBuildTool `Total execution time: 168.35 seconds`, then passed focused browser proof for `HyperTwist.Browser.TrainingPanel.ControlSettingsOwnershipInspectSurface`, `HyperTwist.Browser.CoachDashboard.ControlSettingsOwnershipInspectSurface`, and `HyperTwist.Browser.CoachDashboard.ControlSurfaceStructuredTextArtifacts`, so both the inspect surfaces and the rendered structured dashboard row now keep exact family-owned ids such as `phase6c/magic120cell/dedicated-training-session-surface`, `phase6c/magic120cell/interactive-scene-surface`, `magic120cell-persistence-boundary`, `phase6c/magiccube5d/dedicated-training-session-surface`, and `phase6c/magiccube5d/family-owned-scene-state` visible to operators. A later same-day bounded preferences-continuity follow-up then tightened the same settings seam again without reopening native controller widening: the structured state now carries camera workflow, preview-state, export-artifact, immersive presence-surface, recall-scope, preference-field, and reset-surface counts together with explicit camera-continuity and immersive-session-recall readiness booleans; the rendered status text now distinguishes `missing`, `partial`, and `ready` ownership truth instead of collapsing those states; and the shipped `artifact/camera-export-json` plus `immersive-training-session-recall-boundary` ids now stay visible in both the training-panel and coach-dashboard settings detail lines. That exact-source continuity follow-up then rebuilt maintained validation root `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 3372.27 seconds`, and exported `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.TrainingPanel.ControlSettingsOwnershipInspectSurface`, `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.CoachDashboard.ControlSettingsOwnershipInspectSurface`, and `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.CoachDashboard.ControlSurfaceStructuredTextArtifacts`, each with `index.json` `State=Success`, while the same accepted unattended `Failed to create the web browser window.` dialog remained non-blocking on the Windows editor lane. A later same-family `2026-06-30` degraded-state hardening follow-up then pulled that same readiness doctrine fully into the shared formatter layer itself, so absent higher-dimensional family ownership now renders as `missing` instead of being overstated as generic `partial`, one-sided view-versus-persistence lanes still render as `partial`, and both the dedicated family lines and the selector-ownership line now mask stale ids/counts while preserving the side of the lane that is actually ready. The current controller-settings continuation source now also carries `xr-openxr-controller-settings-owner/v1`, `xr-openxr-controller-rebinding-surface/v1`, `xr-openxr-controller-layout-default/v1`, exact field/input/layout counts, and explicit truth that packaged controller validation is the remaining reopen gate. | | Native control/profile roster inspect surface | Implemented now | landed first-party `2026-06-24` browser/native operator continuation | `UHyperTwistTrainingPanelWidget` and `UHyperTwistCoachDashboardWidget` now expose `FHyperTwistTrainingControlProfileRosterInspectSurface`, keeping the actually shipped selectable native roster visible: classic keyboard profile `classic-wca-keyboard/v1` with `18` bindings plus the exact classic move roster, immersive-presence contract `immersive-training-presence-control-contract` with `3` intensity plus `3` reduced-distraction presets, dedicated-family `Magic120Cell` runtime/view ids `magic120cell-runtime-profile` and `magic120cell-focus-view-profile`, dedicated-family `MagicCube5D` runtime/view ids `magiccube5d-runtime-profile` and `magiccube5d-projection-view-profile`, the current `4` selectors in each dedicated-family roster, persisted generated-mode selector recall when a structurally valid launch request is present, and bounded XR controller settings/rebinding ownership truth while packaged proof remains unfinished. The rendered roster boundary now also states the fixed desktop-hosted `No-Go` decision on native OpenXR/controller widening instead of sounding like a merely pending generic settings packet. A later same-day structured-boundary hardening follow-up then carried the same `desktop-hosted-openxr-controller-widening-no-go` decision id plus its explicit reopen requirements into the roster surface’s structured state too, so native operator automation can prove the shipped roster boundary without depending only on rendered text. After hash-syncing the touched type/training/dashboard/test files into maintained validation worktree `C:\HyperTwist_worktrees\phase10validate`, the same primary reverse-SSH `localhost:22022` lane rebuilt the widened slice on `2026-06-24` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 3606.23 seconds`, then exported `Saved\AutomationReports\Browser-ControlProfileRoster-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests passing, including `CoachDashboard.ControlProfileRosterInspectSurface` and `TrainingPanel.ControlProfileRosterInspectSurface`. A later same-day selector-recall hardening follow-up then rebuilt that same maintained validation root again with `Result: Succeeded`, UnrealBuildTool `Total execution time: 4084.77 seconds`, and exported `Saved\AutomationReports\Browser-SelectorRecall-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests passing again, now explicitly covering imported-request fallback plus active-deck precedence for repository-backed selector recall inside the training-panel and coach-dashboard roster surface. The latest same-family truth-render follow-up on `2026-06-24` then rebuilt that same maintained validation root with `Result: Succeeded`, UnrealBuildTool `Total execution time: 172.52 seconds`, and exported `Saved\AutomationReports\Browser-XrNoGoRendered-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests green again, explicitly covering the roster detail-line visibility of the same fixed `No-Go` boundary. A later same-day post-build structured-boundary follow-up then rebuilt that same maintained validation root once more with `Result: Succeeded`, UnrealBuildTool `Total execution time: 2323.18 seconds`, and exported `Saved\AutomationReports\Browser-XrBoundaryStructured-PostBuild-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests green again, now explicitly covering the stable decision-id and reopen-requirement fields on both control/profile inspect surfaces alongside the sibling control/input and control/settings seams. A later same-day `2026-06-25` parity follow-up then added the literal shipped classic move-roster line to that surface, mirrored it into dedicated coach-dashboard structured rows, rebuilt the maintained validation root with `Result: Succeeded` at `5278.57 seconds` and exact-source rerun `70.76 seconds`, and exported `Saved\AutomationReports\Browser-ControlRosterParity-Verify\index.json` with all `21` `HyperTwist.Browser.*` tests green, including both training-panel and coach-dashboard control/profile surfaces plus the structured dashboard artifact seam. The later same-family `2026-06-28` continuity follow-up then widened that roster seam again by carrying the active higher-dimensional scene id alongside the active activation, view-context, and session ids, while also resolving the first valid viewer camera-export artifact and keeping `artifact/camera-export-json` plus `immersive-training-session-recall-boundary` visible with recall-scope and preference-field counts through both the native detail line and a dedicated coach-dashboard structured row. The authoritative short-root recovery lane on `C:\HTpp` then re-synced the exact touched Unreal files, rebuilt the exact-source state with `Result: Succeeded` and UnrealBuildTool `Total execution time: 2374.44 seconds`, and exported both `Browser-ControlProfileContinuityParity-20260628-HyperTwist.Browser.TrainingPanel.ControlProfileContinuityParity` and `Browser-ControlProfileContinuityParity-20260628-HyperTwist.Browser.CoachDashboard.ControlProfileContinuityArtifacts` with `Result={Success}`, while the repeated `Failed to create the web browser window.` dialog remained a non-blocking unattended editor artifact. A later exact-source short-root recovery proof on `2026-06-29` then rebuilt the same touched state again with `Result: Succeeded` and UnrealBuildTool `Total execution time: 78.51 seconds`, re-exported `Saved\AutomationReports\ControlProfileContinuity-Rerun` with `HyperTwist.Browser.CoachDashboard.ControlProfileContinuityArtifacts`, `HyperTwist.Browser.TrainingPanel.ControlProfileContinuityParity`, and `HyperTwist.Browser.ControlProfileContinuityStateFormatting` all `Result={Success}`, and also re-exported `Saved\AutomationReports\ContinuityStateFormatting-Rerun` with the wider shared continuity-formatting trio green, so the roster-parity and shared continuity-helper seams are both grounded in current exact-source Windows proof rather than only the earlier broader maintained-root evidence. A final maintained-root exact-source hardening follow-up later that same day then tightened the shared continuity formatter so absent readiness masks stale ids and counts instead of leaking carried-over values, rebuilt `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded` and UnrealBuildTool `Total execution time: 3325.07 seconds`, and exported `Continuity-CountMasking-20260629-*` with `HyperTwist.Browser.ControlProfileContinuityStateFormatting`, `HyperTwist.Browser.TrainingPanel.ControlProfileContinuityParity`, and `HyperTwist.Browser.CoachDashboard.ControlProfileContinuityArtifacts` all `Result={Success}`, keeping the shipped roster-continuity truth grounded in current maintained-root degraded-state proof as well. The current controller-settings continuation source now also carries `xr-openxr-controller-settings-owner/v1`, `xr-openxr-controller-rebinding-surface/v1`, `xr-openxr-controller-layout-default/v1`, exact field/input/layout counts, and explicit truth that packaged controller validation is the remaining reopen gate. | diff --git a/scripts/Invoke-HyperTwistInteractiveDesktopTask.ps1 b/scripts/Invoke-HyperTwistInteractiveDesktopTask.ps1 new file mode 100644 index 0000000..1703b37 --- /dev/null +++ b/scripts/Invoke-HyperTwistInteractiveDesktopTask.ps1 @@ -0,0 +1,233 @@ +param( + [Parameter(Mandatory = $true)] + [string]$InlineCommand, + [int]$TimeoutSeconds = 120, + [string]$TaskNamePrefix = 'HyperTwist-InteractiveDesktop', + [string]$ResultPath = '', + [switch]$KeepArtifacts +) + +$ErrorActionPreference = 'Stop' + +function Write-Utf8JsonFile { + param( + [Parameter(Mandatory = $true)] + [string]$Path, + [Parameter(Mandatory = $true)] + [object]$Value + ) + + $ParentPath = Split-Path -Parent $Path + if (-not [string]::IsNullOrWhiteSpace($ParentPath)) + { + New-Item -ItemType Directory -Force -Path $ParentPath | Out-Null + } + + $Json = $Value | ConvertTo-Json -Depth 12 + $Utf8NoBom = New-Object System.Text.UTF8Encoding($false) + [System.IO.File]::WriteAllText($Path, $Json, $Utf8NoBom) +} + +function Read-JsonFile { + param( + [Parameter(Mandatory = $true)] + [string]$Path + ) + + return Get-Content -LiteralPath $Path -Raw | ConvertFrom-Json +} + +function Convert-TaskToken { + param( + [string]$Value + ) + + if ([string]::IsNullOrWhiteSpace($Value)) + { + return 'unknown' + } + + return ($Value -replace '[^A-Za-z0-9_-]', '_') +} + +if ([string]::IsNullOrWhiteSpace($InlineCommand)) +{ + throw 'Provide -InlineCommand.' +} + +$TaskToken = Convert-TaskToken -Value ( + '{0}-{1}' -f $TaskNamePrefix, (Get-Date).ToString('yyyyMMdd-HHmmss') +) +$TaskName = $TaskToken +$TaskRunnerPath = 'C:\Windows\Temp\{0}.runner.ps1' -f $TaskToken +$TaskResultPath = 'C:\Windows\Temp\{0}.result.json' -f $TaskToken +$EncodedInlineCommand = [Convert]::ToBase64String( + [System.Text.Encoding]::Unicode.GetBytes($InlineCommand) +) + +if (Test-Path -LiteralPath $TaskResultPath) +{ + Remove-Item -LiteralPath $TaskResultPath -Force +} + +$RunnerScript = @" +`$ErrorActionPreference = 'Stop' +`$Result = [ordered]@{ + succeeded = `$false + user = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name + processId = `$PID + sessionId = (Get-Process -Id `$PID).SessionId + explorerSessionIds = @((Get-Process explorer -ErrorAction SilentlyContinue | Select-Object -ExpandProperty SessionId -Unique)) + generatedAtUtc = [DateTime]::UtcNow.ToString('o') + outputLines = @() + error = `$null +} +try { + `$CommandSource = [System.Text.Encoding]::Unicode.GetString( + [Convert]::FromBase64String('$EncodedInlineCommand') + ) + `$CapturedOutput = @(& ([scriptblock]::Create(`$CommandSource)) 2>&1 | ForEach-Object { `$_.ToString() }) + `$Result.outputLines = @(`$CapturedOutput) + `$Result.succeeded = `$true +} catch { + if (`$null -ne `$CapturedOutput) { + `$Result.outputLines = @(`$CapturedOutput) + } + `$Result.error = `$_.Exception.Message +} +[System.IO.File]::WriteAllText( + '$TaskResultPath', + (`$Result | ConvertTo-Json -Depth 12), + (New-Object System.Text.UTF8Encoding(`$false)) +) +if (-not `$Result.succeeded) { + exit 1 +} +"@ + +[System.IO.File]::WriteAllText( + $TaskRunnerPath, + $RunnerScript, + (New-Object System.Text.UTF8Encoding($false)) +) + +$Result = [ordered]@{ + reportVersion = 'ht-interactive-desktop-task/v1' + generatedAtUtc = [DateTime]::UtcNow.ToString('o') + taskName = $TaskName + taskRunnerPath = $TaskRunnerPath + taskResultPath = $TaskResultPath + timeoutSeconds = $TimeoutSeconds + currentSessionId = (Get-Process -Id $PID).SessionId + explorerSessionIds = @( + Get-Process explorer -ErrorAction SilentlyContinue | + Select-Object -ExpandProperty SessionId -Unique + ) + createExitCode = $null + runExitCode = $null + taskOutput = $null + result = 'failed' + error = $null +} + +try +{ + $CreateArgs = @( + '/Create', '/F', + '/TN', $TaskName, + '/SC', 'ONCE', + '/ST', '23:59', + '/SD', (Get-Date).ToString('MM/dd/yyyy'), + '/TR', ('C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -File {0}' -f $TaskRunnerPath), + '/RU', 'INTERACTIVE' + ) + & schtasks.exe @CreateArgs | Out-Null + $Result.createExitCode = $LASTEXITCODE + if ($Result.createExitCode -ne 0) + { + throw "Creating the interactive desktop task failed with exit code $($Result.createExitCode)." + } + + & schtasks.exe /Run /TN ('\' + $TaskName) | Out-Null + $Result.runExitCode = $LASTEXITCODE + if ($Result.runExitCode -ne 0) + { + throw "Running the interactive desktop task failed with exit code $($Result.runExitCode)." + } + + $Deadline = [DateTime]::UtcNow.AddSeconds([Math]::Max($TimeoutSeconds, 1)) + while ([DateTime]::UtcNow -lt $Deadline) + { + if (Test-Path -LiteralPath $TaskResultPath) + { + break + } + + Start-Sleep -Milliseconds 500 + } + + if (-not (Test-Path -LiteralPath $TaskResultPath)) + { + throw "The interactive desktop task did not write '$TaskResultPath' before timeout." + } + + $TaskOutput = Read-JsonFile -Path $TaskResultPath + if ($null -eq $TaskOutput) + { + throw "The interactive desktop task result '$TaskResultPath' could not be parsed." + } + + $Result.taskOutput = $TaskOutput + if (-not [bool]$TaskOutput.succeeded) + { + $TaskError = if ([string]::IsNullOrWhiteSpace([string]$TaskOutput.error)) + { + 'The interactive desktop task reported failure without an explicit error message.' + } + else + { + [string]$TaskOutput.error + } + + throw $TaskError + } + + $Result.result = 'passed' +} +catch +{ + $Result.error = $_.Exception.Message + if ($null -eq $Result.taskOutput -and (Test-Path -LiteralPath $TaskResultPath)) + { + $Result.taskOutput = Read-JsonFile -Path $TaskResultPath + } + $ResolvedFailureResultPath = if ([string]::IsNullOrWhiteSpace($ResultPath)) + { + $TaskResultPath + } + else + { + $ResultPath + } + Write-Utf8JsonFile -Path $ResolvedFailureResultPath -Value $Result + throw +} +finally +{ + if (-not $KeepArtifacts) + { + & schtasks.exe /Delete /TN $TaskName /F | Out-Null + if (Test-Path -LiteralPath $TaskRunnerPath) + { + Remove-Item -LiteralPath $TaskRunnerPath -Force + } + } +} + +if ([string]::IsNullOrWhiteSpace($ResultPath)) +{ + $ResultPath = $TaskResultPath +} + +Write-Utf8JsonFile -Path $ResultPath -Value $Result +$Result | ConvertTo-Json -Depth 12