diff --git a/docs/generated/xr/xr_interactive_desktop_task_probe_wmr_override_grace_2026-07-02.json b/docs/generated/xr/xr_interactive_desktop_task_probe_wmr_override_grace_2026-07-02.json new file mode 100644 index 0000000..233197e --- /dev/null +++ b/docs/generated/xr/xr_interactive_desktop_task_probe_wmr_override_grace_2026-07-02.json @@ -0,0 +1,30 @@ +{ + "reportVersion": "ht-interactive-desktop-task/v1", + "generatedAtUtc": "2026-07-02T08:12:05.7777857Z", + "taskName": "HyperTwist-InteractiveDesktop-20260702-101205", + "taskRunnerPath": "C:\\Windows\\Temp\\HyperTwist-InteractiveDesktop-20260702-101205.runner.ps1", + "taskResultPath": "C:\\Windows\\Temp\\HyperTwist-InteractiveDesktop-20260702-101205.result.json", + "timeoutSeconds": 420, + "currentSessionId": 0, + "explorerSessionIds": [ + 1 + ], + "createExitCode": 0, + "runExitCode": 0, + "taskOutput": { + "succeeded": true, + "user": "DESKTOP-KS3VGHU\\Anthracite Ace", + "processId": 35204, + "sessionId": 1, + "explorerSessionIds": [ + 1 + ], + "generatedAtUtc": "2026-07-02T08:12:17.3348869Z", + "outputLines": [ + + ], + "error": null + }, + "result": "passed", + "error": null +} \ No newline at end of file diff --git a/docs/generated/xr/xr_windowed_followalong_probe_wmr_override_grace_2026-07-02.json b/docs/generated/xr/xr_windowed_followalong_probe_wmr_override_grace_2026-07-02.json new file mode 100644 index 0000000..ed36230 --- /dev/null +++ b/docs/generated/xr/xr_windowed_followalong_probe_wmr_override_grace_2026-07-02.json @@ -0,0 +1,65 @@ +{ + "reportVersion": "ht-xr-package-smoke/v1", + "generatedAtUtc": "2026-07-02T08:12:17.7076451Z", + "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-wmr-override-grace\\_Game_HyperTwistTraining_Maps_L_HyperTwist_FollowAlongTraining.runtime.json", + "preflight": { + "currentSessionId": 1, + "explorerSessionIds": [ + 1 + ], + "isInteractiveDesktopSession": true, + "openXrActiveRuntimePath": "C:\\Windows\\System32\\MixedRealityRuntime.json", + "openXrActiveRuntimePresent": true, + "openXrRuntimeSource": "environment-override", + "openXrRegistryRuntimePath": null, + "openXrEnvironmentOverridePath": "C:\\Windows\\System32\\MixedRealityRuntime.json" + }, + "runtimeReportGraceApplied": true, + "runtimeReportGraceSeconds": 60, + "result": "passed", + "processId": 35224, + "processStopped": true, + "exitCode": null, + "runtimeReport": { + "reportVersion": "ht-xr-packaged-validation/v1", + "generatedAtUtc": "2026-07-02T08:15:13.664Z", + "launchSurfaceId": "xr/openxr-desktop-training-packaged-validation-launch-surface", + "gameModeClassPath": "/Script/UnrealHyperTwist.HyperTwistXrTrainingGameMode", + "cookMapAssetPath": "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining", + "launchMapUrl": "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining?game=/Script/UnrealHyperTwist.HyperTwistXrTrainingGameMode", + "result": "passed", + "packagedProofStatus": "pending-hmd-session-observation", + "runtimeOwnerId": "xr/openxr-desktop-training-runtime-owner", + "preferenceProfileId": "xr-openxr-training-preferences/v1", + "controllerBindingProfileId": "xr-openxr-motion-controllers/v1", + "controllerSettingsOwnerId": "xr-openxr-controller-settings-owner/v1", + "runtimeStatusLine": "OpenXR runtime owner xr/openxr-desktop-training-runtime-owner | preferences xr-openxr-training-preferences/v1 | bindings xr-openxr-motion-controllers/v1 | HMD connected no | HMD enabled no | posture standing | dominant hand right | snap turn on | smooth locomotion on | vertical offset 0 | desktop pitch 0 | grip 0.00/0.00 | trigger 0.00/0.00", + "reportPath": "C:\\HyperTwist_worktrees\\phase10validate_packaged_xr_20260702_rebuild\\validation\\windowed-live-interactive-probe-wmr-override-grace\\_Game_HyperTwistTraining_Maps_L_HyperTwist_FollowAlongTraining.runtime.json", + "error": "", + "observationSeconds": 120, + "bRuntimeOwnerStructurallyValid": true, + "bControllerSettingsOwnerStructurallyValid": true, + "bHeadMountedDisplayConnected": false, + "bHeadMountedDisplayEnabled": false, + "bObservedHeadMountedDisplaySession": false, + "bObservedControllerInputActivity": false, + "observedControllerInputMagnitude": 0, + "remainingGateIds": [ + "xr/windows-packaged-headset-session-observation", + "xr/windows-packaged-controller-input-observation" + ] + }, + "error": null +} \ No newline at end of file diff --git a/docs/generated/xr/xr_windowed_followalong_runtime_probe_wmr_override_grace_2026-07-02.json b/docs/generated/xr/xr_windowed_followalong_runtime_probe_wmr_override_grace_2026-07-02.json new file mode 100644 index 0000000..af9e05c --- /dev/null +++ b/docs/generated/xr/xr_windowed_followalong_runtime_probe_wmr_override_grace_2026-07-02.json @@ -0,0 +1,29 @@ +{ + "reportVersion": "ht-xr-packaged-validation/v1", + "generatedAtUtc": "2026-07-02T08:15:13.664Z", + "launchSurfaceId": "xr/openxr-desktop-training-packaged-validation-launch-surface", + "gameModeClassPath": "/Script/UnrealHyperTwist.HyperTwistXrTrainingGameMode", + "cookMapAssetPath": "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining", + "launchMapUrl": "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining?game=/Script/UnrealHyperTwist.HyperTwistXrTrainingGameMode", + "result": "passed", + "packagedProofStatus": "pending-hmd-session-observation", + "runtimeOwnerId": "xr/openxr-desktop-training-runtime-owner", + "preferenceProfileId": "xr-openxr-training-preferences/v1", + "controllerBindingProfileId": "xr-openxr-motion-controllers/v1", + "controllerSettingsOwnerId": "xr-openxr-controller-settings-owner/v1", + "runtimeStatusLine": "OpenXR runtime owner xr/openxr-desktop-training-runtime-owner | preferences xr-openxr-training-preferences/v1 | bindings xr-openxr-motion-controllers/v1 | HMD connected no | HMD enabled no | posture standing | dominant hand right | snap turn on | smooth locomotion on | vertical offset 0 | desktop pitch 0 | grip 0.00/0.00 | trigger 0.00/0.00", + "reportPath": "C:\\HyperTwist_worktrees\\phase10validate_packaged_xr_20260702_rebuild\\validation\\windowed-live-interactive-probe-wmr-override-grace\\_Game_HyperTwistTraining_Maps_L_HyperTwist_FollowAlongTraining.runtime.json", + "error": "", + "observationSeconds": 120, + "bRuntimeOwnerStructurallyValid": true, + "bControllerSettingsOwnerStructurallyValid": true, + "bHeadMountedDisplayConnected": false, + "bHeadMountedDisplayEnabled": false, + "bObservedHeadMountedDisplaySession": false, + "bObservedControllerInputActivity": false, + "observedControllerInputMagnitude": 0, + "remainingGateIds": [ + "xr/windows-packaged-headset-session-observation", + "xr/windows-packaged-controller-input-observation" + ] +} \ No newline at end of file diff --git a/docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json b/docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json new file mode 100644 index 0000000..1a47900 --- /dev/null +++ b/docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json @@ -0,0 +1,103 @@ +{ + "reportVersion": "ht-xr-windowed-live-observation/v1", + "generatedAtUtc": "2026-07-02T08:12:17.5483208Z", + "packageRoot": "C:\\HyperTwist_worktrees\\phase10validate_packaged_xr_20260702_rebuild", + "smokeMaps": [ + "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining" + ], + "observationSeconds": 120, + "timeoutSeconds": 150, + "runtimeLaunchMode": "windowed", + "resolution": { + "width": 1600, + "height": 900 + }, + "openXrRuntimePathOverride": "C:\\Windows\\System32\\MixedRealityRuntime.json", + "smokeReports": [ + { + "reportVersion": "ht-xr-package-smoke/v1", + "generatedAtUtc": "2026-07-02T08:12:17.7076451Z", + "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-wmr-override-grace\\_Game_HyperTwistTraining_Maps_L_HyperTwist_FollowAlongTraining.runtime.json", + "preflight": { + "currentSessionId": 1, + "explorerSessionIds": [ + 1 + ], + "isInteractiveDesktopSession": true, + "openXrActiveRuntimePath": "C:\\Windows\\System32\\MixedRealityRuntime.json", + "openXrActiveRuntimePresent": true, + "openXrRuntimeSource": "environment-override", + "openXrRegistryRuntimePath": null, + "openXrEnvironmentOverridePath": "C:\\Windows\\System32\\MixedRealityRuntime.json" + }, + "runtimeReportGraceApplied": true, + "runtimeReportGraceSeconds": 60, + "result": "passed", + "processId": 35224, + "processStopped": true, + "exitCode": null, + "runtimeReport": { + "reportVersion": "ht-xr-packaged-validation/v1", + "generatedAtUtc": "2026-07-02T08:15:13.664Z", + "launchSurfaceId": "xr/openxr-desktop-training-packaged-validation-launch-surface", + "gameModeClassPath": "/Script/UnrealHyperTwist.HyperTwistXrTrainingGameMode", + "cookMapAssetPath": "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining", + "launchMapUrl": "/Game/HyperTwistTraining/Maps/L_HyperTwist_FollowAlongTraining?game=/Script/UnrealHyperTwist.HyperTwistXrTrainingGameMode", + "result": "passed", + "packagedProofStatus": "pending-hmd-session-observation", + "runtimeOwnerId": "xr/openxr-desktop-training-runtime-owner", + "preferenceProfileId": "xr-openxr-training-preferences/v1", + "controllerBindingProfileId": "xr-openxr-motion-controllers/v1", + "controllerSettingsOwnerId": "xr-openxr-controller-settings-owner/v1", + "runtimeStatusLine": "OpenXR runtime owner xr/openxr-desktop-training-runtime-owner | preferences xr-openxr-training-preferences/v1 | bindings xr-openxr-motion-controllers/v1 | HMD connected no | HMD enabled no | posture standing | dominant hand right | snap turn on | smooth locomotion on | vertical offset 0 | desktop pitch 0 | grip 0.00/0.00 | trigger 0.00/0.00", + "reportPath": "C:\\HyperTwist_worktrees\\phase10validate_packaged_xr_20260702_rebuild\\validation\\windowed-live-interactive-probe-wmr-override-grace\\_Game_HyperTwistTraining_Maps_L_HyperTwist_FollowAlongTraining.runtime.json", + "error": "", + "observationSeconds": 120, + "bRuntimeOwnerStructurallyValid": true, + "bControllerSettingsOwnerStructurallyValid": true, + "bHeadMountedDisplayConnected": false, + "bHeadMountedDisplayEnabled": false, + "bObservedHeadMountedDisplaySession": false, + "bObservedControllerInputActivity": false, + "observedControllerInputMagnitude": 0, + "remainingGateIds": [ + "xr/windows-packaged-headset-session-observation", + "xr/windows-packaged-controller-input-observation" + ] + }, + "error": null + } + ], + "preflight": { + "currentSessionId": 1, + "explorerSessionIds": [ + 1 + ], + "isInteractiveDesktopSession": true, + "openXrActiveRuntimePath": "C:\\Windows\\System32\\MixedRealityRuntime.json", + "openXrActiveRuntimePresent": true, + "openXrRuntimeSource": "environment-override", + "openXrRegistryRuntimePath": null, + "openXrEnvironmentOverridePath": "C:\\Windows\\System32\\MixedRealityRuntime.json" + }, + "packagedHeadMountedDisplaySessionObserved": false, + "packagedControllerInputObserved": false, + "remainingGateIds": [ + "xr/windows-packaged-headset-session-observation", + "xr/windows-packaged-controller-input-observation" + ], + "result": "pending-live-observation", + "error": null +} \ 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 b0715eb..9be2c90 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 @@ -255,3 +255,21 @@ widening. - 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 +- the latest same-day continuation then closed even that runtime-resolution + blocker without mutating the machine-wide registry: + - `scripts\Launch-HyperTwistXrPackage.ps1` and + `scripts\Invoke-HyperTwistXrWindowedObservation.ps1` now also accept a + bounded per-process `OpenXrRuntimePathOverride` + - the maintained lane used that override to point at existing host manifest + `C:\Windows\System32\MixedRealityRuntime.json` + - checked-in corrected proof now lives at: + `docs/generated/xr/xr_interactive_desktop_task_probe_wmr_override_grace_2026-07-02.json` + and + `docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json` + - that corrected rerun proves the packaged follow-along map now reaches + runtime report result `passed` with packaged proof status + `pending-hmd-session-observation` + - the remaining live blockers are therefore no longer runtime resolution but + the actual physical observation facts: + `bHeadMountedDisplayConnected: false`, + `bHeadMountedDisplayEnabled: false`, and no controller-input activity yet 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 f5d53f1..1693bdf 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 @@ -776,6 +776,37 @@ Operational rules reinforced by this proof: - 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 +- the next same-day continuation then removed the runtime-resolution blocker + too without changing the machine-wide registry: + - `scripts\Launch-HyperTwistXrPackage.ps1` and + `scripts\Invoke-HyperTwistXrWindowedObservation.ps1` now also accept + `-OpenXrRuntimePathOverride` + - the maintained lane used override path + `C:\Windows\System32\MixedRealityRuntime.json` + - the first override-backed rerun exposed a real wrapper defect rather than a + host/runtime defect: the packaged runtime report arrived after the original + timeout window, which falsely marked the pass failed + - the wrapper was then hardened with a bounded windowed-only runtime-report + grace window, and the maintained bridge-assisted rerun checked in: + `docs/generated/xr/xr_interactive_desktop_task_probe_wmr_override_grace_2026-07-02.json` + and + `docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json` + - that corrected rerun now proves: + - Session `1`: reached + - `openXrRuntimeSource`: `environment-override` + - `openXrActiveRuntimePresent`: `true` + - packaged runtime report result: `passed` + - packaged proof status: `pending-hmd-session-observation` + - `bHeadMountedDisplayConnected`: `false` + - `bHeadMountedDisplayEnabled`: `false` + - observed controller input: none +- operational reading after the override plus grace continuation: + - the reverse-SSH lane plus first-party desktop bridge is now sufficient to + launch a real Session `1` windowed XR proof without relying on a machine- + wide `ActiveRuntime` registry entry + - the remaining live blockers are now the actual physical headset-session + and controller-input observations, not the launcher bridge and not runtime + manifest resolution - canonical local Windows desktop command for that remaining gate is still: ```powershell @@ -783,11 +814,19 @@ powershell -NoProfile -ExecutionPolicy Bypass -File C:\HyperTwist_worktrees\phas ``` - canonical Session `0` bridge-assisted command shape is now: + without override: ```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'" ``` +- canonical Session `0` bridge-assisted command shape with bounded runtime + override 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' -OpenXrRuntimePathOverride 'C:\Windows\System32\MixedRealityRuntime.json'" +``` + - 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 16a2ff7..53ea9ef 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 @@ -645,3 +645,8 @@ But the mature path 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 +- the later same-day `OpenXrRuntimePathOverride` continuation on + `scripts\Launch-HyperTwistXrPackage.ps1` and + `scripts\Invoke-HyperTwistXrWindowedObservation.ps1` follows the same rule: + it is a bounded validation/ops command seam for runtime selection and proof, + not a new player-facing product feature 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 26c296c..c84c588 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 @@ -422,6 +422,24 @@ scripts/run-hypertwist-remote-unreal-automation-sequence.sh \ proves the session-context requirement is satisfied and that the only remaining blocker is an absent active `OpenXR` runtime on the Windows desktop +- a later same-day continuation then added bounded per-process + `OpenXrRuntimePathOverride` support to + `scripts\Launch-HyperTwistXrPackage.ps1` and + `scripts\Invoke-HyperTwistXrWindowedObservation.ps1`, which let the + maintained bridge-assisted lane use existing host manifest + `C:\Windows\System32\MixedRealityRuntime.json` without mutating the machine- + wide registry +- that same override-backed rerun also exposed a real wrapper defect: the + packaged runtime report could arrive after the original timeout budget even + when the packaged runtime itself later reported `result: passed` +- `scripts\Launch-HyperTwistXrPackage.ps1` therefore now carries a bounded + windowed-only runtime-report grace window, and corrected proof now lives at + `docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json` +- operational reading after that correction: + - runtime manifest resolution is no longer the remaining live blocker when + the bounded override seam is used + - the remaining live blockers are now actual physical headset-session and + controller-input observation 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 f670b75..352c00a 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 @@ -430,6 +430,22 @@ truthfully claim: Session `1` with `isInteractiveDesktopSession: true` - the remaining blocker is therefore narrowed to absent active `OpenXR` runtime, not to the Windows desktop-session bridge anymore +- a later same-day override plus grace continuation then removed the runtime- + resolution blocker too without changing the global host registry: + - `scripts\Launch-HyperTwistXrPackage.ps1` and + `scripts\Invoke-HyperTwistXrWindowedObservation.ps1` now also own bounded + per-process `OpenXrRuntimePathOverride` + - checked-in corrected rerun: + `docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json` + - that corrected rerun proves: + - `isInteractiveDesktopSession: true` + - `openXrRuntimeSource: environment-override` + - `openXrActiveRuntimePresent: true` + - packaged runtime report result: `passed` + - packaged proof status: `pending-hmd-session-observation` + - `bHeadMountedDisplayConnected: false` + - `bHeadMountedDisplayEnabled: false` + - no controller-input activity observed yet - 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 @@ -511,8 +527,9 @@ first clean remaining implementation packet should be: Windows Unreal lane, kept explicit above the now-landed bounded runtime- 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; 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 + interactive logged-in Windows desktop session; 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, and + runtime resolution may now be provided either by a real machine-wide active + runtime or by the bounded first-party per-process override seam 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 91aba64..7049acb 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -2540,6 +2540,42 @@ powershell -NoProfile -ExecutionPolicy Bypass -File C:\HyperTwist_worktrees\phas & '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'" ``` +## XR runtime-override plus grace hardening continuation (`2026-07-02`) + +- the next same-family continuation then removed the remaining runtime- + resolution blocker without mutating the host-wide `OpenXR` registry state +- current exact-source truth is now also source-backed through: + - `scripts/Launch-HyperTwistXrPackage.ps1` + - `scripts/Invoke-HyperTwistXrWindowedObservation.ps1` + - checked-in corrected proof: + `docs/generated/xr/xr_interactive_desktop_task_probe_wmr_override_grace_2026-07-02.json` + - checked-in aggregate rerun: + `docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json` +- the wrappers now accept bounded per-process + `OpenXrRuntimePathOverride`, and the maintained reverse-SSH bridge used + existing host manifest `C:\Windows\System32\MixedRealityRuntime.json` +- the first override-backed rerun exposed a truthful wrapper defect: the + packaged runtime report arrived after the original timeout budget even though + the packaged runtime itself later reported `result: passed` +- `scripts/Launch-HyperTwistXrPackage.ps1` now therefore carries a bounded + windowed-only runtime-report grace window instead of calling that late report + a hard failure +- the corrected rerun now proves: + - Session `1`: reached + - `openXrRuntimeSource: environment-override` + - `openXrActiveRuntimePresent: true` + - packaged runtime report result: `passed` + - packaged proof status: `pending-hmd-session-observation` + - `bHeadMountedDisplayConnected: false` + - `bHeadMountedDisplayEnabled: false` + - no controller-input activity observed yet +- current truthful reading after this continuation: + - HyperTwist now owns first-party desktop bridge plus per-process runtime + override plus late-report grace hardening for the remaining live XR lane + - the remaining live blockers are the actual physical headset-session and + controller-input observations, not launcher reachability and not runtime + manifest resolution + ## 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 9fb7426..a17ba0d 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. 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. | +| 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 was first narrowed from “desktop-session bridge plus runtime” down to the absent active `OpenXR` runtime alone. The latest same-day continuation then removed even that runtime-resolution blocker without mutating the machine-wide registry: the wrappers now own bounded per-process `OpenXrRuntimePathOverride`, the maintained lane proved existing host manifest `C:\Windows\System32\MixedRealityRuntime.json` through corrected grace-hardened evidence at `docs/generated/xr/xr_interactive_desktop_task_probe_wmr_override_grace_2026-07-02.json` and `docs/generated/xr/xr_windowed_interactive_desktop_probe_wmr_override_grace_2026-07-02.json`, and the remaining live blockers are now the actual physical observations `bHeadMountedDisplayConnected: false`, `bHeadMountedDisplayEnabled: false`, and no controller-input activity yet rather than runtime manifest resolution. | | 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-HyperTwistXrWindowedObservation.ps1 b/scripts/Invoke-HyperTwistXrWindowedObservation.ps1 index 7058caf..31aaaa5 100644 --- a/scripts/Invoke-HyperTwistXrWindowedObservation.ps1 +++ b/scripts/Invoke-HyperTwistXrWindowedObservation.ps1 @@ -8,6 +8,7 @@ param( [double]$TimeoutSeconds = 150.0, [int]$ResX = 1600, [int]$ResY = 900, + [string]$OpenXrRuntimePathOverride = '', [string]$ValidationDirectory = '', [string]$AggregateReportPath = '', [switch]$KeepRunning @@ -120,6 +121,7 @@ $AggregateReport = [ordered]@{ width = $ResX height = $ResY } + openXrRuntimePathOverride = $OpenXrRuntimePathOverride smokeReports = @() preflight = $null packagedHeadMountedDisplaySessionObserved = $false @@ -145,6 +147,7 @@ try -RuntimeLaunchMode 'windowed' ` -ResX $ResX ` -ResY $ResY ` + -OpenXrRuntimePathOverride $OpenXrRuntimePathOverride ` -ReportPath $SmokeReportPath ` -KeepRunning:$KeepRunning diff --git a/scripts/Launch-HyperTwistXrPackage.ps1 b/scripts/Launch-HyperTwistXrPackage.ps1 index 06632f7..6a01136 100644 --- a/scripts/Launch-HyperTwistXrPackage.ps1 +++ b/scripts/Launch-HyperTwistXrPackage.ps1 @@ -7,6 +7,7 @@ param( [string]$RuntimeLaunchMode = 'nullrhi', [int]$ResX = 1600, [int]$ResY = 900, + [string]$OpenXrRuntimePathOverride = '', [string]$ReportPath = '', [switch]$KeepRunning ) @@ -104,20 +105,61 @@ function Get-OpenXrActiveRuntimePath { return $null } +function Get-ResolvedOpenXrRuntime { + param( + [string]$RuntimePathOverride = '' + ) + + $RegistryRuntimePath = Get-OpenXrActiveRuntimePath + $ResolvedOverridePath = if ([string]::IsNullOrWhiteSpace($RuntimePathOverride)) + { + $null + } + else + { + [string]$RuntimePathOverride + } + + if (-not [string]::IsNullOrWhiteSpace($ResolvedOverridePath)) + { + return [ordered]@{ + activeRuntimePath = $ResolvedOverridePath + runtimeSource = 'environment-override' + runtimePresent = [bool](Test-Path -LiteralPath $ResolvedOverridePath) + registryRuntimePath = $RegistryRuntimePath + environmentOverridePath = $ResolvedOverridePath + } + } + + return [ordered]@{ + activeRuntimePath = $RegistryRuntimePath + runtimeSource = 'registry' + runtimePresent = + -not [string]::IsNullOrWhiteSpace($RegistryRuntimePath) ` + -and [bool](Test-Path -LiteralPath $RegistryRuntimePath) + registryRuntimePath = $RegistryRuntimePath + environmentOverridePath = $null + } +} + function Get-XrWindowedPreflight { + param( + [string]$RuntimePathOverride = '' + ) + $CurrentSessionId = Get-CurrentSessionId $ExplorerSessionIds = @(Get-ExplorerSessionIds) - $OpenXrActiveRuntimePath = Get-OpenXrActiveRuntimePath - $OpenXrActiveRuntimePresent = - -not [string]::IsNullOrWhiteSpace($OpenXrActiveRuntimePath) ` - -and (Test-Path -LiteralPath $OpenXrActiveRuntimePath) + $ResolvedOpenXrRuntime = Get-ResolvedOpenXrRuntime -RuntimePathOverride $RuntimePathOverride return [ordered]@{ currentSessionId = $CurrentSessionId explorerSessionIds = @($ExplorerSessionIds) isInteractiveDesktopSession = [bool]($ExplorerSessionIds -contains $CurrentSessionId) - openXrActiveRuntimePath = $OpenXrActiveRuntimePath - openXrActiveRuntimePresent = [bool]$OpenXrActiveRuntimePresent + openXrActiveRuntimePath = $ResolvedOpenXrRuntime.activeRuntimePath + openXrActiveRuntimePresent = [bool]$ResolvedOpenXrRuntime.runtimePresent + openXrRuntimeSource = $ResolvedOpenXrRuntime.runtimeSource + openXrRegistryRuntimePath = $ResolvedOpenXrRuntime.registryRuntimePath + openXrEnvironmentOverridePath = $ResolvedOpenXrRuntime.environmentOverridePath } } @@ -148,14 +190,35 @@ function Assert-XrWindowedPreflight { if (-not [bool]$Preflight.openXrActiveRuntimePresent) { + $RuntimeSource = [string](Get-JsonPropertyValue ` + -Object $Preflight ` + -Names @('openXrRuntimeSource', 'OpenXrRuntimeSource') ` + -Default 'registry') + if ([string]::IsNullOrWhiteSpace([string]$Preflight.openXrActiveRuntimePath)) { + if ($RuntimeSource -eq 'environment-override') + { + throw ( + "Windowed XR validation received an OpenXR runtime override request, but the override path was empty. " + + "Provide a full runtime manifest path or remove the override and activate a local OpenXR runtime." + ) + } + throw ( "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." ) } + if ($RuntimeSource -eq 'environment-override') + { + throw ( + "Windowed XR validation received OpenXR runtime override path '{0}', but that manifest was not present on disk. " + + "Repair the override path or remove it and reactivate a local OpenXR runtime." + ) -f $Preflight.openXrActiveRuntimePath + } + throw ( "Windowed XR validation requires an installed active OpenXR runtime, but the configured ActiveRuntime path '{0}' was not present on disk. " + "Repair or reactivate the local OpenXR runtime on the interactive desktop and rerun." @@ -163,6 +226,60 @@ function Assert-XrWindowedPreflight { } } +function Format-ProcessArgument { + param( + [AllowNull()] + [string]$Value + ) + + if ($null -eq $Value) + { + return '""' + } + + if ($Value -notmatch '[\s"]') + { + return $Value + } + + $EscapedValue = $Value -replace '(\\*)"', '$1$1\"' + $EscapedValue = $EscapedValue -replace '(\\+)$', '$1$1' + return '"' + $EscapedValue + '"' +} + +function Start-ObservedProcess { + param( + [Parameter(Mandatory = $true)] + [string]$FilePath, + [Parameter(Mandatory = $true)] + [string[]]$ArgumentList, + [Parameter(Mandatory = $true)] + [string]$WorkingDirectory, + [string]$OpenXrRuntimePathOverride = '' + ) + + if ([string]::IsNullOrWhiteSpace($OpenXrRuntimePathOverride)) + { + return Start-Process ` + -FilePath $FilePath ` + -ArgumentList $ArgumentList ` + -WorkingDirectory $WorkingDirectory ` + -PassThru + } + + $ProcessStartInfo = New-Object System.Diagnostics.ProcessStartInfo + $ProcessStartInfo.FileName = $FilePath + $ProcessStartInfo.Arguments = ( + @($ArgumentList) | + ForEach-Object { Format-ProcessArgument -Value ([string]$_) } + ) -join ' ' + $ProcessStartInfo.WorkingDirectory = $WorkingDirectory + $ProcessStartInfo.UseShellExecute = $false + $ProcessStartInfo.EnvironmentVariables['XR_RUNTIME_JSON'] = $OpenXrRuntimePathOverride + + return [System.Diagnostics.Process]::Start($ProcessStartInfo) +} + function Convert-PathToken { param( [string]$Value @@ -218,7 +335,7 @@ if (Test-Path -LiteralPath $RuntimeReportPath) $WindowedPreflight = if ($ResolvedRuntimeLaunchMode -eq 'windowed') { - Get-XrWindowedPreflight + Get-XrWindowedPreflight -RuntimePathOverride $OpenXrRuntimePathOverride } else { @@ -279,6 +396,15 @@ $Report = [ordered]@{ keepRunning = [bool]$KeepRunning runtimeReportPath = $RuntimeReportPath preflight = $WindowedPreflight + runtimeReportGraceApplied = $false + runtimeReportGraceSeconds = if ($ResolvedRuntimeLaunchMode -eq 'windowed') + { + [double][Math]::Max(60.0, [Math]::Ceiling($ObservationSeconds * 0.5)) + } + else + { + 0.0 + } result = 'failed' processId = $null processStopped = $false @@ -295,11 +421,11 @@ try } Write-Host "Launching packaged XR validation lane from '$ExecutablePath'..." - $Process = Start-Process ` + $Process = Start-ObservedProcess ` -FilePath $ExecutablePath ` -ArgumentList $ArgumentList ` -WorkingDirectory (Split-Path -Parent $ExecutablePath) ` - -PassThru + -OpenXrRuntimePathOverride $OpenXrRuntimePathOverride $Report.processId = $Process.Id $Deadline = [DateTime]::UtcNow.AddSeconds([Math]::Max($TimeoutSeconds, $ObservationSeconds + 5.0)) @@ -318,6 +444,33 @@ try } } + if (-not (Test-Path -LiteralPath $RuntimeReportPath) ` + -and $ResolvedRuntimeLaunchMode -eq 'windowed' ` + -and $null -ne $Process) + { + $Process.Refresh() + if (-not $Process.HasExited -and $Report.runtimeReportGraceSeconds -gt 0.0) + { + $Report.runtimeReportGraceApplied = $true + $GraceDeadline = [DateTime]::UtcNow.AddSeconds($Report.runtimeReportGraceSeconds) + while ([DateTime]::UtcNow -lt $GraceDeadline) + { + if (Test-Path -LiteralPath $RuntimeReportPath) + { + break + } + + Start-Sleep -Milliseconds 500 + $Process.Refresh() + if ($Process.HasExited) + { + $Report.exitCode = $Process.ExitCode + break + } + } + } + } + if (-not (Test-Path -LiteralPath $RuntimeReportPath)) { throw "The packaged XR runtime report was not written to '$RuntimeReportPath' before timeout."