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