feat: harden native preferences continuity proof

This commit is contained in:
axiomlogicnexus 2026-06-28 19:35:38 +00:00
parent e2d3438741
commit 30bec87f9d
7 changed files with 412 additions and 18 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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