diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index a609901..7bf3181 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -7381,6 +7381,453 @@ UHyperTwistCoachDashboardWidget::GetSelectedClosureRecoveryHistoryInspectSurface return Surface; } +FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface +UHyperTwistCoachDashboardWidget::GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface Surface; + Surface.Headline = TEXT("Method-drill recovery outcome history"); + + TArray MethodDrillRecoveryHistoryIndices; + HyperTwistCoachDashboardWidgetInternal::CollectMethodDrillRecoveryOutcomeIndices( + QueueRecoveryOutcomeHistory, + MethodDrillRecoveryHistoryIndices); + const int32 SelectedHistoryPosition = + MethodDrillRecoveryHistoryIndices.IndexOfByKey(SelectedMethodDrillRecoveryOutcomeIndex); + const FHyperTwistCoachDashboardQueueRecoveryOutcome* SelectedOutcome = + SelectedMethodDrillRecoveryOutcomeIndex >= 0 + && SelectedMethodDrillRecoveryOutcomeIndex < QueueRecoveryOutcomeHistory.Num() + ? &QueueRecoveryOutcomeHistory[SelectedMethodDrillRecoveryOutcomeIndex] + : nullptr; + Surface.HistoryEntryCount = MethodDrillRecoveryHistoryIndices.Num(); + Surface.SelectedHistoryIndex = SelectedHistoryPosition; + Surface.bHasSelectedEntry = + SelectedOutcome != nullptr + && SelectedOutcome->IsStructurallyValid() + && SelectedHistoryPosition != INDEX_NONE; + if (!Surface.bHasSelectedEntry) + { + Surface.StatusLine = + TEXT("Drill recovery history: no retained drill-weighted queue-recovery outcomes recorded yet."); + Surface.DetailLine = + TEXT("Drill recovery detail: when drill-weighted queue recovery actions are applied, their retained before/after friction outcomes will accumulate here for later comparison against generic recovery."); + return Surface; + } + + Surface.RecordedAtUtc = SelectedOutcome->RecordedAtUtc; + Surface.SourceLabel = SelectedOutcome->SourceLabel; + Surface.SourceDescription = + HyperTwistCoachDashboardWidgetInternal::DescribeCoachMemorySourceLabel( + SelectedOutcome->SourceLabel); + Surface.AppliedActionLabel = SelectedOutcome->AppliedActionLabel; + Surface.AppliedAction = + HyperTwistCoachDashboardWidgetInternal::ToQueueRecoveryAction( + SelectedOutcome->ActionKind); + Surface.BeforePressureScore = SelectedOutcome->BeforePressureScore; + Surface.AfterPressureScore = SelectedOutcome->AfterPressureScore; + Surface.BeforeDeferredEventCount = SelectedOutcome->BeforeDeferredEventCount; + Surface.AfterDeferredEventCount = SelectedOutcome->AfterDeferredEventCount; + Surface.bSucceeded = SelectedOutcome->bSucceeded; + Surface.bReducedFriction = SelectedOutcome->bReducedFriction; + Surface.bShiftedFriction = SelectedOutcome->bShiftedFriction; + Surface.bBeforeBlockedFollowUp = SelectedOutcome->bBeforeBlockedFollowUp; + Surface.bAfterBlockedFollowUp = SelectedOutcome->bAfterBlockedFollowUp; + Surface.bBeforeOutstandingDeferred = SelectedOutcome->bBeforeOutstandingDeferred; + Surface.bAfterOutstandingDeferred = SelectedOutcome->bAfterOutstandingDeferred; + Surface.bBeforeCompletionGap = SelectedOutcome->bBeforeCompletionGap; + Surface.bAfterCompletionGap = SelectedOutcome->bAfterCompletionGap; + Surface.bUsedDeferredFirstSuppressionSignal = + SelectedOutcome->bUsedDeferredFirstSuppressionSignal; + Surface.bUsedMethodDrillHandoffSignal = SelectedOutcome->bUsedMethodDrillHandoffSignal; + Surface.bUsedNarrowMethodDrillPacketStructureRecovery = + SelectedOutcome->bUsedNarrowMethodDrillPacketStructureRecovery; + Surface.bUsedBroadMethodDrillPacketStructureRecovery = + SelectedOutcome->bUsedBroadMethodDrillPacketStructureRecovery; + Surface.bUsedStrongRetainedMethodDrillRecoveryPosture = + SelectedOutcome->bUsedStrongRetainedMethodDrillRecoveryPosture; + Surface.bUsedWeakRetainedMethodDrillRecoveryPosture = + SelectedOutcome->bUsedWeakRetainedMethodDrillRecoveryPosture; + Surface.bUsedReliableTrustedTightStructurePlanRecovery = + SelectedOutcome->bUsedReliableTrustedTightStructurePlanRecovery; + Surface.bUsedReliableTrustedBroadStructurePlanRecovery = + SelectedOutcome->bUsedReliableTrustedBroadStructurePlanRecovery; + Surface.bUsedReliableAlignedTrustedTightStructurePlanRecovery = + SelectedOutcome->bUsedReliableAlignedTrustedTightStructurePlanRecovery; + Surface.bUsedReliableAlignedTrustedBroadStructurePlanRecovery = + SelectedOutcome->bUsedReliableAlignedTrustedBroadStructurePlanRecovery; + Surface.VerdictLine = !SelectedOutcome->bSucceeded + ? TEXT("failed") + : (SelectedOutcome->bReducedFriction + ? TEXT("reduced friction") + : (SelectedOutcome->bShiftedFriction + ? TEXT("shifted friction") + : TEXT("no immediate change"))); + Surface.PacketStructureRecoveryLine = + SelectedOutcome->bUsedNarrowMethodDrillPacketStructureRecovery + ? TEXT("narrow continuation") + : (SelectedOutcome->bUsedBroadMethodDrillPacketStructureRecovery + ? TEXT("broad redirect") + : TEXT("none")); + Surface.RetainedPostureLine = + HyperTwistCoachDashboardWidgetInternal::DescribeRetainedMethodDrillRecoveryPosture( + SelectedOutcome->bUsedStrongRetainedMethodDrillRecoveryPosture, + SelectedOutcome->bUsedWeakRetainedMethodDrillRecoveryPosture); + Surface.ReliablePlanRecoveryLine = + SelectedOutcome->bUsedReliableAlignedTrustedTightStructurePlanRecovery + ? TEXT("aligned reliable tight continuation") + : (SelectedOutcome->bUsedReliableAlignedTrustedBroadStructurePlanRecovery + ? TEXT("aligned reliable broad redirect") + : (SelectedOutcome->bUsedReliableTrustedTightStructurePlanRecovery + ? TEXT("trusted tight continuation") + : (SelectedOutcome->bUsedReliableTrustedBroadStructurePlanRecovery + ? TEXT("trusted broad redirect") + : TEXT("none")))); + Surface.StatusLine = FString::Printf( + TEXT("Drill recovery history: %d entries | selected %d/%d | %s | %s | Packet recovery: %s | Stance: %s | Recorded: %s"), + MethodDrillRecoveryHistoryIndices.Num(), + SelectedHistoryPosition + 1, + MethodDrillRecoveryHistoryIndices.Num(), + *SelectedOutcome->AppliedActionLabel, + *Surface.VerdictLine, + *Surface.PacketStructureRecoveryLine, + *Surface.RetainedPostureLine, + *SelectedOutcome->RecordedAtUtc); + Surface.DetailLine = FString::Printf( + TEXT("Source: %s | Pressure %.2f -> %.2f | Deferred %d -> %d | Blocked follow-up %s -> %s | Outstanding deferred %s -> %s | Completion gap %s -> %s | deferred-first weighted: %s | packet-structure recovery: %s | retained posture: %s"), + *Surface.SourceDescription, + SelectedOutcome->BeforePressureScore, + SelectedOutcome->AfterPressureScore, + SelectedOutcome->BeforeDeferredEventCount, + SelectedOutcome->AfterDeferredEventCount, + SelectedOutcome->bBeforeBlockedFollowUp ? TEXT("yes") : TEXT("no"), + SelectedOutcome->bAfterBlockedFollowUp ? TEXT("yes") : TEXT("no"), + SelectedOutcome->bBeforeOutstandingDeferred ? TEXT("yes") : TEXT("no"), + SelectedOutcome->bAfterOutstandingDeferred ? TEXT("yes") : TEXT("no"), + SelectedOutcome->bBeforeCompletionGap ? TEXT("yes") : TEXT("no"), + SelectedOutcome->bAfterCompletionGap ? TEXT("yes") : TEXT("no"), + SelectedOutcome->bUsedDeferredFirstSuppressionSignal ? TEXT("yes") : TEXT("no"), + *Surface.PacketStructureRecoveryLine, + *Surface.RetainedPostureLine); + return Surface; +} + +FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface +UHyperTwistCoachDashboardWidget::GetSelectedMethodDrillRecoveryMemoryHistoryInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface Surface; + Surface.Headline = TEXT("Method-drill recovery memory history"); + const HyperTwistCoachDashboardWidgetInternal::FMethodDrillRecoveryPlanComparisonSummary PlanComparisonSummary = + HyperTwistCoachDashboardWidgetInternal::DeriveMethodDrillRecoveryPlanComparisonSummary( + MethodDrillRecoveryMemoryHistoryEntries); + const FHyperTwistCoachDashboardMethodDrillRecoveryMemoryHistoryEntry* SelectedEntry = + SelectedMethodDrillRecoveryMemoryHistoryIndex >= 0 + && SelectedMethodDrillRecoveryMemoryHistoryIndex + < MethodDrillRecoveryMemoryHistoryEntries.Num() + ? &MethodDrillRecoveryMemoryHistoryEntries[SelectedMethodDrillRecoveryMemoryHistoryIndex] + : nullptr; + Surface.SelectedEntryIndex = SelectedMethodDrillRecoveryMemoryHistoryIndex; + Surface.HistoryEntryCount = MethodDrillRecoveryMemoryHistoryEntries.Num(); + Surface.bHasSelectedEntry = + SelectedEntry != nullptr && SelectedEntry->IsStructurallyValid(); + if (!Surface.bHasSelectedEntry) + { + Surface.StatusLine = + TEXT("Drill recovery memory history: no retained upstream drill-recovery memory shifts recorded yet."); + Surface.DetailLine = + TEXT("Drill recovery memory detail: retained upstream strong-vs-weak drill-recovery pressure, resulting generated packet lane, and resulting plan-source vs generated-plan alignment will accumulate here for later comparison."); + return Surface; + } + + const HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias MemoryBias = + SelectedEntry->bStrongPressureDominant + ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong + : (SelectedEntry->bWeakPressureDominant + ? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak + : HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None); + Surface.RecordedAtUtc = SelectedEntry->RecordedAtUtc; + Surface.PreferredRecoveryAction = SelectedEntry->PreferredRecoveryAction; + Surface.PreferredRecoveryActionLabel = + SelectedEntry->PreferredRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::None + ? TEXT("none") + : HyperTwistCoachDashboardWidgetInternal::EnumDisplayName( + SelectedEntry->PreferredRecoveryAction); + Surface.PreferredRecoveryActionSourceLabel = + SelectedEntry->PreferredRecoveryActionSourceLabel; + Surface.PreferredRecoveryActionSourceDescription = + SelectedEntry->PreferredRecoveryActionSourceLabel.IsEmpty() + ? TEXT("n/a") + : HyperTwistCoachDashboardWidgetInternal::DescribeCoachMemorySourceLabel( + SelectedEntry->PreferredRecoveryActionSourceLabel); + Surface.RecommendedHandoffKindLabel = SelectedEntry->RecommendedHandoffKindLabel; + Surface.QueueRecoveryStatusLine = SelectedEntry->QueueRecoveryStatusLine; + Surface.HandoffRecommendationStatusLine = + SelectedEntry->HandoffRecommendationStatusLine; + Surface.GeneratedGuidancePacketKindLabel = + SelectedEntry->GeneratedGuidancePacketKindLabel.IsEmpty() + ? TEXT("none") + : SelectedEntry->GeneratedGuidancePacketKindLabel; + Surface.GeneratedGuidancePacketSourceLabel = + SelectedEntry->GeneratedGuidancePacketSourceLabel; + Surface.GeneratedGuidancePacketSourceDescription = + SelectedEntry->GeneratedGuidancePacketSourceLabel.IsEmpty() + ? TEXT("n/a") + : HyperTwistCoachDashboardWidgetInternal::DescribeCoachMemorySourceLabel( + SelectedEntry->GeneratedGuidancePacketSourceLabel); + Surface.GeneratedGuidancePacketHeadline = + SelectedEntry->GeneratedGuidancePacketHeadline.IsEmpty() + ? TEXT("n/a") + : SelectedEntry->GeneratedGuidancePacketHeadline; + Surface.GeneratedGuidancePacketActionLabel = + SelectedEntry->GeneratedGuidancePacketActionLabel.IsEmpty() + ? TEXT("n/a") + : SelectedEntry->GeneratedGuidancePacketActionLabel; + Surface.GeneratedGuidancePacketFocusCaseCount = + SelectedEntry->GeneratedGuidancePacketFocusCaseCount; + Surface.GeneratedPlanSuggestedMode = SelectedEntry->GeneratedPlanSuggestedMode; + Surface.GeneratedPlanModeLabel = + SelectedEntry->GeneratedGuidancePacketKindLabel.IsEmpty() + ? TEXT("n/a") + : HyperTwistCoachDashboardWidgetInternal::EnumDisplayName( + SelectedEntry->GeneratedPlanSuggestedMode); + Surface.GeneratedPlanSuggestedSelectionPolicy = + SelectedEntry->GeneratedPlanSuggestedSelectionPolicy; + Surface.GeneratedPlanSelectionLabel = + SelectedEntry->GeneratedGuidancePacketKindLabel.IsEmpty() + ? TEXT("n/a") + : HyperTwistCoachDashboardWidgetInternal::EnumDisplayName( + SelectedEntry->GeneratedPlanSuggestedSelectionPolicy); + Surface.GeneratedPlanPostureLabel = + SelectedEntry->GeneratedPlanPostureLabel.IsEmpty() + ? TEXT("n/a") + : SelectedEntry->GeneratedPlanPostureLabel; + Surface.DominantPressureLine = + SelectedEntry->bStrongPressureDominant + ? TEXT("strong") + : (SelectedEntry->bWeakPressureDominant ? TEXT("weak") : TEXT("balanced")); + Surface.StructureBiasLine = + SelectedEntry->bNarrowPacketStructureRecoveryDominant + ? TEXT("narrow continuation") + : (SelectedEntry->bBroadPacketStructureRecoveryDominant + ? TEXT("broad redirect") + : TEXT("none")); + Surface.ReliablePlanLine = [&]() -> FString + { + if (SelectedEntry->bReliableAlignedTrustedTightStructurePlanOutcomeDominant) + { + return TEXT("aligned reliable trusted tight launched-plan continuation"); + } + if (SelectedEntry->bReliableAlignedTrustedBroadStructurePlanOutcomeDominant) + { + return TEXT("aligned reliable trusted broad launched-plan redirect"); + } + if (SelectedEntry->bReliableAlignedTrustedTightStructurePlanDominant) + { + return TEXT("aligned reliable trusted tight continuation"); + } + if (SelectedEntry->bReliableAlignedTrustedBroadStructurePlanDominant) + { + return TEXT("aligned reliable trusted broad redirect"); + } + if (SelectedEntry->bReliableTrustedTightStructurePlanDominant) + { + return TEXT("reliable trusted tight continuation"); + } + if (SelectedEntry->bReliableTrustedBroadStructurePlanDominant) + { + return TEXT("reliable trusted broad redirect"); + } + return TEXT("none"); + }(); + Surface.MemoryBiasLine = + HyperTwistCoachDashboardWidgetInternal::DescribeMethodDrillRecoveryMemoryBias( + MemoryBias); + Surface.PlanSourceLine = + SelectedEntry->PreferredRecoveryActionSourceLabel.IsEmpty() + ? TEXT("none") + : HyperTwistCoachDashboardWidgetInternal::DescribeMethodDrillRecoveryPlanSourceLabel( + SelectedEntry->PreferredRecoveryActionSourceLabel); + Surface.PlanAlignmentLine = + HyperTwistCoachDashboardWidgetInternal::DescribeMethodDrillRecoveryPlanAlignment( + *SelectedEntry); + Surface.ComparisonPreferenceLine = + HyperTwistCoachDashboardWidgetInternal::DescribeMethodDrillRecoveryPlanComparisonPreference( + PlanComparisonSummary); + Surface.GeneratedPacketStanceLine = + SelectedEntry->bGeneratedPacketUsedStrongRetainedMethodDrillRecoveryPosture + ? TEXT("strong retained drill-recovery continuation") + : (SelectedEntry->bGeneratedPacketUsedWeakRetainedMethodDrillRecoveryPosture + ? TEXT("weak retained drill-recovery redirect") + : (SelectedEntry->bGeneratedPacketUsedGenericMethodDrillRecoveryMemory + ? TEXT("generic drill-recovery memory") + : TEXT("none"))); + Surface.MethodDrillRecoveryHistoryCount = SelectedEntry->MethodDrillRecoveryHistoryCount; + Surface.StrongMethodDrillRecoveryHistoryCount = + SelectedEntry->StrongMethodDrillRecoveryHistoryCount; + Surface.WeakMethodDrillRecoveryHistoryCount = + SelectedEntry->WeakMethodDrillRecoveryHistoryCount; + Surface.NarrowMethodDrillPacketStructureRecoveryLaunchCount = + SelectedEntry->NarrowMethodDrillPacketStructureRecoveryLaunchCount; + Surface.NarrowMethodDrillPacketStructureRecoveryLaunchReducedCount = + SelectedEntry->NarrowMethodDrillPacketStructureRecoveryLaunchReducedCount; + Surface.BroadMethodDrillPacketStructureRecoveryPromoteCount = + SelectedEntry->BroadMethodDrillPacketStructureRecoveryPromoteCount; + Surface.BroadMethodDrillPacketStructureRecoveryPromoteReducedCount = + SelectedEntry->BroadMethodDrillPacketStructureRecoveryPromoteReducedCount; + Surface.TrustedTightMethodDrillRecoveryStructurePlanHistoryCount = + SelectedEntry->TrustedTightMethodDrillRecoveryStructurePlanHistoryCount; + Surface.TrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = + SelectedEntry->TrustedBroadMethodDrillRecoveryStructurePlanHistoryCount; + Surface.TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = + SelectedEntry->TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore; + Surface.TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = + SelectedEntry->TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore; + Surface.ReliableTrustedTightMethodDrillRecoveryStructurePlanHistoryCount = + SelectedEntry->ReliableTrustedTightMethodDrillRecoveryStructurePlanHistoryCount; + Surface.ReliableTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = + SelectedEntry->ReliableTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount; + Surface.ReliableTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = + SelectedEntry->ReliableTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore; + Surface.ReliableTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = + SelectedEntry->ReliableTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore; + Surface.ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanHistoryCount = + SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanHistoryCount; + Surface.ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = + SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount; + Surface.ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = + SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore; + Surface.ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = + SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore; + Surface.ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeHistoryCount = + SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeHistoryCount; + Surface.ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeHistoryCount = + SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeHistoryCount; + Surface.ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeAverageScore = + SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeAverageScore; + Surface.ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeAverageScore = + SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeAverageScore; + Surface.MethodDrillRecoveryAverageOutcomeScore = + SelectedEntry->MethodDrillRecoveryAverageOutcomeScore; + Surface.bStrongPressureDominant = SelectedEntry->bStrongPressureDominant; + Surface.bWeakPressureDominant = SelectedEntry->bWeakPressureDominant; + Surface.bNarrowPacketStructureRecoveryDominant = + SelectedEntry->bNarrowPacketStructureRecoveryDominant; + Surface.bBroadPacketStructureRecoveryDominant = + SelectedEntry->bBroadPacketStructureRecoveryDominant; + Surface.bReliableTrustedTightStructurePlanDominant = + SelectedEntry->bReliableTrustedTightStructurePlanDominant; + Surface.bReliableTrustedBroadStructurePlanDominant = + SelectedEntry->bReliableTrustedBroadStructurePlanDominant; + Surface.bReliableAlignedTrustedTightStructurePlanDominant = + SelectedEntry->bReliableAlignedTrustedTightStructurePlanDominant; + Surface.bReliableAlignedTrustedBroadStructurePlanDominant = + SelectedEntry->bReliableAlignedTrustedBroadStructurePlanDominant; + Surface.bReliableAlignedTrustedTightStructurePlanOutcomeDominant = + SelectedEntry->bReliableAlignedTrustedTightStructurePlanOutcomeDominant; + Surface.bReliableAlignedTrustedBroadStructurePlanOutcomeDominant = + SelectedEntry->bReliableAlignedTrustedBroadStructurePlanOutcomeDominant; + Surface.bGeneratedPacketUsedStrongRetainedMethodDrillRecoveryPosture = + SelectedEntry->bGeneratedPacketUsedStrongRetainedMethodDrillRecoveryPosture; + Surface.bGeneratedPacketUsedWeakRetainedMethodDrillRecoveryPosture = + SelectedEntry->bGeneratedPacketUsedWeakRetainedMethodDrillRecoveryPosture; + Surface.bGeneratedPacketUsedGenericMethodDrillRecoveryMemory = + SelectedEntry->bGeneratedPacketUsedGenericMethodDrillRecoveryMemory; + Surface.bGeneratedPlanUsedTightStructureContinuationPosture = + SelectedEntry->bGeneratedPlanUsedTightStructureContinuationPosture; + Surface.bGeneratedPlanUsedBroadStructureRedirectPosture = + SelectedEntry->bGeneratedPlanUsedBroadStructureRedirectPosture; + Surface.bGeneratedPlanUsedReliableTrustedTightStructureContinuationPosture = + SelectedEntry->bGeneratedPlanUsedReliableTrustedTightStructureContinuationPosture; + Surface.bGeneratedPlanUsedReliableTrustedBroadStructureRedirectPosture = + SelectedEntry->bGeneratedPlanUsedReliableTrustedBroadStructureRedirectPosture; + Surface.bGeneratedPlanUsedReliableAlignedTrustedTightStructureContinuationPosture = + SelectedEntry->bGeneratedPlanUsedReliableAlignedTrustedTightStructureContinuationPosture; + Surface.bGeneratedPlanUsedReliableAlignedTrustedBroadStructureRedirectPosture = + SelectedEntry->bGeneratedPlanUsedReliableAlignedTrustedBroadStructureRedirectPosture; + Surface.bUsedMethodDrillRecoveryMemoryForRecovery = + SelectedEntry->bUsedMethodDrillRecoveryMemoryForRecovery; + Surface.bUsedMethodDrillRecoveryMemoryForHandoff = + SelectedEntry->bUsedMethodDrillRecoveryMemoryForHandoff; + Surface.StatusLine = FString::Printf( + TEXT("Drill recovery memory history: %d entries | selected %d/%d | %s | %s | Packet: %s | Stance: %s | Plan source: %s | Plan align: %s | Reliable stance: %s | Plan: %s | Recorded: %s"), + MethodDrillRecoveryMemoryHistoryEntries.Num(), + SelectedMethodDrillRecoveryMemoryHistoryIndex + 1, + MethodDrillRecoveryMemoryHistoryEntries.Num(), + *Surface.PreferredRecoveryActionLabel, + *SelectedEntry->RecommendedHandoffKindLabel, + *Surface.GeneratedGuidancePacketKindLabel, + *Surface.MemoryBiasLine, + *Surface.PlanSourceLine, + *Surface.PlanAlignmentLine, + *Surface.ReliablePlanLine, + *Surface.GeneratedPlanPostureLabel, + *SelectedEntry->RecordedAtUtc); + Surface.DetailLine = FString::Printf( + TEXT("Source: %s | Strong/weak/history %d/%d/%d avg %.1f | Structure recovery narrow %d/%d broad %d/%d | Trusted plan history tight/broad %d/%d avg %.1f/%.1f | Aligned reliable plan outcome history tight/broad %d/%d avg %.1f/%.1f | Aligned reliable plan history tight/broad %d/%d avg %.1f/%.1f | Reliable trusted plan history tight/broad %d/%d avg %.1f/%.1f | Dominant pressure: %s | Structure bias: %s | Reliable stance: %s | Stance: %s | Recovery memory tipped: %s | Handoff memory tipped: %s | Packet kind: %s | Packet source: %s | Packet headline: %s | Packet action: %s | Packet focus %d | Plan mode: %s | Plan selection: %s | Plan posture: %s | Plan source: %s | Plan alignment: %s | Plan comparison tight aligned/diverged %d/%d broad aligned/diverged %d/%d aligned reliable tight aligned/diverged %d/%d aligned reliable broad aligned/diverged %d/%d reliable tight aligned/diverged %d/%d reliable broad aligned/diverged %d/%d | Plan preferred: %s | Tight/broad structure plan: %s/%s | Packet stance: %s | Recovery posture: %s | Handoff posture: %s"), + *Surface.PreferredRecoveryActionSourceDescription, + SelectedEntry->StrongMethodDrillRecoveryHistoryCount, + SelectedEntry->WeakMethodDrillRecoveryHistoryCount, + SelectedEntry->MethodDrillRecoveryHistoryCount, + SelectedEntry->MethodDrillRecoveryAverageOutcomeScore, + SelectedEntry->NarrowMethodDrillPacketStructureRecoveryLaunchCount, + SelectedEntry->NarrowMethodDrillPacketStructureRecoveryLaunchReducedCount, + SelectedEntry->BroadMethodDrillPacketStructureRecoveryPromoteCount, + SelectedEntry->BroadMethodDrillPacketStructureRecoveryPromoteReducedCount, + SelectedEntry->TrustedTightMethodDrillRecoveryStructurePlanHistoryCount, + SelectedEntry->TrustedBroadMethodDrillRecoveryStructurePlanHistoryCount, + SelectedEntry->TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore, + SelectedEntry->TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore, + SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeHistoryCount, + SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeHistoryCount, + SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeAverageScore, + SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeAverageScore, + SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanHistoryCount, + SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount, + SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore, + SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore, + SelectedEntry->ReliableTrustedTightMethodDrillRecoveryStructurePlanHistoryCount, + SelectedEntry->ReliableTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount, + SelectedEntry->ReliableTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore, + SelectedEntry->ReliableTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore, + *Surface.DominantPressureLine, + *Surface.StructureBiasLine, + *Surface.ReliablePlanLine, + *Surface.MemoryBiasLine, + SelectedEntry->bUsedMethodDrillRecoveryMemoryForRecovery ? TEXT("yes") : TEXT("no"), + SelectedEntry->bUsedMethodDrillRecoveryMemoryForHandoff ? TEXT("yes") : TEXT("no"), + *Surface.GeneratedGuidancePacketKindLabel, + *Surface.GeneratedGuidancePacketSourceDescription, + *Surface.GeneratedGuidancePacketHeadline, + *Surface.GeneratedGuidancePacketActionLabel, + SelectedEntry->GeneratedGuidancePacketFocusCaseCount, + *Surface.GeneratedPlanModeLabel, + *Surface.GeneratedPlanSelectionLabel, + *Surface.GeneratedPlanPostureLabel, + *Surface.PlanSourceLine, + *Surface.PlanAlignmentLine, + PlanComparisonSummary.TightPlanAlignedCount, + PlanComparisonSummary.TightPlanDivergedCount, + PlanComparisonSummary.BroadPlanAlignedCount, + PlanComparisonSummary.BroadPlanDivergedCount, + PlanComparisonSummary.ReliableAlignedTrustedTightPlanAlignedCount, + PlanComparisonSummary.ReliableAlignedTrustedTightPlanDivergedCount, + PlanComparisonSummary.ReliableAlignedTrustedBroadPlanAlignedCount, + PlanComparisonSummary.ReliableAlignedTrustedBroadPlanDivergedCount, + PlanComparisonSummary.ReliableTrustedTightPlanAlignedCount, + PlanComparisonSummary.ReliableTrustedTightPlanDivergedCount, + PlanComparisonSummary.ReliableTrustedBroadPlanAlignedCount, + PlanComparisonSummary.ReliableTrustedBroadPlanDivergedCount, + *Surface.ComparisonPreferenceLine, + SelectedEntry->bGeneratedPlanUsedTightStructureContinuationPosture + ? TEXT("yes") + : TEXT("no"), + SelectedEntry->bGeneratedPlanUsedBroadStructureRedirectPosture + ? TEXT("yes") + : TEXT("no"), + *Surface.GeneratedPacketStanceLine, + *SelectedEntry->QueueRecoveryStatusLine, + *SelectedEntry->HandoffRecommendationStatusLine); + return Surface; +} + bool UHyperTwistCoachDashboardWidget::SelectPreviousMethodDrillFollowUpHistoryEntry() { if (MethodDrillFollowUpHistoryEntries.Num() <= 0) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h index 4d8a047..604928b 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h @@ -739,6 +739,14 @@ public: FHyperTwistTrainingCoachDashboardClosureRecoveryHistoryInspectSurface GetSelectedClosureRecoveryHistoryInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface + GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface() const; + + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface + GetSelectedMethodDrillRecoveryMemoryHistoryInspectSurface() const; + UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach|Dashboard") bool SelectPreviousMethodDrillFollowUpHistoryEntry(); diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 5da192a..70db915 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -8657,6 +8657,386 @@ struct FHyperTwistTrainingCoachDashboardClosureRecoveryHistoryInspectSurface } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString Headline; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString StatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecordedAtUtc; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SourceLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SourceDescription; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString AppliedActionLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString VerdictLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PacketStructureRecoveryLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RetainedPostureLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ReliablePlanRecoveryLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 SelectedHistoryIndex = INDEX_NONE; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 HistoryEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float BeforePressureScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AfterPressureScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 BeforeDeferredEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AfterDeferredEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + EHyperTwistTrainingQueueRecoveryAction AppliedAction = + EHyperTwistTrainingQueueRecoveryAction::None; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasSelectedEntry = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bSucceeded = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bReducedFriction = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bShiftedFriction = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bBeforeBlockedFollowUp = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bAfterBlockedFollowUp = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bBeforeOutstandingDeferred = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bAfterOutstandingDeferred = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bBeforeCompletionGap = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bAfterCompletionGap = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedDeferredFirstSuppressionSignal = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedMethodDrillHandoffSignal = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedNarrowMethodDrillPacketStructureRecovery = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedBroadMethodDrillPacketStructureRecovery = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedStrongRetainedMethodDrillRecoveryPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedWeakRetainedMethodDrillRecoveryPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedReliableTrustedTightStructurePlanRecovery = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedReliableTrustedBroadStructurePlanRecovery = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedReliableAlignedTrustedTightStructurePlanRecovery = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedReliableAlignedTrustedBroadStructurePlanRecovery = false; + + bool IsStructurallyValid() const + { + return !StatusLine.IsEmpty() + || !DetailLine.IsEmpty() + || bHasSelectedEntry + || HistoryEntryCount > 0; + } +}; + +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString Headline; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString StatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecordedAtUtc; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PreferredRecoveryActionLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PreferredRecoveryActionSourceLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PreferredRecoveryActionSourceDescription; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecommendedHandoffKindLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString QueueRecoveryStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HandoffRecommendationStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedGuidancePacketKindLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedGuidancePacketSourceLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedGuidancePacketSourceDescription; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedGuidancePacketHeadline; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedGuidancePacketActionLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedPlanModeLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedPlanSelectionLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedPlanPostureLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DominantPressureLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString StructureBiasLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ReliablePlanLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString MemoryBiasLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PlanSourceLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PlanAlignmentLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ComparisonPreferenceLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedPacketStanceLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 SelectedEntryIndex = INDEX_NONE; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 HistoryEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 GeneratedGuidancePacketFocusCaseCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 MethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 StrongMethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 WeakMethodDrillRecoveryHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 NarrowMethodDrillPacketStructureRecoveryLaunchCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 NarrowMethodDrillPacketStructureRecoveryLaunchReducedCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 BroadMethodDrillPacketStructureRecoveryPromoteCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 BroadMethodDrillPacketStructureRecoveryPromoteReducedCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 TrustedTightMethodDrillRecoveryStructurePlanHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 TrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ReliableTrustedTightMethodDrillRecoveryStructurePlanHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ReliableTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ReliableTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ReliableTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeAverageScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeAverageScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float MethodDrillRecoveryAverageOutcomeScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + EHyperTwistTrainingQueueRecoveryAction PreferredRecoveryAction = + EHyperTwistTrainingQueueRecoveryAction::None; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + EHyperTwistTrainingDeliveryMode GeneratedPlanSuggestedMode = + EHyperTwistTrainingDeliveryMode::Timer; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + EHyperTwistTrainingSelectionPolicy GeneratedPlanSuggestedSelectionPolicy = + EHyperTwistTrainingSelectionPolicy::Weighted; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasSelectedEntry = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bStrongPressureDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bWeakPressureDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bNarrowPacketStructureRecoveryDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bBroadPacketStructureRecoveryDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bReliableTrustedTightStructurePlanDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bReliableTrustedBroadStructurePlanDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bReliableAlignedTrustedTightStructurePlanDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bReliableAlignedTrustedBroadStructurePlanDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bReliableAlignedTrustedTightStructurePlanOutcomeDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bReliableAlignedTrustedBroadStructurePlanOutcomeDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPacketUsedStrongRetainedMethodDrillRecoveryPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPacketUsedWeakRetainedMethodDrillRecoveryPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPacketUsedGenericMethodDrillRecoveryMemory = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPlanUsedTightStructureContinuationPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPlanUsedBroadStructureRedirectPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPlanUsedReliableTrustedTightStructureContinuationPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPlanUsedReliableTrustedBroadStructureRedirectPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPlanUsedReliableAlignedTrustedTightStructureContinuationPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bGeneratedPlanUsedReliableAlignedTrustedBroadStructureRedirectPosture = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedMethodDrillRecoveryMemoryForRecovery = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedMethodDrillRecoveryMemoryForHandoff = false; + + bool IsStructurallyValid() const + { + return !StatusLine.IsEmpty() + || !DetailLine.IsEmpty() + || bHasSelectedEntry + || HistoryEntryCount > 0; + } +}; + USTRUCT(BlueprintType) struct FHyperTwistTrainingCoachGeneratedModeLaunchExecutionContextSurface { diff --git a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md index d0168e5..fbad88e 100644 --- a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md +++ b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md @@ -69,8 +69,8 @@ Current correction call from the source-exposed audit and current execution refr - the latest landed bounded `Phase 4` packet closes the retained-idle comparison/outcome actionability gap at the end of the recognition-assisted coach-to-review continuity lane, and the final retained-surface confirmation pass now leaves that closure lane functionally complete - the retained idle widget surface now keeps retained comparison and decision history inspectable without continuing to advertise live launch or guidance-outcome actions once the coach-to-review loop has already collapsed to truthful closed-loop idle - the now-complete deliberate `UHyperTwistTrainingRuntimeLibrary` world-context consumer lane reaches through active generated-mode selector option owned-execution split-phase current-selection merged ordered roster phase-id lookup, normalized-order lookup, and evaluation-order lookup inspect surfaces, so gameplay/Blueprint callers can inspect one retained merged-roster row directly by phase id, normalized order, or evaluation order without scanning the merged roster array or re-running inspect derivation details directly - - the latest landed bounded `Phase 4` packet pivots deliberately to the next broader orchestration lane in `UHyperTwistCoachDashboardWidget` and adds displayed queue-recovery outcome, selected queue-suppression history, and selected closure-recovery history inspect surfaces over already-retained dashboard state, so gameplay/Blueprint callers can inspect retained recovery posture shifts without scraping dashboard text blocks or reopening backend derivation - - the current next bounded packet should stay on that same dashboard retained-history inspect lane only while a real gameplay or Blueprint caller still needs one more thin inspect contract over already-retained dashboard recovery state; the next clean move inside that lane is the method-drill recovery outcome history and method-drill recovery memory history inspect pair rather than widening back into backend continuity or runtime-library drift + - the latest landed bounded `Phase 4` packet stays on that same deliberate `UHyperTwistCoachDashboardWidget` retained-history inspect lane and adds selected method-drill recovery outcome history and selected method-drill recovery memory history inspect surfaces over already-retained dashboard state, so gameplay/Blueprint callers can inspect retained drill-recovery outcome shifts and upstream recovery-memory posture without scraping dashboard text blocks or reopening recovery-memory comparison derivation + - the current next bounded packet should stay on that same dashboard retained-history inspect lane only while a real gameplay or Blueprint caller still needs one more thin inspect contract over already-retained dashboard history state; the next clean move inside that lane is the method-drill follow-up history and handoff history inspect pair rather than widening back into backend continuity or runtime-library drift - the current execution-discipline rule that broad refactor / monolith-splitting work should not interrupt the active bounded roadmap packet unless structure is actually blocking it ## Current execution-reality references diff --git a/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_RECOVERY_OUTCOME_MEMORY_HISTORY_INSPECT_SURFACE_PACKET_2026-05-09.md b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_RECOVERY_OUTCOME_MEMORY_HISTORY_INSPECT_SURFACE_PACKET_2026-05-09.md new file mode 100644 index 0000000..92ebdfc --- /dev/null +++ b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_RECOVERY_OUTCOME_MEMORY_HISTORY_INSPECT_SURFACE_PACKET_2026-05-09.md @@ -0,0 +1,50 @@ +# HyperTwist Phase 4 dashboard method-drill recovery outcome and memory history inspect surface packet + +- bounded Phase `4` dashboard-consumer slice +- date: `2026-05-09` + +## Intent + +Stay on the deliberate `UHyperTwistCoachDashboardWidget` retained-history inspect lane and expose the next two retained method-drill recovery history families directly to gameplay and Blueprint callers. + +## Why this packet exists + +The dashboard already retained: + +- filtered method-drill recovery outcomes inside queue-recovery history +- selected method-drill recovery memory history entries + +But that state still only surfaced through dashboard text blocks and selection actions. Callers still had to scrape widget presentation or reopen recovery-memory comparison derivation to inspect retained drill-recovery posture directly. + +## What changed + +- added `FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface` +- added `FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface` +- added `GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface()` +- added `GetSelectedMethodDrillRecoveryMemoryHistoryInspectSurface()` +- kept the packet bounded to `UHyperTwistCoachDashboardWidget` plus shared surface types, with no dashboard redesign and no backend continuity changes + +## Files + +- `C:\HyperTwist\UnrealHyperTwist\Source\UnrealHyperTwist\Public\HyperTwistTraining\HyperTwistTrainingTypes.h` +- `C:\HyperTwist\UnrealHyperTwist\Source\UnrealHyperTwist\Public\HyperTwistTraining\HyperTwistCoachDashboardWidget.h` +- `C:\HyperTwist\UnrealHyperTwist\Source\UnrealHyperTwist\Private\HyperTwistTraining\HyperTwistCoachDashboardWidget.cpp` +- `C:\HyperTwist\docs\HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md` + +## Outcome + +Gameplay and Blueprint callers can now inspect: + +- the selected retained method-drill recovery outcome entry with action, before/after pressure, deferred-work posture, packet-structure recovery, retained drill-recovery stance, and reliable-plan recovery posture +- the selected retained method-drill recovery memory entry with preferred recovery action, source attribution, generated packet context, generated plan posture, recovery-memory bias, plan-source alignment, and retained comparison counts + +without scraping dashboard text blocks or reopening recovery-memory comparison derivation. + +## Validation + +- full `Development Editor | Win64` MSBuild on `UnrealHyperTwist.sln` + - passed with `0 Warning(s), 0 Error(s)` + +## Next clean slice + +Stay on this dashboard retained-history inspect lane only while a real gameplay or Blueprint caller still needs one more thin inspect contract over already-retained dashboard history state. The next clean move is the method-drill follow-up history and handoff history inspect pair.