diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp index e0e68f1..8a4517f 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp @@ -72,6 +72,37 @@ namespace HyperTwistTrainingPanelWidgetInternal return bValue ? TEXT("ready") : TEXT("not ready"); } + FString DescribeAggregateReadyState( + const bool bPrimaryReady, + const bool bSecondaryReady + ) + { + if (bPrimaryReady && bSecondaryReady) + { + return TEXT("ready"); + } + + if (bPrimaryReady || bSecondaryReady) + { + return TEXT("partial"); + } + + return TEXT("missing"); + } + + FString DescribeOwnedContinuityState( + const bool bOwnershipReady, + const bool bContinuityReady + ) + { + if (!bOwnershipReady) + { + return TEXT("missing"); + } + + return bContinuityReady ? TEXT("ready") : TEXT("partial"); + } + FString DescribeIdOrFallback(const FString& Value) { return !Value.IsEmpty() ? Value : FString(TEXT("n/a")); @@ -215,6 +246,46 @@ namespace HyperTwistTrainingPanelWidgetInternal return false; } + bool TryFindViewerQaArtifactById( + const FHyperTwistTrainingViewerReferenceBundle& Bundle, + const FString& ArtifactId, + FHyperTwistTrainingViewerQaArtifactReference& OutArtifact + ) + { + for (const FHyperTwistTrainingViewerQaArtifactReference& Artifact : Bundle.QaArtifacts) + { + if (Artifact.ArtifactId == ArtifactId && Artifact.IsStructurallyValid()) + { + OutArtifact = Artifact; + return true; + } + } + + OutArtifact = FHyperTwistTrainingViewerQaArtifactReference(); + return false; + } + + bool TryFindFirstViewerQaArtifactByIds( + const FHyperTwistTrainingViewerReferenceBundle& Bundle, + const TArray& ArtifactIds, + FString& OutArtifactId, + FHyperTwistTrainingViewerQaArtifactReference& OutArtifact + ) + { + for (const FString& ArtifactId : ArtifactIds) + { + if (TryFindViewerQaArtifactById(Bundle, ArtifactId, OutArtifact)) + { + OutArtifactId = ArtifactId; + return true; + } + } + + OutArtifactId.Reset(); + OutArtifact = FHyperTwistTrainingViewerQaArtifactReference(); + return false; + } + bool AxisConfigEntriesContainToken( const TArray& AxisConfigEntries, const TCHAR* Token @@ -1182,6 +1253,31 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( TEXT("immersive-training-presence-control-contract"), PresenceControlContract ); + const FHyperTwistTrainingViewerReferenceBundle ViewerBundle = + UHyperTwistTrainingViewerLibrary::BuildBundledBrowserViewerReferenceBundle(); + FHyperTwistTrainingViewerEditorToolReference CameraSettingsTool; + FHyperTwistTrainingViewerQaArtifactReference CameraExportArtifact; + FString CameraExportArtifactId; + const bool bCameraSettingsContinuityReady = + ViewerBundle.IsStructurallyValid() + && HyperTwistTrainingPanelWidgetInternal::TryFindViewerEditorToolById( + ViewerBundle, + TEXT("tool/camera-settings"), + CameraSettingsTool + ) && HyperTwistTrainingPanelWidgetInternal::TryFindFirstViewerQaArtifactByIds( + ViewerBundle, + CameraSettingsTool.ExportArtifactIds, + CameraExportArtifactId, + CameraExportArtifact + ); + FHyperTwistTrainingImmersiveSessionRecallBoundary ImmersiveSessionRecallBoundary; + const bool bImmersiveSessionRecallReady = + UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveSessionRecallBoundary( + TEXT("immersive-training-session-recall-boundary"), + ImmersiveSessionRecallBoundary + ) && ImmersiveSessionRecallBoundary.IsStructurallyValid(); + const bool bBoundedPreferencesContinuityReady = + bCameraSettingsContinuityReady && bImmersiveSessionRecallReady; Surface.bFinishedXrRuntimeReady = false; Surface.bFinishedPreferencesReady = false; @@ -1251,8 +1347,24 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlInputReadinessInspectSurface( *HyperTwistTrainingPanelWidgetInternal::DescribeBool( Surface.bImmersivePresenceContractReady) ); - Surface.PreferencesStatusLine = - TEXT("Preferences: polished user-facing rebinding and broader control-settings ownership are not yet shipped."); + Surface.PreferencesStatusLine = 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."), + *HyperTwistTrainingPanelWidgetInternal::DescribeAggregateReadyState( + bCameraSettingsContinuityReady, + bImmersiveSessionRecallReady), + *HyperTwistTrainingPanelWidgetInternal::DescribeIdOrFallback( + bCameraSettingsContinuityReady ? CameraExportArtifactId : FString()), + *HyperTwistTrainingPanelWidgetInternal::DescribeIdOrFallback( + bImmersiveSessionRecallReady + ? ImmersiveSessionRecallBoundary.BoundaryId + : FString()), + bImmersiveSessionRecallReady + ? ImmersiveSessionRecallBoundary.RecallScopeIds.Num() + : 0, + bImmersiveSessionRecallReady + ? ImmersiveSessionRecallBoundary.PreferenceFieldTags.Num() + : 0 + ); Surface.NextPacketLine = HyperTwistTrainingPanelWidgetInternal::BuildControlInputXrBoundaryLine(); Surface.StatusLine = FString::Printf( @@ -1305,7 +1417,23 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlSettingsOwnershipInspectSurfa if (Surface.bCameraSettingsReady) { Surface.CameraSettingsToolId = CameraSettingsTool.ToolId; + Surface.CameraSettingsWorkflowTagCount = CameraSettingsTool.WorkflowTags.Num(); + Surface.CameraSettingsPreviewStateTagCount = + CameraSettingsTool.PreviewStateTags.Num(); + Surface.CameraSettingsExportArtifactCount = + CameraSettingsTool.ExportArtifactIds.Num(); } + FHyperTwistTrainingViewerQaArtifactReference CameraExportArtifact; + FString CameraExportArtifactId; + Surface.bCameraSettingsContinuityReady = + Surface.bCameraSettingsReady + && HyperTwistTrainingPanelWidgetInternal::TryFindFirstViewerQaArtifactByIds( + ViewerBundle, + CameraSettingsTool.ExportArtifactIds, + CameraExportArtifactId, + CameraExportArtifact + ); + Surface.CameraSettingsExportArtifactId = CameraExportArtifactId; FHyperTwistTrainingImmersivePresenceControlContract ImmersivePresenceContract; Surface.bImmersivePresenceSettingsReady = @@ -1313,6 +1441,29 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlSettingsOwnershipInspectSurfa TEXT("immersive-training-presence-control-contract"), ImmersivePresenceContract ) && ImmersivePresenceContract.IsStructurallyValid(); + if (Surface.bImmersivePresenceSettingsReady) + { + Surface.ImmersivePresenceContractId = ImmersivePresenceContract.ContractId; + Surface.ImmersivePresenceSurfaceTagCount = + ImmersivePresenceContract.PresenceSurfaceTags.Num(); + } + FHyperTwistTrainingImmersiveSessionRecallBoundary ImmersiveSessionRecallBoundary; + Surface.bImmersiveSessionRecallReady = + UHyperTwistTrainingRuntimeLibrary::TryGetBundledImmersiveSessionRecallBoundary( + TEXT("immersive-training-session-recall-boundary"), + ImmersiveSessionRecallBoundary + ) && ImmersiveSessionRecallBoundary.IsStructurallyValid(); + if (Surface.bImmersiveSessionRecallReady) + { + Surface.ImmersiveSessionRecallBoundaryId = + ImmersiveSessionRecallBoundary.BoundaryId; + Surface.ImmersiveSessionRecallScopeCount = + ImmersiveSessionRecallBoundary.RecallScopeIds.Num(); + Surface.ImmersiveSessionRecallPreferenceFieldTagCount = + ImmersiveSessionRecallBoundary.PreferenceFieldTags.Num(); + Surface.ImmersiveSessionRecallResetSurfaceTagCount = + ImmersiveSessionRecallBoundary.ResetSurfaceTags.Num(); + } FHyperTwistTrainingHigherDimensionalRuntimeViewContextSurface Magic120CellViewContextSurface; const bool bMagic120CellViewContextReady = @@ -1531,21 +1682,50 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlSettingsOwnershipInspectSurfa const bool bMagicCube5DOwnedSettingsReady = Surface.bMagicCube5DViewSettingsReady && Surface.bMagicCube5DPersistenceSettingsReady; + const bool bCameraSettingsOwnedContinuityReady = + Surface.bCameraSettingsReady && Surface.bCameraSettingsContinuityReady; + const bool bImmersiveOwnedContinuityReady = + Surface.bImmersivePresenceSettingsReady + && Surface.bImmersiveSessionRecallReady; + const FString DisplayCameraExportArtifactId = + !Surface.CameraSettingsExportArtifactId.IsEmpty() + ? Surface.CameraSettingsExportArtifactId + : TEXT("n/a"); + const FString ImmersivePresenceContractId = + !Surface.ImmersivePresenceContractId.IsEmpty() + ? Surface.ImmersivePresenceContractId + : TEXT("n/a"); + const FString ImmersiveSessionRecallBoundaryId = + !Surface.ImmersiveSessionRecallBoundaryId.IsEmpty() + ? Surface.ImmersiveSessionRecallBoundaryId + : TEXT("n/a"); Surface.SummaryLine = - TEXT("Camera, immersive, and dedicated-family projection, selector, and persistence settings are already first-party owned, while XR/controller rebinding still remains unfinished."); + TEXT("Camera, immersive, and dedicated-family projection, selector, continuity, and persistence settings are already first-party owned, while XR/controller rebinding still remains unfinished."); Surface.CameraSettingsLine = FString::Printf( - TEXT("Viewer camera settings: %s | tool %s | orbit/framing/export surface is owned."), - *HyperTwistTrainingPanelWidgetInternal::DescribeReadyState( - Surface.bCameraSettingsReady), - *CameraSettingsToolId + TEXT("Viewer camera settings: %s | tool %s | camera export %s | workflow tags %d | preview states %d | export artifacts %d | orbit/framing/export surface is owned."), + *HyperTwistTrainingPanelWidgetInternal::DescribeOwnedContinuityState( + Surface.bCameraSettingsReady, + Surface.bCameraSettingsContinuityReady), + *CameraSettingsToolId, + *DisplayCameraExportArtifactId, + Surface.CameraSettingsWorkflowTagCount, + Surface.CameraSettingsPreviewStateTagCount, + Surface.CameraSettingsExportArtifactCount ); Surface.ImmersiveSettingsLine = FString::Printf( - TEXT("Immersive presence settings: %s | contract immersive-training-presence-control-contract | intensity presets %d | reduced-distraction presets %d."), - *HyperTwistTrainingPanelWidgetInternal::DescribeReadyState( - Surface.bImmersivePresenceSettingsReady), + TEXT("Immersive presence settings: %s | contract %s | session recall %s | intensity presets %d | reduced-distraction presets %d | presence tags %d | recall scopes %d | preference fields %d | reset surfaces %d."), + *HyperTwistTrainingPanelWidgetInternal::DescribeOwnedContinuityState( + Surface.bImmersivePresenceSettingsReady, + Surface.bImmersiveSessionRecallReady), + *ImmersivePresenceContractId, + *ImmersiveSessionRecallBoundaryId, ImmersivePresenceContract.ImmersionIntensityIds.Num(), - ImmersivePresenceContract.ReducedDistractionPresetIds.Num() + ImmersivePresenceContract.ReducedDistractionPresetIds.Num(), + Surface.ImmersivePresenceSurfaceTagCount, + Surface.ImmersiveSessionRecallScopeCount, + Surface.ImmersiveSessionRecallPreferenceFieldTagCount, + Surface.ImmersiveSessionRecallResetSurfaceTagCount ); Surface.Magic120CellSettingsLine = FString::Printf( TEXT("Magic120Cell owned settings: %s | profile %s | session %s | scene %s | persistence %s | semantics %s | selectors %d | projection tags %d | symmetry presets %d | visibility presets %d | focus surfaces %d."), @@ -1596,8 +1776,12 @@ UHyperTwistTrainingPanelWidget::GetDisplayedControlSettingsOwnershipInspectSurfa ); Surface.StatusLine = 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"), - Surface.bCameraSettingsReady ? TEXT("ready") : TEXT("missing"), - Surface.bImmersivePresenceSettingsReady ? TEXT("ready") : TEXT("missing"), + *HyperTwistTrainingPanelWidgetInternal::DescribeOwnedContinuityState( + Surface.bCameraSettingsReady, + Surface.bCameraSettingsContinuityReady), + *HyperTwistTrainingPanelWidgetInternal::DescribeOwnedContinuityState( + Surface.bImmersivePresenceSettingsReady, + Surface.bImmersiveSessionRecallReady), bMagic120CellOwnedSettingsReady ? TEXT("ready") : TEXT("partial"), bMagicCube5DOwnedSettingsReady ? TEXT("ready") : TEXT("partial"), Surface.bHigherDimensionalSelectorSettingsReady ? TEXT("ready") : TEXT("partial"), diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 871fccf..de125b4 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -10137,6 +10137,15 @@ struct FHyperTwistTrainingControlSettingsOwnershipInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString CameraSettingsToolId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString CameraSettingsExportArtifactId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ImmersivePresenceContractId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ImmersiveSessionRecallBoundaryId; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") FString ActiveHigherDimensionalViewContextId; @@ -10212,12 +10221,39 @@ struct FHyperTwistTrainingControlSettingsOwnershipInspectSurface UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") int32 RecalledHigherDimensionalSelectorCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CameraSettingsWorkflowTagCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CameraSettingsPreviewStateTagCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CameraSettingsExportArtifactCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ImmersivePresenceSurfaceTagCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ImmersiveSessionRecallScopeCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ImmersiveSessionRecallPreferenceFieldTagCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ImmersiveSessionRecallResetSurfaceTagCount = 0; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bCameraSettingsReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bCameraSettingsContinuityReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bImmersivePresenceSettingsReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bImmersiveSessionRecallReady = false; + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") bool bMagic120CellViewSettingsReady = false; @@ -10268,7 +10304,9 @@ struct FHyperTwistTrainingControlSettingsOwnershipInspectSurface || !SelectorSettingsLine.IsEmpty() || !SelectorRecallLine.IsEmpty() || bCameraSettingsReady + || bCameraSettingsContinuityReady || bImmersivePresenceSettingsReady + || bImmersiveSessionRecallReady || bMagic120CellViewSettingsReady || bMagicCube5DViewSettingsReady || bHigherDimensionalSelectorSettingsReady diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp index bf1e4b8..655716b 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistBrowserBridgeObjectTest.cpp @@ -1155,6 +1155,13 @@ 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 now expose bounded non-XR preferences continuity for camera export and immersive session recall."), + Surface.PreferencesStatusLine.Contains(TEXT("artifact/camera-export-json")) + && Surface.PreferencesStatusLine.Contains(TEXT("immersive-training-session-recall-boundary")) + && Surface.PreferencesStatusLine.Contains(TEXT("recall scopes 3")) + && Surface.PreferencesStatusLine.Contains(TEXT("preference fields 5")) + ); TestEqual( TEXT("The control/input readiness surface must expose a stable structured XR host decision id."), Surface.XrHostDecisionId, @@ -1235,6 +1242,11 @@ bool FHyperTwistCoachDashboardControlInputReadinessInspectSurfaceTest::RunTest( Surface.DetailLine.Contains(TEXT("not yet shipped")) && Surface.DetailLine.Contains(TEXT("OpenXR project plugin no")) ); + 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")) + && Surface.DetailLine.Contains(TEXT("immersive-training-session-recall-boundary")) + ); TestFalse( TEXT("The coach dashboard control/input readiness surface must preserve the explicit disabled OpenXR project plugin truth."), Surface.bOpenXrProjectPluginEnabled @@ -1320,6 +1332,26 @@ bool FHyperTwistTrainingPanelControlSettingsOwnershipInspectSurfaceTest::RunTest Surface.CameraSettingsToolId, TEXT("tool/camera-settings") ); + TestTrue( + TEXT("The control settings ownership surface must expose camera continuity through the shipped camera-export artifact and structured viewer tags."), + Surface.bCameraSettingsContinuityReady + && Surface.CameraSettingsExportArtifactId == TEXT("artifact/camera-export-json") + && Surface.CameraSettingsWorkflowTagCount == 3 + && Surface.CameraSettingsPreviewStateTagCount == 2 + && Surface.CameraSettingsExportArtifactCount == 1 + ); + TestTrue( + TEXT("The control settings ownership surface must expose immersive session-local continuity through the shipped recall boundary and structured preference counts."), + Surface.bImmersiveSessionRecallReady + && Surface.ImmersivePresenceContractId + == TEXT("immersive-training-presence-control-contract") + && Surface.ImmersiveSessionRecallBoundaryId + == TEXT("immersive-training-session-recall-boundary") + && Surface.ImmersivePresenceSurfaceTagCount == 4 + && Surface.ImmersiveSessionRecallScopeCount == 3 + && Surface.ImmersiveSessionRecallPreferenceFieldTagCount == 5 + && Surface.ImmersiveSessionRecallResetSurfaceTagCount == 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, @@ -1432,6 +1464,11 @@ bool FHyperTwistTrainingPanelControlSettingsOwnershipInspectSurfaceTest::RunTest TEXT("The control settings ownership surface must retain the camera settings tool reference in its detail line."), Surface.DetailLine.Contains(TEXT("tool/camera-settings")) ); + TestTrue( + TEXT("The control settings ownership surface must retain the shipped camera-export and immersive session-recall ids in its detail line."), + Surface.DetailLine.Contains(TEXT("artifact/camera-export-json")) + && Surface.DetailLine.Contains(TEXT("immersive-training-session-recall-boundary")) + ); TestTrue( TEXT("The control settings ownership surface detail line must now keep dedicated family session, scene, persistence, and state-semantics ids visible."), Surface.DetailLine.Contains(TEXT("phase6c/magic120cell/dedicated-training-session-surface")) @@ -1544,6 +1581,14 @@ bool FHyperTwistCoachDashboardControlSettingsOwnershipInspectSurfaceTest::RunTes Surface.XrHostDecisionId, TEXT("desktop-hosted-openxr-controller-widening-no-go") ); + TestTrue( + TEXT("The coach dashboard control settings ownership surface must preserve bounded camera and immersive continuity in structured form."), + Surface.bCameraSettingsContinuityReady + && Surface.CameraSettingsExportArtifactId == TEXT("artifact/camera-export-json") + && Surface.bImmersiveSessionRecallReady + && Surface.ImmersiveSessionRecallBoundaryId + == TEXT("immersive-training-session-recall-boundary") + ); TestEqual( TEXT("The coach dashboard control settings ownership surface must preserve the shipped Magic120Cell projection-tag count."), Surface.Magic120CellProjectionSurfaceTagCount, @@ -1866,6 +1911,16 @@ bool FHyperTwistCoachDashboardControlSurfaceStructuredTextArtifactsTest::RunTest CoachDashboard, TEXT("CoachControlInputReadinessHigherDimensional") ); + UTextBlock* ControlInputPreferencesTextBlock = + HyperTwistBrowserBridgeObjectTestInternal::FindDashboardTextBlock( + CoachDashboard, + TEXT("CoachControlInputReadinessPreferences") + ); + UTextBlock* ControlInputNextPacketTextBlock = + HyperTwistBrowserBridgeObjectTestInternal::FindDashboardTextBlock( + CoachDashboard, + TEXT("CoachControlInputReadinessNextPacket") + ); TestNotNull( TEXT("The coach dashboard must build the control/input summary text row."), ControlInputSummaryTextBlock @@ -1890,6 +1945,14 @@ bool FHyperTwistCoachDashboardControlSurfaceStructuredTextArtifactsTest::RunTest TEXT("The coach dashboard must build the structured higher-dimensional control/input row."), ControlInputHigherDimensionalTextBlock ); + TestNotNull( + TEXT("The coach dashboard must build the structured preferences continuity row."), + ControlInputPreferencesTextBlock + ); + TestNotNull( + TEXT("The coach dashboard must build the structured next-packet control/input row."), + ControlInputNextPacketTextBlock + ); if (ControlInputSummaryTextBlock != nullptr) { TestEqual( @@ -1945,6 +2008,29 @@ bool FHyperTwistCoachDashboardControlSurfaceStructuredTextArtifactsTest::RunTest TEXT("phase6c/magiccube5d/interactive-scene-surface")) ); } + if (ControlInputPreferencesTextBlock != nullptr) + { + TestEqual( + TEXT("The structured preferences continuity row must mirror the inspect surface."), + ControlInputPreferencesTextBlock->GetText().ToString(), + ControlInputSurface.PreferencesStatusLine + ); + TestTrue( + TEXT("The structured preferences continuity row must expose the shipped camera-export and immersive session-recall ids."), + ControlInputPreferencesTextBlock->GetText().ToString().Contains( + TEXT("artifact/camera-export-json")) + && ControlInputPreferencesTextBlock->GetText().ToString().Contains( + TEXT("immersive-training-session-recall-boundary")) + ); + } + if (ControlInputNextPacketTextBlock != nullptr) + { + TestEqual( + TEXT("The structured next-packet control/input row must mirror the inspect surface."), + ControlInputNextPacketTextBlock->GetText().ToString(), + ControlInputSurface.NextPacketLine + ); + } UTextBlock* ControlSettingsSummaryTextBlock = HyperTwistBrowserBridgeObjectTestInternal::FindDashboardTextBlock( diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md index 2d9f30a..136ff7b 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/DEVELOPMENT.md @@ -1227,6 +1227,78 @@ Current audit note: still appeared on the Windows editor lane, but the focused automation proofs completed successfully and exported their reports cleanly +## Latest bounded preferences-continuity truth follow-up (`2026-06-28`) + +- the next same-family native/operator packet then tightened the shipped + non-`XR` preferences-continuity seam without reopening the current + desktop-hosted controller boundary: + - `FHyperTwistTrainingControlInputReadinessInspectSurface` now keeps the + shipped camera-export artifact and immersive session-recall boundary + explicit in the preferences line, together with the current recall-scope + and preference-field counts + - `FHyperTwistTrainingControlSettingsOwnershipInspectSurface` now also + carries camera workflow, preview-state, and export-artifact counts plus + immersive presence-surface, recall-scope, preference-field, and + reset-surface counts alongside explicit camera-continuity and immersive + session-recall readiness booleans + - the same implementation quality pass also hardened the viewer continuity + lookup itself by resolving the first valid camera-export artifact instead + of trusting only the first listed id, and it now distinguishes `missing`, + `partial`, and `ready` ownership truth in the rendered status text instead + of flattening those states together + - `HyperTwistBrowserBridgeObjectTest.cpp` now proves the new bounded + preferences-continuity ids on both the training-panel and coach-dashboard + inspect seams, and the structured dashboard artifact proof now also covers + `CoachControlInputReadinessPreferences` plus + `CoachControlInputReadinessNextPacket` +- the local public/manual and dependency-health evidence for that same packet + is already green: + - `npm --prefix website test -- --run src/__tests__/public-marketing-pages.test.tsx src/__tests__/protected-app-pages.test.tsx src/__tests__/DashboardOverviewPage.test.tsx` + - `3` website test files passed + - `27` tests passed + - `scripts/run-hypertwist-web-surface-validation.sh --with-responsive-e2e` + - responsive public-route Playwright proof: `14` tests passed + - responsive protected-route Playwright proof: `12` tests passed + - `website/server` suite: `10` files and `36` tests passed + - `Content/Browser` shell verification passed + - `website/` and `Content/Browser/` production audits stayed at + `found 0 vulnerabilities` + - `website/server/` retained only the already-documented upstream + `supertokens-node -> nodemailer` residual +- the local refactor/analyzer evidence for the same packet also stayed green: + - `scripts/run-hypertwist-sentrux-source-only.sh` + - `Quality: 6228` + - all `7` rules passing + - `scripts/run-hypertwist-gitnexus-analyze.sh` + - retained runtime truthfully fell back to `npx -y gitnexus@latest` on this + Linux host because `@ladybugdb/core` still hits `ERR_DLOPEN_FAILED` with an + `invalid ELF header` + - bounded mirror refreshed at: + - `16,364` nodes + - `38,618` edges + - `680` clusters + - `300` flows + - `scripts/run-hypertwist-gitnexus-status.sh` + - bounded mirror `Status: up-to-date` +- the authoritative Windows proof for the same packet also completed cleanly on + maintained validation root `C:\HyperTwist_worktrees\phase10validate`: + - synced the exact touched Unreal source files through + `scripts/run-hypertwist-remote-windows-file-sync.sh` + - remote Unreal rebuild through + `scripts/run-hypertwist-remote-unreal-build.sh` + - `Result: Succeeded` + - UnrealBuildTool `Total execution time: 3372.27 seconds` + - the follow-on focused remote automation sequence then exported all five + report roots with `index.json` `State=Success`: + - `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.TrainingPanel.ControlInputReadinessInspectSurface` + - `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.CoachDashboard.ControlInputReadinessInspectSurface` + - `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.TrainingPanel.ControlSettingsOwnershipInspectSurface` + - `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.CoachDashboard.ControlSettingsOwnershipInspectSurface` + - `Browser-PreferencesContinuity-20260628-HyperTwist.Browser.CoachDashboard.ControlSurfaceStructuredTextArtifacts` + - the accepted unattended `Failed to create the web browser window.` dialog + still appeared during those Windows editor runs, but all five focused + automation proofs completed successfully and exported their reports cleanly + ## Latest public-route responsive e2e hardening follow-up (`2026-06-28`) - the next same-family public-web hardening packet then cross-referenced the diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md b/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md index baee727..85171c9 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md @@ -145,8 +145,8 @@ 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. | -| 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. | -| 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. | +| 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. | +| 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. | | 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. | | 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. | diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/PRD.md b/docs/v6_5_deep_manual_pack/HyperTwist/PRD.md index b78fab0..5cae993 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/PRD.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/PRD.md @@ -132,6 +132,13 @@ interactive-scene, persistence-boundary, and state-semantics ownership explicitly for both `Magic120Cell` and `MagicCube5D` instead of leaving that family-owned runtime state hidden behind generic view-settings wording. +The next adjacent non-`XR` preferences-continuity follow-up then tightened the +same native/operator truth again without reopening the current controller lane: +camera settings now keep bounded camera-export continuity explicit, scenic +immersive settings now keep session-local recall ownership explicit, and the +current product story stays honest that this is real local continuity rather +than a finished global preferences or rebinding suite. + Canonical audit note: - `C:\HyperTwist\docs\ops\HYPERTWIST_UNREAL_INPUT_AND_XR_COMPLETENESS_AUDIT_2026-06-22.md` diff --git a/website/src/site-data.ts b/website/src/site-data.ts index a7d2799..9bb98b0 100644 --- a/website/src/site-data.ts +++ b/website/src/site-data.ts @@ -114,7 +114,7 @@ export const browserDesktopRealityCards = [ posture: 'Shipped today versus still gated', description: 'HyperTwist already ships meaningful desktop control/settings ownership, but it does not market unfinished XR/controller widening as complete.', bullets: [ - 'Classic keyboard, mouse/touch classic-cube control, viewer camera settings, immersive presets, and dedicated-family selector, session, scene, and view ownership are real today.', + 'Classic keyboard, mouse/touch classic-cube control, viewer camera settings, bounded camera-export continuity, immersive presets, session-local immersive recall, and dedicated-family selector, session, scene, and view ownership are real today.', 'The native operator surfaces now also expose concrete Magic120Cell and MagicCube5D session-surface, interactive-scene, persistence-boundary, and state-semantics ownership instead of hiding that proof behind softer settings summaries.', 'OpenXR/controller runtime widening and polished rebinding/preferences remain explicitly unfinished behind the current desktop-hosted No-Go boundary.', ], @@ -510,6 +510,7 @@ export const inputAndDevicePostureCards = [ 'Magic120Cell keeps symmetry, logical-visibility depth, and center-cell focus posture explicit.', 'MagicCube5D keeps projection-distance, stereo, face-visibility, and focus posture explicit.', 'The desktop operator and training lane now also surfaces these dedicated-family view owners together with exact session-surface, interactive-scene, persistence-boundary, and state-semantics ownership.', + 'That same native lane now also keeps bounded camera-export continuity and immersive session-local recall visible instead of implying that continuity only through softer prose.', 'The same native surfaces now expose selector recall from the latest persisted generated-mode launch request when that launch history exists.', 'These controls belong to the dedicated-family desktop runtime lanes, not to the public website.', ], @@ -552,7 +553,7 @@ export const runtimeControlGuideCards = [ description: 'This keeps the manual useful by being explicit about what is supported now and what remains outside the current desktop-hosted No-Go XR/controller branch.', 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, but still bounded.', + '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.', '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.', ], @@ -585,6 +586,7 @@ export const controlProfileRosterCards = [ description: 'Current continuity is real, but it is still narrower than a finished global preferences and controller-rebinding suite.', bullets: [ 'The native operator and training surfaces can recall the latest persisted generated-mode selector posture when a structurally valid launch request exists.', + 'Those same native surfaces now also keep the shipped camera-export artifact and immersive session-recall boundary explicit, 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.', @@ -1029,6 +1031,11 @@ export const changelogEntries = [ title: 'Public pages now explain what each route is actually for', details: 'The homepage, docs, and resources routes now share a first-party public route atlas explaining what each major public page owns: product truth, onboarding, launch readiness, pricing, download, support, release notes, and the legal/distribution surfaces are now easier to navigate as one professional operator manual instead of a flatter marketing shell.', }, + { + date: 'June 28, 2026', + title: 'Native settings proof now exposes bounded camera and immersive continuity', + details: 'The desktop operator and training diagnostics now keep the shipped camera-export artifact and the immersive session-recall boundary visible in structured non-XR settings truth, so bounded local continuity is explicit without pretending a full global preferences or controller-rebinding suite already exists.', + }, { date: 'June 28, 2026', title: 'Native higher-dimensional settings proof now exposes family session and persistence seams', @@ -1279,7 +1286,7 @@ export const supportFaqs = [ }, { 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, immersive-presence settings, 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 proves the need.', + 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 proves the need.', }, { question: 'Do higher-dimensional selector choices persist between sessions?',