Expose higher-dimensional runtime activation in training surfaces

This commit is contained in:
axiomlogicnexus 2026-06-13 02:03:05 +00:00
parent dbd48d0965
commit 10b66a37c3
13 changed files with 405 additions and 2 deletions

View file

@ -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();

View file

@ -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(

View file

@ -139,6 +139,86 @@ namespace HyperTwistTrainingRuntimeLibraryInternal
: TEXT("handoff")))
);
}
void AddUniqueCandidate(TArray<FString>& 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<FString> 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<FString> 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

View file

@ -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(

View file

@ -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<FString> SeenProfileIds;
TSet<FString> SeenPuzzleIds;
TSet<FString> 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,

View file

@ -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);

View file

@ -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,

View file

@ -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);

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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`