Harden XR runtime override observation lane
This commit is contained in:
parent
da911b07fb
commit
02399cf736
13 changed files with 530 additions and 14 deletions
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -255,3 +255,21 @@ widening.
|
||||||
- that rerun shows the interactive-desktop requirement is now satisfied and
|
- that rerun shows the interactive-desktop requirement is now satisfied and
|
||||||
the remaining blocker has narrowed further to one host fact only:
|
the remaining blocker has narrowed further to one host fact only:
|
||||||
`OpenXR` still has no active runtime registered on the desktop
|
`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
|
||||||
|
|
|
||||||
|
|
@ -776,6 +776,37 @@ Operational rules reinforced by this proof:
|
||||||
- the remaining blocker is no longer the desktop-session bridge
|
- the remaining blocker is no longer the desktop-session bridge
|
||||||
- the remaining blocker is the absent active `OpenXR` runtime on the logged-
|
- the remaining blocker is the absent active `OpenXR` runtime on the logged-
|
||||||
in Windows desktop
|
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:
|
- canonical local Windows desktop command for that remaining gate is still:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
|
|
@ -783,11 +814,19 @@ powershell -NoProfile -ExecutionPolicy Bypass -File C:\HyperTwist_worktrees\phas
|
||||||
```
|
```
|
||||||
|
|
||||||
- canonical Session `0` bridge-assisted command shape is now:
|
- canonical Session `0` bridge-assisted command shape is now:
|
||||||
|
without override:
|
||||||
|
|
||||||
```powershell
|
```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'"
|
& '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:
|
- that local desktop run writes the aggregate live-observation report beneath:
|
||||||
`C:\HyperTwist_worktrees\phase10validate_packaged_xr_20260702_rebuild\validation\windowed-live\`
|
`C:\HyperTwist_worktrees\phase10validate_packaged_xr_20260702_rebuild\validation\windowed-live\`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -645,3 +645,8 @@ But the mature path is:
|
||||||
`docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json`
|
`docs/generated/xr/xr_interactive_desktop_task_probe_2026-07-02.json`
|
||||||
- the wrapper therefore belongs to the bounded workflow/review or provider/ops
|
- the wrapper therefore belongs to the bounded workflow/review or provider/ops
|
||||||
command-surface family, not to the shippable gameplay feature layer
|
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
|
||||||
|
|
|
||||||
|
|
@ -422,6 +422,24 @@ scripts/run-hypertwist-remote-unreal-automation-sequence.sh \
|
||||||
proves the session-context requirement is satisfied and that the only
|
proves the session-context requirement is satisfied and that the only
|
||||||
remaining blocker is an absent active `OpenXR` runtime on the Windows
|
remaining blocker is an absent active `OpenXR` runtime on the Windows
|
||||||
desktop
|
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
|
- for reverse-SSH/headless classic-cube replay-export validation, use
|
||||||
`-NullRHI` only for the asset-authoring leg and `-RenderOffScreen` for the
|
`-NullRHI` only for the asset-authoring leg and `-RenderOffScreen` for the
|
||||||
actual `MovieRenderQueue` render leg; they solve different failure modes
|
actual `MovieRenderQueue` render leg; they solve different failure modes
|
||||||
|
|
|
||||||
|
|
@ -430,6 +430,22 @@ truthfully claim:
|
||||||
Session `1` with `isInteractiveDesktopSession: true`
|
Session `1` with `isInteractiveDesktopSession: true`
|
||||||
- the remaining blocker is therefore narrowed to absent active `OpenXR`
|
- the remaining blocker is therefore narrowed to absent active `OpenXR`
|
||||||
runtime, not to the Windows desktop-session bridge anymore
|
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:
|
- the current remaining unproven pieces therefore are:
|
||||||
- live packaged headset-session observation on the Windows lane
|
- live packaged headset-session observation on the Windows lane
|
||||||
- live packaged controller-input 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-
|
Windows Unreal lane, kept explicit above the now-landed bounded runtime-
|
||||||
owner plus controller settings/rebinding substrate and above the already-
|
owner plus controller settings/rebinding substrate and above the already-
|
||||||
shipped headless `nullrhi` packaged structural proof, and run from the
|
shipped headless `nullrhi` packaged structural proof, and run from the
|
||||||
interactive logged-in Windows desktop session with an active local `OpenXR`
|
interactive logged-in Windows desktop session; that session may now be
|
||||||
runtime; that session may now be reached either directly on the desktop or
|
reached either directly on the desktop or through the new first-party
|
||||||
through the new first-party interactive-desktop task bridge above the
|
interactive-desktop task bridge above the reverse-SSH Session `0` lane, and
|
||||||
reverse-SSH Session `0` lane
|
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
|
2. public/product copy update only after that live packaged proof exists
|
||||||
|
|
|
||||||
|
|
@ -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'"
|
& '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`)
|
## 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
|
- the next same-family browser pass fixed a real small-screen regression on the
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -8,6 +8,7 @@ param(
|
||||||
[double]$TimeoutSeconds = 150.0,
|
[double]$TimeoutSeconds = 150.0,
|
||||||
[int]$ResX = 1600,
|
[int]$ResX = 1600,
|
||||||
[int]$ResY = 900,
|
[int]$ResY = 900,
|
||||||
|
[string]$OpenXrRuntimePathOverride = '',
|
||||||
[string]$ValidationDirectory = '',
|
[string]$ValidationDirectory = '',
|
||||||
[string]$AggregateReportPath = '',
|
[string]$AggregateReportPath = '',
|
||||||
[switch]$KeepRunning
|
[switch]$KeepRunning
|
||||||
|
|
@ -120,6 +121,7 @@ $AggregateReport = [ordered]@{
|
||||||
width = $ResX
|
width = $ResX
|
||||||
height = $ResY
|
height = $ResY
|
||||||
}
|
}
|
||||||
|
openXrRuntimePathOverride = $OpenXrRuntimePathOverride
|
||||||
smokeReports = @()
|
smokeReports = @()
|
||||||
preflight = $null
|
preflight = $null
|
||||||
packagedHeadMountedDisplaySessionObserved = $false
|
packagedHeadMountedDisplaySessionObserved = $false
|
||||||
|
|
@ -145,6 +147,7 @@ try
|
||||||
-RuntimeLaunchMode 'windowed' `
|
-RuntimeLaunchMode 'windowed' `
|
||||||
-ResX $ResX `
|
-ResX $ResX `
|
||||||
-ResY $ResY `
|
-ResY $ResY `
|
||||||
|
-OpenXrRuntimePathOverride $OpenXrRuntimePathOverride `
|
||||||
-ReportPath $SmokeReportPath `
|
-ReportPath $SmokeReportPath `
|
||||||
-KeepRunning:$KeepRunning
|
-KeepRunning:$KeepRunning
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ param(
|
||||||
[string]$RuntimeLaunchMode = 'nullrhi',
|
[string]$RuntimeLaunchMode = 'nullrhi',
|
||||||
[int]$ResX = 1600,
|
[int]$ResX = 1600,
|
||||||
[int]$ResY = 900,
|
[int]$ResY = 900,
|
||||||
|
[string]$OpenXrRuntimePathOverride = '',
|
||||||
[string]$ReportPath = '',
|
[string]$ReportPath = '',
|
||||||
[switch]$KeepRunning
|
[switch]$KeepRunning
|
||||||
)
|
)
|
||||||
|
|
@ -104,20 +105,61 @@ function Get-OpenXrActiveRuntimePath {
|
||||||
return $null
|
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 {
|
function Get-XrWindowedPreflight {
|
||||||
|
param(
|
||||||
|
[string]$RuntimePathOverride = ''
|
||||||
|
)
|
||||||
|
|
||||||
$CurrentSessionId = Get-CurrentSessionId
|
$CurrentSessionId = Get-CurrentSessionId
|
||||||
$ExplorerSessionIds = @(Get-ExplorerSessionIds)
|
$ExplorerSessionIds = @(Get-ExplorerSessionIds)
|
||||||
$OpenXrActiveRuntimePath = Get-OpenXrActiveRuntimePath
|
$ResolvedOpenXrRuntime = Get-ResolvedOpenXrRuntime -RuntimePathOverride $RuntimePathOverride
|
||||||
$OpenXrActiveRuntimePresent =
|
|
||||||
-not [string]::IsNullOrWhiteSpace($OpenXrActiveRuntimePath) `
|
|
||||||
-and (Test-Path -LiteralPath $OpenXrActiveRuntimePath)
|
|
||||||
|
|
||||||
return [ordered]@{
|
return [ordered]@{
|
||||||
currentSessionId = $CurrentSessionId
|
currentSessionId = $CurrentSessionId
|
||||||
explorerSessionIds = @($ExplorerSessionIds)
|
explorerSessionIds = @($ExplorerSessionIds)
|
||||||
isInteractiveDesktopSession = [bool]($ExplorerSessionIds -contains $CurrentSessionId)
|
isInteractiveDesktopSession = [bool]($ExplorerSessionIds -contains $CurrentSessionId)
|
||||||
openXrActiveRuntimePath = $OpenXrActiveRuntimePath
|
openXrActiveRuntimePath = $ResolvedOpenXrRuntime.activeRuntimePath
|
||||||
openXrActiveRuntimePresent = [bool]$OpenXrActiveRuntimePresent
|
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)
|
if (-not [bool]$Preflight.openXrActiveRuntimePresent)
|
||||||
{
|
{
|
||||||
|
$RuntimeSource = [string](Get-JsonPropertyValue `
|
||||||
|
-Object $Preflight `
|
||||||
|
-Names @('openXrRuntimeSource', 'OpenXrRuntimeSource') `
|
||||||
|
-Default 'registry')
|
||||||
|
|
||||||
if ([string]::IsNullOrWhiteSpace([string]$Preflight.openXrActiveRuntimePath))
|
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 (
|
throw (
|
||||||
"Windowed XR validation requires an installed active OpenXR runtime, but no OpenXR ActiveRuntime registry entry was found. " +
|
"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."
|
"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 (
|
throw (
|
||||||
"Windowed XR validation requires an installed active OpenXR runtime, but the configured ActiveRuntime path '{0}' was not present on disk. " +
|
"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."
|
"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 {
|
function Convert-PathToken {
|
||||||
param(
|
param(
|
||||||
[string]$Value
|
[string]$Value
|
||||||
|
|
@ -218,7 +335,7 @@ if (Test-Path -LiteralPath $RuntimeReportPath)
|
||||||
|
|
||||||
$WindowedPreflight = if ($ResolvedRuntimeLaunchMode -eq 'windowed')
|
$WindowedPreflight = if ($ResolvedRuntimeLaunchMode -eq 'windowed')
|
||||||
{
|
{
|
||||||
Get-XrWindowedPreflight
|
Get-XrWindowedPreflight -RuntimePathOverride $OpenXrRuntimePathOverride
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -279,6 +396,15 @@ $Report = [ordered]@{
|
||||||
keepRunning = [bool]$KeepRunning
|
keepRunning = [bool]$KeepRunning
|
||||||
runtimeReportPath = $RuntimeReportPath
|
runtimeReportPath = $RuntimeReportPath
|
||||||
preflight = $WindowedPreflight
|
preflight = $WindowedPreflight
|
||||||
|
runtimeReportGraceApplied = $false
|
||||||
|
runtimeReportGraceSeconds = if ($ResolvedRuntimeLaunchMode -eq 'windowed')
|
||||||
|
{
|
||||||
|
[double][Math]::Max(60.0, [Math]::Ceiling($ObservationSeconds * 0.5))
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
0.0
|
||||||
|
}
|
||||||
result = 'failed'
|
result = 'failed'
|
||||||
processId = $null
|
processId = $null
|
||||||
processStopped = $false
|
processStopped = $false
|
||||||
|
|
@ -295,11 +421,11 @@ try
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Launching packaged XR validation lane from '$ExecutablePath'..."
|
Write-Host "Launching packaged XR validation lane from '$ExecutablePath'..."
|
||||||
$Process = Start-Process `
|
$Process = Start-ObservedProcess `
|
||||||
-FilePath $ExecutablePath `
|
-FilePath $ExecutablePath `
|
||||||
-ArgumentList $ArgumentList `
|
-ArgumentList $ArgumentList `
|
||||||
-WorkingDirectory (Split-Path -Parent $ExecutablePath) `
|
-WorkingDirectory (Split-Path -Parent $ExecutablePath) `
|
||||||
-PassThru
|
-OpenXrRuntimePathOverride $OpenXrRuntimePathOverride
|
||||||
$Report.processId = $Process.Id
|
$Report.processId = $Process.Id
|
||||||
$Deadline = [DateTime]::UtcNow.AddSeconds([Math]::Max($TimeoutSeconds, $ObservationSeconds + 5.0))
|
$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))
|
if (-not (Test-Path -LiteralPath $RuntimeReportPath))
|
||||||
{
|
{
|
||||||
throw "The packaged XR runtime report was not written to '$RuntimeReportPath' before timeout."
|
throw "The packaged XR runtime report was not written to '$RuntimeReportPath' before timeout."
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue