From 10b66a37c35e2644091d314efac0012926d116a2 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Sat, 13 Jun 2026 02:03:05 +0000 Subject: [PATCH] Expose higher-dimensional runtime activation in training surfaces --- ...rainingHigherDimensionalRuntimeLibrary.cpp | 32 ++++- .../HyperTwistTrainingPanelWidget.cpp | 18 +++ .../HyperTwistTrainingRuntimeLibrary.cpp | 114 +++++++++++++++ .../HyperTwistTrainingSessionActor.cpp | 18 +++ ...tTrainingHigherDimensionalRuntimeLibrary.h | 21 +++ .../HyperTwistTrainingPanelWidget.h | 11 ++ .../HyperTwistTrainingRuntimeLibrary.h | 18 +++ .../HyperTwistTrainingSessionActor.h | 11 ++ ...mensionalPhase6CActivationContractTest.cpp | 132 ++++++++++++++++++ ...NSIVE_RECONSTRUCTION_ROADMAP_2026-06-10.md | 8 ++ ...BUILD_VALIDATION_REQUIREMENT_2026-06-01.md | 13 ++ .../HyperTwist/FEATURE_REGISTRY.md | 2 +- .../HyperTwist/ROADMAP.md | 9 ++ 13 files changed, 405 insertions(+), 2 deletions(-) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.cpp index ce5769c..e3b8497 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.cpp @@ -290,6 +290,31 @@ bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivation return false; } +bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivationProfileByRuntimeModeId( + const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog& Catalog, + const FString& RuntimeModeId, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile +) +{ + if (RuntimeModeId.IsEmpty()) + { + OutProfile = FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile(); + return false; + } + + for (const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile : Catalog.Profiles) + { + if (Profile.MatchesRuntimeModeId(RuntimeModeId)) + { + OutProfile = Profile; + return true; + } + } + + OutProfile = FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile(); + return false; +} + bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryResolvePuzzleDefinition( const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog& Catalog, const FString& ActivationProfileIdOrPuzzleId, @@ -299,7 +324,12 @@ bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryResolvePuzzleDefinit FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile Profile; const bool bResolved = TryGetRuntimeActivationProfileById(Catalog, ActivationProfileIdOrPuzzleId, Profile) - || TryGetRuntimeActivationProfileByPuzzleId(Catalog, ActivationProfileIdOrPuzzleId, Profile); + || TryGetRuntimeActivationProfileByPuzzleId(Catalog, ActivationProfileIdOrPuzzleId, Profile) + || TryGetRuntimeActivationProfileByRuntimeModeId( + Catalog, + ActivationProfileIdOrPuzzleId, + Profile + ); if (!bResolved) { OutDefinition = FHyperTwistPuzzleDefinitionRef(); diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp index 45b69c4..4b30e84 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingPanelWidget.cpp @@ -128,6 +128,13 @@ void UHyperTwistTrainingPanelWidget::RefreshTrainingState() this, CachedLatestGeneratedModeLaunchRequestForActiveDeck ); + if (!UHyperTwistTrainingRuntimeLibrary::TryGetActiveHigherDimensionalRuntimeActivationProfile( + this, + CachedHigherDimensionalRuntimeActivationProfile)) + { + CachedHigherDimensionalRuntimeActivationProfile = + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile(); + } CachedMethodDrillRunState = UHyperTwistTrainingRuntimeLibrary::GetActiveMethodDrillRunState(this); CachedMethodDrillSummary = UHyperTwistTrainingRuntimeLibrary::GetActiveMethodDrillSummary(this); CachedMethodDrillDiagnosticPacket = @@ -399,6 +406,17 @@ FString UHyperTwistTrainingPanelWidget::GetDisplayedGeneratedModeExecutionBlocke return LastGeneratedModeExecutionBlockedReason; } +bool UHyperTwistTrainingPanelWidget::HasDisplayedHigherDimensionalRuntimeActivationProfile() const +{ + return CachedHigherDimensionalRuntimeActivationProfile.IsStructurallyValid(); +} + +FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile +UHyperTwistTrainingPanelWidget::GetDisplayedHigherDimensionalRuntimeActivationProfile() const +{ + return CachedHigherDimensionalRuntimeActivationProfile; +} + FHyperTwistTrainingDeck UHyperTwistTrainingPanelWidget::BuildActiveCoachRecommendedDeck(const int32 MaxCases) { CachedCoachRecommendedDeck = UHyperTwistTrainingRuntimeLibrary::BuildActiveCoachRecommendedDeck( diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp index 8dee190..5d4dad9 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp @@ -139,6 +139,86 @@ namespace HyperTwistTrainingRuntimeLibraryInternal : TEXT("handoff"))) ); } + + void AddUniqueCandidate(TArray& Candidates, const FString& Candidate) + { + if (Candidate.IsEmpty()) + { + return; + } + + for (const FString& ExistingCandidate : Candidates) + { + if (ExistingCandidate.Equals(Candidate, ESearchCase::IgnoreCase)) + { + return; + } + } + + Candidates.Add(Candidate); + } + + bool TryResolveHigherDimensionalRuntimeActivationProfile( + const FHyperTwistTrainingRunState& RunState, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile + ) + { + const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog Catalog = + UHyperTwistTrainingHigherDimensionalRuntimeLibrary::BuildBundledHigherDimensionalRuntimeActivationCatalog(); + + TArray CandidateRuntimeModeIds; + if (RunState.ImportedGeneratedModeLaunchRequest.IsStructurallyValid()) + { + AddUniqueCandidate( + CandidateRuntimeModeIds, + RunState.ImportedGeneratedModeLaunchRequest.LaunchConfig.RuntimeModeId + ); + } + + for (const FString& CandidateRuntimeModeId : CandidateRuntimeModeIds) + { + if (UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivationProfileByRuntimeModeId( + Catalog, + CandidateRuntimeModeId, + OutProfile)) + { + return true; + } + } + + TArray CandidatePuzzleIds; + if (RunState.CurrentSelection.TrainingCase.IsStructurallyValid()) + { + AddUniqueCandidate(CandidatePuzzleIds, RunState.CurrentSelection.TrainingCase.PuzzleId); + } + + if (RunState.ImportedGeneratedModeLaunchRequest.IsStructurallyValid()) + { + AddUniqueCandidate( + CandidatePuzzleIds, + RunState.ImportedGeneratedModeLaunchRequest.LaunchConfig.PuzzleId + ); + } + + if (RunState.ReplayPacket.PuzzleDefinition.IsStructurallyValid()) + { + AddUniqueCandidate(CandidatePuzzleIds, RunState.ReplayPacket.PuzzleDefinition.PuzzleId); + } + + for (const FString& CandidatePuzzleId : CandidatePuzzleIds) + { + if (UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivationProfileByPuzzleId( + Catalog, + CandidatePuzzleId, + OutProfile)) + { + return true; + } + } + + OutProfile = FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile(); + return false; + } } UHyperTwistTrainingSubsystem* UHyperTwistTrainingRuntimeLibrary::GetTrainingSubsystem(UObject* WorldContextObject) @@ -7041,6 +7121,40 @@ bool UHyperTwistTrainingRuntimeLibrary::TryGetBundledHigherDimensionalRuntimeAct ); } +bool UHyperTwistTrainingRuntimeLibrary::TryGetBundledHigherDimensionalRuntimeActivationProfileByRuntimeModeId( + const FString& RuntimeModeId, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile +) +{ + return UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetRuntimeActivationProfileByRuntimeModeId( + GetBundledHigherDimensionalRuntimeActivationCatalog(), + RuntimeModeId, + OutProfile + ); +} + +bool UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalRuntimeActivationProfileForRunState( + const FHyperTwistTrainingRunState& RunState, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile +) +{ + return HyperTwistTrainingRuntimeLibraryInternal::TryResolveHigherDimensionalRuntimeActivationProfile( + RunState, + OutProfile + ); +} + +bool UHyperTwistTrainingRuntimeLibrary::TryGetActiveHigherDimensionalRuntimeActivationProfile( + UObject* WorldContextObject, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile +) +{ + return TryGetHigherDimensionalRuntimeActivationProfileForRunState( + GetActiveTrainingRunState(WorldContextObject), + OutProfile + ); +} + bool UHyperTwistTrainingRuntimeLibrary::TryResolveBundledHigherDimensionalPuzzleDefinition( const FString& ActivationProfileIdOrPuzzleId, FHyperTwistPuzzleDefinitionRef& OutDefinition diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSessionActor.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSessionActor.cpp index 14f30f2..4529cbc 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSessionActor.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSessionActor.cpp @@ -228,6 +228,13 @@ void AHyperTwistTrainingSessionActor::RefreshCachedTrainingState() this, CachedLatestGeneratedModeLaunchRequestForActiveDeck ); + if (!UHyperTwistTrainingRuntimeLibrary::TryGetActiveHigherDimensionalRuntimeActivationProfile( + this, + CachedHigherDimensionalRuntimeActivationProfile)) + { + CachedHigherDimensionalRuntimeActivationProfile = + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile(); + } CachedActiveTrainingSessionTemplates = UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingSessionTemplates(this); if (AutoStartUserId.IsEmpty()) @@ -372,6 +379,17 @@ FString AHyperTwistTrainingSessionActor::GetDisplayedGeneratedModeExecutionBlock return LastGeneratedModeExecutionBlockedReason; } +bool AHyperTwistTrainingSessionActor::HasDisplayedHigherDimensionalRuntimeActivationProfile() const +{ + return CachedHigherDimensionalRuntimeActivationProfile.IsStructurallyValid(); +} + +FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile +AHyperTwistTrainingSessionActor::GetDisplayedHigherDimensionalRuntimeActivationProfile() const +{ + return CachedHigherDimensionalRuntimeActivationProfile; +} + FHyperTwistTrainingDeck AHyperTwistTrainingSessionActor::BuildCoachRecommendedDeck(const int32 MaxCases) { CachedCoachRecommendedDeck = UHyperTwistTrainingRuntimeLibrary::BuildActiveCoachRecommendedDeck( diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h index 98331fc..d2420e4 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h @@ -114,6 +114,12 @@ struct FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile && CandidatePuzzleId.Equals(PuzzleId, ESearchCase::IgnoreCase); } + bool MatchesRuntimeModeId(const FString& CandidateRuntimeModeId) const + { + return !CandidateRuntimeModeId.IsEmpty() + && CandidateRuntimeModeId.Equals(RuntimeModeId, ESearchCase::IgnoreCase); + } + FHyperTwistPuzzleDefinitionRef ToDefinitionRef() const { FHyperTwistPuzzleDefinitionRef Definition; @@ -151,6 +157,7 @@ struct FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog TSet SeenProfileIds; TSet SeenPuzzleIds; + TSet SeenRuntimeModeIds; for (const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile : Profiles) { if (!Profile.IsStructurallyValid()) @@ -170,8 +177,15 @@ struct FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog return false; } + const FString NormalizedRuntimeModeId = Profile.RuntimeModeId.ToLower(); + if (SeenRuntimeModeIds.Contains(NormalizedRuntimeModeId)) + { + return false; + } + SeenProfileIds.Add(NormalizedProfileId); SeenPuzzleIds.Add(NormalizedPuzzleId); + SeenRuntimeModeIds.Add(NormalizedRuntimeModeId); } return true; @@ -202,6 +216,13 @@ public: FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") + static bool TryGetRuntimeActivationProfileByRuntimeModeId( + const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog& Catalog, + const FString& RuntimeModeId, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile + ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") static bool TryResolvePuzzleDefinition( const FHyperTwistTrainingHigherDimensionalRuntimeActivationCatalog& Catalog, diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingPanelWidget.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingPanelWidget.h index b5d8f4a..e1f9506 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingPanelWidget.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingPanelWidget.h @@ -3,6 +3,7 @@ #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "HyperTwistTraining/HyperTwistTrainingCoachLibrary.h" +#include "HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h" #include "HyperTwistTraining/HyperTwistTrainingTypes.h" #include "HyperTwistTrainingPanelWidget.generated.h" @@ -110,6 +111,9 @@ public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|Imported") FString LastGeneratedModeExecutionBlockedReason; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|HigherDimensional") + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile CachedHigherDimensionalRuntimeActivationProfile; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training") FHyperTwistTrainingRepositoryRoundTripVerification CachedRepositoryRoundTripVerification; @@ -215,6 +219,13 @@ public: UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Imported") FString GetDisplayedGeneratedModeExecutionBlockedReason() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|HigherDimensional") + bool HasDisplayedHigherDimensionalRuntimeActivationProfile() const; + + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|HigherDimensional") + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile + GetDisplayedHigherDimensionalRuntimeActivationProfile() const; + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach") FHyperTwistTrainingDeck BuildActiveCoachRecommendedDeck(int32 MaxCases); diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h index 6b7d600..6df1d7f 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h @@ -3388,6 +3388,24 @@ public: FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") + static bool TryGetBundledHigherDimensionalRuntimeActivationProfileByRuntimeModeId( + const FString& RuntimeModeId, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile + ); + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") + static bool TryGetHigherDimensionalRuntimeActivationProfileForRunState( + const FHyperTwistTrainingRunState& RunState, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile + ); + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional", meta = (WorldContext = "WorldContextObject")) + static bool TryGetActiveHigherDimensionalRuntimeActivationProfile( + UObject* WorldContextObject, + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& OutProfile + ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") static bool TryResolveBundledHigherDimensionalPuzzleDefinition( const FString& ActivationProfileIdOrPuzzleId, diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSessionActor.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSessionActor.h index 3f6ddbe..3340c27 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSessionActor.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingSessionActor.h @@ -3,6 +3,7 @@ #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "HyperTwistTraining/HyperTwistTrainingCoachLibrary.h" +#include "HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h" #include "HyperTwistTraining/HyperTwistTrainingTypes.h" #include "HyperTwistTrainingSessionActor.generated.h" @@ -97,6 +98,9 @@ public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|Imported") FString LastGeneratedModeExecutionBlockedReason; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training|HigherDimensional") + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile CachedHigherDimensionalRuntimeActivationProfile; + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "HyperTwist|Training") FHyperTwistTrainingRepositoryRoundTripVerification CachedRepositoryRoundTripVerification; @@ -192,6 +196,13 @@ public: UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Imported") FString GetDisplayedGeneratedModeExecutionBlockedReason() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|HigherDimensional") + bool HasDisplayedHigherDimensionalRuntimeActivationProfile() const; + + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|HigherDimensional") + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile + GetDisplayedHigherDimensionalRuntimeActivationProfile() const; + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach") FHyperTwistTrainingDeck BuildCoachRecommendedDeck(int32 MaxCases); diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistHigherDimensionalPhase6CActivationContractTest.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistHigherDimensionalPhase6CActivationContractTest.cpp index e88bfaa..b1d7401 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistHigherDimensionalPhase6CActivationContractTest.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistHigherDimensionalPhase6CActivationContractTest.cpp @@ -24,6 +24,41 @@ namespace HyperTwistHigherDimensionalPhase6CTestInternal Deck.Cases = {TrainingCase}; return Deck; } + + FHyperTwistTrainingImportedGeneratedModeLaunchRequest MakeGeneratedModeLaunchRequest( + const FString& DeckId, + const FString& TrainingSessionId, + const FString& PuzzleId, + const FString& RuntimeModeId + ) + { + FHyperTwistTrainingImportedRuntimeSelectorChoice SelectorChoice; + SelectorChoice.SelectorId = TEXT("family-mode"); + SelectorChoice.SelectorBinding = TEXT("family-mode"); + SelectorChoice.SelectedValue = TEXT("order3"); + SelectorChoice.DisplayValue = TEXT("Order 3"); + + FHyperTwistTrainingImportedGeneratedModeLaunchConfig LaunchConfig; + LaunchConfig.DeckId = DeckId; + LaunchConfig.UserId = TEXT("phase6c-user"); + LaunchConfig.TrainingSessionId = TrainingSessionId; + LaunchConfig.DeliveryMode = EHyperTwistTrainingDeliveryMode::VirtualCube; + LaunchConfig.PuzzleId = PuzzleId; + LaunchConfig.SurfaceId = TEXT("phase6c/imported-runtime-surface"); + LaunchConfig.SurfaceLabel = TEXT("Phase 6C Imported Runtime Surface"); + LaunchConfig.RuntimeModeId = RuntimeModeId; + LaunchConfig.GeneratorType = TEXT("cleanroom-generated-mode"); + LaunchConfig.SelectorChoices = {SelectorChoice}; + LaunchConfig.OriginPaths = {TEXT("phase6c/generated-mode")}; + LaunchConfig.Notes = TEXT("Phase 6C contract test launch request."); + + FHyperTwistTrainingImportedGeneratedModeLaunchRequest Request; + Request.RequestId = FString::Printf(TEXT("%s/request"), *DeckId); + Request.RequestedAtUtc = TEXT("2026-06-13T00:00:00Z"); + Request.RequestSource = TEXT("phase6c-contract-test"); + Request.LaunchConfig = LaunchConfig; + return Request; + } } IMPLEMENT_SIMPLE_AUTOMATION_TEST( @@ -137,4 +172,101 @@ bool FHyperTwistHigherDimensionalPhase6CTrainingRunDefinitionBridgeTest::RunTest return true; } +IMPLEMENT_SIMPLE_AUTOMATION_TEST( + FHyperTwistHigherDimensionalPhase6CRunStateActivationResolutionTest, + "HyperTwist.FirstParty.HigherDimensional.Phase6C.RunStateActivationResolution", + EAutomationTestFlags::EditorContext | EAutomationTestFlags::EngineFilter +) + +bool FHyperTwistHigherDimensionalPhase6CRunStateActivationResolutionTest::RunTest(const FString& Parameters) +{ + const FHyperTwistTrainingRunState Magic120CellRun = UHyperTwistTrainingLibrary::StartTrainingRun( + HyperTwistHigherDimensionalPhase6CTestInternal::MakeDeck( + TEXT("phase6c/magic120cell-resolution"), + TEXT("polychoron/magic120cell") + ), + TEXT("phase6c-user"), + TEXT("phase6c-magic120cell-resolution-session"), + EHyperTwistTrainingDeliveryMode::VirtualCube + ); + TestTrue(TEXT("The Magic120Cell resolution run must start structurally valid."), Magic120CellRun.IsStructurallyValid()); + + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile Magic120CellProfile; + TestTrue( + TEXT("The Magic120Cell run must resolve a higher-dimensional activation profile from its run state."), + UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalRuntimeActivationProfileForRunState( + Magic120CellRun, + Magic120CellProfile + ) + ); + TestEqual(TEXT("The Magic120Cell run must resolve the canonical activation profile id."), Magic120CellProfile.ActivationProfileId, TEXT("magic120cell-cleanroom-runtime-activation")); + TestEqual(TEXT("The Magic120Cell run must resolve the canonical runtime mode id."), Magic120CellProfile.RuntimeModeId, TEXT("magic120cell-full-color-runtime-v1")); + + FHyperTwistTrainingRunState RuntimeModeFallbackRun = UHyperTwistTrainingLibrary::StartTrainingRun( + HyperTwistHigherDimensionalPhase6CTestInternal::MakeDeck( + TEXT("phase6c/runtime-mode-fallback"), + TEXT("cube/3x3x3") + ), + TEXT("phase6c-user"), + TEXT("phase6c-runtime-mode-fallback-session"), + EHyperTwistTrainingDeliveryMode::VirtualCube + ); + TestTrue(TEXT("The runtime-mode fallback run must start structurally valid."), RuntimeModeFallbackRun.IsStructurallyValid()); + + RuntimeModeFallbackRun.ImportedGeneratedModeLaunchRequest = + HyperTwistHigherDimensionalPhase6CTestInternal::MakeGeneratedModeLaunchRequest( + RuntimeModeFallbackRun.ActiveDeck.DeckId, + RuntimeModeFallbackRun.Session.TrainingSessionId, + TEXT("cube/3x3x3"), + TEXT("magiccube5d-order3-runtime-v1") + ); + TestTrue( + TEXT("The runtime-mode fallback launch request must stay structurally valid."), + RuntimeModeFallbackRun.ImportedGeneratedModeLaunchRequest.IsStructurallyValid() + ); + + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile RuntimeModeProfile; + TestTrue( + TEXT("The runtime-mode fallback run must resolve by runtime mode id even when the run puzzle is not higher-dimensional."), + UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalRuntimeActivationProfileForRunState( + RuntimeModeFallbackRun, + RuntimeModeProfile + ) + ); + TestEqual(TEXT("The runtime-mode fallback run must resolve the MagicCube5D activation profile."), RuntimeModeProfile.ActivationProfileId, TEXT("magiccube5d-cleanroom-runtime-activation")); + TestEqual(TEXT("The runtime-mode fallback run must resolve the canonical MagicCube5D puzzle id."), RuntimeModeProfile.PuzzleId, TEXT("hypercube/magiccube5d/order3")); + + FHyperTwistPuzzleDefinitionRef RuntimeModeDefinition; + TestTrue( + TEXT("The bundled higher-dimensional resolver must also accept runtime mode ids directly."), + UHyperTwistTrainingRuntimeLibrary::TryResolveBundledHigherDimensionalPuzzleDefinition( + TEXT("magiccube5d-order3-runtime-v1"), + RuntimeModeDefinition + ) + ); + TestEqual(TEXT("The runtime-mode definition resolution must map back to the canonical MagicCube5D puzzle id."), RuntimeModeDefinition.PuzzleId, TEXT("hypercube/magiccube5d/order3")); + + FHyperTwistTrainingRunState ClassicRun = UHyperTwistTrainingLibrary::StartTrainingRun( + HyperTwistHigherDimensionalPhase6CTestInternal::MakeDeck( + TEXT("phase6c/classic-negative"), + TEXT("cube/3x3x3") + ), + TEXT("phase6c-user"), + TEXT("phase6c-classic-negative-session"), + EHyperTwistTrainingDeliveryMode::VirtualCube + ); + TestTrue(TEXT("The classic negative-control run must start structurally valid."), ClassicRun.IsStructurallyValid()); + + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile MissingProfile; + TestFalse( + TEXT("A classic run without a higher-dimensional imported launch request must not resolve an activation profile."), + UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalRuntimeActivationProfileForRunState( + ClassicRun, + MissingProfile + ) + ); + TestFalse(TEXT("The negative-control resolved profile must stay empty."), MissingProfile.IsStructurallyValid()); + return true; +} + #endif diff --git a/docs/ops/HYPERTWIST_COMPREHENSIVE_RECONSTRUCTION_ROADMAP_2026-06-10.md b/docs/ops/HYPERTWIST_COMPREHENSIVE_RECONSTRUCTION_ROADMAP_2026-06-10.md index dcb2e98..39ff140 100644 --- a/docs/ops/HYPERTWIST_COMPREHENSIVE_RECONSTRUCTION_ROADMAP_2026-06-10.md +++ b/docs/ops/HYPERTWIST_COMPREHENSIVE_RECONSTRUCTION_ROADMAP_2026-06-10.md @@ -352,6 +352,8 @@ Closure read: ### 6C — Magic120Cell & MagicCube5D - [x] Resolve the Phase `6C` widening posture as an Unreal clean-room activation lane above the bounded retained `Magic120Cell` / `MagicCube5D` donor contracts and the retained `Hyperspeedcube` runtime anchor - [x] Land a first-party higher-dimensional runtime-activation catalog with canonical `Magic120Cell` and `MagicCube5D` launch definitions, primary contract ids, default selection posture, and no external-process requirement +- `2026-06-13` continuation proof: current code now resolves the active higher-dimensional activation profile from training run state through both canonical puzzle ids and imported generated-mode `RuntimeModeId` fallback, then mirrors that resolved profile through the training runtime library plus the live training panel and session-actor caches +- `2026-06-13` Windows checkpoint: the primary reverse-SSH lane rebuilt the slice in isolated worktree `C:\HyperTwist_worktrees\phase10validate` with `Result: Succeeded` / UnrealBuildTool `Total execution time: 1061.50 seconds`, and targeted `UnrealEditor-Cmd` automation found `5` tests under `HyperTwist.FirstParty.HigherDimensional.Phase6C` and passed all `5`, including `RunStateActivationResolution` - [ ] Implement the full owned interactive `120-cell` and `5D` projection/runtime surfaces in Unreal above the new activation catalog - [ ] Widen the new activation catalog into actual map-level launch, interaction, and persistence execution for the dedicated families @@ -512,4 +514,10 @@ Recommended next widening order: canonical `polychoron/magic120cell` and `hypercube/magiccube5d/order3` puzzle definitions, primary donor-boundary contract ids, and default launch-selection posture without widening into an external-process bridge +- `2026-06-13`: the next `Phase 6C` continuation widened that owned activation + lane into active run-state/runtime surfaces by resolving higher-dimensional + activation through both puzzle-id and imported generated-mode + `RuntimeModeId` paths, mirroring the result into the training panel/session + caches, and validating the slice on `localhost:22022` with `5` passing + `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests - later classic-cube polish only when a concrete presentation gap remains, not as the default next move diff --git a/docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md b/docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md index 699ad6b..93cc9fd 100644 --- a/docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md +++ b/docs/ops/HYPERTWIST_UNREAL_BUILD_VALIDATION_REQUIREMENT_2026-06-01.md @@ -164,6 +164,19 @@ UnrealBuildTool `Total execution time: 2829.95 seconds`, and targeted compile proof to current higher-dimensional activation-catalog proof on the same primary reverse-SSH lane. +Later `2026-06-13` continuation proof on that same primary lane validated the +active runtime-surface widening above the landed `Phase 6C` packet without +opening a new host/runtime branch: the isolated Windows worktree +`C:\HyperTwist_worktrees\phase10validate` rebuilt the updated runtime-library, +training-panel, and session-actor exposure slice with `Result: Succeeded` and +UnrealBuildTool `Total execution time: 1061.50 seconds`, then targeted +`UnrealEditor-Cmd` automation found `5` tests under +`HyperTwist.FirstParty.HigherDimensional.Phase6C` and passed all `5`, +including `RunStateActivationResolution`, with +`**** TEST COMPLETE. EXIT CODE: 0 ****`. This extends the doctrine from the +earlier activation-catalog checkpoint into current active-run and +`RuntimeModeId` fallback proof on the same primary reverse-SSH lane. + Operational reading: - use `localhost:22022` as the primary reverse-SSH lane 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 617bcda..75a2725 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md @@ -266,7 +266,7 @@ repo. | Dedicated `120-cell` symmetry-aware focus view profiles | Implemented now | landed `Magic120Cell` `Phase 6R-AL` | Current bounded settings-derived projection, symmetry preset, logical-visibility, per-cell visibility, and center-cell focus posture are live above the landed dedicated `120-cell` runtime-profile seam without widening into renderer, host-shell, or generic topology ownership. | | Dedicated `5D` family runtime profile and persistence boundary | Implemented now | landed `MagicCube5D` packet | Current bounded family-specific widening is live beneath the retained `Hyperspeedcube` runtime anchor. | | Dedicated `5D` projection and focus view profiles | Implemented now | landed `MagicCube5D` `Phase 6R-AM` | Current bounded settings-derived projection-distance, stereo posture, per-face visibility, accent emphasis, and fifth-axis focus posture are live above the landed dedicated `5D` runtime-profile seam without widening into renderer, host-shell, or generic hyper-runtime ownership. | -| Higher-dimensional clean-room runtime activation catalog | Implemented now | landed `Phase 6C` activation packet | First-party current code now resolves canonical `polychoron/magic120cell` and `hypercube/magiccube5d/order3` puzzle definitions, default launch posture, primary donor-boundary contract ids, and the no-external-process clean-room stance above the retained `Magic120Cell` / `MagicCube5D` contracts and the retained `Hyperspeedcube` runtime anchor. | +| Higher-dimensional clean-room runtime activation catalog | Implemented now | landed `Phase 6C` activation packet | First-party current code now resolves canonical `polychoron/magic120cell` and `hypercube/magiccube5d/order3` puzzle definitions, default launch posture, primary donor-boundary contract ids, and the no-external-process clean-room stance above the retained `Magic120Cell` / `MagicCube5D` contracts and the retained `Hyperspeedcube` runtime anchor. The current continuation also resolves the active higher-dimensional activation profile from live training run state through both puzzle-id and imported generated-mode `RuntimeModeId` paths, then mirrors that resolved profile through the training runtime library plus the training panel/session caches; the primary `localhost:22022` Windows lane passed all `5` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests on `2026-06-13`. | | Broad non-Euclidean interaction shell and host ownership | Deep-source grounded retained | `MagicTile` retained remainder | Broad interaction-shell, WinForms/OpenTK host ownership, and generic runtime replacement remain deferred after the landed `Phase 6R-T` slice. | ### 7. Speech input and voice sidecars diff --git a/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md b/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md index f13eef0..3c48765 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md @@ -98,6 +98,15 @@ Current consolidated milestone snapshot: `Magic120Cell` and `MagicCube5D` puzzle definitions above the retained donor bundles and the retained `Hyperspeedcube` runtime anchor; the remaining gap is the actual interactive runtime, not the posture decision +- `2026-06-13`: the next `Phase 6C` continuation widened that activation lane + into active runtime surfaces by resolving higher-dimensional activation + through both canonical puzzle ids and imported generated-mode + `RuntimeModeId` fallback, then mirroring the resolved profile through the + training runtime library and the live training panel/session caches; the + primary `localhost:22022` Windows lane rebuilt the slice with `Result: + Succeeded` and passed all `5` + `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including + `RunStateActivationResolution` - the canonical HyperTwist repo-row portfolio is now treated as `75` rows, not `71` - currently implemented rows are now `35`, not `20`