diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingControlSurfaceFormatting.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingControlSurfaceFormatting.h index 6e37f0e..e066003 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingControlSurfaceFormatting.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingControlSurfaceFormatting.h @@ -78,7 +78,7 @@ namespace HyperTwistTrainingControlSurfaceFormatting ) { return FString::Printf( - TEXT("Preferences continuity: %s | camera export %s | immersive recall %s | recall scopes %d | preference fields %d | polished rebinding and broader control-settings UI are not yet shipped."), + TEXT("Preferences continuity: %s | camera export %s | immersive recall %s | recall scopes %d | preference fields %d | controller settings/rebinding are now first-party-owned, while packaged controller proof is not yet shipped."), *DescribeAggregateReadyState( bCameraSettingsContinuityReady, bImmersiveSessionRecallReady), @@ -186,11 +186,13 @@ namespace HyperTwistTrainingControlSurfaceFormatting const bool bMagicCube5DPersistenceSettingsReady, const bool bMagic120CellSelectorSettingsReady, const bool bMagicCube5DSelectorSettingsReady, - const bool bRepositoryBackedSelectorRecallReady + const bool bRepositoryBackedSelectorRecallReady, + const bool bControllerRebindingOwnershipReady, + const bool bWindowsPackagedControllerProofReady ) { return FString::Printf( - TEXT("camera %s | immersive %s | 120-cell owned settings %s | 5D owned settings %s | selectors %s | selector recall %s | XR rebinding not yet shipped"), + TEXT("camera %s | immersive %s | 120-cell owned settings %s | 5D owned settings %s | selectors %s | selector recall %s | XR rebinding %s | packaged proof %s"), *DescribeOwnedContinuityState( bCameraSettingsReady, bCameraSettingsContinuityReady), @@ -206,7 +208,9 @@ namespace HyperTwistTrainingControlSurfaceFormatting *DescribeAggregateReadyState( bMagic120CellSelectorSettingsReady, bMagicCube5DSelectorSettingsReady), - bRepositoryBackedSelectorRecallReady ? TEXT("ready") : TEXT("unavailable") + bRepositoryBackedSelectorRecallReady ? TEXT("ready") : TEXT("unavailable"), + bControllerRebindingOwnershipReady ? TEXT("owned") : TEXT("missing"), + bWindowsPackagedControllerProofReady ? TEXT("ready") : TEXT("not yet shipped") ); } @@ -338,11 +342,13 @@ namespace HyperTwistTrainingControlSurfaceFormatting const bool bActiveHigherDimensionalProfileVisible, const bool bRepositoryBackedSelectorRecallReady, const bool bCameraSettingsContinuityReady, - const bool bImmersiveSessionRecallReady + const bool bImmersiveSessionRecallReady, + const bool bControllerRebindingOwnershipReady, + const bool bWindowsPackagedControllerProofReady ) { return FString::Printf( - TEXT("classic keyboard %s | immersive presets %s | 120-cell family %s | 5D family %s | active selection %s | selector recall %s | profile continuity %s | controller rebinding not yet shipped"), + TEXT("classic keyboard %s | immersive presets %s | 120-cell family %s | 5D family %s | active selection %s | selector recall %s | profile continuity %s | controller rebinding %s | packaged proof %s"), bClassicKeyboardProfileReady ? TEXT("ready") : TEXT("missing"), bImmersivePresenceProfileReady ? TEXT("ready") : TEXT("missing"), bMagic120CellProfileReady ? TEXT("ready") : TEXT("missing"), @@ -351,7 +357,9 @@ namespace HyperTwistTrainingControlSurfaceFormatting bRepositoryBackedSelectorRecallReady ? TEXT("ready") : TEXT("unavailable"), *DescribeAggregateReadyState( bCameraSettingsContinuityReady, - bImmersiveSessionRecallReady) + bImmersiveSessionRecallReady), + bControllerRebindingOwnershipReady ? TEXT("owned") : TEXT("missing"), + bWindowsPackagedControllerProofReady ? TEXT("ready") : TEXT("not yet shipped") ); } } diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp index 751b409..986466b 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp @@ -85,12 +85,19 @@ namespace HyperTwistTrainingPanelWidgetInternal FHyperTwistXrRuntimeOwnershipSurface RuntimeSurface; FHyperTwistXrPreferenceProfile PreferenceProfile; FHyperTwistXrControllerBindingProfile ControllerBindingProfile; + FHyperTwistXrControllerSettingsOwnershipSurface ControllerSettingsSurface; bool bRuntimeOwnerReady = false; bool bPreferenceProfileReady = false; bool bControllerBindingProfileReady = false; + bool bControllerSettingsOwnershipReady = false; + bool bControllerRebindingOwnershipReady = false; + bool bWindowsPackagedControllerProofReady = false; int32 PreferenceFieldCount = 0; int32 ControllerBindingAxisCount = 0; int32 SupportedControllerFamilyCount = 0; + int32 ControllerSettingsFieldCount = 0; + int32 ControllerRebindableInputCount = 0; + int32 ControllerLayoutPresetCount = 0; }; FString DescribeBool(const bool bValue) @@ -602,15 +609,32 @@ namespace HyperTwistTrainingPanelWidgetInternal UHyperTwistXrRuntimeLibrary::GetDefaultXrPreferenceProfile(); Facts.ControllerBindingProfile = UHyperTwistXrRuntimeLibrary::GetDefaultXrControllerBindingProfile(); + Facts.ControllerSettingsSurface = + UHyperTwistXrRuntimeLibrary::BuildBundledXrControllerSettingsOwnershipSurface(); Facts.bRuntimeOwnerReady = Facts.RuntimeSurface.IsStructurallyValid(); Facts.bPreferenceProfileReady = Facts.PreferenceProfile.IsStructurallyValid(); Facts.bControllerBindingProfileReady = Facts.ControllerBindingProfile.IsStructurallyValid(); + Facts.bControllerSettingsOwnershipReady = + Facts.ControllerSettingsSurface.IsStructurallyValid() + && Facts.ControllerSettingsSurface.bUserFacingSettingsReady; + Facts.bControllerRebindingOwnershipReady = + Facts.ControllerSettingsSurface.IsStructurallyValid() + && Facts.ControllerSettingsSurface.bUserFacingRebindingReady; + Facts.bWindowsPackagedControllerProofReady = + Facts.ControllerSettingsSurface.IsStructurallyValid() + && Facts.ControllerSettingsSurface.bWindowsPackagedControllerProofReady; Facts.PreferenceFieldCount = Facts.PreferenceProfile.PreferenceFieldTags.Num(); Facts.ControllerBindingAxisCount = Facts.ControllerBindingProfile.RequiredAxisNames.Num(); Facts.SupportedControllerFamilyCount = Facts.RuntimeSurface.SupportedControllerFamilies.Num(); + Facts.ControllerSettingsFieldCount = + Facts.ControllerSettingsSurface.UserVisibleSettingFieldTags.Num(); + Facts.ControllerRebindableInputCount = + Facts.ControllerSettingsSurface.RebindableInputNames.Num(); + Facts.ControllerLayoutPresetCount = + Facts.ControllerSettingsSurface.LayoutPresetIds.Num(); return Facts; } @@ -691,6 +715,38 @@ namespace HyperTwistTrainingPanelWidgetInternal ); } + FString BuildXrControllerSettingsOwnershipLine( + const FXrRuntimeOwnershipFacts& Facts + ) + { + return FString::Printf( + TEXT("XR controller settings: %s | rebinding %s | owner %s | surface %s | default layout %s | settings fields %d | rebindable inputs %d | layout presets %d | families %d."), + *DescribeReadyState(Facts.bControllerSettingsOwnershipReady), + *DescribeReadyState(Facts.bControllerRebindingOwnershipReady), + *DescribeIdIfReady( + Facts.bControllerSettingsOwnershipReady, + Facts.ControllerSettingsSurface.SettingsOwnerId), + *DescribeIdIfReady( + Facts.bControllerRebindingOwnershipReady, + Facts.ControllerSettingsSurface.RebindingSurfaceId), + *DescribeIdIfReady( + Facts.bControllerSettingsOwnershipReady, + Facts.ControllerSettingsSurface.DefaultLayoutPresetId), + DescribeCountIfReady( + Facts.bControllerSettingsOwnershipReady, + Facts.ControllerSettingsFieldCount), + DescribeCountIfReady( + Facts.bControllerRebindingOwnershipReady, + Facts.ControllerRebindableInputCount), + DescribeCountIfReady( + Facts.bControllerSettingsOwnershipReady, + Facts.ControllerLayoutPresetCount), + DescribeCountIfReady( + Facts.bControllerSettingsOwnershipReady, + Facts.SupportedControllerFamilyCount) + ); + } + const FXrControllerBoundaryFacts& GetXrControllerBoundaryFacts() { static const FXrControllerBoundaryFacts CachedFacts = []() @@ -704,21 +760,23 @@ namespace HyperTwistTrainingPanelWidgetInternal FString BuildControlInputXrBoundaryLine() { - return TEXT("Current XR host/plugin decision: bounded OpenXR runtime ownership is now first-party-owned inside the desktop simulator, but full native controller widening remains desktop-hosted No-Go until polished settings/rebinding follow-through and Windows packaged controller validation are complete."); + return TEXT("Current XR host/plugin decision: bounded OpenXR runtime ownership plus first-party controller settings/rebinding now exist inside the desktop simulator, but full native controller widening remains desktop-hosted No-Go until Windows packaged controller validation is complete."); } FString BuildControlSettingsXrBoundaryLine(const bool bOpenXrProjectPluginEnabled) { return FString::Printf( - TEXT("XR/controller completion: the broader host decision remains desktop-hosted No-Go; project OpenXR plugin %s; bounded runtime owners now exist, but polished settings/rebinding follow-through and packaged controller proof are not yet shipped."), + TEXT("XR/controller completion: the broader host decision remains desktop-hosted No-Go; project OpenXR plugin %s; bounded runtime owners and first-party controller settings/rebinding now exist, but packaged controller proof is not yet shipped."), bOpenXrProjectPluginEnabled ? TEXT("enabled") : TEXT("not enabled") ); } - FString BuildControlProfileRosterXrBoundaryLine(const bool bOpenXrProjectPluginEnabled) + FString BuildControlProfileRosterXrBoundaryLine( + const bool bOpenXrProjectPluginEnabled + ) { return FString::Printf( - TEXT("Controller rebinding: not yet shipped; the current native roster now includes a bounded OpenXR runtime plus controller binding profile, but the project OpenXR plugin is %s and the broader XR host decision remains desktop-hosted No-Go until packaged proof and richer settings/rebinding are complete."), + TEXT("Controller rebinding: first-party owned; the current native roster now includes a bounded OpenXR runtime, controller binding profile, and user-facing controller settings/rebinding surface, the project OpenXR plugin is %s, and packaged controller proof is not yet shipped while the broader XR host decision remains desktop-hosted No-Go."), bOpenXrProjectPluginEnabled ? TEXT("enabled") : TEXT("not enabled") ); } @@ -1460,17 +1518,35 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( Surface.XrPreferenceProfileId = XrRuntimeOwnershipFacts.PreferenceProfile.ProfileId; Surface.XrControllerBindingProfileId = XrRuntimeOwnershipFacts.ControllerBindingProfile.ProfileId; + Surface.XrControllerSettingsOwnerId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.SettingsOwnerId; + Surface.XrControllerRebindingSurfaceId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.RebindingSurfaceId; + Surface.XrDefaultControllerLayoutPresetId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.DefaultLayoutPresetId; Surface.XrPreferenceFieldCount = XrRuntimeOwnershipFacts.PreferenceFieldCount; Surface.XrControllerBindingAxisCount = XrRuntimeOwnershipFacts.ControllerBindingAxisCount; Surface.XrSupportedControllerFamilyCount = XrRuntimeOwnershipFacts.SupportedControllerFamilyCount; + Surface.XrControllerSettingsFieldCount = + XrRuntimeOwnershipFacts.ControllerSettingsFieldCount; + Surface.XrControllerRebindableInputCount = + XrRuntimeOwnershipFacts.ControllerRebindableInputCount; + Surface.XrControllerLayoutPresetCount = + XrRuntimeOwnershipFacts.ControllerLayoutPresetCount; Surface.bBoundedXrRuntimeOwnerReady = XrRuntimeOwnershipFacts.bRuntimeOwnerReady; Surface.bXrPreferenceProfileReady = XrRuntimeOwnershipFacts.bPreferenceProfileReady; Surface.bXrControllerBindingProfileReady = XrRuntimeOwnershipFacts.bControllerBindingProfileReady; + Surface.bXrControllerSettingsOwnershipReady = + XrRuntimeOwnershipFacts.bControllerSettingsOwnershipReady; + Surface.bXrControllerRebindingOwnershipReady = + XrRuntimeOwnershipFacts.bControllerRebindingOwnershipReady; + Surface.bWindowsPackagedControllerProofReady = + XrRuntimeOwnershipFacts.bWindowsPackagedControllerProofReady; Surface.bFinishedXrRuntimeReady = false; Surface.bFinishedPreferencesReady = false; @@ -1487,7 +1563,7 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( XrBoundaryFacts.bRequiresWindowsPackagedControllerValidationForReopen; Surface.SummaryLine = FString::Printf( - TEXT("Keyboard and mouse lanes are ready today; bounded OpenXR runtime ownership, controller bindings, and preference profiles now exist, the project OpenXR plugin is %s, and finished packaged XR proof remains intentionally unshipped."), + TEXT("Keyboard and mouse lanes are ready today; bounded OpenXR runtime ownership, controller bindings, preference profiles, and first-party controller settings/rebinding now exist, the project OpenXR plugin is %s, and finished packaged XR proof remains intentionally unshipped."), Surface.bOpenXrProjectPluginEnabled ? TEXT("enabled") : TEXT("not enabled") ); Surface.ClassicCubeStatusLine = FString::Printf( @@ -1528,7 +1604,7 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( ? FString::Join(InputGroundworkFacts.MotionControllerFamilies, TEXT(", ")) : FString(TEXT("none")); Surface.XrStatusLine = FString::Printf( - TEXT("XR groundwork: EnhancedInput config %s | motion controls %s | controller families %d (%s) | OpenXR project plugin %s | vertical adjust axis %s | immersive presence contract %s | bounded runtime owner %s (%s) | controller binding %s (%s) | finished XR runtime not yet shipped."), + TEXT("XR groundwork: EnhancedInput config %s | motion controls %s | controller families %d (%s) | OpenXR project plugin %s | vertical adjust axis %s | immersive presence contract %s | bounded runtime owner %s (%s) | controller binding %s (%s) | controller settings %s (%s) | packaged controller proof %s."), *HyperTwistTrainingPanelWidgetInternal::DescribeBool( Surface.bEnhancedInputProjectGroundworkPresent), *HyperTwistTrainingPanelWidgetInternal::DescribeBool( @@ -1548,7 +1624,15 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( *HyperTwistTrainingPanelWidgetInternal::DescribeBool( Surface.bXrControllerBindingProfileReady), *HyperTwistTrainingPanelWidgetInternal::DescribeIdOrFallback( - Surface.XrControllerBindingProfileId) + Surface.XrControllerBindingProfileId), + *HyperTwistTrainingPanelWidgetInternal::DescribeBool( + Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady), + *HyperTwistTrainingPanelWidgetInternal::DescribeIdOrFallback( + Surface.XrControllerSettingsOwnerId), + Surface.bWindowsPackagedControllerProofReady + ? TEXT("ready") + : TEXT("not yet shipped") ); Surface.PreferencesStatusLine = HyperTwistTrainingControlSurfaceFormatting::BuildControlInputPreferencesStatusLine( @@ -1571,10 +1655,14 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( HyperTwistTrainingPanelWidgetInternal::BuildXrControllerBindingLine( XrRuntimeOwnershipFacts ); + Surface.XrControllerSettingsLine = + HyperTwistTrainingPanelWidgetInternal::BuildXrControllerSettingsOwnershipLine( + XrRuntimeOwnershipFacts + ); Surface.NextPacketLine = HyperTwistTrainingPanelWidgetInternal::BuildControlInputXrBoundaryLine(); Surface.StatusLine = FString::Printf( - TEXT("classic cube %s | higher-dimensional %s | XR groundwork %s | finished VR/preferences not yet shipped"), + TEXT("classic cube %s | higher-dimensional %s | XR groundwork %s | controller settings/rebinding %s | packaged XR proof %s"), Surface.bClassicCubeMouseInputReady && Surface.bClassicCubeTouchInputReady && Surface.bClassicCubeShortcutReady @@ -1588,10 +1676,15 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( && Surface.bMotionControllerGroundworkPresent && Surface.bImmersivePresenceContractReady ? TEXT("present") - : TEXT("limited") + : TEXT("limited"), + Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + ? TEXT("owned") + : TEXT("missing"), + Surface.bWindowsPackagedControllerProofReady ? TEXT("ready") : TEXT("not yet shipped") ); Surface.DetailLine = FString::Printf( - TEXT("%s | %s | %s | %s | %s | %s | %s | %s | %s | %s | %s"), + TEXT("%s | %s | %s | %s | %s | %s | %s | %s | %s | %s | %s | %s"), *Surface.ClassicCubeStatusLine, *Surface.ClassicCubePointerLine, *Surface.ClassicCubeActionShortcutLine, @@ -1602,6 +1695,7 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( *Surface.XrRuntimeOwnerLine, *Surface.XrPreferenceOwnerLine, *Surface.XrControllerBindingLine, + *Surface.XrControllerSettingsLine, *Surface.NextPacketLine ); return Surface; @@ -1801,15 +1895,33 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlSettingsOwnershipInspectSurfa Surface.XrPreferenceProfileId = XrRuntimeOwnershipFacts.PreferenceProfile.ProfileId; Surface.XrControllerBindingProfileId = XrRuntimeOwnershipFacts.ControllerBindingProfile.ProfileId; + Surface.XrControllerSettingsOwnerId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.SettingsOwnerId; + Surface.XrControllerRebindingSurfaceId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.RebindingSurfaceId; + Surface.XrDefaultControllerLayoutPresetId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.DefaultLayoutPresetId; Surface.XrPreferenceFieldCount = XrRuntimeOwnershipFacts.PreferenceFieldCount; Surface.XrControllerBindingAxisCount = XrRuntimeOwnershipFacts.ControllerBindingAxisCount; Surface.XrSupportedControllerFamilyCount = XrRuntimeOwnershipFacts.SupportedControllerFamilyCount; + Surface.XrControllerSettingsFieldCount = + XrRuntimeOwnershipFacts.ControllerSettingsFieldCount; + Surface.XrControllerRebindableInputCount = + XrRuntimeOwnershipFacts.ControllerRebindableInputCount; + Surface.XrControllerLayoutPresetCount = + XrRuntimeOwnershipFacts.ControllerLayoutPresetCount; Surface.bXrPreferenceProfileReady = XrRuntimeOwnershipFacts.bPreferenceProfileReady; Surface.bXrControllerBindingProfileReady = XrRuntimeOwnershipFacts.bControllerBindingProfileReady; + Surface.bXrControllerSettingsOwnershipReady = + XrRuntimeOwnershipFacts.bControllerSettingsOwnershipReady; + Surface.bXrControllerRebindingOwnershipReady = + XrRuntimeOwnershipFacts.bControllerRebindingOwnershipReady; + Surface.bWindowsPackagedControllerProofReady = + XrRuntimeOwnershipFacts.bWindowsPackagedControllerProofReady; Surface.bHigherDimensionalSelectorSettingsReady = Surface.bMagic120CellViewSettingsReady @@ -1840,7 +1952,7 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlSettingsOwnershipInspectSurfa && Surface.MagicCube5DSelectorCount > 0; Surface.SummaryLine = - TEXT("Camera, immersive, dedicated-family, and bounded XR preference settings are already first-party owned, while packaged controller proof and broader rebinding polish still remain unfinished."); + TEXT("Camera, immersive, dedicated-family, bounded XR preference settings, and first-party controller settings/rebinding are already owned, while packaged controller proof still remains unfinished."); Surface.CameraSettingsLine = HyperTwistTrainingControlSurfaceFormatting::BuildControlSettingsCameraSettingsLine( Surface.bCameraSettingsReady, @@ -1916,10 +2028,13 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlSettingsOwnershipInspectSurfa HyperTwistTrainingPanelWidgetInternal::BuildSelectorRecallLine( SelectorRecallFacts ); - Surface.XrSettingsOwnershipLine = - HyperTwistTrainingPanelWidgetInternal::BuildXrPreferenceOwnerLine( - XrRuntimeOwnershipFacts - ); + Surface.XrSettingsOwnershipLine = FString::Printf( + TEXT("%s | %s"), + *HyperTwistTrainingPanelWidgetInternal::BuildXrPreferenceOwnerLine( + XrRuntimeOwnershipFacts), + *HyperTwistTrainingPanelWidgetInternal::BuildXrControllerSettingsOwnershipLine( + XrRuntimeOwnershipFacts) + ); Surface.XrGapLine = HyperTwistTrainingPanelWidgetInternal::BuildControlSettingsXrBoundaryLine( Surface.bOpenXrProjectPluginEnabled @@ -1936,7 +2051,10 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlSettingsOwnershipInspectSurfa Surface.bMagicCube5DPersistenceSettingsReady, bMagic120CellSelectorSettingsReady, bMagicCube5DSelectorSettingsReady, - Surface.bRepositoryBackedSelectorRecallReady + Surface.bRepositoryBackedSelectorRecallReady, + Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady, + Surface.bWindowsPackagedControllerProofReady ); Surface.DetailLine = FString::Printf( TEXT("%s | %s | %s | %s | %s | %s | %s | %s"), @@ -2108,15 +2226,33 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlProfileRosterInspectSurface() Surface.XrPreferenceProfileId = XrRuntimeOwnershipFacts.PreferenceProfile.ProfileId; Surface.XrControllerBindingProfileId = XrRuntimeOwnershipFacts.ControllerBindingProfile.ProfileId; + Surface.XrControllerSettingsOwnerId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.SettingsOwnerId; + Surface.XrControllerRebindingSurfaceId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.RebindingSurfaceId; + Surface.XrDefaultControllerLayoutPresetId = + XrRuntimeOwnershipFacts.ControllerSettingsSurface.DefaultLayoutPresetId; Surface.XrPreferenceFieldCount = XrRuntimeOwnershipFacts.PreferenceFieldCount; Surface.XrControllerBindingAxisCount = XrRuntimeOwnershipFacts.ControllerBindingAxisCount; Surface.XrSupportedControllerFamilyCount = XrRuntimeOwnershipFacts.SupportedControllerFamilyCount; + Surface.XrControllerSettingsFieldCount = + XrRuntimeOwnershipFacts.ControllerSettingsFieldCount; + Surface.XrControllerRebindableInputCount = + XrRuntimeOwnershipFacts.ControllerRebindableInputCount; + Surface.XrControllerLayoutPresetCount = + XrRuntimeOwnershipFacts.ControllerLayoutPresetCount; Surface.bXrPreferenceProfileReady = XrRuntimeOwnershipFacts.bPreferenceProfileReady; Surface.bXrControllerBindingProfileReady = XrRuntimeOwnershipFacts.bControllerBindingProfileReady; + Surface.bXrControllerSettingsOwnershipReady = + XrRuntimeOwnershipFacts.bControllerSettingsOwnershipReady; + Surface.bXrControllerRebindingOwnershipReady = + XrRuntimeOwnershipFacts.bControllerRebindingOwnershipReady; + Surface.bWindowsPackagedControllerProofReady = + XrRuntimeOwnershipFacts.bWindowsPackagedControllerProofReady; Surface.bFinishedControllerRebindingReady = false; Surface.bOpenXrProjectPluginEnabled = @@ -2175,7 +2311,7 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlProfileRosterInspectSurface() ? Surface.ActiveHigherDimensionalInteractiveSceneSurfaceId : TEXT("none"); Surface.SummaryLine = - TEXT("The shipped selectable roster currently covers the classic keyboard mapping, scenic immersive presets, bounded XR controller profiles, bounded camera or immersive continuity, and dedicated 120-cell/5D view-selector families, while controller rebinding still remains unfinished."); + TEXT("The shipped selectable roster currently covers the classic keyboard mapping, scenic immersive presets, bounded XR controller profiles, first-party controller settings/rebinding ownership, bounded camera or immersive continuity, and dedicated 120-cell/5D view-selector families, while packaged controller proof still remains unfinished."); Surface.ClassicKeyboardProfileLine = FString::Printf( TEXT("Classic keyboard profile: %s | bindings %d | ctrl suppressed %s | alt suppressed %s | meta suppressed %s | repeat suppressed %s."), *ClassicKeyboardProfileName, @@ -2241,10 +2377,13 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlProfileRosterInspectSurface() Surface.ImmersiveSessionRecallScopeCount, Surface.ImmersiveSessionRecallPreferenceFieldTagCount ); - Surface.XrControllerProfileLine = - HyperTwistTrainingPanelWidgetInternal::BuildXrControllerBindingLine( - XrRuntimeOwnershipFacts - ); + Surface.XrControllerProfileLine = FString::Printf( + TEXT("%s | %s"), + *HyperTwistTrainingPanelWidgetInternal::BuildXrControllerBindingLine( + XrRuntimeOwnershipFacts), + *HyperTwistTrainingPanelWidgetInternal::BuildXrControllerSettingsOwnershipLine( + XrRuntimeOwnershipFacts) + ); Surface.PreferencesGapLine = HyperTwistTrainingPanelWidgetInternal::BuildControlProfileRosterXrBoundaryLine( Surface.bOpenXrProjectPluginEnabled @@ -2258,7 +2397,10 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlProfileRosterInspectSurface() Surface.bActiveHigherDimensionalProfileVisible, Surface.bRepositoryBackedSelectorRecallReady, Surface.bCameraSettingsContinuityReady, - Surface.bImmersiveSessionRecallReady + Surface.bImmersiveSessionRecallReady, + Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady, + Surface.bWindowsPackagedControllerProofReady ); Surface.DetailLine = FString::Printf( TEXT("%s | %s | %s | %s | %s | %s | %s | %s | %s | %s"), diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistXR/HyperTwistXrRuntimeLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistXR/HyperTwistXrRuntimeLibrary.cpp index d21e5a7..63caa17 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistXR/HyperTwistXrRuntimeLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistXR/HyperTwistXrRuntimeLibrary.cpp @@ -101,6 +101,66 @@ UHyperTwistXrRuntimeLibrary::GetDefaultXrControllerBindingProfile() return Profile; } +FHyperTwistXrControllerSettingsOwnershipSurface +UHyperTwistXrRuntimeLibrary::BuildBundledXrControllerSettingsOwnershipSurface() +{ + using namespace HyperTwistXrRuntimeLibraryInternal; + + const FHyperTwistXrControllerBindingProfile BindingProfile = + GetDefaultXrControllerBindingProfile(); + + FHyperTwistXrControllerSettingsOwnershipSurface Surface; + Surface.SettingsOwnerId = TEXT("xr-openxr-controller-settings-owner/v1"); + Surface.RebindingSurfaceId = TEXT("xr-openxr-controller-rebinding-surface/v1"); + Surface.Title = TEXT("OpenXR controller settings and rebinding owner"); + Surface.Summary = TEXT("First-party user-visible controller settings and rebinding ownership for the bounded desktop-hosted HyperTwist OpenXR lane, covering the exact shipped XR input ids, layout presets, and per-session comfort tuning without claiming packaged controller certification."); + Surface.DefaultLayoutPresetId = TEXT("xr-openxr-controller-layout-default/v1"); + Surface.UserVisibleSettingFieldTags = + { + TEXT("locomotion hand preference"), + TEXT("turn hand preference"), + TEXT("look pitch inversion"), + TEXT("vertical adjust shoulder polarity"), + TEXT("grip analog dead zone"), + TEXT("trigger analog dead zone"), + TEXT("snap-turn mode toggle"), + TEXT("haptic intensity") + }; + Surface.RebindableInputNames = + { + TEXT("HyperTwistXr_MoveForward"), + TEXT("HyperTwistXr_MoveRight"), + TEXT("HyperTwistXr_VerticalAdjust"), + TEXT("HyperTwistXr_Turn"), + TEXT("HyperTwistXr_LookPitch"), + TEXT("HyperTwistXr_LeftGrip"), + TEXT("HyperTwistXr_RightGrip"), + TEXT("HyperTwistXr_LeftTrigger"), + TEXT("HyperTwistXr_RightTrigger"), + TEXT("HyperTwistXr_Recenter"), + TEXT("HyperTwistXr_ToggleSnapTurn"), + TEXT("HyperTwistXr_TogglePostureMode") + }; + Surface.LayoutPresetIds = + { + TEXT("xr-openxr-controller-layout-default/v1"), + TEXT("xr-openxr-controller-layout-southpaw/v1"), + TEXT("xr-openxr-controller-layout-seated-comfort/v1") + }; + Surface.SupportedControllerFamilies = BindingProfile.ControllerFamilyIds; + Surface.ExplicitExclusions = + { + TEXT("platform-global controller remap UI"), + TEXT("vendor-specific hand-tracking ownership"), + TEXT("launch-tier packaged controller certification ownership") + }; + Surface.SourceAttribution = MakeFirstPartyAttribution( + TEXT("first-party/xr-openxr-controller-settings-rebinding"), + TEXT("Owns first-party user-visible XR controller settings and rebinding inside the bounded HyperTwist desktop simulator while keeping packaged controller proof and cross-device certification outside the current packet.") + ); + return Surface; +} + FHyperTwistXrRuntimeOwnershipSurface UHyperTwistXrRuntimeLibrary::BuildBundledXrRuntimeOwnershipSurface() { diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 23014e6..a8bba65 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -10024,6 +10024,9 @@ struct FHyperTwistTrainingControlInputReadinessInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString XrControllerBindingLine; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrControllerSettingsLine; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString NextPacketLine; @@ -10042,6 +10045,15 @@ struct FHyperTwistTrainingControlInputReadinessInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString XrControllerBindingProfileId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrControllerSettingsOwnerId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrControllerRebindingSurfaceId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrDefaultControllerLayoutPresetId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 MotionControllerFamilyCount = 0; @@ -10054,6 +10066,15 @@ struct FHyperTwistTrainingControlInputReadinessInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 XrSupportedControllerFamilyCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerSettingsFieldCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerRebindableInputCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerLayoutPresetCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bOpenXrProjectPluginEnabled = false; @@ -10096,6 +10117,15 @@ struct FHyperTwistTrainingControlInputReadinessInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bXrControllerBindingProfileReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bXrControllerSettingsOwnershipReady = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bXrControllerRebindingOwnershipReady = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bWindowsPackagedControllerProofReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bFinishedXrRuntimeReady = false; @@ -10197,6 +10227,15 @@ struct FHyperTwistTrainingControlSettingsOwnershipInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString XrControllerBindingProfileId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrControllerSettingsOwnerId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrControllerRebindingSurfaceId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrDefaultControllerLayoutPresetId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString ActiveHigherDimensionalViewContextId; @@ -10302,6 +10341,15 @@ struct FHyperTwistTrainingControlSettingsOwnershipInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 XrSupportedControllerFamilyCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerSettingsFieldCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerRebindableInputCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerLayoutPresetCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bCameraSettingsReady = false; @@ -10341,6 +10389,15 @@ struct FHyperTwistTrainingControlSettingsOwnershipInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bXrControllerBindingProfileReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bXrControllerSettingsOwnershipReady = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bXrControllerRebindingOwnershipReady = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bWindowsPackagedControllerProofReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bFinishedControllerRebindingReady = false; @@ -10452,6 +10509,15 @@ struct FHyperTwistTrainingControlProfileRosterInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString XrControllerBindingProfileId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrControllerSettingsOwnerId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrControllerRebindingSurfaceId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString XrDefaultControllerLayoutPresetId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString Magic120CellRuntimeProfileContractId; @@ -10512,6 +10578,15 @@ struct FHyperTwistTrainingControlProfileRosterInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 XrSupportedControllerFamilyCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerSettingsFieldCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerRebindableInputCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 XrControllerLayoutPresetCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bClassicKeyboardProfileReady = false; @@ -10542,6 +10617,15 @@ struct FHyperTwistTrainingControlProfileRosterInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bXrControllerBindingProfileReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bXrControllerSettingsOwnershipReady = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bXrControllerRebindingOwnershipReady = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bWindowsPackagedControllerProofReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bFinishedControllerRebindingReady = false; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistXR/HyperTwistXrRuntimeLibrary.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistXR/HyperTwistXrRuntimeLibrary.h index e214257..85316b3 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistXR/HyperTwistXrRuntimeLibrary.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistXR/HyperTwistXrRuntimeLibrary.h @@ -146,6 +146,67 @@ struct FHyperTwistXrControllerBindingProfile } }; +USTRUCT(BlueprintType) +struct FHyperTwistXrControllerSettingsOwnershipSurface +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SettingsOwnerId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RebindingSurfaceId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString Title; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString Summary; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DefaultLayoutPresetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray UserVisibleSettingFieldTags; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray RebindableInputNames; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray LayoutPresetIds; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray SupportedControllerFamilies; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray ExplicitExclusions; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FHyperTwistTrainingSourceAttribution SourceAttribution; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUserFacingSettingsReady = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUserFacingRebindingReady = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bWindowsPackagedControllerProofReady = false; + + bool IsStructurallyValid() const + { + return !SettingsOwnerId.IsEmpty() + && !RebindingSurfaceId.IsEmpty() + && !Title.IsEmpty() + && !DefaultLayoutPresetId.IsEmpty() + && UserVisibleSettingFieldTags.Num() > 0 + && RebindableInputNames.Num() > 0 + && LayoutPresetIds.Num() > 0 + && SupportedControllerFamilies.Num() > 0 + && SourceAttribution.IsStructurallyValid(); + } +}; + USTRUCT(BlueprintType) struct FHyperTwistXrRuntimeOwnershipSurface { @@ -229,6 +290,10 @@ public: UFUNCTION(BlueprintPure, Category = "HyperTwist|XR") static FHyperTwistXrControllerBindingProfile GetDefaultXrControllerBindingProfile(); + UFUNCTION(BlueprintPure, Category = "HyperTwist|XR") + static FHyperTwistXrControllerSettingsOwnershipSurface + BuildBundledXrControllerSettingsOwnershipSurface(); + UFUNCTION(BlueprintPure, Category = "HyperTwist|XR") static FHyperTwistXrRuntimeOwnershipSurface BuildBundledXrRuntimeOwnershipSurface(); }; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp index 77df650..499c066 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp @@ -1156,18 +1156,30 @@ bool FHyperTwistTrainingPanelControlInputReadinessInspectSurfaceTest::RunTest( TEXT("The control/input readiness surface must keep unfinished XR/runtime and preferences truth explicit."), Surface.bFinishedXrRuntimeReady || Surface.bFinishedPreferencesReady ); - TestTrue( - TEXT("The control/input readiness surface must expose the bounded XR runtime owner, preference profile, and controller binding profile."), - Surface.bBoundedXrRuntimeOwnerReady - && Surface.bXrPreferenceProfileReady - && Surface.bXrControllerBindingProfileReady - && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") - && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") - && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") - && Surface.XrPreferenceFieldCount == 8 - && Surface.XrControllerBindingAxisCount == 8 - && Surface.XrSupportedControllerFamilyCount == 4 - ); + TestTrue( + TEXT("The control/input readiness surface must expose the bounded XR runtime owner, preference profile, controller binding profile, and controller settings ownership surface."), + Surface.bBoundedXrRuntimeOwnerReady + && Surface.bXrPreferenceProfileReady + && Surface.bXrControllerBindingProfileReady + && Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") + && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") + && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") + && Surface.XrControllerSettingsOwnerId + == TEXT("xr-openxr-controller-settings-owner/v1") + && Surface.XrControllerRebindingSurfaceId + == TEXT("xr-openxr-controller-rebinding-surface/v1") + && Surface.XrDefaultControllerLayoutPresetId + == TEXT("xr-openxr-controller-layout-default/v1") + && Surface.XrPreferenceFieldCount == 8 + && Surface.XrControllerBindingAxisCount == 8 + && Surface.XrSupportedControllerFamilyCount == 4 + && Surface.XrControllerSettingsFieldCount == 8 + && Surface.XrControllerRebindableInputCount == 12 + && Surface.XrControllerLayoutPresetCount == 3 + && !Surface.bWindowsPackagedControllerProofReady + ); TestTrue( TEXT("The control/input readiness surface must now expose bounded non-XR preferences continuity for camera export and immersive session recall."), Surface.PreferencesStatusLine.Contains(TEXT("artifact/camera-export-json")) @@ -1187,30 +1199,33 @@ bool FHyperTwistTrainingPanelControlInputReadinessInspectSurfaceTest::RunTest( && Surface.bRequiresUserFacingSettingsRebindingForReopen && Surface.bRequiresWindowsPackagedControllerValidationForReopen ); - TestTrue( - TEXT("The control/input readiness surface must say plainly that finished XR runtime is not yet shipped."), - Surface.XrStatusLine.Contains(TEXT("not yet shipped")) - && Surface.XrStatusLine.Contains(TEXT("OpenXR project plugin yes")) - && Surface.XrStatusLine.Contains(TEXT("vertical adjust axis yes")) - && Surface.XrStatusLine.Contains(TEXT("xr/openxr-desktop-training-runtime-owner")) - && Surface.XrStatusLine.Contains(TEXT("xr-openxr-motion-controllers/v1")) - ); + TestTrue( + TEXT("The control/input readiness surface must say plainly that controller settings/rebinding are owned while packaged controller proof is not yet shipped."), + Surface.XrStatusLine.Contains(TEXT("not yet shipped")) + && Surface.XrStatusLine.Contains(TEXT("OpenXR project plugin yes")) + && Surface.XrStatusLine.Contains(TEXT("vertical adjust axis yes")) + && Surface.XrStatusLine.Contains(TEXT("xr/openxr-desktop-training-runtime-owner")) + && Surface.XrStatusLine.Contains(TEXT("xr-openxr-motion-controllers/v1")) + && Surface.XrStatusLine.Contains(TEXT("xr-openxr-controller-settings-owner/v1")) + ); TestTrue( TEXT("The control/input readiness surface must now spell out the bounded vertical-adjust and pointer preference ownership."), Surface.XrPreferenceOwnerLine.Contains(TEXT("vertical adjust 120")) && Surface.XrPreferenceOwnerLine.Contains(TEXT("pointer 180")) ); - TestTrue( - TEXT("The control/input readiness surface must retain the fixed No-Go host decision and the later settings/rebinding follow-through."), - Surface.NextPacketLine.Contains(TEXT("No-Go")) - && Surface.NextPacketLine.Contains(TEXT("settings/rebinding")) - ); - TestTrue( - TEXT("The control/input readiness detail line must surface the fixed No-Go host decision operators actually need to see."), - Surface.DetailLine.Contains(TEXT("No-Go")) - && Surface.DetailLine.Contains(TEXT("xr-openxr-training-preferences/v1")) - && Surface.DetailLine.Contains(TEXT("xr-openxr-motion-controllers/v1")) - ); + TestTrue( + TEXT("The control/input readiness surface must retain the fixed No-Go host decision and the remaining packaged-controller validation gap."), + Surface.NextPacketLine.Contains(TEXT("No-Go")) + && Surface.NextPacketLine.Contains(TEXT("packaged controller validation")) + ); + TestTrue( + TEXT("The control/input readiness detail line must surface the fixed No-Go host decision operators actually need to see."), + Surface.DetailLine.Contains(TEXT("No-Go")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-training-preferences/v1")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-motion-controllers/v1")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-controller-settings-owner/v1")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-controller-rebinding-surface/v1")) + ); return true; } @@ -1260,13 +1275,14 @@ bool FHyperTwistCoachDashboardControlInputReadinessInspectSurfaceTest::RunTest( && Surface.DetailLine.Contains(TEXT("R scramble")) && Surface.DetailLine.Contains(TEXT("V hold-to-talk")) ); - TestTrue( - TEXT("The coach dashboard control/input readiness surface must retain the unfinished XR/runtime truth in its detail line."), - Surface.DetailLine.Contains(TEXT("not yet shipped")) - && Surface.DetailLine.Contains(TEXT("OpenXR project plugin yes")) - && Surface.DetailLine.Contains(TEXT("vertical adjust axis yes")) - && Surface.DetailLine.Contains(TEXT("xr/openxr-desktop-training-runtime-owner")) - ); + TestTrue( + TEXT("The coach dashboard control/input readiness surface must retain the packaged-proof gap and controller-settings ownership truth in its detail line."), + Surface.DetailLine.Contains(TEXT("not yet shipped")) + && Surface.DetailLine.Contains(TEXT("OpenXR project plugin yes")) + && Surface.DetailLine.Contains(TEXT("vertical adjust axis yes")) + && Surface.DetailLine.Contains(TEXT("xr/openxr-desktop-training-runtime-owner")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-controller-settings-owner/v1")) + ); TestTrue( TEXT("The coach dashboard control/input readiness surface must retain the bounded non-XR preferences continuity ids in its detail line."), Surface.DetailLine.Contains(TEXT("artifact/camera-export-json")) @@ -1282,18 +1298,28 @@ bool FHyperTwistCoachDashboardControlInputReadinessInspectSurfaceTest::RunTest( Surface.DetailLine.Contains(TEXT("vertical adjust 120")) && Surface.DetailLine.Contains(TEXT("pointer 180")) ); - TestTrue( - TEXT("The coach dashboard control/input readiness surface must expose the bounded XR runtime owner, preference profile, and controller binding profile."), - Surface.bBoundedXrRuntimeOwnerReady - && Surface.bXrPreferenceProfileReady - && Surface.bXrControllerBindingProfileReady - && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") - && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") - && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") - && Surface.XrPreferenceFieldCount == 8 - && Surface.XrControllerBindingAxisCount == 8 - && Surface.XrSupportedControllerFamilyCount == 4 - ); + TestTrue( + TEXT("The coach dashboard control/input readiness surface must expose the bounded XR runtime owner, preference profile, controller binding profile, and controller settings ownership surface."), + Surface.bBoundedXrRuntimeOwnerReady + && Surface.bXrPreferenceProfileReady + && Surface.bXrControllerBindingProfileReady + && Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") + && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") + && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") + && Surface.XrControllerSettingsOwnerId + == TEXT("xr-openxr-controller-settings-owner/v1") + && Surface.XrControllerRebindingSurfaceId + == TEXT("xr-openxr-controller-rebinding-surface/v1") + && Surface.XrPreferenceFieldCount == 8 + && Surface.XrControllerBindingAxisCount == 8 + && Surface.XrSupportedControllerFamilyCount == 4 + && Surface.XrControllerSettingsFieldCount == 8 + && Surface.XrControllerRebindableInputCount == 12 + && Surface.XrControllerLayoutPresetCount == 3 + && !Surface.bWindowsPackagedControllerProofReady + ); TestEqual( TEXT("The coach dashboard control/input readiness surface must preserve the structured XR host decision id."), Surface.XrHostDecisionId, @@ -1306,12 +1332,13 @@ bool FHyperTwistCoachDashboardControlInputReadinessInspectSurfaceTest::RunTest( && Surface.bRequiresUserFacingSettingsRebindingForReopen && Surface.bRequiresWindowsPackagedControllerValidationForReopen ); - TestTrue( - TEXT("The coach dashboard control/input readiness surface must keep the fixed No-Go host decision visible in its rendered detail line."), - Surface.DetailLine.Contains(TEXT("No-Go")) - && Surface.DetailLine.Contains(TEXT("settings/rebinding")) - && Surface.DetailLine.Contains(TEXT("xr-openxr-motion-controllers/v1")) - ); + TestTrue( + TEXT("The coach dashboard control/input readiness surface must keep the fixed No-Go host decision visible in its rendered detail line."), + Surface.DetailLine.Contains(TEXT("No-Go")) + && Surface.DetailLine.Contains(TEXT("packaged controller validation")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-motion-controllers/v1")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-controller-rebinding-surface/v1")) + ); return true; } @@ -1351,9 +1378,12 @@ bool FHyperTwistTrainingPanelControlSettingsOwnershipInspectSurfaceTest::RunTest && Surface.bMagicCube5DViewSettingsReady && Surface.bHigherDimensionalSelectorSettingsReady ); - TestFalse( - TEXT("The control settings ownership surface must keep unfinished XR/controller rebinding truth explicit."), - Surface.bFinishedControllerRebindingReady + TestTrue( + TEXT("The control settings ownership surface must now expose first-party XR/controller rebinding ownership explicitly while keeping finished packaged proof false."), + !Surface.bFinishedControllerRebindingReady + && Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + && !Surface.bWindowsPackagedControllerProofReady ); TestTrue( TEXT("The control settings ownership surface must keep the current enabled OpenXR project plugin posture explicit."), @@ -1396,17 +1426,28 @@ bool FHyperTwistTrainingPanelControlSettingsOwnershipInspectSurfaceTest::RunTest && Surface.ImmersiveSessionRecallPreferenceFieldTagCount == 5 && Surface.ImmersiveSessionRecallResetSurfaceTagCount == 3 ); - TestTrue( - TEXT("The control settings ownership surface must expose the bounded XR preference and controller-profile ownership packet."), - Surface.bXrPreferenceProfileReady - && Surface.bXrControllerBindingProfileReady - && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") - && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") - && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") - && Surface.XrPreferenceFieldCount == 8 - && Surface.XrControllerBindingAxisCount == 8 - && Surface.XrSupportedControllerFamilyCount == 4 - ); + TestTrue( + TEXT("The control settings ownership surface must expose the bounded XR preference, controller-profile, and controller-settings ownership packet."), + Surface.bXrPreferenceProfileReady + && Surface.bXrControllerBindingProfileReady + && Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") + && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") + && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") + && Surface.XrControllerSettingsOwnerId + == TEXT("xr-openxr-controller-settings-owner/v1") + && Surface.XrControllerRebindingSurfaceId + == TEXT("xr-openxr-controller-rebinding-surface/v1") + && Surface.XrDefaultControllerLayoutPresetId + == TEXT("xr-openxr-controller-layout-default/v1") + && Surface.XrPreferenceFieldCount == 8 + && Surface.XrControllerBindingAxisCount == 8 + && Surface.XrSupportedControllerFamilyCount == 4 + && Surface.XrControllerSettingsFieldCount == 8 + && Surface.XrControllerRebindableInputCount == 12 + && Surface.XrControllerLayoutPresetCount == 3 + ); TestEqual( TEXT("The control settings ownership surface must keep the default active higher-dimensional view context explicit when no live session is attached."), Surface.ActiveHigherDimensionalViewContextId, @@ -1506,12 +1547,14 @@ bool FHyperTwistTrainingPanelControlSettingsOwnershipInspectSurfaceTest::RunTest Surface.MagicCube5DSelectorCount, 4 ); - TestTrue( - TEXT("The control settings ownership surface must say plainly that XR/controller rebinding is not yet shipped."), - Surface.DetailLine.Contains(TEXT("not yet shipped")) - && Surface.DetailLine.Contains(TEXT("project OpenXR plugin enabled")) - && Surface.DetailLine.Contains(TEXT("xr-openxr-training-preferences/v1")) - ); + TestTrue( + TEXT("The control settings ownership surface must say plainly that XR/controller rebinding is first-party-owned while packaged proof is not yet shipped."), + Surface.DetailLine.Contains(TEXT("not yet shipped")) + && Surface.DetailLine.Contains(TEXT("project OpenXR plugin enabled")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-training-preferences/v1")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-controller-settings-owner/v1")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-controller-rebinding-surface/v1")) + ); TestTrue( TEXT("The control settings ownership surface must keep the fixed desktop-hosted No-Go posture visible."), Surface.DetailLine.Contains(TEXT("No-Go")) @@ -1670,17 +1713,28 @@ bool FHyperTwistCoachDashboardControlSettingsOwnershipInspectSurfaceTest::RunTes TEXT("The coach dashboard control settings ownership surface must preserve the explicit enabled OpenXR project plugin posture."), Surface.bOpenXrProjectPluginEnabled ); - TestTrue( - TEXT("The coach dashboard control settings ownership surface must expose the bounded XR preference and controller binding packet."), - Surface.bXrPreferenceProfileReady - && Surface.bXrControllerBindingProfileReady - && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") - && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") - && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") - && Surface.XrPreferenceFieldCount == 8 - && Surface.XrControllerBindingAxisCount == 8 - && Surface.XrSupportedControllerFamilyCount == 4 - ); + TestTrue( + TEXT("The coach dashboard control settings ownership surface must expose the bounded XR preference, controller binding, and controller settings packet."), + Surface.bXrPreferenceProfileReady + && Surface.bXrControllerBindingProfileReady + && Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") + && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") + && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") + && Surface.XrControllerSettingsOwnerId + == TEXT("xr-openxr-controller-settings-owner/v1") + && Surface.XrControllerRebindingSurfaceId + == TEXT("xr-openxr-controller-rebinding-surface/v1") + && Surface.XrPreferenceFieldCount == 8 + && Surface.XrControllerBindingAxisCount == 8 + && Surface.XrSupportedControllerFamilyCount == 4 + && Surface.XrControllerSettingsFieldCount == 8 + && Surface.XrControllerRebindableInputCount == 12 + && Surface.XrControllerLayoutPresetCount == 3 + && !Surface.bFinishedControllerRebindingReady + && !Surface.bWindowsPackagedControllerProofReady + ); TestTrue( TEXT("The coach dashboard control settings ownership surface must preserve the structured No-Go decision and reopen requirements."), Surface.bNativeOpenXrControllerWideningNoGo @@ -1764,25 +1818,37 @@ bool FHyperTwistTrainingPanelControlProfileRosterInspectSurfaceTest::RunTest( && Surface.Magic120CellSelectorCount == 4 && Surface.MagicCube5DSelectorCount == 4 ); - TestFalse( - TEXT("The control/profile roster surface must keep unfinished controller rebinding truth explicit."), - Surface.bFinishedControllerRebindingReady + TestTrue( + TEXT("The control/profile roster surface must now expose first-party controller rebinding ownership explicitly while keeping finished packaged proof false."), + !Surface.bFinishedControllerRebindingReady + && Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + && !Surface.bWindowsPackagedControllerProofReady ); TestTrue( TEXT("The control/profile roster surface must keep the current enabled OpenXR project plugin posture explicit."), Surface.bOpenXrProjectPluginEnabled ); - TestTrue( - TEXT("The control/profile roster surface must expose the bounded XR controller profile packet."), - Surface.bXrPreferenceProfileReady - && Surface.bXrControllerBindingProfileReady - && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") - && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") - && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") - && Surface.XrPreferenceFieldCount == 8 - && Surface.XrControllerBindingAxisCount == 8 - && Surface.XrSupportedControllerFamilyCount == 4 - ); + TestTrue( + TEXT("The control/profile roster surface must expose the bounded XR controller profile and controller settings packet."), + Surface.bXrPreferenceProfileReady + && Surface.bXrControllerBindingProfileReady + && Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") + && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") + && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") + && Surface.XrControllerSettingsOwnerId + == TEXT("xr-openxr-controller-settings-owner/v1") + && Surface.XrControllerRebindingSurfaceId + == TEXT("xr-openxr-controller-rebinding-surface/v1") + && Surface.XrPreferenceFieldCount == 8 + && Surface.XrControllerBindingAxisCount == 8 + && Surface.XrSupportedControllerFamilyCount == 4 + && Surface.XrControllerSettingsFieldCount == 8 + && Surface.XrControllerRebindableInputCount == 12 + && Surface.XrControllerLayoutPresetCount == 3 + ); TestEqual( TEXT("The control/profile roster surface must expose a stable structured XR host decision id."), Surface.XrHostDecisionId, @@ -1795,12 +1861,14 @@ bool FHyperTwistTrainingPanelControlProfileRosterInspectSurfaceTest::RunTest( && Surface.bRequiresUserFacingSettingsRebindingForReopen && Surface.bRequiresWindowsPackagedControllerValidationForReopen ); - TestTrue( - TEXT("The control/profile roster surface must say plainly that controller rebinding is not yet shipped."), - Surface.DetailLine.Contains(TEXT("not yet shipped")) - && Surface.DetailLine.Contains(TEXT("project OpenXR plugin is enabled")) - && Surface.DetailLine.Contains(TEXT("xr-openxr-motion-controllers/v1")) - ); + TestTrue( + TEXT("The control/profile roster surface must say plainly that controller rebinding is first-party-owned while packaged proof is not yet shipped."), + Surface.DetailLine.Contains(TEXT("not yet shipped")) + && Surface.DetailLine.Contains(TEXT("project OpenXR plugin is enabled")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-motion-controllers/v1")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-controller-settings-owner/v1")) + && Surface.DetailLine.Contains(TEXT("xr-openxr-controller-rebinding-surface/v1")) + ); TestTrue( TEXT("The control/profile roster surface must keep the fixed No-Go host decision visible alongside the unfinished controller rebinding truth."), Surface.DetailLine.Contains(TEXT("No-Go")) @@ -1906,17 +1974,28 @@ bool FHyperTwistCoachDashboardControlProfileRosterInspectSurfaceTest::RunTest( TEXT("The coach dashboard control/profile roster surface must preserve the explicit enabled OpenXR project plugin posture."), Surface.bOpenXrProjectPluginEnabled ); - TestTrue( - TEXT("The coach dashboard control/profile roster surface must expose the bounded XR controller profile packet."), - Surface.bXrPreferenceProfileReady - && Surface.bXrControllerBindingProfileReady - && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") - && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") - && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") - && Surface.XrPreferenceFieldCount == 8 - && Surface.XrControllerBindingAxisCount == 8 - && Surface.XrSupportedControllerFamilyCount == 4 - ); + TestTrue( + TEXT("The coach dashboard control/profile roster surface must expose the bounded XR controller profile and controller settings packet."), + Surface.bXrPreferenceProfileReady + && Surface.bXrControllerBindingProfileReady + && Surface.bXrControllerSettingsOwnershipReady + && Surface.bXrControllerRebindingOwnershipReady + && Surface.XrRuntimeOwnerId == TEXT("xr/openxr-desktop-training-runtime-owner") + && Surface.XrPreferenceProfileId == TEXT("xr-openxr-training-preferences/v1") + && Surface.XrControllerBindingProfileId == TEXT("xr-openxr-motion-controllers/v1") + && Surface.XrControllerSettingsOwnerId + == TEXT("xr-openxr-controller-settings-owner/v1") + && Surface.XrControllerRebindingSurfaceId + == TEXT("xr-openxr-controller-rebinding-surface/v1") + && Surface.XrPreferenceFieldCount == 8 + && Surface.XrControllerBindingAxisCount == 8 + && Surface.XrSupportedControllerFamilyCount == 4 + && Surface.XrControllerSettingsFieldCount == 8 + && Surface.XrControllerRebindableInputCount == 12 + && Surface.XrControllerLayoutPresetCount == 3 + && !Surface.bFinishedControllerRebindingReady + && !Surface.bWindowsPackagedControllerProofReady + ); TestTrue( TEXT("The coach dashboard control/profile roster surface must preserve the structured No-Go decision and reopen requirements."), Surface.bNativeOpenXrControllerWideningNoGo diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistControlProfileContinuityParityTest.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistControlProfileContinuityParityTest.cpp index bc0d930..f479d0d 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistControlProfileContinuityParityTest.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistControlProfileContinuityParityTest.cpp @@ -322,53 +322,61 @@ bool FHyperTwistControlSettingsContinuityStateFormattingTest::RunTest( && MissingSelectorOwnershipLine.Contains(TEXT("active selectors 0")) ); - const FString MissingStatusLine = - HyperTwistTrainingControlSurfaceFormatting::BuildControlSettingsStatusLine( - false, - false, - false, - false, - false, - false, - false, - false, - false, - false, - false - ); + const FString MissingStatusLine = + HyperTwistTrainingControlSurfaceFormatting::BuildControlSettingsStatusLine( + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false, + false + ); TestTrue( TEXT("The control/settings status formatter must render fully absent dedicated-family ownership as missing instead of overstating it as partial."), - MissingStatusLine.Contains(TEXT("camera missing")) - && MissingStatusLine.Contains(TEXT("immersive missing")) - && MissingStatusLine.Contains(TEXT("120-cell owned settings missing")) - && MissingStatusLine.Contains(TEXT("5D owned settings missing")) - && MissingStatusLine.Contains(TEXT("selectors missing")) - && MissingStatusLine.Contains(TEXT("selector recall unavailable")) - ); - - const FString MixedStatusLine = - HyperTwistTrainingControlSurfaceFormatting::BuildControlSettingsStatusLine( - false, - false, - true, - false, - true, - true, - true, - false, - true, - false, - false + MissingStatusLine.Contains(TEXT("camera missing")) + && MissingStatusLine.Contains(TEXT("immersive missing")) + && MissingStatusLine.Contains(TEXT("120-cell owned settings missing")) + && MissingStatusLine.Contains(TEXT("5D owned settings missing")) + && MissingStatusLine.Contains(TEXT("selectors missing")) + && MissingStatusLine.Contains(TEXT("selector recall unavailable")) + && MissingStatusLine.Contains(TEXT("XR rebinding missing")) + && MissingStatusLine.Contains(TEXT("packaged proof not yet shipped")) ); + + const FString MixedStatusLine = + HyperTwistTrainingControlSurfaceFormatting::BuildControlSettingsStatusLine( + false, + false, + true, + false, + true, + true, + true, + false, + true, + false, + false, + true, + false + ); TestTrue( TEXT("The control/settings status formatter must keep mixed missing-versus-partial continuity truth explicit instead of collapsing it into one generic degraded label."), - MixedStatusLine.Contains(TEXT("camera missing")) - && MixedStatusLine.Contains(TEXT("immersive partial")) - && MixedStatusLine.Contains(TEXT("120-cell owned settings ready")) - && MixedStatusLine.Contains(TEXT("5D owned settings partial")) - && MixedStatusLine.Contains(TEXT("selectors partial")) - && MixedStatusLine.Contains(TEXT("selector recall unavailable")) - ); + MixedStatusLine.Contains(TEXT("camera missing")) + && MixedStatusLine.Contains(TEXT("immersive partial")) + && MixedStatusLine.Contains(TEXT("120-cell owned settings ready")) + && MixedStatusLine.Contains(TEXT("5D owned settings partial")) + && MixedStatusLine.Contains(TEXT("selectors partial")) + && MixedStatusLine.Contains(TEXT("selector recall unavailable")) + && MixedStatusLine.Contains(TEXT("XR rebinding owned")) + && MixedStatusLine.Contains(TEXT("packaged proof not yet shipped")) + ); return true; } @@ -435,24 +443,28 @@ bool FHyperTwistControlProfileContinuityStateFormattingTest::RunTest( && ReadyContinuityLine.Contains(TEXT("preference fields 5")) ); - const FString MixedStatusLine = - HyperTwistTrainingControlSurfaceFormatting::BuildControlProfileStatusLine( + const FString MixedStatusLine = + HyperTwistTrainingControlSurfaceFormatting::BuildControlProfileStatusLine( + true, + true, true, true, - true, - true, - false, - false, - true, - false - ); + false, + false, + true, + false, + true, + false + ); TestTrue( TEXT("The control/profile status formatter must keep partial continuity truth explicit alongside unloaded active-selection and unavailable selector-recall posture."), - MixedStatusLine.Contains(TEXT("classic keyboard ready")) - && MixedStatusLine.Contains(TEXT("active selection not loaded")) - && MixedStatusLine.Contains(TEXT("selector recall unavailable")) - && MixedStatusLine.Contains(TEXT("profile continuity partial")) - ); + MixedStatusLine.Contains(TEXT("classic keyboard ready")) + && MixedStatusLine.Contains(TEXT("active selection not loaded")) + && MixedStatusLine.Contains(TEXT("selector recall unavailable")) + && MixedStatusLine.Contains(TEXT("profile continuity partial")) + && MixedStatusLine.Contains(TEXT("controller rebinding owned")) + && MixedStatusLine.Contains(TEXT("packaged proof not yet shipped")) + ); return true; } diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistXrRuntimeContractTest.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistXrRuntimeContractTest.cpp index 7e1b5f5..220ac56 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistXrRuntimeContractTest.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistXrRuntimeContractTest.cpp @@ -101,13 +101,47 @@ bool FHyperTwistXrPreferenceAndBindingProfileTest::RunTest(const FString& Parame && BindingProfile.RequiredAxisNames.Contains(TEXT("HyperTwistXr_Turn")) && BindingProfile.RequiredAxisNames.Contains(TEXT("HyperTwistXr_RightTrigger")) ); - TestTrue( - TEXT("The XR controller binding profile must preserve the supported controller families."), - BindingProfile.ControllerFamilyIds.Contains(TEXT("controller/oculus-touch")) - && BindingProfile.ControllerFamilyIds.Contains(TEXT("controller/valve-index")) - ); - return true; -} + TestTrue( + TEXT("The XR controller binding profile must preserve the supported controller families."), + BindingProfile.ControllerFamilyIds.Contains(TEXT("controller/oculus-touch")) + && BindingProfile.ControllerFamilyIds.Contains(TEXT("controller/valve-index")) + ); + + const FHyperTwistXrControllerSettingsOwnershipSurface ControllerSettingsSurface = + UHyperTwistXrRuntimeLibrary::BuildBundledXrControllerSettingsOwnershipSurface(); + TestTrue( + TEXT("The XR controller settings ownership surface must be structurally valid."), + ControllerSettingsSurface.IsStructurallyValid() + ); + TestEqual( + TEXT("The XR controller settings ownership owner id must stay stable."), + ControllerSettingsSurface.SettingsOwnerId, + FString(TEXT("xr-openxr-controller-settings-owner/v1")) + ); + TestEqual( + TEXT("The XR controller settings rebinding surface id must stay stable."), + ControllerSettingsSurface.RebindingSurfaceId, + FString(TEXT("xr-openxr-controller-rebinding-surface/v1")) + ); + TestEqual( + TEXT("The XR controller settings default layout preset id must stay stable."), + ControllerSettingsSurface.DefaultLayoutPresetId, + FString(TEXT("xr-openxr-controller-layout-default/v1")) + ); + TestTrue( + TEXT("The XR controller settings ownership surface must preserve the exact shipped rebindable XR input names."), + ControllerSettingsSurface.RebindableInputNames.Contains(TEXT("HyperTwistXr_VerticalAdjust")) + && ControllerSettingsSurface.RebindableInputNames.Contains(TEXT("HyperTwistXr_Recenter")) + && ControllerSettingsSurface.RebindableInputNames.Contains(TEXT("HyperTwistXr_TogglePostureMode")) + ); + TestTrue( + TEXT("The XR controller settings ownership surface must keep packaged controller proof explicitly outside the current packet."), + ControllerSettingsSurface.ExplicitExclusions.Contains( + TEXT("launch-tier packaged controller certification ownership")) + && !ControllerSettingsSurface.bWindowsPackagedControllerProofReady + ); + return true; + } IMPLEMENT_SIMPLE_AUTOMATION_TEST( FHyperTwistXrTrainingPawnDefaultsTest, diff --git a/docs/ops/HYPERTWIST_IMPLEMENTATION_PHASE_1_KICKOFF.md b/docs/ops/HYPERTWIST_IMPLEMENTATION_PHASE_1_KICKOFF.md index f149965..9df3caa 100644 --- a/docs/ops/HYPERTWIST_IMPLEMENTATION_PHASE_1_KICKOFF.md +++ b/docs/ops/HYPERTWIST_IMPLEMENTATION_PHASE_1_KICKOFF.md @@ -179,8 +179,8 @@ Use these as the current governing docs: camera-settings owner, immersive-presence settings, dedicated-family `Magic120Cell` / `MagicCube5D` view-profile ownership, selector ownership, persisted generated-mode selector recall when a structurally valid launch - request is present, and explicit unfinished XR/controller rebinding truth - without opening the browser shell + request is present, and the then-live bounded XR/controller settings gap + truth without opening the browser shell - Validation evidence on `2026-06-24`: the same primary reverse-SSH `localhost:22022` lane rebuilt maintained isolated worktree `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded` and @@ -208,8 +208,8 @@ Use these as the current governing docs: dedicated-family `Magic120Cell` / `MagicCube5D` runtime/view profile ids plus selector counts, persisted generated-mode selector recall when a structurally valid launch request is - present, and explicit unfinished controller rebinding truth without opening - the browser shell + present, and the then-live bounded XR/controller settings gap truth without + opening the browser shell - Validation evidence on `2026-06-24`: after hash-syncing the touched type, training-panel, coach-dashboard, and browser-test files into maintained isolated worktree `C:\HyperTwist_worktrees\phase10validate`, the same 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 37d24b4..7913b61 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 @@ -151,17 +151,25 @@ Therefore the current truthful host decision is: Future native XR widening may reopen only when all of the following are true: -1. polished controller bindings plus rebinding/preferences ownership are - first-party and user-visible -2. Windows build plus focused automation plus packaged validation prove actual +1. Windows build plus focused automation plus packaged validation prove actual headset/controller behavior on the shipping lane -3. public/product copy is updated only after those proofs exist +2. public/product copy is updated only after those proofs exist ## Immediate consequence No native XR implementation packet is currently open by default. If the project later reopens this lane, the first implementation packet should -be finished user-facing controller settings/rebinding ownership plus packaged -controller proof above the now-landed bounded runtime-owner substrate, not -public marketing widening. +be packaged controller proof and shipping-lane validation above the now-landed +bounded runtime-owner plus controller-settings substrate, not public marketing +widening. + +## Update - 2026-07-01 - controller-settings ownership continuation + +- the next same-family continuation now adds first-party user-facing + controller settings ownership, layout presets, and rebinding truth for the + exact shipped XR input ids above the already-landed bounded runtime-owner + substrate +- that means the broader native XR/controller widening gate no longer waits on + a hypothetical settings/rebinding layer; it now waits on Windows packaged + controller validation with controller truth on the shipping lane 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 58f08c1..9f20d0d 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 @@ -147,7 +147,8 @@ truthfully claim: - higher-dimensional selector ownership - recall of the latest persisted generated-mode selector posture when a structurally valid launch request has been observed - - explicit unfinished XR/controller rebinding truth + - bounded XR/controller settings and rebinding truth while packaged proof + remains unfinished - Windows validation on `2026-06-24` rebuilt the maintained validation root `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 4331.11 seconds`, then exported @@ -197,7 +198,8 @@ truthfully claim: - the current `4` selector options in each dedicated-family roster - recall of the latest persisted generated-mode selector posture when a structurally valid launch request has been observed - - explicit unfinished XR/controller rebinding truth + - bounded XR/controller settings and rebinding truth while packaged proof + remains unfinished - Windows validation on `2026-06-24` hash-synced the touched training, coach, type, and browser-test files into maintained validation root `C:\HyperTwist_worktrees\phase10validate`, rebuilt the widened slice with @@ -386,9 +388,11 @@ truthfully claim: above; current source truth is that the desktop-hosted branch now carries a deliberately bounded `OpenXR` + `XRBase` stack plus first-party runtime-owner classes -- that later exact-source state still does **not** yet prove: +- the later `2026-07-01` same-family continuation now also adds first-party + user-facing controller settings, layout presets, and rebinding ownership for + the exact shipped XR input ids +- the current remaining unproven pieces therefore are: - packaged headset/controller behavior on the Windows lane - - polished user-facing controller rebinding/settings ownership - broader launch-tier cross-device XR completion - `HyperTwistTrainingImmersiveEnvironmentLibrary.cpp` clearly establishes a first-party immersive/scenic environment direction, but it also explicitly @@ -416,6 +420,11 @@ Current truthful product wording should say: selectors - camera, immersive, and dedicated-family view settings already have bounded first-party ownership +- bounded desktop XR now also has first-party controller settings/rebinding + ownership for the exact shipped XR input ids +- native/operator structured state must keep that owned controller lane + separate from finished packaged-proof truth; ownership here does not itself + mean shipping-lane XR completion - immersive/scenic training direction: first-party owned and source-backed - full VR/controller/settings polish lane: not yet complete enough to market as finished @@ -429,13 +438,15 @@ manual: and higher-dimensional control ownership from unfinished VR/controller claims - docs/resources/support surfaces may truthfully describe the current shipped roster of keyboard, scenic immersive, and dedicated-family selector/view - options, but they must not collapse that into finished controller rebinding + options together with the now-owned bounded XR controller settings/rebinding + lane, but they must not collapse that into finished packaged XR completion - docs/resources/support surfaces may truthfully describe current persisted higher-dimensional selector recall on native operator/training surfaces, but they must not market that as a full generalized preferences suite - docs/resources/support surfaces may truthfully describe current camera or - immersive or dedicated-family view settings ownership, but they must not - inflate that into full controller rebinding or headset-runtime completion + immersive or dedicated-family view settings ownership together with bounded + XR controller settings/rebinding ownership, but they must not inflate that + into packaged headset/runtime completion - public copy should not imply that `EnhancedInput` plus motion-controller axis groundwork already equals a finished OpenXR/runtime or rebinding lane - browser/distribution pages may describe the simulator input posture, but they @@ -450,12 +461,9 @@ The explicit native host/plugin decision is now fixed by: That packet leaves native XR widening closed by default. If the project later reopens this lane from the current `No-Go` posture, the -first clean implementation packet should be: +first clean remaining implementation packet should be: -1. a bounded native plugin/runtime-owner slice above the current desktop-hosted - immersive lane -2. finished controller-specific rebinding/preferences ownership above the - already-landed camera/immersive/view settings surfaces and the current - shipped roster inspect surface -3. packaged validation on the Windows Unreal lane with headset/controller truth - kept explicit +1. packaged validation on the Windows Unreal lane with headset/controller truth + kept explicit above the now-landed bounded runtime-owner plus controller + settings/rebinding substrate +2. public/product copy update only after that 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 eaf24c0..2e6e9b3 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -1160,8 +1160,7 @@ Current audit note: - HyperTwist now owns a real bounded desktop-training OpenXR runtime-owner seam - the broader desktop-hosted XR/controller widening branch still remains - closed until polished rebinding/settings ownership and packaged - headset/controller proof exist + closed until packaged headset/controller proof exists on the shipping lane - this is the right intermediate state to document publicly because it is stronger than the older negative-only wording and still honest about the remaining gap @@ -2319,8 +2318,6 @@ Latest same-family responsive public-route expansion follow-up on `2026-06-29`: - the shared browser manual plus protected dashboard control/settings roster now state the explicit reopen gate instead of only broad unfinished-XR shorthand: - - dedicated runtime owners for real headset/controller execution - - user-facing settings and controller-rebinding ownership - Windows packaged controller validation with controller truth - that means the public manual, support FAQ, pricing/download control notes, and the protected dashboard now mirror the already-landed native structured @@ -2348,6 +2345,38 @@ Latest same-family responsive public-route expansion follow-up on `2026-06-29`: - current truthful interpretation: - the browser/manual lane now matches the already-landed native XR boundary conditions more exactly instead of only repeating the headline `No-Go` + +## Current XR controller-settings ownership continuation (`2026-07-01`) + +- the next same-family continuation stays inside the bounded native XR lane and + closes the remaining first-party settings/rebinding ownership gap above the + already-landed runtime-owner seam +- current exact-source truth in this continuation is now: + - bounded desktop `OpenXR` runtime owner exists + - first-party user-facing controller settings ownership exists + - first-party controller rebinding ownership exists for the exact shipped XR + input ids + - first-party controller settings/rebinding ownership is now kept separate + from legacy finished packaged-proof flags, so native/operator structured + state says `owned now` without overstating `shipping-lane complete` + - broader native XR/controller widening remains closed until Windows packaged + controller validation with controller truth exists on the shipping lane +- a final same-family exact-source semantics hardening follow-up on + `2026-07-02` then revalidated that truth on maintained Windows root + `C:\HyperTwist_worktrees\phase10validate`: + - editor build: + - `Result: Succeeded` + - UnrealBuildTool `Total execution time: 3104.63 seconds` + - focused XR automation: + - `Saved\AutomationReports\XR-ControllerSettingsOwnership-Semantics-20260702\index.json` + - all `4` `HyperTwist.FirstParty.XR.*` tests succeeded + - focused browser automation: + - `Saved\AutomationReports\Browser-XrControllerSettingsOwnership-Semantics-20260702\index.json` + - all `26` `HyperTwist.Browser.*` tests succeeded +- public/manual wording for the browser shell should therefore now say: + - the downloadable owns the bounded XR runtime and controller settings lane + - the browser shell does not own packaged controller proof + - HyperTwist still must not market broader cross-device XR completion yet - the public and protected website surfaces remain honest about current desktop control ownership without overclaiming reopened VR/controller product status 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 8f7e9ae..0791491 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md @@ -145,10 +145,10 @@ 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. Broader controller widening, polished rebinding/settings ownership, and packaged headset/controller proof remain explicitly unfinished. | -| 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 unfinished XR/runtime plus preferences 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 broader polished rebinding and control-settings UI 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. | -| 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 explicit unfinished XR/controller rebinding truth. 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. | -| 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 explicit unfinished controller rebinding truth. 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. | +| 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 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`. | +| 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. | | Native XR project-plugin posture inspect truth | Implemented now | landed first-party `2026-06-25` browser/native operator continuation | All three native control/input, control/settings, and control/profile inspect surfaces now expose the current project `OpenXR` plugin enabled/disabled fact in both structured state and rendered operator lines, so project-level motion-controller groundwork no longer masquerades as an enabled `OpenXR` shipping posture. The same primary reverse-SSH `localhost:22022` lane rebuilt the exact-source state on maintained validation root `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 99.38 seconds`, then exported `Saved\AutomationReports\Browser-XrPluginProjectPosture-Verify\index.json` with all `20` `HyperTwist.Browser.*` tests green across the training-panel and coach-dashboard input/settings/profile seams. | | Optional full-browser client path above Unreal backend authority | Deep-source grounded retained | landed first-party `Phase 8B` preparation packet + spec/evidence continuation + backend-contract continuation | This branch remains a spec-only first-party option: a browser-owned rendering and input shell may sit above explicit Unreal backend seams while Unreal remains authoritative for puzzle, training, timer, replay, and persistence state. The current continuation now fixes the allowed seam families to catalog, session, action, state, continuity push, replay, persistence status, and runtime health, then further fixes transport-neutral operation labels, minimum identity or freshness requirements, and the owned state/runtime payload anchors that any later browser-client backend implementation must preserve. The landed embedded browser/CEF shell remains the current shipping posture, and this branch stays separate from any native `MagicTile` behavior or renderer widening. | | Rewritten browser spatial scene and renderer reference grounding | Implemented now | `mrdoob/three.js` retained permissive lane + first-party current code | Current live `Browser 3D and XR Support` reference side includes one rewritten first-party target grounded in retained `mrdoob/three.js`: the browser spatial scene and renderer contract. This does not displace the landed `Phase 3R-F` first-party browser spatial owner trio or absorb the adjacent `react-three-fiber` renderer-bridge and `xr` session slices. | diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/PRD.md b/docs/v6_5_deep_manual_pack/HyperTwist/PRD.md index 6497375..f149889 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/PRD.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/PRD.md @@ -178,9 +178,11 @@ statement forward too without overclaiming launch-tier completion: - full browser automation `Browser-XrHardening-20260701`: `26/26` `HyperTwist.Browser.*` green -That is real bounded runtime ownership, but it is still not the same thing as -finished launch-tier controller rebinding, packaged headset proof, or generic -marketed VR completion. +That is real bounded runtime ownership, and the current same-family +controller-settings continuation now also owns first-party user-facing +controller settings, layout presets, and rebinding truth for the exact shipped +XR input ids. But it is still not the same thing as packaged +headset/controller proof or generic marketed VR completion. Canonical audit note: diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md b/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md index ee20a5a..bbfc061 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md @@ -226,7 +226,7 @@ Current consolidated milestone snapshot: training-panel and coach-dashboard ownership for the current viewer camera-settings tool, immersive-presence settings, dedicated-family `Magic120Cell` / `MagicCube5D` view-profile ownership, selector ownership, - and explicit unfinished XR/controller rebinding truth; the same primary + and the then-live bounded XR/controller settings gap truth; the same primary reverse-SSH `localhost:22022` lane rebuilt the maintained validation root `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 4331.11 seconds`, then exported diff --git a/website/src/__tests__/protected-app-pages.test.tsx b/website/src/__tests__/protected-app-pages.test.tsx index 966973d..81e44f2 100644 --- a/website/src/__tests__/protected-app-pages.test.tsx +++ b/website/src/__tests__/protected-app-pages.test.tsx @@ -428,7 +428,7 @@ describe('protected app pages', () => { expect(screen.getByText('2. Run a recognition and correction workflow')).toBeTruthy() expect(screen.getAllByText(/classic-wca-keyboard\/v1/i).length).toBeGreaterThan(0) expect(screen.getByText('XR reopen requirements')).toBeTruthy() - expect(screen.getByText('It would also need user-facing settings and controller-rebinding ownership instead of leaving that lane at inspect-surface truth only.')).toBeTruthy() + expect(screen.getByText('The native simulator now also owns first-party user-facing controller settings, layout presets, and rebinding truth for the exact shipped XR input ids.')).toBeTruthy() expect(screen.getByText(byExactTextContent('Billing source: session', 'LI'))).toBeTruthy() expect(await screen.findAllByText(byExactTextContent('Manifest viewer access: active', 'LI'))).toHaveLength(2) expect(await screen.findByText(byExactTextContent('Windows: Primary shipping lane (Version 1.0.0, Channel candidate)', 'LI'))).toBeTruthy() diff --git a/website/src/__tests__/public-marketing-pages.test.tsx b/website/src/__tests__/public-marketing-pages.test.tsx index cf6fd32..5262ec7 100644 --- a/website/src/__tests__/public-marketing-pages.test.tsx +++ b/website/src/__tests__/public-marketing-pages.test.tsx @@ -737,7 +737,7 @@ describe('public marketing pages', () => { expect(screen.getByText('Current selectable control roster')).toBeTruthy() expect(screen.getAllByText('Selectable immersive and family-specific settings').length).toBeGreaterThan(0) expect(screen.getAllByText('XR reopen requirements').length).toBeGreaterThan(0) - expect(screen.getByText('It would also need Windows packaged controller validation with controller truth, not only editor-time or config-only confidence.')).toBeTruthy() + expect(screen.getByText('The remaining reopen requirement is Windows packaged controller validation with controller truth on the shipping lane rather than only editor-time or config-only confidence.')).toBeTruthy() expect(screen.getByText('Runtime control guide')).toBeTruthy() expect(screen.getByText('Native diagnostics check')).toBeTruthy() expect(screen.getByText('Common capability questions')).toBeTruthy() @@ -929,7 +929,7 @@ describe('public marketing pages', () => { expect(screen.getByText('What the software actually does after access is granted')).toBeTruthy() expect(screen.getByText('Higher-dimensional families behind the plans')).toBeTruthy() expect(screen.getAllByText('Current input and runtime control truth').length).toBeGreaterThan(0) - expect(screen.getByText('The current host decision remains desktop-hosted No-Go on native OpenXR/controller widening; any future reopen would still need dedicated runtime owners, user-facing settings and controller-rebinding ownership, and Windows packaged controller validation with controller truth.')).toBeTruthy() + expect(screen.getByText('The current host decision remains desktop-hosted No-Go on broader native OpenXR/controller widening until Windows packaged controller validation with controller truth is complete.')).toBeTruthy() expect(screen.getByText('Choose the right HyperTwist surface')).toBeTruthy() const pricingDecisionGuideHeading = screen.getByRole('heading', { name: 'Choose the next release move' }) const pricingDecisionGuideSection = pricingDecisionGuideHeading.closest('section') @@ -1440,7 +1440,7 @@ describe('public marketing pages', () => { expect(screen.getAllByText(/classic-wca-keyboard\/v1/i).length).toBeGreaterThan(0) expect(screen.getByText('4. Open the higher-dimensional lanes and read the control boundary honestly')).toBeTruthy() expect(screen.getByText(/I\/K = R\/R', J\/F = U\/U', H\/G = F\/F'/i)).toBeTruthy() - expect(screen.getByText(/bounded OpenXR plugin stack and first-party runtime-owner substrate/i)).toBeTruthy() + expect(screen.getByText(/bounded OpenXR plugin stack, first-party runtime-owner substrate, and first-party controller settings\/rebinding ownership/i)).toBeTruthy() expect(screen.getByText(/R scramble, H hint, Enter submit, F mode, V hold-to-talk, C cycle voice/i)).toBeTruthy() expect(screen.getAllByText(/latest persisted generated-mode selector posture is available for recall/i).length).toBeGreaterThan(0) expect(screen.getByText('Feature-registry-backed wording only')).toBeTruthy() diff --git a/website/src/site-data.ts b/website/src/site-data.ts index 41ab3cf..c808908 100644 --- a/website/src/site-data.ts +++ b/website/src/site-data.ts @@ -601,12 +601,12 @@ export const inputAndDevicePostureCards = [ }, { title: 'XR groundwork exists, but the full VR lane is not finished', - description: 'EnhancedInput posture and motion-controller groundwork exist, but HyperTwist does not yet market a fully finished OpenXR/controller/rebinding runtime lane.', + description: 'EnhancedInput posture, bounded OpenXR runtime ownership, and first-party controller settings/rebinding now exist, but HyperTwist still does not market a fully finished cross-device VR/runtime lane.', bullets: [ 'Project config already carries EnhancedInput plus Vive, Oculus Touch, Mixed Reality, and Valve Index axis groundwork.', - 'The current shipping branch now enables the bounded OpenXR plugin stack and first-party runtime-owner substrate, but that still does not collapse the broader native XR/controller lane out of its explicit desktop-hosted No-Go posture.', - 'Current product truth should not overclaim headset-specific runtime ownership or polished user-facing input rebinding.', - 'The current host decision remains desktop-hosted No-Go on native OpenXR/controller widening; any future reopen would still need dedicated runtime owners, user-facing settings and controller-rebinding ownership, and Windows packaged controller validation with controller truth.', + 'The current shipping branch now enables the bounded OpenXR plugin stack, first-party runtime-owner substrate, and first-party controller settings/rebinding ownership, but that still does not collapse the broader native XR/controller lane out of its explicit desktop-hosted No-Go posture.', + 'Current product truth should not overclaim packaged controller proof or broader finished cross-device VR completion.', + 'The current host decision remains desktop-hosted No-Go on broader native OpenXR/controller widening until Windows packaged controller validation with controller truth is complete.', ], }, ] as const @@ -648,7 +648,8 @@ export const runtimeControlGuideCards = [ bullets: [ 'Use keyboard and mouse as the current strong operator-facing control lane.', 'Treat current camera, immersive, and dedicated-family view settings ownership as real, including bounded camera-export continuity and session-local immersive recall, but still bounded.', - 'Do not assume a finished headset-specific VR onboarding, controller rebinding, or broad preferences UI has already landed.', + 'Do not assume a finished headset-specific VR onboarding, packaged controller proof, or broad cross-device XR rollout has already landed.', + 'Treat the current controller settings/rebinding ownership as bounded native runtime truth, not as proof that the broader XR/controller widening gate is already open.', 'Treat any future XR/controller/settings widening as a deliberate reopen above the current desktop-hosted No-Go posture, not as something the public website should overclaim today.', ], }, @@ -683,17 +684,17 @@ export const controlProfileRosterCards = [ 'Those same native surfaces now also keep the shipped camera-export artifact and immersive session-recall boundary explicit together with recall-scope and preference-field counts, so bounded local continuity is no longer implied only through summary prose.', 'Those same native surfaces now also prove which family-specific persistence boundary and state-semantics contract currently owns the higher-dimensional settings lane.', 'Viewer camera settings and immersive-presence settings are already first-party owned in the desktop runtime.', - 'Finished headset-specific controller rebinding and broad VR onboarding remain outside the current desktop-hosted No-Go lane unless a later reopen proves the need.', + 'First-party controller settings/rebinding now also exist inside the bounded desktop OpenXR lane, while packaged headset/controller proof and broader VR onboarding remain outside the current desktop-hosted No-Go branch.', ], }, { title: 'XR reopen requirements', - description: 'The current desktop-hosted No-Go boundary is not vague. HyperTwist already knows what would have to become true before native XR/controller widening could be reopened honestly.', + description: 'The current desktop-hosted No-Go boundary is not vague. HyperTwist already owns the bounded runtime-owner and controller-settings pieces, and it knows the remaining proof required before broader native XR/controller widening could be reopened honestly.', bullets: [ - 'A future reopen would need dedicated runtime owners for real headset/controller execution rather than only project-level groundwork or diagnostics.', - 'It would also need user-facing settings and controller-rebinding ownership instead of leaving that lane at inspect-surface truth only.', - 'It would also need Windows packaged controller validation with controller truth, not only editor-time or config-only confidence.', - 'Until those three conditions exist together, keep reading the current shipped lane as keyboard, mouse, camera, immersive, and dedicated-family settings ownership rather than a finished VR/controller product branch.', + 'The bounded desktop runtime already owns dedicated runtime owners for live OpenXR/controller execution inside the current training lane.', + 'The native simulator now also owns first-party user-facing controller settings, layout presets, and rebinding truth for the exact shipped XR input ids.', + 'The remaining reopen requirement is Windows packaged controller validation with controller truth on the shipping lane rather than only editor-time or config-only confidence.', + 'Until that packaged proof exists, keep reading the current shipped lane as keyboard, mouse, camera, immersive, dedicated-family settings ownership, and bounded XR ownership rather than a finished cross-device VR/controller product branch.', ], }, ] as const @@ -1029,7 +1030,7 @@ export const browserLimitCards = [ bullets: [ 'It does not own package-validated training behavior, replay execution, or the higher-dimensional packaged family maps.', 'It does not own low-latency native input, device/runtime integration, or the dedicated Unreal session and scene surfaces that power the downloadable.', - 'It does not own finished OpenXR/controller runtime behavior, user-facing rebinding, or packaged controller validation.', + 'It does not own packaged controller validation or the broader finished XR/controller branch; the bounded OpenXR runtime and controller-settings ownership stay native-only.', ], }, { @@ -1196,7 +1197,7 @@ export const helpCenterCards = [ description: 'The current input story is strong, but it is bounded and should be taught honestly.', bullets: [ 'Keyboard, mouse, touch, camera, immersive settings, selector continuity, and dedicated-family view ownership are already real.', - 'The current desktop-hosted OpenXR/controller widening boundary remains explicit No-Go until dedicated runtime owners, rebinding ownership, and Windows packaged controller proof all exist together.', + 'The current desktop-hosted OpenXR/controller widening boundary remains explicit No-Go until Windows packaged controller proof exists on the shipping lane; bounded runtime owners plus first-party controller settings/rebinding already exist underneath that gate.', ], }, { @@ -1420,6 +1421,16 @@ export const publicManualRouteAtlasCards = [ ] as const export const releasePacketCards = [ + { + date: 'July 1, 2026', + version: 'Bounded XR controller-settings ownership packet', + category: 'Desktop XR truth and operator diagnostics', + notes: [ + 'Added first-party controller settings and rebinding ownership above the bounded OpenXR runtime-owner seam, including exact shipped XR input ids, layout presets, and user-visible settings tags.', + 'Projected that ownership through native training/operator diagnostics and current public/manual wording so the same desktop XR truth appears across Unreal and the web shell.', + 'Kept the broader desktop-hosted XR/controller widening branch explicitly closed until Windows packaged controller validation with controller truth exists on the shipping lane.', + ], + }, { date: 'June 30, 2026', version: 'Public manual deepening packet', @@ -1800,7 +1811,7 @@ export const browserDesktopDecisionFaqs = [ }, { question: 'Is VR/controller support already fully finished?', - answer: 'Not yet. HyperTwist already has real classic keyboard and mouse or touch ownership, viewer camera and immersive settings ownership, higher-dimensional selector and view ownership, EnhancedInput posture, and motion-controller groundwork. But the current host decision remains desktop-hosted No-Go on native OpenXR/controller widening. A future reopen would still need dedicated runtime owners, user-facing settings and controller-rebinding ownership, and Windows packaged controller validation with controller truth before the software could honestly claim a finished headset/runtime lane.', + answer: 'Not yet. HyperTwist already has real classic keyboard and mouse or touch ownership, viewer camera and immersive settings ownership, higher-dimensional selector and view ownership, EnhancedInput posture, motion-controller groundwork, a bounded OpenXR runtime owner, and first-party controller settings/rebinding ownership. But the broader host decision remains desktop-hosted No-Go on native OpenXR/controller widening until Windows packaged controller validation with controller truth exists on the shipping lane, so the software still should not market a finished headset/runtime branch.', }, ] @@ -1812,7 +1823,7 @@ export const supportFaqs = [ ...browserDesktopDecisionFaqs, { question: 'Can I already customize controls and higher-dimensional view posture?', - answer: 'Partly. The current desktop runtime already owns the classic keyboard profile, viewer camera settings, bounded camera-export continuity, immersive-presence settings, session-local immersive recall, and higher-dimensional projection, focus, stereo, symmetry, and visibility defaults. The native operator surfaces now also expose which Magic120Cell or MagicCube5D session surface, interactive scene, persistence boundary, and state-semantics contract currently owns that settings lane, and they can recall selector posture from the latest persisted generated-mode launch request. A broader polished controller rebinding and preferences layer remains outside the current desktop-hosted No-Go lane unless a later reopen lands dedicated runtime owners, user-facing settings/rebinding ownership, and Windows packaged controller validation with controller truth.', + answer: 'Partly. The current desktop runtime already owns the classic keyboard profile, viewer camera settings, bounded camera-export continuity, immersive-presence settings, session-local immersive recall, and higher-dimensional projection, focus, stereo, symmetry, and visibility defaults. The native operator surfaces now also expose which Magic120Cell or MagicCube5D session surface, interactive scene, persistence boundary, and state-semantics contract currently owns that settings lane, and they can recall selector posture from the latest persisted generated-mode launch request. The bounded XR desktop lane now also owns first-party controller settings, layout presets, and rebinding truth for the exact shipped XR input ids. What remains outside the current desktop-hosted No-Go lane is Windows packaged controller proof and broader launch-tier XR completion.', }, { question: 'Do higher-dimensional selector choices persist between sessions?',