diff --git a/UnrealHyperTwist/Content/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining.umap b/UnrealHyperTwist/Content/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining.umap new file mode 100644 index 0000000..028fa9f Binary files /dev/null and b/UnrealHyperTwist/Content/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining.umap differ diff --git a/UnrealHyperTwist/Content/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining.umap b/UnrealHyperTwist/Content/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining.umap new file mode 100644 index 0000000..028fa9f Binary files /dev/null and b/UnrealHyperTwist/Content/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining.umap differ diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.cpp index 24c5bb8..b9f40a7 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.cpp @@ -1,9 +1,9 @@ #include "HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h" +#include "JsonObjectConverter.h" + namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal { - const TCHAR* SharedHigherDimensionalTrainingMapPath = - TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_ClassicTraining"); const TCHAR* Magic120CellDedicatedTrainingMapPath = TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining"); const TCHAR* MagicCube5DDedicatedTrainingMapPath = @@ -127,44 +127,81 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal return Choice; } - FString BuildPlaceholderSceneStatePayloadJson( - const FString& EnvelopeId, - const FString& SessionSurfaceId, - const FString& ActivationProfileId, - const FString& PuzzleId, - const FString& StateSemanticsId, - const FString& ProjectionProfile, - const FString& ContextPresetId, - const FString& VisibilityPresetId, - const FString& FocusPresetId - ) + template + FString SerializeStructToJson(const TStruct& Value) { - return FString::Printf( - TEXT("{\"EnvelopeId\":\"%s\",\"SessionSurfaceId\":\"%s\",\"ActivationProfileId\":\"%s\",\"PuzzleId\":\"%s\",\"StateSemanticsId\":\"%s\",\"ProjectionProfile\":\"%s\",\"ContextPresetId\":\"%s\",\"VisibilityPresetId\":\"%s\",\"FocusPresetId\":\"%s\",\"bSolved\":true}"), - *EnvelopeId, - *SessionSurfaceId, - *ActivationProfileId, - *PuzzleId, - *StateSemanticsId, - *ProjectionProfile, - *ContextPresetId, - *VisibilityPresetId, - *FocusPresetId - ); + FString Json; + FJsonObjectConverter::UStructToJsonObjectString(TStruct::StaticStruct(), &Value, Json, 0, 0); + return Json; } - FHyperTwistSimulationSceneContext BuildPlaceholderInteractiveSceneContext( + template + bool DeserializeJsonString(const FString& Json, TStruct& OutValue) + { + return !Json.IsEmpty() + && FJsonObjectConverter::JsonObjectStringToUStruct( + Json, + &OutValue, + 0, + 0); + } + + bool TryGetMagic120CellContracts( + FHyperTwistTrainingMagic120CellRuntimeProfileContract& OutRuntimeProfile, + FHyperTwistTrainingMagic120CellPersistenceBoundary& OutPersistenceBoundary, + FHyperTwistTrainingMagic120CellViewProfileContract& OutViewProfile + ) + { + const FHyperTwistTrainingMagic120CellReferenceBundle Bundle = + UHyperTwistTrainingMagic120CellLibrary::BuildBundledMagic120CellReferenceBundle(); + return UHyperTwistTrainingMagic120CellLibrary::TryGetRuntimeProfileContractById( + Bundle, + Bundle.PrimaryRuntimeProfileContractId, + OutRuntimeProfile) + && UHyperTwistTrainingMagic120CellLibrary::TryGetPersistenceBoundaryById( + Bundle, + Bundle.PrimaryPersistenceBoundaryId, + OutPersistenceBoundary) + && UHyperTwistTrainingMagic120CellLibrary::TryGetViewProfileContractById( + Bundle, + Bundle.PrimaryViewProfileContractId, + OutViewProfile); + } + + bool TryGetMagicCube5DContracts( + FHyperTwistTrainingMagicCube5DRuntimeProfileContract& OutRuntimeProfile, + FHyperTwistTrainingMagicCube5DPersistenceBoundary& OutPersistenceBoundary, + FHyperTwistTrainingMagicCube5DViewProfileContract& OutViewProfile + ) + { + const FHyperTwistTrainingMagicCube5DReferenceBundle Bundle = + UHyperTwistTrainingMagicCube5DLibrary::BuildBundledMagicCube5DReferenceBundle(); + return UHyperTwistTrainingMagicCube5DLibrary::TryGetRuntimeProfileContractById( + Bundle, + Bundle.PrimaryRuntimeProfileContractId, + OutRuntimeProfile) + && UHyperTwistTrainingMagicCube5DLibrary::TryGetPersistenceBoundaryById( + Bundle, + Bundle.PrimaryPersistenceBoundaryId, + OutPersistenceBoundary) + && UHyperTwistTrainingMagicCube5DLibrary::TryGetViewProfileContractById( + Bundle, + Bundle.PrimaryViewProfileContractId, + OutViewProfile); + } + + FHyperTwistSimulationSceneContext BuildInteractiveSceneContext( const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile, const FString& SessionSurfaceId, const FString& SceneContextId, + const EHyperTwistStateEncodingKind StateEncodingKind, const FString& EncodingProfile, + const FString& PayloadJson, + const FString& OrientationReference, const FString& ProjectionProfile, const float ProjectionDepth, const FString& RenderStateProfile, - const FString& StateSemanticsId, - const FString& ContextPresetId, - const FString& VisibilityPresetId, - const FString& FocusPresetId + const FString& Notes ) { FHyperTwistSimulationSceneContext SceneContext; @@ -175,27 +212,15 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal SceneContext.SceneContextId = SceneContextId; SceneContext.PuzzleState.Definition = Profile.ToDefinitionRef(); - SceneContext.PuzzleState.StateEncodingKind = EHyperTwistStateEncodingKind::CellComplex; + SceneContext.PuzzleState.StateEncodingKind = StateEncodingKind; SceneContext.PuzzleState.StateEncoding.EncodingProfile = EncodingProfile; - SceneContext.PuzzleState.StateEncoding.PayloadJson = BuildPlaceholderSceneStatePayloadJson( - FString::Printf(TEXT("%s/envelope"), *SceneContextId), - SessionSurfaceId, - Profile.ActivationProfileId, - Profile.PuzzleId, - StateSemanticsId, - ProjectionProfile, - ContextPresetId, - VisibilityPresetId, - FocusPresetId - ); - SceneContext.PuzzleState.OrientationFrame.Reference = - TEXT("phase6c/higher-dimensional-interactive-scene"); + SceneContext.PuzzleState.StateEncoding.PayloadJson = PayloadJson; + SceneContext.PuzzleState.OrientationFrame.Reference = OrientationReference; SceneContext.PuzzleState.bIsSolved = true; SceneContext.PuzzleState.Source = EHyperTwistStateSource::Runtime; SceneContext.PuzzleState.CapturedAtUtc = TEXT("2026-06-18T00:00:00Z"); SceneContext.PuzzleState.SourceSessionId = SessionSurfaceId; - SceneContext.PuzzleState.Notes = - TEXT("Placeholder higher-dimensional interactive scene envelope until dedicated family runtime-state ownership replaces the shared-map bridge."); + SceneContext.PuzzleState.Notes = Notes; SceneContext.ProjectionSettings.ProjectionKind = EHyperTwistProjectionKind::HyperProjection; SceneContext.ProjectionSettings.ProjectionProfile = ProjectionProfile; SceneContext.ProjectionSettings.ProjectionDepth = ProjectionDepth; @@ -310,6 +335,159 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal AppendUniqueStrings(OutProfile.CapabilityTags, ViewProfile.FocusSurfaceTags); } + FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope + BuildMagic120CellInteractiveSceneStateEnvelope( + const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile, + const FHyperTwistTrainingHigherDimensionalRuntimeSessionSurface& SessionSurface, + const FHyperTwistTrainingMagic120CellPersistenceBoundary& PersistenceBoundary, + const FHyperTwistTrainingMagic120CellViewProfileContract& ViewProfile + ) + { + FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope Envelope; + if (!Profile.IsStructurallyValid() || !SessionSurface.IsStructurallyValid()) + { + return Envelope; + } + + Envelope.EnvelopeId = TEXT("phase6c/magic120cell/interactive-scene-state"); + Envelope.SessionSurfaceId = SessionSurface.SessionSurfaceId; + Envelope.ActivationProfileId = Profile.ActivationProfileId; + Envelope.PuzzleId = Profile.PuzzleId; + Envelope.RuntimeModeId = SessionSurface.RuntimeModeId; + Envelope.PersistenceBoundaryId = PersistenceBoundary.BoundaryId; + Envelope.ViewProfileContractId = ViewProfile.ContractId; + Envelope.ProjectionProfile = TEXT("magic120cell-4d-projection-distance-v1"); + Envelope.ProjectionDepth = 4.0f; + Envelope.PuzzleTypeModeId = TEXT("full-puzzle-default-mode"); + Envelope.SymmetryPresetId = TEXT("torus-visibility-groups"); + Envelope.VisibilityPresetId = TEXT("logical-visibility-depth-ladder"); + Envelope.FocusPresetId = TEXT("center-cell-recentering"); + Envelope.PersistenceFormatId = TEXT("magic120cell/version1-header-hex-facelets-v1"); + Envelope.TwistHistoryFormatId = TEXT("magic120cell/twist-history-ledger-v1"); + Envelope.ViewRotationPolicyId = TEXT("magic120cell/view-rotation-guard-rails-v1"); + Envelope.VisibleGroupIds = + { + TEXT("torus-groups"), + TEXT("hypercube-groups"), + TEXT("layer-groups"), + TEXT("ring-groups") + }; + AppendUniqueStrings( + Envelope.PersistenceSurfaceTags, + PersistenceBoundary.PersistenceSurfaceTags); + AppendUniqueStrings( + Envelope.PersistenceSurfaceTags, + PersistenceBoundary.TwistHistorySurfaceTags); + AppendUniqueStrings( + Envelope.PersistenceSurfaceTags, + ViewProfile.ProjectionSurfaceTags); + AppendUniqueStrings( + Envelope.PersistenceSurfaceTags, + ViewProfile.VisibilityPresetTags); + return Envelope; + } + + FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope + BuildMagicCube5DInteractiveSceneStateEnvelope( + const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile, + const FHyperTwistTrainingHigherDimensionalRuntimeSessionSurface& SessionSurface, + const FHyperTwistTrainingMagicCube5DPersistenceBoundary& PersistenceBoundary, + const FHyperTwistTrainingMagicCube5DViewProfileContract& ViewProfile + ) + { + FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope Envelope; + if (!Profile.IsStructurallyValid() || !SessionSurface.IsStructurallyValid()) + { + return Envelope; + } + + Envelope.EnvelopeId = TEXT("phase6c/magiccube5d/interactive-scene-state"); + Envelope.SessionSurfaceId = SessionSurface.SessionSurfaceId; + Envelope.ActivationProfileId = Profile.ActivationProfileId; + Envelope.PuzzleId = Profile.PuzzleId; + Envelope.RuntimeModeId = SessionSurface.RuntimeModeId; + Envelope.PersistenceBoundaryId = PersistenceBoundary.BoundaryId; + Envelope.ViewProfileContractId = ViewProfile.ContractId; + Envelope.ProjectionProfile = TEXT("magiccube5d-5d-projection-distance-v1"); + Envelope.ProjectionDepth = 5.0f; + Envelope.PuzzleOrder = 3; + Envelope.StereoModeId = TEXT("stereo-disabled-default"); + Envelope.VisibilityPresetId = TEXT("all-faces-visible-default"); + Envelope.FocusPresetId = TEXT("view-centered-solved-progress"); + Envelope.AccentProfileId = TEXT("order-three-default-accent"); + Envelope.PersistenceFormatId = TEXT("magiccube5d/version1-ten-face-state-matrix-v1"); + Envelope.TwistHistoryFormatId = TEXT("magiccube5d/compact-twist-token-v1"); + Envelope.MacroFormatId = TEXT("magiccube5d/macros-sidecar-v1"); + Envelope.VisibleFaceIds = + { + TEXT("x-negative"), + TEXT("x-positive"), + TEXT("y-negative"), + TEXT("y-positive"), + TEXT("z-negative"), + TEXT("z-positive"), + TEXT("w-negative"), + TEXT("w-positive"), + TEXT("v-negative"), + TEXT("v-positive") + }; + AppendUniqueStrings( + Envelope.SolvedProgressSurfaceTags, + PersistenceBoundary.PersistenceSurfaceTags); + AppendUniqueStrings( + Envelope.SolvedProgressSurfaceTags, + PersistenceBoundary.TwistHistorySurfaceTags); + AppendUniqueStrings( + Envelope.SolvedProgressSurfaceTags, + PersistenceBoundary.MacroSurfaceTags); + AppendUniqueStrings( + Envelope.SolvedProgressSurfaceTags, + ViewProfile.FocusSurfaceTags); + return Envelope; + } + + FHyperTwistSimulationSceneContext BuildMagic120CellInteractiveSceneContext( + const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile, + const FHyperTwistTrainingHigherDimensionalRuntimeSessionSurface& SessionSurface, + const FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope& Envelope + ) + { + return BuildInteractiveSceneContext( + Profile, + SessionSurface.SessionSurfaceId, + TEXT("phase6c/magic120cell/interactive-scene-context"), + EHyperTwistStateEncodingKind::FamilySpecific, + TEXT("magic120cell-family-owned-scene-state-v1"), + SerializeStructToJson(Envelope), + TEXT("magic120cell-center-cell-runtime-frame-v1"), + Envelope.ProjectionProfile, + Envelope.ProjectionDepth, + TEXT("magic120cell-center-cell-focus-scene-runtime-v1"), + TEXT("Family-owned Magic120Cell interactive scene state envelope with dedicated persistence, projection, symmetry, and focus ownership above the dedicated family training shell.") + ); + } + + FHyperTwistSimulationSceneContext BuildMagicCube5DInteractiveSceneContext( + const FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile& Profile, + const FHyperTwistTrainingHigherDimensionalRuntimeSessionSurface& SessionSurface, + const FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope& Envelope + ) + { + return BuildInteractiveSceneContext( + Profile, + SessionSurface.SessionSurfaceId, + TEXT("phase6c/magiccube5d/interactive-scene-context"), + EHyperTwistStateEncodingKind::FamilySpecific, + TEXT("magiccube5d-family-owned-scene-state-v1"), + SerializeStructToJson(Envelope), + TEXT("magiccube5d-signed-axis-runtime-frame-v1"), + Envelope.ProjectionProfile, + Envelope.ProjectionDepth, + TEXT("magiccube5d-order3-scene-runtime-v1"), + TEXT("Family-owned MagicCube5D interactive scene state envelope with dedicated persistence, solved-progress, projection, stereo, visibility, and focus ownership above the dedicated family training shell.") + ); + } + FHyperTwistTrainingHigherDimensionalRuntimeActivationProfile BuildMagic120CellActivationProfile() { const FHyperTwistTrainingMagic120CellReferenceBundle Bundle = @@ -404,15 +582,15 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal HostSurface.HostSurfaceId = TEXT("phase6c/magic120cell/runtime-host-surface"); HostSurface.ActivationProfileId = Profile.ActivationProfileId; HostSurface.Title = TEXT("Magic120Cell dedicated-family host surface"); - HostSurface.Summary = TEXT("Explicit dedicated-family host seam for Magic120Cell that records the preferred owned training-map target while the effective runtime still resolves to the current shared HyperTwist training shell."); + HostSurface.Summary = TEXT("Explicit dedicated-family host seam for Magic120Cell that now boots through the authored first-party family training shell and no longer falls back to the shared higher-dimensional map."); HostSurface.PreferredHostMapPath = Magic120CellDedicatedTrainingMapPath; HostSurface.PreferredHostMapRouteId = TEXT("phase6c/magic120cell/dedicated-training-map-host"); HostSurface.PreferredHostMapLabel = TEXT("Magic120Cell dedicated training shell"); - HostSurface.EffectiveHostMapPath = SharedHigherDimensionalTrainingMapPath; - HostSurface.EffectiveHostMapRouteId = TEXT("phase6c/shared-training-map-host"); - HostSurface.EffectiveHostMapLabel = TEXT("Shared HyperTwist training shell"); - HostSurface.bDedicatedFamilyHostMapAuthored = false; - HostSurface.bUsesSharedTrainingMapFallback = true; + HostSurface.EffectiveHostMapPath = Magic120CellDedicatedTrainingMapPath; + HostSurface.EffectiveHostMapRouteId = TEXT("phase6c/magic120cell/dedicated-training-map-host"); + HostSurface.EffectiveHostMapLabel = TEXT("Magic120Cell dedicated training shell"); + HostSurface.bDedicatedFamilyHostMapAuthored = true; + HostSurface.bUsesSharedTrainingMapFallback = false; HostSurface.HostTags = { TEXT("phase6c"), @@ -420,11 +598,11 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal TEXT("host-surface"), TEXT("family:magic120cell"), TEXT("preferred-host:dedicated-family-map"), - TEXT("effective-host:shared-training-map") + TEXT("effective-host:dedicated-family-map") }; HostSurface.SourceAttribution = MakeHostAttribution( HostSurface.HostSurfaceId, - TEXT("Phase 6C explicit host-surface seam for Magic120Cell that preserves the preferred dedicated-family map target while keeping the current shared training-map fallback authoritative.") + TEXT("Phase 6C explicit host-surface seam for Magic120Cell that now routes owned launch and runtime execution through the authored dedicated-family training map.") ); return HostSurface; } @@ -451,33 +629,23 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal return FHyperTwistTrainingHigherDimensionalRuntimeLaunchSurface(); } - const FHyperTwistTrainingMagic120CellReferenceBundle Bundle = - UHyperTwistTrainingMagic120CellLibrary::BuildBundledMagic120CellReferenceBundle(); FHyperTwistTrainingMagic120CellRuntimeProfileContract RuntimeProfile; FHyperTwistTrainingMagic120CellPersistenceBoundary PersistenceBoundary; FHyperTwistTrainingMagic120CellViewProfileContract ViewProfile; - if (!UHyperTwistTrainingMagic120CellLibrary::TryGetRuntimeProfileContractById( - Bundle, - Bundle.PrimaryRuntimeProfileContractId, - RuntimeProfile) - || !UHyperTwistTrainingMagic120CellLibrary::TryGetPersistenceBoundaryById( - Bundle, - Bundle.PrimaryPersistenceBoundaryId, - PersistenceBoundary) - || !UHyperTwistTrainingMagic120CellLibrary::TryGetViewProfileContractById( - Bundle, - Bundle.PrimaryViewProfileContractId, + if (!TryGetMagic120CellContracts( + RuntimeProfile, + PersistenceBoundary, ViewProfile)) { return FHyperTwistTrainingHigherDimensionalRuntimeLaunchSurface(); } FHyperTwistTrainingHigherDimensionalRuntimeLaunchSurface LaunchSurface; - LaunchSurface.LaunchSurfaceId = TEXT("phase6c/magic120cell/shared-training-launch-surface"); + LaunchSurface.LaunchSurfaceId = TEXT("phase6c/magic120cell/dedicated-training-launch-surface"); LaunchSurface.ActivationProfileId = Profile.ActivationProfileId; LaunchSurface.HostSurfaceId = HostSurface.HostSurfaceId; - LaunchSurface.Title = TEXT("Magic120Cell shared-map launch surface"); - LaunchSurface.Summary = TEXT("Dedicated-family launch surface that binds the Magic120Cell clean-room activation profile to the current shared HyperTwist training map host, selector defaults, and generated-mode persistence execution path."); + LaunchSurface.Title = TEXT("Magic120Cell dedicated-family launch surface"); + LaunchSurface.Summary = TEXT("Dedicated-family launch surface that binds the Magic120Cell clean-room activation profile to the authored dedicated training shell, owned selector defaults, and the family-owned persistence execution path."); LaunchSurface.HostMapPath = HostSurface.EffectiveHostMapPath; LaunchSurface.HostMapRouteId = HostSurface.EffectiveHostMapRouteId; LaunchSurface.HostMapLabel = HostSurface.EffectiveHostMapLabel; @@ -532,7 +700,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal }; LaunchSurface.SourceAttribution = MakeLaunchAttribution( LaunchSurface.LaunchSurfaceId, - TEXT("Phase 6C dedicated-family launch surface for Magic120Cell on the explicit host-surface seam, with the preferred dedicated-family map target deferred and the current shared training-map host remaining authoritative for owned generated-mode execution.") + TEXT("Phase 6C dedicated-family launch surface for Magic120Cell on the authored host seam, replacing the shared-map bridge with a dedicated family training shell for owned generated-mode execution.") ); return LaunchSurface; } @@ -632,15 +800,15 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal HostSurface.HostSurfaceId = TEXT("phase6c/magiccube5d/runtime-host-surface"); HostSurface.ActivationProfileId = Profile.ActivationProfileId; HostSurface.Title = TEXT("MagicCube5D dedicated-family host surface"); - HostSurface.Summary = TEXT("Explicit dedicated-family host seam for MagicCube5D that records the preferred owned training-map target while the effective runtime still resolves to the current shared HyperTwist training shell."); + HostSurface.Summary = TEXT("Explicit dedicated-family host seam for MagicCube5D that now boots through the authored first-party family training shell and no longer falls back to the shared higher-dimensional map."); HostSurface.PreferredHostMapPath = MagicCube5DDedicatedTrainingMapPath; HostSurface.PreferredHostMapRouteId = TEXT("phase6c/magiccube5d/dedicated-training-map-host"); HostSurface.PreferredHostMapLabel = TEXT("MagicCube5D dedicated training shell"); - HostSurface.EffectiveHostMapPath = SharedHigherDimensionalTrainingMapPath; - HostSurface.EffectiveHostMapRouteId = TEXT("phase6c/shared-training-map-host"); - HostSurface.EffectiveHostMapLabel = TEXT("Shared HyperTwist training shell"); - HostSurface.bDedicatedFamilyHostMapAuthored = false; - HostSurface.bUsesSharedTrainingMapFallback = true; + HostSurface.EffectiveHostMapPath = MagicCube5DDedicatedTrainingMapPath; + HostSurface.EffectiveHostMapRouteId = TEXT("phase6c/magiccube5d/dedicated-training-map-host"); + HostSurface.EffectiveHostMapLabel = TEXT("MagicCube5D dedicated training shell"); + HostSurface.bDedicatedFamilyHostMapAuthored = true; + HostSurface.bUsesSharedTrainingMapFallback = false; HostSurface.HostTags = { TEXT("phase6c"), @@ -648,11 +816,11 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal TEXT("host-surface"), TEXT("family:magiccube5d"), TEXT("preferred-host:dedicated-family-map"), - TEXT("effective-host:shared-training-map") + TEXT("effective-host:dedicated-family-map") }; HostSurface.SourceAttribution = MakeHostAttribution( HostSurface.HostSurfaceId, - TEXT("Phase 6C explicit host-surface seam for MagicCube5D that preserves the preferred dedicated-family map target while keeping the current shared training-map fallback authoritative.") + TEXT("Phase 6C explicit host-surface seam for MagicCube5D that now routes owned launch and runtime execution through the authored dedicated-family training map.") ); return HostSurface; } @@ -679,33 +847,23 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal return FHyperTwistTrainingHigherDimensionalRuntimeLaunchSurface(); } - const FHyperTwistTrainingMagicCube5DReferenceBundle Bundle = - UHyperTwistTrainingMagicCube5DLibrary::BuildBundledMagicCube5DReferenceBundle(); FHyperTwistTrainingMagicCube5DRuntimeProfileContract RuntimeProfile; FHyperTwistTrainingMagicCube5DPersistenceBoundary PersistenceBoundary; FHyperTwistTrainingMagicCube5DViewProfileContract ViewProfile; - if (!UHyperTwistTrainingMagicCube5DLibrary::TryGetRuntimeProfileContractById( - Bundle, - Bundle.PrimaryRuntimeProfileContractId, - RuntimeProfile) - || !UHyperTwistTrainingMagicCube5DLibrary::TryGetPersistenceBoundaryById( - Bundle, - Bundle.PrimaryPersistenceBoundaryId, - PersistenceBoundary) - || !UHyperTwistTrainingMagicCube5DLibrary::TryGetViewProfileContractById( - Bundle, - Bundle.PrimaryViewProfileContractId, + if (!TryGetMagicCube5DContracts( + RuntimeProfile, + PersistenceBoundary, ViewProfile)) { return FHyperTwistTrainingHigherDimensionalRuntimeLaunchSurface(); } FHyperTwistTrainingHigherDimensionalRuntimeLaunchSurface LaunchSurface; - LaunchSurface.LaunchSurfaceId = TEXT("phase6c/magiccube5d/shared-training-launch-surface"); + LaunchSurface.LaunchSurfaceId = TEXT("phase6c/magiccube5d/dedicated-training-launch-surface"); LaunchSurface.ActivationProfileId = Profile.ActivationProfileId; LaunchSurface.HostSurfaceId = HostSurface.HostSurfaceId; - LaunchSurface.Title = TEXT("MagicCube5D shared-map launch surface"); - LaunchSurface.Summary = TEXT("Dedicated-family launch surface that binds the MagicCube5D clean-room activation profile to the current shared HyperTwist training map host, selector defaults, and generated-mode persistence execution path."); + LaunchSurface.Title = TEXT("MagicCube5D dedicated-family launch surface"); + LaunchSurface.Summary = TEXT("Dedicated-family launch surface that binds the MagicCube5D clean-room activation profile to the authored dedicated training shell, owned selector defaults, and the family-owned persistence execution path."); LaunchSurface.HostMapPath = HostSurface.EffectiveHostMapPath; LaunchSurface.HostMapRouteId = HostSurface.EffectiveHostMapRouteId; LaunchSurface.HostMapLabel = HostSurface.EffectiveHostMapLabel; @@ -766,7 +924,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal }; LaunchSurface.SourceAttribution = MakeLaunchAttribution( LaunchSurface.LaunchSurfaceId, - TEXT("Phase 6C dedicated-family launch surface for MagicCube5D on the explicit host-surface seam, with the preferred dedicated-family map target deferred and the current shared training-map host remaining authoritative for owned generated-mode execution.") + TEXT("Phase 6C dedicated-family launch surface for MagicCube5D on the authored host seam, replacing the shared-map bridge with a dedicated family training shell for owned generated-mode execution.") ); return LaunchSurface; } @@ -791,12 +949,12 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal return FHyperTwistTrainingHigherDimensionalRuntimeViewContextSurface(); } - const FHyperTwistTrainingMagic120CellReferenceBundle Bundle = - UHyperTwistTrainingMagic120CellLibrary::BuildBundledMagic120CellReferenceBundle(); FHyperTwistTrainingMagic120CellViewProfileContract ViewProfile; - if (!UHyperTwistTrainingMagic120CellLibrary::TryGetViewProfileContractById( - Bundle, - Bundle.PrimaryViewProfileContractId, + FHyperTwistTrainingMagic120CellRuntimeProfileContract RuntimeProfile; + FHyperTwistTrainingMagic120CellPersistenceBoundary PersistenceBoundary; + if (!TryGetMagic120CellContracts( + RuntimeProfile, + PersistenceBoundary, ViewProfile)) { return FHyperTwistTrainingHigherDimensionalRuntimeViewContextSurface(); @@ -804,13 +962,13 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal FHyperTwistTrainingHigherDimensionalRuntimeViewContextSurface ViewContextSurface; ViewContextSurface.ViewContextSurfaceId = - TEXT("phase6c/magic120cell/shared-training-view-context-surface"); + TEXT("phase6c/magic120cell/dedicated-training-view-context-surface"); ViewContextSurface.ActivationProfileId = LaunchSurface.ActivationProfileId; ViewContextSurface.LaunchSurfaceId = LaunchSurface.LaunchSurfaceId; ViewContextSurface.HostSurfaceId = HostSurface.HostSurfaceId; - ViewContextSurface.Title = TEXT("Magic120Cell shared-map view context surface"); + ViewContextSurface.Title = TEXT("Magic120Cell dedicated-family view context surface"); ViewContextSurface.Summary = - TEXT("Dedicated-family view-context surface that keeps the Magic120Cell projection, symmetry, visibility, and focus posture explicit above the shared HyperTwist training-map host."); + TEXT("Dedicated-family view-context surface that keeps the Magic120Cell projection, symmetry, visibility, and focus posture explicit above the dedicated family training shell."); ViewContextSurface.HostMapPath = HostSurface.EffectiveHostMapPath; ViewContextSurface.HostMapRouteId = HostSurface.EffectiveHostMapRouteId; ViewContextSurface.HostMapLabel = HostSurface.EffectiveHostMapLabel; @@ -835,7 +993,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal TEXT("higher-dimensional"), TEXT("view-context"), TEXT("family:magic120cell"), - TEXT("host:shared-training-map"), + TEXT("host:dedicated-family-map"), FString::Printf(TEXT("activation-profile:%s"), *LaunchSurface.ActivationProfileId.ToLower()), FString::Printf(TEXT("host-surface:%s"), @@ -870,7 +1028,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal }; ViewContextSurface.SourceAttribution = MakeViewContextAttribution( ViewContextSurface.ViewContextSurfaceId, - TEXT("Phase 6C dedicated-family view-context surface for Magic120Cell on the explicit host-surface seam, preserving owned projection, symmetry, visibility, and focus defaults while the shared training-map fallback remains effective.") + TEXT("Phase 6C dedicated-family view-context surface for Magic120Cell on the authored host seam, preserving owned projection, symmetry, visibility, and focus defaults on the dedicated family training shell.") ); return ViewContextSurface; } @@ -895,12 +1053,12 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal return FHyperTwistTrainingHigherDimensionalRuntimeViewContextSurface(); } - const FHyperTwistTrainingMagicCube5DReferenceBundle Bundle = - UHyperTwistTrainingMagicCube5DLibrary::BuildBundledMagicCube5DReferenceBundle(); FHyperTwistTrainingMagicCube5DViewProfileContract ViewProfile; - if (!UHyperTwistTrainingMagicCube5DLibrary::TryGetViewProfileContractById( - Bundle, - Bundle.PrimaryViewProfileContractId, + FHyperTwistTrainingMagicCube5DRuntimeProfileContract RuntimeProfile; + FHyperTwistTrainingMagicCube5DPersistenceBoundary PersistenceBoundary; + if (!TryGetMagicCube5DContracts( + RuntimeProfile, + PersistenceBoundary, ViewProfile)) { return FHyperTwistTrainingHigherDimensionalRuntimeViewContextSurface(); @@ -908,13 +1066,13 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal FHyperTwistTrainingHigherDimensionalRuntimeViewContextSurface ViewContextSurface; ViewContextSurface.ViewContextSurfaceId = - TEXT("phase6c/magiccube5d/shared-training-view-context-surface"); + TEXT("phase6c/magiccube5d/dedicated-training-view-context-surface"); ViewContextSurface.ActivationProfileId = LaunchSurface.ActivationProfileId; ViewContextSurface.LaunchSurfaceId = LaunchSurface.LaunchSurfaceId; ViewContextSurface.HostSurfaceId = HostSurface.HostSurfaceId; - ViewContextSurface.Title = TEXT("MagicCube5D shared-map view context surface"); + ViewContextSurface.Title = TEXT("MagicCube5D dedicated-family view context surface"); ViewContextSurface.Summary = - TEXT("Dedicated-family view-context surface that keeps the MagicCube5D projection, stereo, visibility, and focus posture explicit above the shared HyperTwist training-map host."); + TEXT("Dedicated-family view-context surface that keeps the MagicCube5D projection, stereo, visibility, and focus posture explicit above the dedicated family training shell."); ViewContextSurface.HostMapPath = HostSurface.EffectiveHostMapPath; ViewContextSurface.HostMapRouteId = HostSurface.EffectiveHostMapRouteId; ViewContextSurface.HostMapLabel = HostSurface.EffectiveHostMapLabel; @@ -939,7 +1097,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal TEXT("higher-dimensional"), TEXT("view-context"), TEXT("family:magiccube5d"), - TEXT("host:shared-training-map"), + TEXT("host:dedicated-family-map"), FString::Printf(TEXT("activation-profile:%s"), *LaunchSurface.ActivationProfileId.ToLower()), FString::Printf(TEXT("host-surface:%s"), @@ -974,7 +1132,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal }; ViewContextSurface.SourceAttribution = MakeViewContextAttribution( ViewContextSurface.ViewContextSurfaceId, - TEXT("Phase 6C dedicated-family view-context surface for MagicCube5D on the explicit host-surface seam, preserving owned projection, stereo, visibility, and focus defaults while the shared training-map fallback remains effective.") + TEXT("Phase 6C dedicated-family view-context surface for MagicCube5D on the authored host seam, preserving owned projection, stereo, visibility, and focus defaults on the dedicated family training shell.") ); return ViewContextSurface; } @@ -1010,14 +1168,14 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal FHyperTwistTrainingHigherDimensionalRuntimeSessionSurface SessionSurface; SessionSurface.SessionSurfaceId = - TEXT("phase6c/magic120cell/shared-training-session-surface"); + TEXT("phase6c/magic120cell/dedicated-training-session-surface"); SessionSurface.ActivationProfileId = LaunchSurface.ActivationProfileId; SessionSurface.HostSurfaceId = HostSurface.HostSurfaceId; SessionSurface.LaunchSurfaceId = LaunchSurface.LaunchSurfaceId; SessionSurface.ViewContextSurfaceId = ViewContextSurface.ViewContextSurfaceId; - SessionSurface.Title = TEXT("Magic120Cell shared-map runtime session surface"); + SessionSurface.Title = TEXT("Magic120Cell dedicated-family runtime session surface"); SessionSurface.Summary = - TEXT("Dedicated-family runtime session surface that merges the Magic120Cell shared-map launch posture with the authored projection, symmetry, visibility, and focus defaults so the executed training session carries the owned higher-dimensional interaction shell rather than only the seed-run bridge."); + TEXT("Dedicated-family runtime session surface that merges the Magic120Cell dedicated-family launch posture with the authored projection, symmetry, visibility, and focus defaults so the executed training session carries the owned higher-dimensional interaction shell on the dedicated training shell."); SessionSurface.HostMapPath = HostSurface.EffectiveHostMapPath; SessionSurface.HostMapRouteId = HostSurface.EffectiveHostMapRouteId; SessionSurface.HostMapLabel = HostSurface.EffectiveHostMapLabel; @@ -1050,7 +1208,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal TEXT("higher-dimensional"), TEXT("session-surface"), TEXT("family:magic120cell"), - TEXT("host:shared-training-map"), + TEXT("host:dedicated-family-map"), TEXT("session-defaults:launch-plus-view-context"), FString::Printf(TEXT("activation-profile:%s"), *LaunchSurface.ActivationProfileId.ToLower()), @@ -1081,7 +1239,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal ViewContextSurface.DefaultSelectorChoices); SessionSurface.SourceAttribution = MakeSessionAttribution( SessionSurface.SessionSurfaceId, - TEXT("Phase 6C dedicated-family runtime session surface for Magic120Cell that turns the authored launch and view-context posture into one executed clean-room session contract while the shared training-map host remains the effective runtime fallback.") + TEXT("Phase 6C dedicated-family runtime session surface for Magic120Cell that turns the authored launch and view-context posture into one executed clean-room session contract on the dedicated family training shell.") ); return SessionSurface; } @@ -1117,14 +1275,14 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal FHyperTwistTrainingHigherDimensionalRuntimeSessionSurface SessionSurface; SessionSurface.SessionSurfaceId = - TEXT("phase6c/magiccube5d/shared-training-session-surface"); + TEXT("phase6c/magiccube5d/dedicated-training-session-surface"); SessionSurface.ActivationProfileId = LaunchSurface.ActivationProfileId; SessionSurface.HostSurfaceId = HostSurface.HostSurfaceId; SessionSurface.LaunchSurfaceId = LaunchSurface.LaunchSurfaceId; SessionSurface.ViewContextSurfaceId = ViewContextSurface.ViewContextSurfaceId; - SessionSurface.Title = TEXT("MagicCube5D shared-map runtime session surface"); + SessionSurface.Title = TEXT("MagicCube5D dedicated-family runtime session surface"); SessionSurface.Summary = - TEXT("Dedicated-family runtime session surface that merges the MagicCube5D shared-map launch posture with the authored projection, stereo, visibility, and focus defaults so the executed training session carries the owned higher-dimensional interaction shell rather than only the seed-run bridge."); + TEXT("Dedicated-family runtime session surface that merges the MagicCube5D dedicated-family launch posture with the authored projection, stereo, visibility, and focus defaults so the executed training session carries the owned higher-dimensional interaction shell on the dedicated training shell."); SessionSurface.HostMapPath = HostSurface.EffectiveHostMapPath; SessionSurface.HostMapRouteId = HostSurface.EffectiveHostMapRouteId; SessionSurface.HostMapLabel = HostSurface.EffectiveHostMapLabel; @@ -1157,7 +1315,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal TEXT("higher-dimensional"), TEXT("session-surface"), TEXT("family:magiccube5d"), - TEXT("host:shared-training-map"), + TEXT("host:dedicated-family-map"), TEXT("session-defaults:launch-plus-view-context"), FString::Printf(TEXT("activation-profile:%s"), *LaunchSurface.ActivationProfileId.ToLower()), @@ -1188,7 +1346,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal ViewContextSurface.DefaultSelectorChoices); SessionSurface.SourceAttribution = MakeSessionAttribution( SessionSurface.SessionSurfaceId, - TEXT("Phase 6C dedicated-family runtime session surface for MagicCube5D that turns the authored launch and view-context posture into one executed clean-room session contract while the shared training-map host remains the effective runtime fallback.") + TEXT("Phase 6C dedicated-family runtime session surface for MagicCube5D that turns the authored launch and view-context posture into one executed clean-room session contract on the dedicated family training shell.") ); return SessionSurface; } @@ -1216,6 +1374,28 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal return FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface(); } + FHyperTwistTrainingMagic120CellRuntimeProfileContract RuntimeProfile; + FHyperTwistTrainingMagic120CellPersistenceBoundary PersistenceBoundary; + FHyperTwistTrainingMagic120CellViewProfileContract ViewProfile; + if (!TryGetMagic120CellContracts( + RuntimeProfile, + PersistenceBoundary, + ViewProfile)) + { + return FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface(); + } + + const FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope Envelope = + BuildMagic120CellInteractiveSceneStateEnvelope( + Profile, + SessionSurface, + PersistenceBoundary, + ViewProfile); + if (!Envelope.IsStructurallyValid()) + { + return FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface(); + } + FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface SceneSurface; SceneSurface.SceneSurfaceId = TEXT("phase6c/magic120cell/interactive-scene-surface"); SceneSurface.SessionSurfaceId = SessionSurface.SessionSurfaceId; @@ -1225,7 +1405,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal SceneSurface.ViewContextSurfaceId = SessionSurface.ViewContextSurfaceId; SceneSurface.Title = TEXT("Magic120Cell interactive scene surface"); SceneSurface.Summary = - TEXT("Dedicated-family interactive scene surface that promotes the Magic120Cell runtime session into an explicit simulation scene-context contract while dedicated maps and family-owned runtime state are still being authored."); + TEXT("Dedicated-family interactive scene surface that promotes the Magic120Cell runtime session into an explicit simulation scene-context contract with family-owned state, projection, and persistence posture on the dedicated training shell."); SceneSurface.HostMapPath = SessionSurface.HostMapPath; SceneSurface.HostMapRouteId = SessionSurface.HostMapRouteId; SceneSurface.HostMapLabel = SessionSurface.HostMapLabel; @@ -1237,20 +1417,12 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal SceneSurface.PrimaryViewProfileContractId = SessionSurface.PrimaryViewProfileContractId; SceneSurface.StateSemanticsId = - TEXT("phase6c/higher-dimensional-placeholder-solved-envelope"); - SceneSurface.bUsesPlaceholderStateEnvelope = true; - SceneSurface.SceneContext = BuildPlaceholderInteractiveSceneContext( + TEXT("phase6c/magic120cell/family-owned-scene-state"); + SceneSurface.bUsesPlaceholderStateEnvelope = false; + SceneSurface.SceneContext = BuildMagic120CellInteractiveSceneContext( Profile, - SessionSurface.SessionSurfaceId, - TEXT("phase6c/magic120cell/interactive-scene-context"), - TEXT("phase6c/magic120cell-interactive-scene-envelope-v1"), - TEXT("magic120cell-4d-projection-distance-v1"), - 4.0f, - TEXT("magic120cell-center-cell-focus-scene-runtime-v1"), - SceneSurface.StateSemanticsId, - TEXT("full-puzzle-default-mode"), - TEXT("logical-visibility-depth-ladder"), - TEXT("center-cell-recentering") + SessionSurface, + Envelope ); AppendUniqueStrings( SceneSurface.InteractionSurfaceTags, @@ -1262,10 +1434,12 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal TEXT("higher-dimensional"), TEXT("interactive-scene"), TEXT("family:magic120cell"), - TEXT("scene-state:placeholder-envelope"), + TEXT("scene-state:family-owned-envelope"), TEXT("projection:magic120cell-4d-projection-distance-v1"), TEXT("focus:center-cell-recentering"), TEXT("visibility:logical-visibility-depth-ladder"), + TEXT("host:dedicated-family-map"), + TEXT("persistence:magic120cell-persistence-boundary"), FString::Printf(TEXT("activation-profile:%s"), *SceneSurface.ActivationProfileId.ToLower()), FString::Printf(TEXT("session-surface:%s"), @@ -1274,9 +1448,10 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal AppendUniqueStrings(SceneSurface.SceneTags, SessionSurface.SessionTags); AppendUniqueStrings(SceneSurface.SceneTags, SceneSurface.InteractionSurfaceTags); AppendUniqueStrings(SceneSurface.SceneTags, SceneSurface.ViewSurfaceTags); + AppendUniqueStrings(SceneSurface.SceneTags, Envelope.PersistenceSurfaceTags); SceneSurface.SourceAttribution = MakeInteractiveSceneAttribution( SceneSurface.SceneSurfaceId, - TEXT("Phase 6C dedicated-family interactive scene surface for Magic120Cell that keeps the simulation-side scene contract explicit and intentionally placeholder-backed while the shared training-map host remains authoritative.") + TEXT("Phase 6C dedicated-family interactive scene surface for Magic120Cell that now carries a family-owned scene-state envelope, dedicated persistence ownership, and the dedicated family training shell instead of the placeholder shared-map bridge.") ); return SceneSurface; } @@ -1304,6 +1479,28 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal return FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface(); } + FHyperTwistTrainingMagicCube5DRuntimeProfileContract RuntimeProfile; + FHyperTwistTrainingMagicCube5DPersistenceBoundary PersistenceBoundary; + FHyperTwistTrainingMagicCube5DViewProfileContract ViewProfile; + if (!TryGetMagicCube5DContracts( + RuntimeProfile, + PersistenceBoundary, + ViewProfile)) + { + return FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface(); + } + + const FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope Envelope = + BuildMagicCube5DInteractiveSceneStateEnvelope( + Profile, + SessionSurface, + PersistenceBoundary, + ViewProfile); + if (!Envelope.IsStructurallyValid()) + { + return FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface(); + } + FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface SceneSurface; SceneSurface.SceneSurfaceId = TEXT("phase6c/magiccube5d/interactive-scene-surface"); SceneSurface.SessionSurfaceId = SessionSurface.SessionSurfaceId; @@ -1313,7 +1510,7 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal SceneSurface.ViewContextSurfaceId = SessionSurface.ViewContextSurfaceId; SceneSurface.Title = TEXT("MagicCube5D interactive scene surface"); SceneSurface.Summary = - TEXT("Dedicated-family interactive scene surface that promotes the MagicCube5D runtime session into an explicit simulation scene-context contract while dedicated maps and family-owned runtime state are still being authored."); + TEXT("Dedicated-family interactive scene surface that promotes the MagicCube5D runtime session into an explicit simulation scene-context contract with family-owned state, projection, persistence, and solved-progress posture on the dedicated training shell."); SceneSurface.HostMapPath = SessionSurface.HostMapPath; SceneSurface.HostMapRouteId = SessionSurface.HostMapRouteId; SceneSurface.HostMapLabel = SessionSurface.HostMapLabel; @@ -1325,20 +1522,12 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal SceneSurface.PrimaryViewProfileContractId = SessionSurface.PrimaryViewProfileContractId; SceneSurface.StateSemanticsId = - TEXT("phase6c/higher-dimensional-placeholder-solved-envelope"); - SceneSurface.bUsesPlaceholderStateEnvelope = true; - SceneSurface.SceneContext = BuildPlaceholderInteractiveSceneContext( + TEXT("phase6c/magiccube5d/family-owned-scene-state"); + SceneSurface.bUsesPlaceholderStateEnvelope = false; + SceneSurface.SceneContext = BuildMagicCube5DInteractiveSceneContext( Profile, - SessionSurface.SessionSurfaceId, - TEXT("phase6c/magiccube5d/interactive-scene-context"), - TEXT("phase6c/magiccube5d-interactive-scene-envelope-v1"), - TEXT("magiccube5d-5d-projection-distance-v1"), - 5.0f, - TEXT("magiccube5d-order3-scene-runtime-v1"), - SceneSurface.StateSemanticsId, - TEXT("stereo-disabled-default"), - TEXT("all-faces-visible-default"), - TEXT("view-centered-solved-progress") + SessionSurface, + Envelope ); AppendUniqueStrings( SceneSurface.InteractionSurfaceTags, @@ -1350,11 +1539,13 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal TEXT("higher-dimensional"), TEXT("interactive-scene"), TEXT("family:magiccube5d"), - TEXT("scene-state:placeholder-envelope"), + TEXT("scene-state:family-owned-envelope"), TEXT("projection:magiccube5d-5d-projection-distance-v1"), TEXT("context:stereo-disabled-default"), TEXT("visibility:all-faces-visible-default"), TEXT("focus:view-centered-solved-progress"), + TEXT("host:dedicated-family-map"), + TEXT("persistence:magiccube5d-persistence-boundary"), FString::Printf(TEXT("activation-profile:%s"), *SceneSurface.ActivationProfileId.ToLower()), FString::Printf(TEXT("session-surface:%s"), @@ -1363,9 +1554,10 @@ namespace HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal AppendUniqueStrings(SceneSurface.SceneTags, SessionSurface.SessionTags); AppendUniqueStrings(SceneSurface.SceneTags, SceneSurface.InteractionSurfaceTags); AppendUniqueStrings(SceneSurface.SceneTags, SceneSurface.ViewSurfaceTags); + AppendUniqueStrings(SceneSurface.SceneTags, Envelope.SolvedProgressSurfaceTags); SceneSurface.SourceAttribution = MakeInteractiveSceneAttribution( SceneSurface.SceneSurfaceId, - TEXT("Phase 6C dedicated-family interactive scene surface for MagicCube5D that keeps the simulation-side scene contract explicit and intentionally placeholder-backed while the shared training-map host remains authoritative.") + TEXT("Phase 6C dedicated-family interactive scene surface for MagicCube5D that now carries a family-owned scene-state envelope, dedicated persistence ownership, and the dedicated family training shell instead of the placeholder shared-map bridge.") ); return SceneSurface; } @@ -1951,3 +2143,47 @@ bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryGetInteractiveSceneS OutSceneSurface ); } + +bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryDecodeMagic120CellInteractiveSceneStateEnvelope( + const FHyperTwistSimulationSceneContext& SceneContext, + FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope& OutEnvelope +) +{ + OutEnvelope = FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope(); + if (!SceneContext.IsStructurallyValid() + || SceneContext.PuzzleState.Definition.PuzzleId != TEXT("polychoron/magic120cell") + || SceneContext.PuzzleState.StateEncoding.EncodingProfile + != TEXT("magic120cell-family-owned-scene-state-v1") + || !HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal::DeserializeJsonString( + SceneContext.PuzzleState.StateEncoding.PayloadJson, + OutEnvelope) + || !OutEnvelope.IsStructurallyValid()) + { + OutEnvelope = FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope(); + return false; + } + + return true; +} + +bool UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryDecodeMagicCube5DInteractiveSceneStateEnvelope( + const FHyperTwistSimulationSceneContext& SceneContext, + FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope& OutEnvelope +) +{ + OutEnvelope = FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope(); + if (!SceneContext.IsStructurallyValid() + || SceneContext.PuzzleState.Definition.PuzzleId != TEXT("hypercube/magiccube5d/order3") + || SceneContext.PuzzleState.StateEncoding.EncodingProfile + != TEXT("magiccube5d-family-owned-scene-state-v1") + || !HyperTwistTrainingHigherDimensionalRuntimeLibraryInternal::DeserializeJsonString( + SceneContext.PuzzleState.StateEncoding.PayloadJson, + OutEnvelope) + || !OutEnvelope.IsStructurallyValid()) + { + OutEnvelope = FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope(); + return false; + } + + return true; +} diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp index 5fff397..372f5af 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp @@ -7479,6 +7479,28 @@ bool UHyperTwistTrainingRuntimeLibrary::TryGetHigherDimensionalInteractiveSceneS ); } +bool UHyperTwistTrainingRuntimeLibrary::TryDecodeMagic120CellInteractiveSceneStateEnvelope( + const FHyperTwistSimulationSceneContext& SceneContext, + FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope& OutEnvelope +) +{ + return UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryDecodeMagic120CellInteractiveSceneStateEnvelope( + SceneContext, + OutEnvelope + ); +} + +bool UHyperTwistTrainingRuntimeLibrary::TryDecodeMagicCube5DInteractiveSceneStateEnvelope( + const FHyperTwistSimulationSceneContext& SceneContext, + FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope& OutEnvelope +) +{ + return UHyperTwistTrainingHigherDimensionalRuntimeLibrary::TryDecodeMagicCube5DInteractiveSceneStateEnvelope( + SceneContext, + OutEnvelope + ); +} + bool UHyperTwistTrainingRuntimeLibrary::TryGetActiveHigherDimensionalRuntimeHostSurface( UObject* WorldContextObject, FHyperTwistTrainingHigherDimensionalRuntimeHostSurface& OutHostSurface diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp index 83f7ceb..0a32786 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingSubsystem.cpp @@ -768,6 +768,80 @@ namespace HyperTwistTrainingSubsystemInternal return true; } + bool TryApplyGeneratedModeSelectorChoiceToRunState( + FHyperTwistTrainingRunState& InOutRunState, + const FString& SelectorId, + const FString& SelectedValue, + const FString& DisplayValue, + FString& OutBlockedReason + ) + { + OutBlockedReason.Reset(); + + if (!InOutRunState.IsStructurallyValid() || SelectedValue.IsEmpty()) + { + OutBlockedReason = TEXT("Generated-mode selector application requires a structurally valid active run."); + return false; + } + + FHyperTwistTrainingImportedRuntimeSurface RuntimeSurface; + if (!UHyperTwistTrainingCatalogLibrary::TryGetImportedRuntimeSurfaceFromDeck( + InOutRunState.ActiveDeck, + RuntimeSurface) + || !RuntimeSurface.SurfaceKind.Equals(TEXT("generated-mode"), ESearchCase::IgnoreCase)) + { + OutBlockedReason = TEXT("Generated-mode selector application requires an imported generated-mode surface."); + return false; + } + + FHyperTwistTrainingImportedRuntimeSelector Selector; + if (!UHyperTwistTrainingCatalogLibrary::TryGetImportedRuntimeSelectorFromDeck( + InOutRunState.ActiveDeck, + SelectorId, + Selector)) + { + OutBlockedReason = FString::Printf( + TEXT("Generated-mode selector application could not resolve selector %s."), + *SelectorId + ); + return false; + } + + if (!InOutRunState.ImportedRuntimeSelectionState.IsStructurallyValid()) + { + InOutRunState.ImportedRuntimeSelectionState.SurfaceId = RuntimeSurface.SurfaceId; + InOutRunState.ImportedRuntimeSelectionState.SurfaceKind = RuntimeSurface.SurfaceKind; + } + + FHyperTwistTrainingImportedRuntimeSelectorChoice* ExistingChoice = + InOutRunState.ImportedRuntimeSelectionState.SelectorChoices.FindByPredicate( + [&SelectorId](const FHyperTwistTrainingImportedRuntimeSelectorChoice& Candidate) + { + return Candidate.SelectorId == SelectorId; + } + ); + if (ExistingChoice != nullptr) + { + ExistingChoice->SelectorBinding = Selector.SelectorBinding; + ExistingChoice->SelectedValue = SelectedValue; + ExistingChoice->DisplayValue = DisplayValue.IsEmpty() ? SelectedValue : DisplayValue; + } + else + { + FHyperTwistTrainingImportedRuntimeSelectorChoice Choice; + Choice.SelectorId = SelectorId; + Choice.SelectorBinding = Selector.SelectorBinding; + Choice.SelectedValue = SelectedValue; + Choice.DisplayValue = DisplayValue.IsEmpty() ? SelectedValue : DisplayValue; + InOutRunState.ImportedRuntimeSelectionState.SelectorChoices.Add(MoveTemp(Choice)); + } + + InOutRunState.ActiveDeck.Tags.AddUnique(TEXT("runtime-surface:generated-choice-applied")); + InOutRunState.ActiveDeck.Tags.AddUnique(FString::Printf(TEXT("selector:%s"), *SelectorId.ToLower())); + InOutRunState.ActiveDeck.Tags.AddUnique(FString::Printf(TEXT("selector-choice:%s"), *SelectedValue.ToLower())); + return true; + } + TArray ExtractCaseIdsFromDeck(const FHyperTwistTrainingDeck& Deck) { TArray CaseIds; @@ -9750,20 +9824,29 @@ bool UHyperTwistTrainingSubsystem::TryStartHigherDimensionalLaunchSurface( for (const FHyperTwistTrainingImportedRuntimeSelectorChoice& Choice : SessionSurface.DefaultSelectorChoices) { - OutRunState = ApplyActiveImportedGeneratedModeSelectorChoice( - Choice.SelectorId, - Choice.SelectedValue, - Choice.DisplayValue - ); - if (!OutRunState.IsStructurallyValid()) + if (!HyperTwistTrainingSubsystemInternal::TryApplyGeneratedModeSelectorChoiceToRunState( + ActiveRunState, + Choice.SelectorId, + Choice.SelectedValue, + Choice.DisplayValue, + OutBlockedReason)) { - OutBlockedReason = FString::Printf( - TEXT("Higher-dimensional launch surface could not apply default selector %s."), - *Choice.SelectorId - ); return false; } } + RefreshSummary(); + TrainingRepositoryState = UHyperTwistTrainingRepositoryLibrary::RecordRunState( + TrainingRepositoryState, + ActiveRunState + ); + RefreshRepositoryViews(); + OutRunState = ActiveRunState; + if (!OutRunState.IsStructurallyValid()) + { + OutBlockedReason = + TEXT("Higher-dimensional launch surface could not persist a structurally valid selector posture."); + return false; + } if (!bExecuteGeneratedModeLaunchRequest) { @@ -9840,56 +9923,16 @@ FHyperTwistTrainingRunState UHyperTwistTrainingSubsystem::ApplyActiveImportedGen return FHyperTwistTrainingRunState(); } - FHyperTwistTrainingImportedRuntimeSurface RuntimeSurface; - if (!UHyperTwistTrainingCatalogLibrary::TryGetImportedRuntimeSurfaceFromDeck( - ActiveRunState.ActiveDeck, - RuntimeSurface) - || !RuntimeSurface.SurfaceKind.Equals(TEXT("generated-mode"), ESearchCase::IgnoreCase)) - { - return FHyperTwistTrainingRunState(); - } - - FHyperTwistTrainingImportedRuntimeSelector Selector; - if (!UHyperTwistTrainingCatalogLibrary::TryGetImportedRuntimeSelectorFromDeck( - ActiveRunState.ActiveDeck, + FString BlockedReason; + if (!HyperTwistTrainingSubsystemInternal::TryApplyGeneratedModeSelectorChoiceToRunState( + ActiveRunState, SelectorId, - Selector)) + SelectedValue, + DisplayValue, + BlockedReason)) { return FHyperTwistTrainingRunState(); } - - if (!ActiveRunState.ImportedRuntimeSelectionState.IsStructurallyValid()) - { - ActiveRunState.ImportedRuntimeSelectionState.SurfaceId = RuntimeSurface.SurfaceId; - ActiveRunState.ImportedRuntimeSelectionState.SurfaceKind = RuntimeSurface.SurfaceKind; - } - - FHyperTwistTrainingImportedRuntimeSelectorChoice* ExistingChoice = - ActiveRunState.ImportedRuntimeSelectionState.SelectorChoices.FindByPredicate( - [&SelectorId](const FHyperTwistTrainingImportedRuntimeSelectorChoice& Candidate) - { - return Candidate.SelectorId == SelectorId; - } - ); - if (ExistingChoice != nullptr) - { - ExistingChoice->SelectorBinding = Selector.SelectorBinding; - ExistingChoice->SelectedValue = SelectedValue; - ExistingChoice->DisplayValue = DisplayValue.IsEmpty() ? SelectedValue : DisplayValue; - } - else - { - FHyperTwistTrainingImportedRuntimeSelectorChoice Choice; - Choice.SelectorId = SelectorId; - Choice.SelectorBinding = Selector.SelectorBinding; - Choice.SelectedValue = SelectedValue; - Choice.DisplayValue = DisplayValue.IsEmpty() ? SelectedValue : DisplayValue; - ActiveRunState.ImportedRuntimeSelectionState.SelectorChoices.Add(MoveTemp(Choice)); - } - - ActiveRunState.ActiveDeck.Tags.AddUnique(TEXT("runtime-surface:generated-choice-applied")); - ActiveRunState.ActiveDeck.Tags.AddUnique(FString::Printf(TEXT("selector:%s"), *SelectorId.ToLower())); - ActiveRunState.ActiveDeck.Tags.AddUnique(FString::Printf(TEXT("selector-choice:%s"), *SelectedValue.ToLower())); RefreshSummary(); TrainingRepositoryState = UHyperTwistTrainingRepositoryLibrary::RecordRunState( TrainingRepositoryState, diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h index b60c01e..58b43b3 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingHigherDimensionalRuntimeLibrary.h @@ -1046,6 +1046,200 @@ struct FHyperTwistTrainingHigherDimensionalInteractiveSceneCatalog } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString EnvelopeId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SchemaVersion = TEXT("phase6c/magic120cell-interactive-scene-state/v1"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SessionSurfaceId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ActivationProfileId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PuzzleId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RuntimeModeId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PersistenceBoundaryId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ViewProfileContractId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ProjectionProfile; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ProjectionDepth = 4.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PuzzleTypeModeId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SymmetryPresetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString VisibilityPresetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString FocusPresetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PersistenceFormatId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString TwistHistoryFormatId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ViewRotationPolicyId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray VisibleGroupIds; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray PersistenceSurfaceTags; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bSolved = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bScrambled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bCenterCellPinned = true; + + bool IsStructurallyValid() const + { + return !EnvelopeId.IsEmpty() + && !SchemaVersion.IsEmpty() + && !SessionSurfaceId.IsEmpty() + && !ActivationProfileId.IsEmpty() + && !PuzzleId.IsEmpty() + && !RuntimeModeId.IsEmpty() + && !PersistenceBoundaryId.IsEmpty() + && !ViewProfileContractId.IsEmpty() + && !ProjectionProfile.IsEmpty() + && ProjectionDepth > 0.0f + && !PuzzleTypeModeId.IsEmpty() + && !SymmetryPresetId.IsEmpty() + && !VisibilityPresetId.IsEmpty() + && !FocusPresetId.IsEmpty() + && !PersistenceFormatId.IsEmpty() + && !TwistHistoryFormatId.IsEmpty() + && !ViewRotationPolicyId.IsEmpty() + && VisibleGroupIds.Num() > 0 + && PersistenceSurfaceTags.Num() > 0; + } +}; + +USTRUCT(BlueprintType) +struct FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString EnvelopeId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SchemaVersion = TEXT("phase6c/magiccube5d-interactive-scene-state/v1"); + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SessionSurfaceId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ActivationProfileId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PuzzleId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RuntimeModeId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PersistenceBoundaryId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ViewProfileContractId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ProjectionProfile; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ProjectionDepth = 5.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 PuzzleOrder = 3; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString StereoModeId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString VisibilityPresetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString FocusPresetId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString AccentProfileId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PersistenceFormatId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString TwistHistoryFormatId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString MacroFormatId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray VisibleFaceIds; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + TArray SolvedProgressSurfaceTags; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bSolved = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bScrambled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bStereoEnabled = false; + + bool IsStructurallyValid() const + { + return !EnvelopeId.IsEmpty() + && !SchemaVersion.IsEmpty() + && !SessionSurfaceId.IsEmpty() + && !ActivationProfileId.IsEmpty() + && !PuzzleId.IsEmpty() + && !RuntimeModeId.IsEmpty() + && !PersistenceBoundaryId.IsEmpty() + && !ViewProfileContractId.IsEmpty() + && !ProjectionProfile.IsEmpty() + && ProjectionDepth > 0.0f + && PuzzleOrder > 0 + && !StereoModeId.IsEmpty() + && !VisibilityPresetId.IsEmpty() + && !FocusPresetId.IsEmpty() + && !AccentProfileId.IsEmpty() + && !PersistenceFormatId.IsEmpty() + && !TwistHistoryFormatId.IsEmpty() + && !MacroFormatId.IsEmpty() + && VisibleFaceIds.Num() > 0 + && SolvedProgressSurfaceTags.Num() > 0; + } +}; + UCLASS() class UNREALHYPERTWIST_API UHyperTwistTrainingHigherDimensionalRuntimeLibrary : public UBlueprintFunctionLibrary { @@ -1186,4 +1380,16 @@ public: const FString& PuzzleId, FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface& OutSceneSurface ); + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") + static bool TryDecodeMagic120CellInteractiveSceneStateEnvelope( + const FHyperTwistSimulationSceneContext& SceneContext, + FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope& OutEnvelope + ); + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") + static bool TryDecodeMagicCube5DInteractiveSceneStateEnvelope( + const FHyperTwistSimulationSceneContext& SceneContext, + FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope& OutEnvelope + ); }; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h index ae2894d..f01ca39 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h @@ -3522,6 +3522,18 @@ public: FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface& OutSceneSurface ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") + static bool TryDecodeMagic120CellInteractiveSceneStateEnvelope( + const FHyperTwistSimulationSceneContext& SceneContext, + FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope& OutEnvelope + ); + + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional") + static bool TryDecodeMagicCube5DInteractiveSceneStateEnvelope( + const FHyperTwistSimulationSceneContext& SceneContext, + FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope& OutEnvelope + ); + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|HigherDimensional", meta = (WorldContext = "WorldContextObject")) static bool TryGetActiveHigherDimensionalRuntimeHostSurface( UObject* WorldContextObject, diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistHigherDimensionalPhase6CActivationContractTest.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistHigherDimensionalPhase6CActivationContractTest.cpp index 6b01a70..b4ac842 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistHigherDimensionalPhase6CActivationContractTest.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Tests/HyperTwistHigherDimensionalPhase6CActivationContractTest.cpp @@ -2,6 +2,7 @@ #include "Engine/GameInstance.h" #include "Misc/AutomationTest.h" +#include "Misc/PackageName.h" #include "HyperTwistSimulation/HyperTwistSimulationLibrary.h" #include "HyperTwistTraining/HyperTwistTrainingLibrary.h" @@ -138,18 +139,22 @@ bool FHyperTwistHigherDimensionalPhase6CHostCatalogTest::RunTest(const FString& TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining") ); TestEqual( - TEXT("The Magic120Cell host surface must still resolve to the shared effective host."), + TEXT("The Magic120Cell host surface must now resolve to the dedicated effective host."), Magic120CellHostSurface.EffectiveHostMapPath, - TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_ClassicTraining") - ); - TestFalse( - TEXT("The Magic120Cell host surface must not claim the dedicated host map is authored yet."), - Magic120CellHostSurface.bDedicatedFamilyHostMapAuthored + TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining") ); TestTrue( - TEXT("The Magic120Cell host surface must keep the shared-map fallback posture explicit."), + TEXT("The Magic120Cell host surface must now claim the dedicated host map is authored."), + Magic120CellHostSurface.bDedicatedFamilyHostMapAuthored + ); + TestFalse( + TEXT("The Magic120Cell host surface must no longer depend on the shared-map fallback posture."), Magic120CellHostSurface.bUsesSharedTrainingMapFallback ); + TestTrue( + TEXT("The Magic120Cell dedicated host map asset must exist."), + FPackageName::DoesPackageExist(TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining")) + ); FHyperTwistTrainingHigherDimensionalRuntimeHostSurface MagicCube5DHostSurface; TestTrue( @@ -165,8 +170,20 @@ bool FHyperTwistHigherDimensionalPhase6CHostCatalogTest::RunTest(const FString& TEXT("phase6c/magiccube5d/dedicated-training-map-host") ); TestTrue( - TEXT("The MagicCube5D host surface must carry shared-host fallback tags."), - MagicCube5DHostSurface.HostTags.Contains(TEXT("effective-host:shared-training-map")) + TEXT("The MagicCube5D host surface must carry dedicated-host effective tags."), + MagicCube5DHostSurface.HostTags.Contains(TEXT("effective-host:dedicated-family-map")) + ); + TestTrue( + TEXT("The MagicCube5D host surface must now claim the dedicated host map is authored."), + MagicCube5DHostSurface.bDedicatedFamilyHostMapAuthored + ); + TestFalse( + TEXT("The MagicCube5D host surface must no longer depend on the shared-map fallback posture."), + MagicCube5DHostSurface.bUsesSharedTrainingMapFallback + ); + TestTrue( + TEXT("The MagicCube5D dedicated host map asset must exist."), + FPackageName::DoesPackageExist(TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining")) ); return true; } @@ -201,17 +218,17 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchCatalogTest::RunTest(const FString ) ); TestEqual( - TEXT("The Magic120Cell launch surface must stay on the current shared training map host."), + TEXT("The Magic120Cell launch surface must now use the dedicated family training map host."), Magic120CellLaunchSurface.HostMapPath, - TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_ClassicTraining") + TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_Magic120CellTraining") ); TestEqual( TEXT("The Magic120Cell launch surface must resolve through the explicit host surface seam."), Magic120CellLaunchSurface.HostSurfaceId, TEXT("phase6c/magic120cell/runtime-host-surface") ); - TestTrue( - TEXT("The Magic120Cell launch surface must remain flagged as a shared-map fallback until dedicated assets land."), + TestFalse( + TEXT("The Magic120Cell launch surface must no longer be flagged as a shared-map fallback."), Magic120CellLaunchSurface.bUsesSharedTrainingMapFallback ); TestEqual( @@ -253,6 +270,11 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchCatalogTest::RunTest(const FString MagicCube5DLaunchSurface.HostSurfaceId, TEXT("phase6c/magiccube5d/runtime-host-surface") ); + TestEqual( + TEXT("The MagicCube5D launch surface must now use the dedicated family training map host."), + MagicCube5DLaunchSurface.HostMapPath, + TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining") + ); TestEqual( TEXT("The MagicCube5D launch surface must preserve three default selector choices."), MagicCube5DLaunchSurface.DefaultSelectorChoices.Num(), @@ -305,8 +327,8 @@ bool FHyperTwistHigherDimensionalPhase6CViewContextCatalogTest::RunTest(const FS Magic120CellViewContextSurface.HostSurfaceId, TEXT("phase6c/magic120cell/runtime-host-surface") ); - TestTrue( - TEXT("The Magic120Cell view-context surface must stay on the shared training-map fallback."), + TestFalse( + TEXT("The Magic120Cell view-context surface must no longer stay on the shared training-map fallback."), Magic120CellViewContextSurface.bUsesSharedTrainingMapFallback ); @@ -370,14 +392,14 @@ bool FHyperTwistHigherDimensionalPhase6CSessionCatalogTest::RunTest(const FStrin ) ); TestEqual( - TEXT("The Magic120Cell session surface must preserve the launch surface linkage."), + TEXT("The Magic120Cell session surface must preserve the dedicated launch surface linkage."), Magic120CellSessionSurface.LaunchSurfaceId, - TEXT("phase6c/magic120cell/shared-training-launch-surface") + TEXT("phase6c/magic120cell/dedicated-training-launch-surface") ); TestEqual( - TEXT("The Magic120Cell session surface must preserve the view-context linkage."), + TEXT("The Magic120Cell session surface must preserve the dedicated view-context linkage."), Magic120CellSessionSurface.ViewContextSurfaceId, - TEXT("phase6c/magic120cell/shared-training-view-context-surface") + TEXT("phase6c/magic120cell/dedicated-training-view-context-surface") ); TestEqual( TEXT("The Magic120Cell session surface must merge all unique launch and view selector families."), @@ -403,14 +425,14 @@ bool FHyperTwistHigherDimensionalPhase6CSessionCatalogTest::RunTest(const FStrin ) ); TestEqual( - TEXT("The MagicCube5D session surface must preserve the launch surface linkage."), + TEXT("The MagicCube5D session surface must preserve the dedicated launch surface linkage."), MagicCube5DSessionSurface.LaunchSurfaceId, - TEXT("phase6c/magiccube5d/shared-training-launch-surface") + TEXT("phase6c/magiccube5d/dedicated-training-launch-surface") ); TestEqual( - TEXT("The MagicCube5D session surface must preserve the view-context linkage."), + TEXT("The MagicCube5D session surface must preserve the dedicated view-context linkage."), MagicCube5DSessionSurface.ViewContextSurfaceId, - TEXT("phase6c/magiccube5d/shared-training-view-context-surface") + TEXT("phase6c/magiccube5d/dedicated-training-view-context-surface") ); TestEqual( TEXT("The MagicCube5D session surface must merge duplicate stereo and visibility selectors rather than duplicating them."), @@ -423,9 +445,9 @@ bool FHyperTwistHigherDimensionalPhase6CSessionCatalogTest::RunTest(const FStrin 5 ); TestEqual( - TEXT("The MagicCube5D session surface must stay on the shared host fallback."), + TEXT("The MagicCube5D session surface must now stay on the dedicated family host."), MagicCube5DSessionSurface.HostMapPath, - TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_ClassicTraining") + TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining") ); return true; } @@ -462,14 +484,14 @@ bool FHyperTwistHigherDimensionalPhase6CInteractiveSceneCatalogTest::RunTest(con TestEqual( TEXT("The Magic120Cell interactive scene surface must preserve the session-surface linkage."), Magic120CellSceneSurface.SessionSurfaceId, - TEXT("phase6c/magic120cell/shared-training-session-surface") + TEXT("phase6c/magic120cell/dedicated-training-session-surface") ); TestTrue( TEXT("The Magic120Cell interactive scene surface must remain renderable."), UHyperTwistSimulationLibrary::CanRenderSceneContext(Magic120CellSceneSurface.SceneContext) ); - TestTrue( - TEXT("The Magic120Cell interactive scene surface must keep the placeholder-state posture explicit."), + TestFalse( + TEXT("The Magic120Cell interactive scene surface must no longer keep the placeholder-state posture."), Magic120CellSceneSurface.bUsesPlaceholderStateEnvelope ); TestEqual( @@ -487,6 +509,39 @@ bool FHyperTwistHigherDimensionalPhase6CInteractiveSceneCatalogTest::RunTest(con Magic120CellSceneSurface.SceneContext.RenderStateProfile, TEXT("magic120cell-center-cell-focus-scene-runtime-v1") ); + TestEqual( + TEXT("The Magic120Cell interactive scene surface must keep the family-owned encoding profile."), + Magic120CellSceneSurface.SceneContext.PuzzleState.StateEncoding.EncodingProfile, + TEXT("magic120cell-family-owned-scene-state-v1") + ); + TestTrue( + TEXT("The Magic120Cell interactive scene surface must carry the family-owned scene-state tag."), + Magic120CellSceneSurface.SceneTags.Contains(TEXT("scene-state:family-owned-envelope")) + ); + + FHyperTwistTrainingMagic120CellInteractiveSceneStateEnvelope Magic120CellEnvelope; + TestTrue( + TEXT("The Magic120Cell interactive scene surface must decode to a family-owned scene-state envelope."), + UHyperTwistTrainingRuntimeLibrary::TryDecodeMagic120CellInteractiveSceneStateEnvelope( + Magic120CellSceneSurface.SceneContext, + Magic120CellEnvelope + ) + ); + TestEqual( + TEXT("The Magic120Cell interactive scene-state envelope must preserve the persistence boundary."), + Magic120CellEnvelope.PersistenceBoundaryId, + TEXT("magic120cell-persistence-boundary") + ); + TestEqual( + TEXT("The Magic120Cell interactive scene-state envelope must preserve the view-profile contract."), + Magic120CellEnvelope.ViewProfileContractId, + TEXT("magic120cell-focus-view-profile") + ); + TestEqual( + TEXT("The Magic120Cell interactive scene-state envelope must keep the full puzzle mode."), + Magic120CellEnvelope.PuzzleTypeModeId, + TEXT("full-puzzle-default-mode") + ); FHyperTwistTrainingHigherDimensionalInteractiveSceneSurface MagicCube5DSceneSurface; TestTrue( @@ -499,14 +554,14 @@ bool FHyperTwistHigherDimensionalPhase6CInteractiveSceneCatalogTest::RunTest(con TestEqual( TEXT("The MagicCube5D interactive scene surface must preserve the session-surface linkage."), MagicCube5DSceneSurface.SessionSurfaceId, - TEXT("phase6c/magiccube5d/shared-training-session-surface") + TEXT("phase6c/magiccube5d/dedicated-training-session-surface") ); TestTrue( TEXT("The MagicCube5D interactive scene surface must remain renderable."), UHyperTwistSimulationLibrary::CanRenderSceneContext(MagicCube5DSceneSurface.SceneContext) ); - TestTrue( - TEXT("The MagicCube5D interactive scene surface must keep the placeholder-state posture explicit."), + TestFalse( + TEXT("The MagicCube5D interactive scene surface must no longer keep the placeholder-state posture."), MagicCube5DSceneSurface.bUsesPlaceholderStateEnvelope ); TestEqual( @@ -525,13 +580,37 @@ bool FHyperTwistHigherDimensionalPhase6CInteractiveSceneCatalogTest::RunTest(con TEXT("magiccube5d-order3-scene-runtime-v1") ); TestEqual( - TEXT("The MagicCube5D interactive scene surface must keep the family-specific placeholder encoding profile."), + TEXT("The MagicCube5D interactive scene surface must keep the family-owned encoding profile."), MagicCube5DSceneSurface.SceneContext.PuzzleState.StateEncoding.EncodingProfile, - TEXT("phase6c/magiccube5d-interactive-scene-envelope-v1") + TEXT("magiccube5d-family-owned-scene-state-v1") ); TestTrue( - TEXT("The MagicCube5D interactive scene surface must carry the explicit placeholder-scene tag."), - MagicCube5DSceneSurface.SceneTags.Contains(TEXT("scene-state:placeholder-envelope")) + TEXT("The MagicCube5D interactive scene surface must carry the family-owned scene-state tag."), + MagicCube5DSceneSurface.SceneTags.Contains(TEXT("scene-state:family-owned-envelope")) + ); + + FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope MagicCube5DEnvelope; + TestTrue( + TEXT("The MagicCube5D interactive scene surface must decode to a family-owned scene-state envelope."), + UHyperTwistTrainingRuntimeLibrary::TryDecodeMagicCube5DInteractiveSceneStateEnvelope( + MagicCube5DSceneSurface.SceneContext, + MagicCube5DEnvelope + ) + ); + TestEqual( + TEXT("The MagicCube5D interactive scene-state envelope must preserve the persistence boundary."), + MagicCube5DEnvelope.PersistenceBoundaryId, + TEXT("magiccube5d-persistence-boundary") + ); + TestEqual( + TEXT("The MagicCube5D interactive scene-state envelope must preserve the macro format."), + MagicCube5DEnvelope.MacroFormatId, + TEXT("magiccube5d/macros-sidecar-v1") + ); + TestEqual( + TEXT("The MagicCube5D interactive scene-state envelope must preserve the order-three family ownership."), + MagicCube5DEnvelope.PuzzleOrder, + 3 ); return true; } @@ -826,12 +905,12 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchExecutionTest::RunTest(const FStri ) ); TestEqual( - TEXT("The launch-execution proof must preserve the shared host map route."), + TEXT("The launch-execution proof must preserve the dedicated host map route."), LaunchSurface.HostMapPath, - TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_ClassicTraining") + TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining") ); - TestTrue( - TEXT("The launch-execution proof must keep the shared-map fallback posture explicit."), + TestFalse( + TEXT("The launch-execution proof must no longer keep the shared-map fallback posture."), LaunchSurface.bUsesSharedTrainingMapFallback ); TestEqual( @@ -842,7 +921,7 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchExecutionTest::RunTest(const FStri TestEqual( TEXT("The launch-execution proof must preserve the resolved launch surface id."), LaunchSurface.LaunchSurfaceId, - TEXT("phase6c/magiccube5d/shared-training-launch-surface") + TEXT("phase6c/magiccube5d/dedicated-training-launch-surface") ); TestEqual( TEXT("The launch-execution proof must preserve the resolved host surface id."), @@ -864,12 +943,12 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchExecutionTest::RunTest(const FStri TEXT("/Game/HyperTwistTraining/Maps/L_HyperTwist_MagicCube5DTraining") ); TestEqual( - TEXT("The launch-execution proof must preserve the effective shared host route."), + TEXT("The launch-execution proof must preserve the effective dedicated host route."), HostSurface.EffectiveHostMapRouteId, - TEXT("phase6c/shared-training-map-host") + TEXT("phase6c/magiccube5d/dedicated-training-map-host") ); - TestTrue( - TEXT("The launch-execution proof must keep the shared-host fallback posture explicit."), + TestFalse( + TEXT("The launch-execution proof must no longer keep the shared-host fallback posture explicit."), HostSurface.bUsesSharedTrainingMapFallback ); @@ -884,7 +963,7 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchExecutionTest::RunTest(const FStri TestEqual( TEXT("The launch-execution proof must preserve the resolved view-context surface id."), ViewContextSurface.ViewContextSurfaceId, - TEXT("phase6c/magiccube5d/shared-training-view-context-surface") + TEXT("phase6c/magiccube5d/dedicated-training-view-context-surface") ); TestEqual( TEXT("The launch-execution proof must preserve the dedicated view-profile contract."), @@ -908,7 +987,7 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchExecutionTest::RunTest(const FStri TestEqual( TEXT("The launch-execution proof must preserve the resolved session surface id."), SessionSurface.SessionSurfaceId, - TEXT("phase6c/magiccube5d/shared-training-session-surface") + TEXT("phase6c/magiccube5d/dedicated-training-session-surface") ); TestEqual( TEXT("The launch-execution proof must preserve the merged session selector count."), @@ -918,7 +997,7 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchExecutionTest::RunTest(const FStri TestTrue( TEXT("The launch-execution proof must record the explicit higher-dimensional session surface in runtime lineage."), StartedRunState.ActiveDeck.ImportedRuntimeSurface.OriginPaths.Contains( - TEXT("phase6c/magiccube5d/shared-training-session-surface") + TEXT("phase6c/magiccube5d/dedicated-training-session-surface") ) ); @@ -947,10 +1026,10 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchExecutionTest::RunTest(const FStri TestEqual( TEXT("The launch-execution proof must preserve the interactive-scene encoding profile."), InteractiveSceneSurface.SceneContext.PuzzleState.StateEncoding.EncodingProfile, - TEXT("phase6c/magiccube5d-interactive-scene-envelope-v1") + TEXT("magiccube5d-family-owned-scene-state-v1") ); - TestTrue( - TEXT("The launch-execution proof must keep the placeholder interactive-scene posture explicit."), + TestFalse( + TEXT("The launch-execution proof must no longer keep the placeholder interactive-scene posture."), InteractiveSceneSurface.bUsesPlaceholderStateEnvelope ); TestTrue( @@ -965,6 +1044,25 @@ bool FHyperTwistHigherDimensionalPhase6CLaunchExecutionTest::RunTest(const FStri TEXT("phase6c/magiccube5d/interactive-scene-context") ) ); + + FHyperTwistTrainingMagicCube5DInteractiveSceneStateEnvelope MagicCube5DEnvelope; + TestTrue( + TEXT("The launch-execution proof must decode the active MagicCube5D scene-state envelope."), + UHyperTwistTrainingRuntimeLibrary::TryDecodeMagicCube5DInteractiveSceneStateEnvelope( + InteractiveSceneSurface.SceneContext, + MagicCube5DEnvelope + ) + ); + TestEqual( + TEXT("The launch-execution proof must keep the dedicated session linkage inside the decoded envelope."), + MagicCube5DEnvelope.SessionSurfaceId, + TEXT("phase6c/magiccube5d/dedicated-training-session-surface") + ); + TestEqual( + TEXT("The launch-execution proof must keep the compact twist-history format inside the decoded envelope."), + MagicCube5DEnvelope.TwistHistoryFormatId, + TEXT("magiccube5d/compact-twist-token-v1") + ); return true; } 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 192565a..058ef4b 100644 --- a/docs/ops/HYPERTWIST_COMPREHENSIVE_RECONSTRUCTION_ROADMAP_2026-06-10.md +++ b/docs/ops/HYPERTWIST_COMPREHENSIVE_RECONSTRUCTION_ROADMAP_2026-06-10.md @@ -363,8 +363,10 @@ Closure read: - `2026-06-18` Windows checkpoint: the same isolated worktree `C:\HyperTwist_worktrees\phase10validate` rebuilt the widened session-surface slice with `Result: Succeeded` / UnrealBuildTool `Total execution time: 3541.98 seconds`, and targeted `UnrealEditor-Cmd` automation found `10` tests under `HyperTwist.FirstParty.HigherDimensional.Phase6C` and passed all `10`, including the new `SessionCatalog`; `LaunchExecution` emitted `Ignoring very large delta of 573.84 seconds`, so that longer quiet interval also remains confirmed as known-good on this lane rather than a corruption signal - `2026-06-18` continuation proof: current code now adds an explicit higher-dimensional interactive-scene catalog that promotes the landed `Magic120Cell` / `MagicCube5D` runtime-session seams into family-owned scene-context contracts, mirrors those scene surfaces through the training runtime library plus the live training panel/session-actor caches, and upgrades generated-mode lineage plus source attribution to record the explicit interactive scene surface and scene-context ids while dedicated maps and family-owned runtime state remain placeholder-backed - `2026-06-18` Windows checkpoint: the same isolated worktree `C:\HyperTwist_worktrees\phase10validate` rebuilt the widened interactive-scene slice with `Result: Succeeded` / UnrealBuildTool `Total execution time: 3528.60 seconds`, and targeted `UnrealEditor-Cmd` automation found `11` tests under `HyperTwist.FirstParty.HigherDimensional.Phase6C` and passed all `11`, including the new `InteractiveSceneCatalog`; `LaunchExecution` emitted `Ignoring very large delta of 479.46 seconds`, so that quiet interval also remains confirmed as known-good on this lane rather than a corruption signal -- [ ] Replace the current placeholder interactive-scene envelopes with full owned `120-cell` and `5D` simulation-state, projection, and persistence ownership in Unreal above the landed higher-dimensional scene-context catalog -- [ ] Replace the current shared-map execution bridge with full owned dedicated-family interactive launch, map, and persistence surfaces for `120-cell` and `5D` +- `2026-06-18` continuation proof: current code now replaces those placeholder `Magic120Cell` / `MagicCube5D` interactive-scene envelopes with family-owned runtime-state, projection, and persistence payloads, adds dedicated-family training-map assets plus dedicated host/launch/view-context/session surfaces, exposes explicit scene-envelope decoders through the runtime library, and batches start-time selector posture application so generated-mode launch execution no longer rebuilds repository views once per default selector +- `2026-06-18` Windows checkpoint: the same isolated worktree `C:\HyperTwist_worktrees\phase10validate` rebuilt the dedicated-family runtime-state slice with `Result: Succeeded` / UnrealBuildTool `Total execution time: 1648.33 seconds`; after the selector-batching hardening rebuild with `Result: Succeeded` / UnrealBuildTool `Total execution time: 93.44 seconds`, targeted `UnrealEditor-Cmd` automation exported `C:\HyperTwist_worktrees\phase10validate\UnrealHyperTwist\Saved\AutomationReports\Phase6C-DedicatedFamily-Optimized\index.json` with all `11` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests passing, `totalDuration` `196.08790588378906`, and `LaunchExecution` duration `195.65591430664062`; the commandlet still emitted `Ignoring very large delta of 195.58 seconds`, but that quiet interval is materially down from the immediately prior `385.00 seconds` proof on this lane while retaining `**** TEST COMPLETE. EXIT CODE: 0 ****` +- [x] Replace the current placeholder interactive-scene envelopes with full owned `120-cell` and `5D` simulation-state, projection, and persistence ownership in Unreal above the landed higher-dimensional scene-context catalog +- [x] Replace the current shared-map execution bridge with full owned dedicated-family interactive launch, map, and persistence surfaces for `120-cell` and `5D` **Estimated actions:** 100–200 **Estimated time:** 1–2 weeks @@ -564,4 +566,13 @@ Recommended next widening order: ids, and revalidated the widened slice on `localhost:22022` with `11` passing `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including the new `InteractiveSceneCatalog` +- `2026-06-18`: the next `Phase 6C` continuation then closed the previously + open ownership gap by replacing the placeholder `Magic120Cell` / + `MagicCube5D` interactive-scene envelopes with family-owned runtime-state, + projection, and persistence payloads, swapping the shared-map bridge for + dedicated-family training-map assets plus dedicated host/launch/view-context/ + session surfaces, and tightening generated-mode selector application so the + rerun on `localhost:22022` still passed all `11` + `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests while dropping the + long `LaunchExecution` quiet interval from `385.00` to `195.58` seconds - later classic-cube polish only when a concrete presentation gap remains, not as the default next move 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 96e88a6..0f742b0 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/FEATURE_REGISTRY.md @@ -268,10 +268,10 @@ repo. | 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. 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`. | -| Higher-dimensional shared-map launch and view-context execution bridge | Implemented now | landed `Phase 6C` continuation packet | First-party current code now bundles higher-dimensional launch surfaces and view-context surfaces for `Magic120Cell` and `MagicCube5D`, resolves those surfaces through the training runtime library plus the live training panel/session-actor caches, and lets the training subsystem start the shared-map seed run, apply default selector posture, persist the generated-mode launch request, and start the owned generated run without widening into external-process ownership. After recovering an interrupted follow-up, the primary reverse-SSH `localhost:22022` Windows lane rebuilt the cleaned slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 124.81 seconds`, and passed all `8` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including `LaunchCatalog`, `ViewContextCatalog`, `LaunchExecution`, and `RunStateActivationResolution`; the quiet `LaunchExecution` interval is now known to be healthy rather than a stalled commandlet. | -| Higher-dimensional explicit dedicated-host seam | Implemented now | landed `Phase 6C` host-surface continuation packet | First-party current code now records the preferred dedicated-family `Magic120Cell` / `MagicCube5D` host-map targets in an explicit higher-dimensional host-surface catalog while keeping the current shared training map as the effective runtime fallback, mirrors that resolved host seam through the training runtime library plus the panel/session caches, and threads the host-surface id into the launch/view-context surfaces and generated-mode lineage. The primary reverse-SSH `localhost:22022` Windows lane rebuilt this widened slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 2858.02 seconds`, and passed all `9` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including the new `HostCatalog`; the long `LaunchExecution` quiet interval remained known-good. | +| Higher-dimensional initial shared-map launch and view-context execution bridge | Implemented now | landed `Phase 6C` continuation packet | First-party current code first bundled higher-dimensional launch surfaces and view-context surfaces for `Magic120Cell` and `MagicCube5D`, resolved those surfaces through the training runtime library plus the live training panel/session-actor caches, and let the training subsystem start the shared-map seed run, apply default selector posture, persist the generated-mode launch request, and start the owned generated run without widening into external-process ownership. After recovering an interrupted follow-up, the primary reverse-SSH `localhost:22022` Windows lane rebuilt that cleaned slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 124.81 seconds`, and passed all `8` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including `LaunchCatalog`, `ViewContextCatalog`, `LaunchExecution`, and `RunStateActivationResolution`; that initial bridge is now superseded by the later dedicated-family map ownership continuation. | +| Higher-dimensional explicit dedicated-host seam | Implemented now | landed `Phase 6C` host-surface continuation packet | First-party current code then recorded the preferred dedicated-family `Magic120Cell` / `MagicCube5D` host-map targets in an explicit higher-dimensional host-surface catalog while the slice still kept the shared training map as the interim effective runtime fallback, mirrored that resolved host seam through the training runtime library plus the panel/session caches, and threaded the host-surface id into the launch/view-context surfaces and generated-mode lineage. The primary reverse-SSH `localhost:22022` Windows lane rebuilt this widened slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 2858.02 seconds`, and passed all `9` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including the new `HostCatalog`; that interim fallback is now superseded by the later dedicated-family map ownership continuation. | | Higher-dimensional executed runtime session surface | Implemented now | landed `Phase 6C` session-surface continuation packet | First-party current code now merges the higher-dimensional launch, host, and view-context seams into an explicit runtime-session catalog for `Magic120Cell` and `MagicCube5D`, mirrors that session surface through the training runtime library plus the panel/session caches, upgrades generated-mode deck lineage to record the resolved session surface, and applies the merged launch-plus-view selector posture at start time instead of only the narrower launch defaults. The primary reverse-SSH `localhost:22022` Windows lane rebuilt this widened slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 3541.98 seconds`, and passed all `10` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including the new `SessionCatalog`; the longer `LaunchExecution` quiet interval of `573.84 seconds` remained known-good. | -| Higher-dimensional explicit interactive scene surface | Implemented now | landed `Phase 6C` interactive-scene continuation packet | First-party current code now promotes the higher-dimensional runtime-session seams into explicit `Magic120Cell` and `MagicCube5D` interactive-scene surfaces with renderable placeholder scene-context envelopes, mirrors those scene surfaces through the training runtime library plus the panel/session caches, and upgrades generated-mode lineage plus source attribution to record the resolved scene-surface and scene-context ids. The primary reverse-SSH `localhost:22022` Windows lane rebuilt this widened slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 3528.60 seconds`, and passed all `11` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests, including the new `InteractiveSceneCatalog`; the `LaunchExecution` quiet interval of `479.46 seconds` remained known-good. | +| Higher-dimensional dedicated-family interactive scene ownership | Implemented now | landed `Phase 6C` interactive-scene and dedicated-host continuation packet | First-party current code now promotes the higher-dimensional runtime-session seams into explicit `Magic120Cell` and `MagicCube5D` interactive-scene surfaces with family-owned runtime-state, projection, and persistence envelopes, replaces the shared-map bridge with dedicated-family training-map assets plus dedicated host/launch/view-context/session surfaces, exposes explicit scene-envelope decoders through the runtime library, and batches default selector application so generated-mode launch execution no longer rebuilds repository views once per selector. The primary reverse-SSH `localhost:22022` Windows lane rebuilt the dedicated-family ownership slice on `2026-06-18` with `Result: Succeeded`, UnrealBuildTool `Total execution time: 1648.33 seconds`; the follow-up hardening rebuild completed in `93.44 seconds`, and the exported automation report passed all `11` `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests with `totalDuration` `196.08790588378906`, `LaunchExecution` duration `195.65591430664062`, and the controller quiet interval reduced to `195.58 seconds`. | | 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 874a10a..fc3e941 100644 --- a/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md +++ b/docs/v6_5_deep_manual_pack/HyperTwist/ROADMAP.md @@ -160,9 +160,22 @@ Current consolidated milestone snapshot: `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests passing, including the new `InteractiveSceneCatalog`; `LaunchExecution` again remained healthy through an `Ignoring very large delta of 479.46 seconds` quiet interval -- the remaining `Phase 6C` gap is now the full dedicated-family - `120-cell` / `5D` map, runtime-state, and persistence replacement, not the - activation, host, session, or explicit interactive-scene contract layers +- `2026-06-18`: the next `Phase 6C` continuation then closed that remaining + ownership gap by replacing the placeholder `Magic120Cell` / `MagicCube5D` + scene envelopes with family-owned runtime-state, projection, and + persistence payloads, swapping the shared-map execution bridge for dedicated + family maps plus dedicated host/launch/view-context/session surfaces, and + hardening selector application so the same `localhost:22022` lane rebuilt + the follow-up with `Result: Succeeded`, UnrealBuildTool `Total execution + time: 1648.33 seconds`, then the targeted hardening rebuild with `Result: + Succeeded`, UnrealBuildTool `Total execution time: 93.44 seconds`, and the + exported automation report passed all `11` + `HyperTwist.FirstParty.HigherDimensional.Phase6C` tests with + `LaunchExecution` duration `195.65591430664062` +- the functional `Phase 6C` ownership gap is now closed; the remaining work + in this lane is launch-execution performance hardening and richer + dedicated-family authored map content, not missing activation, host, + session, interactive-scene, runtime-state, or persistence ownership seams - the canonical HyperTwist repo-row portfolio is now treated as `75` rows, not `71` - currently implemented rows are now `35`, not `20`