diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index 6dd38c7..b97fc3a 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -67,6 +67,18 @@ namespace HyperTwistCoachDashboardWidgetInternal int32 WeakRetainedMethodDrillQueueRecommendationCount = 0; int32 WeakRetainedMethodDrillFollowUpRecommendationCount = 0; int32 WeakRetainedMethodDrillRecommendedRecommendationCount = 0; + int32 ReliableTrustedTightQueueAcceptedDeltaCount = 0; + int32 ReliableTrustedTightFollowUpAcceptedDeltaCount = 0; + int32 ReliableTrustedTightRecommendedAcceptedDeltaCount = 0; + int32 ReliableTrustedBroadQueueAcceptedDeltaCount = 0; + int32 ReliableTrustedBroadFollowUpAcceptedDeltaCount = 0; + int32 ReliableTrustedBroadRecommendedAcceptedDeltaCount = 0; + int32 ReliableTrustedTightQueueRecommendationCount = 0; + int32 ReliableTrustedTightFollowUpRecommendationCount = 0; + int32 ReliableTrustedTightRecommendedRecommendationCount = 0; + int32 ReliableTrustedBroadQueueRecommendationCount = 0; + int32 ReliableTrustedBroadFollowUpRecommendationCount = 0; + int32 ReliableTrustedBroadRecommendedRecommendationCount = 0; int32 QueueScore = 0; int32 FollowUpScore = 0; int32 RecommendedScore = 0; @@ -80,6 +92,8 @@ namespace HyperTwistCoachDashboardWidgetInternal bool bHasMethodDrillRecommendationSignal = false; bool bHasStrongRetainedMethodDrillPostureSignal = false; bool bHasWeakRetainedMethodDrillPostureSignal = false; + bool bHasReliableTrustedTightPlanHistorySignal = false; + bool bHasReliableTrustedBroadPlanHistorySignal = false; bool bHasSignal = false; }; @@ -1303,18 +1317,54 @@ namespace HyperTwistCoachDashboardWidgetInternal Bias.QueueAcceptedDeltaCount += QueuedDelta; Bias.QueueScore += QueuedDelta * 3; Bias.bHasAcceptedSignal = true; + if (Entry.bUsedReliableTrustedTightStructurePlanHistory) + { + Bias.ReliableTrustedTightQueueAcceptedDeltaCount += QueuedDelta; + Bias.QueueScore += QueuedDelta * 2; + Bias.bHasReliableTrustedTightPlanHistorySignal = true; + } + if (Entry.bUsedReliableTrustedBroadStructurePlanHistory) + { + Bias.ReliableTrustedBroadQueueAcceptedDeltaCount += QueuedDelta; + ++Bias.QueueScore; + Bias.bHasReliableTrustedBroadPlanHistorySignal = true; + } } if (FollowUpDelta > 0) { Bias.FollowUpAcceptedDeltaCount += FollowUpDelta; Bias.FollowUpScore += FollowUpDelta * 3; Bias.bHasAcceptedSignal = true; + if (Entry.bUsedReliableTrustedTightStructurePlanHistory) + { + Bias.ReliableTrustedTightFollowUpAcceptedDeltaCount += FollowUpDelta; + Bias.FollowUpScore += FollowUpDelta * 2; + Bias.bHasReliableTrustedTightPlanHistorySignal = true; + } + if (Entry.bUsedReliableTrustedBroadStructurePlanHistory) + { + Bias.ReliableTrustedBroadFollowUpAcceptedDeltaCount += FollowUpDelta; + ++Bias.FollowUpScore; + Bias.bHasReliableTrustedBroadPlanHistorySignal = true; + } } if (RecommendedDelta > 0) { Bias.RecommendedAcceptedDeltaCount += RecommendedDelta; Bias.RecommendedScore += RecommendedDelta * 3; Bias.bHasAcceptedSignal = true; + if (Entry.bUsedReliableTrustedTightStructurePlanHistory) + { + Bias.ReliableTrustedTightRecommendedAcceptedDeltaCount += RecommendedDelta; + ++Bias.RecommendedScore; + Bias.bHasReliableTrustedTightPlanHistorySignal = true; + } + if (Entry.bUsedReliableTrustedBroadStructurePlanHistory) + { + Bias.ReliableTrustedBroadRecommendedAcceptedDeltaCount += RecommendedDelta; + Bias.RecommendedScore += RecommendedDelta * 2; + Bias.bHasReliableTrustedBroadPlanHistorySignal = true; + } } if (DeferredOverflowQueuedDelta > 0) { @@ -1402,6 +1452,18 @@ namespace HyperTwistCoachDashboardWidgetInternal ++Bias.QueueRecommendationCount; ++Bias.QueueScore; Bias.bHasRecommendationSignal = true; + if (Entry.bUsedReliableTrustedTightStructurePlanHistory) + { + ++Bias.ReliableTrustedTightQueueRecommendationCount; + Bias.QueueScore += 2; + Bias.bHasReliableTrustedTightPlanHistorySignal = true; + } + if (Entry.bUsedReliableTrustedBroadStructurePlanHistory) + { + ++Bias.ReliableTrustedBroadQueueRecommendationCount; + ++Bias.QueueScore; + Bias.bHasReliableTrustedBroadPlanHistorySignal = true; + } if (Entry.bUsedMethodDrillWeighting) { ++Bias.MethodDrillQueueRecommendationCount; @@ -1432,6 +1494,18 @@ namespace HyperTwistCoachDashboardWidgetInternal ++Bias.FollowUpRecommendationCount; ++Bias.FollowUpScore; Bias.bHasRecommendationSignal = true; + if (Entry.bUsedReliableTrustedTightStructurePlanHistory) + { + ++Bias.ReliableTrustedTightFollowUpRecommendationCount; + Bias.FollowUpScore += 2; + Bias.bHasReliableTrustedTightPlanHistorySignal = true; + } + if (Entry.bUsedReliableTrustedBroadStructurePlanHistory) + { + ++Bias.ReliableTrustedBroadFollowUpRecommendationCount; + ++Bias.FollowUpScore; + Bias.bHasReliableTrustedBroadPlanHistorySignal = true; + } if (Entry.bUsedMethodDrillWeighting) { ++Bias.MethodDrillFollowUpRecommendationCount; @@ -1462,6 +1536,18 @@ namespace HyperTwistCoachDashboardWidgetInternal ++Bias.RecommendedRecommendationCount; ++Bias.RecommendedScore; Bias.bHasRecommendationSignal = true; + if (Entry.bUsedReliableTrustedTightStructurePlanHistory) + { + ++Bias.ReliableTrustedTightRecommendedRecommendationCount; + ++Bias.RecommendedScore; + Bias.bHasReliableTrustedTightPlanHistorySignal = true; + } + if (Entry.bUsedReliableTrustedBroadStructurePlanHistory) + { + ++Bias.ReliableTrustedBroadRecommendedRecommendationCount; + Bias.RecommendedScore += 2; + Bias.bHasReliableTrustedBroadPlanHistorySignal = true; + } if (Entry.bUsedMethodDrillWeighting) { ++Bias.MethodDrillRecommendedRecommendationCount; @@ -1945,7 +2031,9 @@ namespace HyperTwistCoachDashboardWidgetInternal if (Outcome.IsStructurallyValid() && (Outcome.bUsedMethodDrillHandoffSignal || Outcome.bUsedNarrowMethodDrillPacketStructureRecovery - || Outcome.bUsedBroadMethodDrillPacketStructureRecovery)) + || Outcome.bUsedBroadMethodDrillPacketStructureRecovery + || Outcome.bUsedReliableTrustedTightStructurePlanRecovery + || Outcome.bUsedReliableTrustedBroadStructurePlanRecovery)) { OutIndices.Add(Index); } @@ -2239,6 +2327,12 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() HyperTwistCoachDashboardWidgetInternal::DeriveMethodDrillRecoveryPlanComparisonSummary( MethodDrillRecoveryMemoryHistoryEntries ); + const int32 MethodDrillRecoveryPlanTightTrust = + HyperTwistCoachDashboardWidgetInternal::DeriveMethodDrillRecoveryPlanTightTrust( + MethodDrillRecoveryPlanComparisonSummary); + const int32 MethodDrillRecoveryPlanBroadTrust = + HyperTwistCoachDashboardWidgetInternal::DeriveMethodDrillRecoveryPlanBroadTrust( + MethodDrillRecoveryPlanComparisonSummary); const bool bUseTrustedTightMethodDrillRecoveryStructurePlan = bUseTightMethodDrillRecoveryStructurePlan && (HyperTwistCoachDashboardWidgetInternal::IsTrustedTightMethodDrillRecoveryPlanSourceLabel( @@ -2251,6 +2345,20 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() CachedCoachPanelState.PreferredQueueRecoveryActionSourceLabel) || HyperTwistCoachDashboardWidgetInternal::PrefersMethodDrillRecoveryPlanBroadRedirect( MethodDrillRecoveryPlanComparisonSummary)); + const bool bUseReliableTrustedTightMethodDrillRecoveryStructurePlan = + bUseTrustedTightMethodDrillRecoveryStructurePlan + && (HyperTwistCoachDashboardWidgetInternal::IsReliableTrustedTightMethodDrillRecoveryPlanSourceLabel( + CachedCoachPanelState.PreferredQueueRecoveryActionSourceLabel) + || (MethodDrillRecoveryPlanComparisonSummary.ReliableTrustedTightPlanSourceCount > 0 + && MethodDrillRecoveryPlanTightTrust > 0 + && MethodDrillRecoveryPlanTightTrust >= MethodDrillRecoveryPlanBroadTrust)); + const bool bUseReliableTrustedBroadMethodDrillRecoveryStructurePlan = + bUseTrustedBroadMethodDrillRecoveryStructurePlan + && (HyperTwistCoachDashboardWidgetInternal::IsReliableTrustedBroadMethodDrillRecoveryPlanSourceLabel( + CachedCoachPanelState.PreferredQueueRecoveryActionSourceLabel) + || (MethodDrillRecoveryPlanComparisonSummary.ReliableTrustedBroadPlanSourceCount > 0 + && MethodDrillRecoveryPlanBroadTrust > 0 + && MethodDrillRecoveryPlanBroadTrust >= MethodDrillRecoveryPlanTightTrust)); auto StartRunAndRefresh = [this](const FHyperTwistTrainingRunState& RunState) { @@ -2274,7 +2382,9 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() bUseNarrowMethodDrillPacketStructureRecovery, bUseBroadMethodDrillPacketStructureRecovery, bUseStrongRetainedMethodDrillRecoveryPosture, - bUseWeakRetainedMethodDrillRecoveryPosture + bUseWeakRetainedMethodDrillRecoveryPosture, + bUseReliableTrustedTightMethodDrillRecoveryStructurePlan, + bUseReliableTrustedBroadMethodDrillRecoveryStructurePlan ]( const TCHAR* AppliedActionLabel, const FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind ActionKind, @@ -2303,6 +2413,12 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture() bUseWeakRetainedMethodDrillRecoveryPosture && ActionKind == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::PromoteDeferred, + bUseReliableTrustedTightMethodDrillRecoveryStructurePlan + && ActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery, + bUseReliableTrustedBroadMethodDrillRecoveryStructurePlan + && ActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::PromoteDeferred, bSucceeded ); UpdateDashboardPresentation(); @@ -6499,6 +6615,15 @@ FHyperTwistCoachDashboardQueueRecoveryWeighting UHyperTwistCoachDashboardWidget: ++Weighting.WeakRetainedMethodDrillPromoteReducedCount; } } + if (Outcome.bUsedReliableTrustedBroadStructurePlanRecovery) + { + ++Weighting.ReliableTrustedBroadPlanPromoteCount; + Weighting.bHasReliableTrustedPlanOutcomeSignal = true; + if (Outcome.bReducedFriction) + { + ++Weighting.ReliableTrustedBroadPlanPromoteReducedCount; + } + } break; case FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery: ++Weighting.LaunchCount; @@ -6550,6 +6675,15 @@ FHyperTwistCoachDashboardQueueRecoveryWeighting UHyperTwistCoachDashboardWidget: ++Weighting.StrongRetainedMethodDrillLaunchReducedCount; } } + if (Outcome.bUsedReliableTrustedTightStructurePlanRecovery) + { + ++Weighting.ReliableTrustedTightPlanLaunchCount; + Weighting.bHasReliableTrustedPlanOutcomeSignal = true; + if (Outcome.bReducedFriction) + { + ++Weighting.ReliableTrustedTightPlanLaunchReducedCount; + } + } break; default: break; @@ -6800,6 +6934,18 @@ FHyperTwistCoachDashboardQueueRecoveryWeighting UHyperTwistCoachDashboardWidget: Weighting.BroadMethodDrillPacketStructurePromoteCount - Weighting.BroadMethodDrillPacketStructurePromoteReducedCount, 0)) * 0.5f; + const float ReliableTrustedTightPlanLaunchScore = + static_cast(Weighting.ReliableTrustedTightPlanLaunchReducedCount) * 3.0f + + static_cast(FMath::Max( + Weighting.ReliableTrustedTightPlanLaunchCount + - Weighting.ReliableTrustedTightPlanLaunchReducedCount, + 0)) * 0.5f; + const float ReliableTrustedBroadPlanPromoteScore = + static_cast(Weighting.ReliableTrustedBroadPlanPromoteReducedCount) * 3.0f + + static_cast(FMath::Max( + Weighting.ReliableTrustedBroadPlanPromoteCount + - Weighting.ReliableTrustedBroadPlanPromoteReducedCount, + 0)) * 0.5f; const float AdjustedPromoteScore = PromoteScore + (Weighting.bHasDeferredFirstSignal ? DeferredFirstPromoteScore * 1.5f : 0.0f) @@ -6807,6 +6953,9 @@ FHyperTwistCoachDashboardQueueRecoveryWeighting UHyperTwistCoachDashboardWidget: + (Weighting.BroadMethodDrillPacketStructurePromoteCount > 0 ? BroadMethodDrillPacketStructurePromoteScore * 1.2f : 0.0f) + + (Weighting.ReliableTrustedBroadPlanPromoteCount > 0 + ? ReliableTrustedBroadPlanPromoteScore * 1.25f + : 0.0f) + (Weighting.WeakRetainedMethodDrillPromoteCount > 0 ? WeakRetainedMethodDrillPromoteScore * 1.1f : 0.0f) @@ -6818,6 +6967,9 @@ FHyperTwistCoachDashboardQueueRecoveryWeighting UHyperTwistCoachDashboardWidget: + (Weighting.NarrowMethodDrillPacketStructureLaunchCount > 0 ? NarrowMethodDrillPacketStructureLaunchScore * 1.2f : 0.0f) + + (Weighting.ReliableTrustedTightPlanLaunchCount > 0 + ? ReliableTrustedTightPlanLaunchScore * 1.25f + : 0.0f) + (Weighting.StrongRetainedMethodDrillLaunchCount > 0 ? StrongRetainedMethodDrillLaunchScore * 1.1f : 0.0f) @@ -7161,6 +7313,8 @@ void UHyperTwistCoachDashboardWidget::RecordQueueRecoveryOutcome( const bool bUsedBroadMethodDrillPacketStructureRecovery, const bool bUsedStrongRetainedMethodDrillRecoveryPosture, const bool bUsedWeakRetainedMethodDrillRecoveryPosture, + const bool bUsedReliableTrustedTightStructurePlanRecovery, + const bool bUsedReliableTrustedBroadStructurePlanRecovery, const bool bSucceeded) { QueueRecoveryOutcome.RecordedAtUtc = FDateTime::UtcNow().ToIso8601(); @@ -7205,6 +7359,10 @@ void UHyperTwistCoachDashboardWidget::RecordQueueRecoveryOutcome( bUsedStrongRetainedMethodDrillRecoveryPosture; QueueRecoveryOutcome.bUsedWeakRetainedMethodDrillRecoveryPosture = bUsedWeakRetainedMethodDrillRecoveryPosture; + QueueRecoveryOutcome.bUsedReliableTrustedTightStructurePlanRecovery = + bUsedReliableTrustedTightStructurePlanRecovery; + QueueRecoveryOutcome.bUsedReliableTrustedBroadStructurePlanRecovery = + bUsedReliableTrustedBroadStructurePlanRecovery; bHasQueueRecoveryOutcome = QueueRecoveryOutcome.IsStructurallyValid(); if (bHasQueueRecoveryOutcome) { @@ -7232,7 +7390,9 @@ void UHyperTwistCoachDashboardWidget::RecordCoachHandoffHistorySnapshot( const bool bUsedDeferredFirstSuppressionSignal, const bool bUsedMethodDrillWeighting, const bool bUsedStrongRetainedMethodDrillRecoveryPosture, - const bool bUsedWeakRetainedMethodDrillRecoveryPosture) + const bool bUsedWeakRetainedMethodDrillRecoveryPosture, + const bool bUsedReliableTrustedTightStructurePlanHistory, + const bool bUsedReliableTrustedBroadStructurePlanHistory) { FHyperTwistCoachDashboardHandoffHistoryEntry Entry; Entry.RecordedAtUtc = FDateTime::UtcNow().ToIso8601(); @@ -7275,6 +7435,10 @@ void UHyperTwistCoachDashboardWidget::RecordCoachHandoffHistorySnapshot( bUsedStrongRetainedMethodDrillRecoveryPosture; Entry.bUsedWeakRetainedMethodDrillRecoveryPosture = bUsedWeakRetainedMethodDrillRecoveryPosture; + Entry.bUsedReliableTrustedTightStructurePlanHistory = + bUsedReliableTrustedTightStructurePlanHistory; + Entry.bUsedReliableTrustedBroadStructurePlanHistory = + bUsedReliableTrustedBroadStructurePlanHistory; if (!Entry.IsStructurallyValid()) { return; @@ -7327,7 +7491,11 @@ void UHyperTwistCoachDashboardWidget::RecordCoachHandoffHistorySnapshot( && HandoffHistoryEntries.Last().bUsedStrongRetainedMethodDrillRecoveryPosture == Entry.bUsedStrongRetainedMethodDrillRecoveryPosture && HandoffHistoryEntries.Last().bUsedWeakRetainedMethodDrillRecoveryPosture - == Entry.bUsedWeakRetainedMethodDrillRecoveryPosture; + == Entry.bUsedWeakRetainedMethodDrillRecoveryPosture + && HandoffHistoryEntries.Last().bUsedReliableTrustedTightStructurePlanHistory + == Entry.bUsedReliableTrustedTightStructurePlanHistory + && HandoffHistoryEntries.Last().bUsedReliableTrustedBroadStructurePlanHistory + == Entry.bUsedReliableTrustedBroadStructurePlanHistory; if (bMatchesLastEntry) { return; @@ -9505,6 +9673,24 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() CachedCoachPanelState.TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore, CachedCoachPanelState.TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore ); + CoachHandoffRecommendationDetailLine += FString::Printf( + TEXT(" | reliable trusted tight accepted q/f/r %d/%d/%d, broad accepted q/f/r %d/%d/%d"), + HandoffHistoryBias.ReliableTrustedTightQueueAcceptedDeltaCount, + HandoffHistoryBias.ReliableTrustedTightFollowUpAcceptedDeltaCount, + HandoffHistoryBias.ReliableTrustedTightRecommendedAcceptedDeltaCount, + HandoffHistoryBias.ReliableTrustedBroadQueueAcceptedDeltaCount, + HandoffHistoryBias.ReliableTrustedBroadFollowUpAcceptedDeltaCount, + HandoffHistoryBias.ReliableTrustedBroadRecommendedAcceptedDeltaCount + ); + CoachHandoffRecommendationDetailLine += FString::Printf( + TEXT(" | reliable trusted tight recommendation q/f/r %d/%d/%d, broad recommendation q/f/r %d/%d/%d"), + HandoffHistoryBias.ReliableTrustedTightQueueRecommendationCount, + HandoffHistoryBias.ReliableTrustedTightFollowUpRecommendationCount, + HandoffHistoryBias.ReliableTrustedTightRecommendedRecommendationCount, + HandoffHistoryBias.ReliableTrustedBroadQueueRecommendationCount, + HandoffHistoryBias.ReliableTrustedBroadFollowUpRecommendationCount, + HandoffHistoryBias.ReliableTrustedBroadRecommendedRecommendationCount + ); CoachHandoffRecommendationDetailLine += FString::Printf( TEXT(" | strong posture q/f/r %d/%d/%d, weak posture q/f/r %d/%d/%d"), HandoffHistoryBias.StrongRetainedMethodDrillQueueAcceptedDeltaCount, @@ -9546,6 +9732,14 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() CoachHandoffRecommendationDetailLine += MethodDrillUpstreamMemoryLine; } } + const bool bHandoffRecommendationUsedReliableTrustedTightPlanHistory = + bHandoffRecommendationUsedPlanComparisonHistory + && bPlanComparisonPrefersTightContinuation + && bHasReliableTrustedTightPlanComparisonHistory; + const bool bHandoffRecommendationUsedReliableTrustedBroadPlanHistory = + bHandoffRecommendationUsedPlanComparisonHistory + && bPlanComparisonPrefersBroadRedirect + && bHasReliableTrustedBroadPlanComparisonHistory; RecordCoachHandoffHistorySnapshot( HyperTwistCoachDashboardWidgetInternal::DescribeHandoffRecommendationKind( HandoffRecommendationKind), @@ -9560,7 +9754,9 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() bHandoffRecommendationUsedDeferredFirstSuppressionSignal, bHandoffRecommendationUsedMethodDrillWeighting, bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture, - bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture + bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture, + bHandoffRecommendationUsedReliableTrustedTightPlanHistory, + bHandoffRecommendationUsedReliableTrustedBroadPlanHistory ); FString QueuedRunLabel = CachedCoachPanelState.NextQueueSourceLabel.IsEmpty() ? TEXT("Start Queue") @@ -9593,7 +9789,7 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() const FString HandoffHistoryStatusLine = SelectedHandoffHistoryEntry != nullptr ? FString::Printf( - TEXT("Handoff history: %d entries | selected %d/%d | Recommendation: %s | Stance: %s | Recorded: %s"), + TEXT("Handoff history: %d entries | selected %d/%d | Recommendation: %s | Stance: %s | Reliable plan: %s | Recorded: %s"), HandoffHistoryEntries.Num(), SelectedHandoffHistoryIndex + 1, HandoffHistoryEntries.Num(), @@ -9603,13 +9799,18 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() *HyperTwistCoachDashboardWidgetInternal::DescribeRetainedMethodDrillRecoveryPosture( SelectedHandoffHistoryEntry->bUsedStrongRetainedMethodDrillRecoveryPosture, SelectedHandoffHistoryEntry->bUsedWeakRetainedMethodDrillRecoveryPosture), + SelectedHandoffHistoryEntry->bUsedReliableTrustedTightStructurePlanHistory + ? TEXT("trusted tight continuation") + : (SelectedHandoffHistoryEntry->bUsedReliableTrustedBroadStructurePlanHistory + ? TEXT("trusted broad redirect") + : TEXT("none")), *SelectedHandoffHistoryEntry->RecordedAtUtc ) : TEXT("Handoff history: no retained handoff-pattern shifts recorded yet."); const FString HandoffHistoryDetailLine = SelectedHandoffHistoryEntry != nullptr ? FString::Printf( - TEXT("Accepted queued/follow-up/recommended: %d/%d/%d | deferred-overflow queued/follow-up/recommended: %d/%d/%d | drill-driven queued/follow-up/recommended: %d/%d/%d | deferred-first suppression recommendation used: %s | drill weighting used: %s | retained posture: %s | queue source: %s | preferred lane: %s | memory source: %s | recovery action: %s | recovery source: %s | closure continuation bias %d | closure suppression bias %d | readiness queue/follow-up/recommended: %s/%s/%s || %s"), + TEXT("Accepted queued/follow-up/recommended: %d/%d/%d | deferred-overflow queued/follow-up/recommended: %d/%d/%d | drill-driven queued/follow-up/recommended: %d/%d/%d | deferred-first suppression recommendation used: %s | drill weighting used: %s | retained posture: %s | reliable trusted plan: %s | queue source: %s | preferred lane: %s | memory source: %s | recovery action: %s | recovery source: %s | closure continuation bias %d | closure suppression bias %d | readiness queue/follow-up/recommended: %s/%s/%s || %s"), SelectedHandoffHistoryEntry->AcceptedQueuedHandoffCount, SelectedHandoffHistoryEntry->AcceptedFollowUpHandoffCount, SelectedHandoffHistoryEntry->AcceptedRecommendedHandoffCount, @@ -9624,6 +9825,11 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() *HyperTwistCoachDashboardWidgetInternal::DescribeRetainedMethodDrillRecoveryPosture( SelectedHandoffHistoryEntry->bUsedStrongRetainedMethodDrillRecoveryPosture, SelectedHandoffHistoryEntry->bUsedWeakRetainedMethodDrillRecoveryPosture), + SelectedHandoffHistoryEntry->bUsedReliableTrustedTightStructurePlanHistory + ? TEXT("trusted tight continuation") + : (SelectedHandoffHistoryEntry->bUsedReliableTrustedBroadStructurePlanHistory + ? TEXT("trusted broad redirect") + : TEXT("none")), SelectedHandoffHistoryEntry->QueueSourceLabel.IsEmpty() ? TEXT("n/a") : *SelectedHandoffHistoryEntry->QueueSourceLabel, @@ -9856,31 +10062,36 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() >= MethodDrillRecoveryPacketQueueBias.PromoteRecoveryBias ? TEXT(" | Retained drill-recovery packet history is reinforcing launch recovery.") : TEXT(" | Retained drill-recovery packet history is reinforcing promote-deferred recovery.")) + : (QueueRecoveryWeighting.bHasReliableTrustedPlanOutcomeSignal + ? (QueueRecoveryWeighting.PreferredActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery + ? TEXT(" | Prior reliable trusted tight plan recovery outcomes are reinforcing launch recovery.") + : TEXT(" | Prior reliable trusted broad plan recovery outcomes are reinforcing promote-deferred recovery.")) : (bQueueRecoveryUsedPlanComparisonHistory - ? (QueueRecoveryWeighting.PreferredActionKind - == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery - ? (bHasReliableTrustedPlanComparisonHistory - ? TEXT(" | Reliable retained plan-alignment history is reinforcing trusted tight continuation recovery.") - : TEXT(" | Retained plan-alignment history is reinforcing trusted tight continuation recovery.")) - : (bHasReliableTrustedPlanComparisonHistory - ? TEXT(" | Reliable retained plan-alignment history is reinforcing trusted broad redirect recovery.") - : TEXT(" | Retained plan-alignment history is reinforcing trusted broad redirect recovery."))) - : (QueueRecoveryWeighting.bHasMethodDrillMemorySignal - ? (QueueRecoveryWeighting.PreferredActionKind - == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery - ? TEXT(" | Upstream drill-driven recovery memory is reinforcing launch recovery.") - : TEXT(" | Upstream drill-driven recovery memory is reinforcing promote-deferred recovery.")) - : (QueueRecoveryWeighting.bHasMethodDrillOutcomeSignal - ? (QueueRecoveryWeighting.PreferredActionKind - == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery - ? TEXT(" | Prior drill-weighted recovery outcomes are reinforcing launch recovery.") - : TEXT(" | Prior drill-weighted recovery outcomes are reinforcing promote-deferred recovery.")) - : (QueueRecoveryWeighting.bHasMethodDrillSignal - ? (QueueRecoveryWeighting.PreferredActionKind - == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery - ? TEXT(" | Drill-driven accepted handoff history is reinforcing launch recovery.") - : TEXT(" | Drill-driven accepted handoff history is present, but promote-deferred recovery still holds.")) - : TEXT(""))))); + ? (QueueRecoveryWeighting.PreferredActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery + ? (bHasReliableTrustedPlanComparisonHistory + ? TEXT(" | Reliable retained plan-alignment history is reinforcing trusted tight continuation recovery.") + : TEXT(" | Retained plan-alignment history is reinforcing trusted tight continuation recovery.")) + : (bHasReliableTrustedPlanComparisonHistory + ? TEXT(" | Reliable retained plan-alignment history is reinforcing trusted broad redirect recovery.") + : TEXT(" | Retained plan-alignment history is reinforcing trusted broad redirect recovery."))) + : (QueueRecoveryWeighting.bHasMethodDrillMemorySignal + ? (QueueRecoveryWeighting.PreferredActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery + ? TEXT(" | Upstream drill-driven recovery memory is reinforcing launch recovery.") + : TEXT(" | Upstream drill-driven recovery memory is reinforcing promote-deferred recovery.")) + : (QueueRecoveryWeighting.bHasMethodDrillOutcomeSignal + ? (QueueRecoveryWeighting.PreferredActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery + ? TEXT(" | Prior drill-weighted recovery outcomes are reinforcing launch recovery.") + : TEXT(" | Prior drill-weighted recovery outcomes are reinforcing promote-deferred recovery.")) + : (QueueRecoveryWeighting.bHasMethodDrillSignal + ? (QueueRecoveryWeighting.PreferredActionKind + == FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery + ? TEXT(" | Drill-driven accepted handoff history is reinforcing launch recovery.") + : TEXT(" | Drill-driven accepted handoff history is present, but promote-deferred recovery still holds.")) + : TEXT("")))))); const bool bHasQueueRecoveryFriction = CachedCoachSchedulePolicySummary.bHasBlockedFollowUpDeferrals || CachedCoachSchedulePolicySummary.bHasArchiveAwareDeferrals @@ -9939,7 +10150,7 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() : *QueueDeferredFirstSuppressionSignal->Detail) : TEXT(""); FString QueueRecoveryDetailLine = FString::Printf( - TEXT("Deferred events %d | Promoted %d | Manual %d | Pressure %.2f | Dominant reason: %s | Follow-up deferrals: %s | Archive-aware deferrals: %s | Completion gap: %s | Upstream action source: %s%s || Learned promote %d/%d reduced, %d failed, avg delta %.2f | launch %d/%d reduced, %d failed, avg delta %.2f | deferred-first promote/launch reduced %d/%d over %d/%d | drill-driven outcome promote/launch reduced %d/%d over %d/%d | retained strong-launch %d/%d, weak-promote %d/%d | drill-driven bias promote/launch %d/%d | reliable trusted plan bias promote/launch %d/%d | packet history queue/follow-up/recommended %d/%d/%d | packet-plan posture tight/broad %d/%d | plan-source tight aligned/diverged %d/%d | broad aligned/diverged %d/%d | reliable trusted tight aligned/diverged %d/%d | reliable trusted broad aligned/diverged %d/%d | plan preferred: %s | packet bias promote/launch %d/%d | upstream drill recovery strong/weak/history %d/%d/%d avg %.1f | reliable trusted plan history tight/broad %d/%d avg %.1f/%.1f | retained drill-recovery stance: %s"), + TEXT("Deferred events %d | Promoted %d | Manual %d | Pressure %.2f | Dominant reason: %s | Follow-up deferrals: %s | Archive-aware deferrals: %s | Completion gap: %s | Upstream action source: %s%s || Learned promote %d/%d reduced, %d failed, avg delta %.2f | launch %d/%d reduced, %d failed, avg delta %.2f | deferred-first promote/launch reduced %d/%d over %d/%d | drill-driven outcome promote/launch reduced %d/%d over %d/%d | reliable trusted outcome promote/launch reduced %d/%d over %d/%d | retained strong-launch %d/%d, weak-promote %d/%d | drill-driven bias promote/launch %d/%d | reliable trusted plan bias promote/launch %d/%d | packet history queue/follow-up/recommended %d/%d/%d | packet-plan posture tight/broad %d/%d | plan-source tight aligned/diverged %d/%d | broad aligned/diverged %d/%d | reliable trusted tight aligned/diverged %d/%d | reliable trusted broad aligned/diverged %d/%d | plan preferred: %s | packet bias promote/launch %d/%d | upstream drill recovery strong/weak/history %d/%d/%d avg %.1f | reliable trusted plan history tight/broad %d/%d avg %.1f/%.1f | retained drill-recovery stance: %s"), CachedCoachQueueExecutionSummary.DeferredEventCount, CachedCoachQueueExecutionSummary.PromotedEventCount, CachedCoachQueueExecutionSummary.ManualRescheduleEventCount, @@ -9968,6 +10179,10 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() QueueRecoveryWeighting.MethodDrillLaunchReducedCount, QueueRecoveryWeighting.MethodDrillPromoteCount, QueueRecoveryWeighting.MethodDrillLaunchCount, + QueueRecoveryWeighting.ReliableTrustedBroadPlanPromoteReducedCount, + QueueRecoveryWeighting.ReliableTrustedTightPlanLaunchReducedCount, + QueueRecoveryWeighting.ReliableTrustedBroadPlanPromoteCount, + QueueRecoveryWeighting.ReliableTrustedTightPlanLaunchCount, QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchReducedCount, QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount, QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteReducedCount, @@ -10124,7 +10339,7 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() const FString QueueRecoveryOutcomeDetailLine = !bHasQueueRecoveryOutcome || !QueueRecoveryOutcome.IsStructurallyValid() ? TEXT("Outcome detail: apply a queue-recovery action to compare before/after pressure, deferred count, blocked follow-up state, and completion-gap state.") : FString::Printf( - TEXT("Recorded: %s | Pressure %.2f -> %.2f | Deferred %d -> %d | Blocked follow-up %s -> %s | Outstanding deferred %s -> %s | Completion gap %s -> %s | deferred-first weighted: %s | drill-weighted: %s | packet-structure recovery: %s | retained posture: %s"), + TEXT("Recorded: %s | Pressure %.2f -> %.2f | Deferred %d -> %d | Blocked follow-up %s -> %s | Outstanding deferred %s -> %s | Completion gap %s -> %s | deferred-first weighted: %s | drill-weighted: %s | packet-structure recovery: %s | retained posture: %s | reliable trusted plan recovery: %s"), *QueueRecoveryOutcome.RecordedAtUtc, QueueRecoveryOutcome.BeforePressureScore, QueueRecoveryOutcome.AfterPressureScore, @@ -10145,7 +10360,12 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() : TEXT("none")), *HyperTwistCoachDashboardWidgetInternal::DescribeRetainedMethodDrillRecoveryPosture( QueueRecoveryOutcome.bUsedStrongRetainedMethodDrillRecoveryPosture, - QueueRecoveryOutcome.bUsedWeakRetainedMethodDrillRecoveryPosture) + QueueRecoveryOutcome.bUsedWeakRetainedMethodDrillRecoveryPosture), + QueueRecoveryOutcome.bUsedReliableTrustedTightStructurePlanRecovery + ? TEXT("trusted tight continuation") + : (QueueRecoveryOutcome.bUsedReliableTrustedBroadStructurePlanRecovery + ? TEXT("trusted broad redirect") + : TEXT("none")) ); TArray MethodDrillRecoveryHistoryIndices; HyperTwistCoachDashboardWidgetInternal::CollectMethodDrillRecoveryOutcomeIndices( diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h index 3b8e30e..6dbacc1 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h @@ -153,6 +153,8 @@ struct FHyperTwistCoachDashboardQueueRecoveryOutcome bool bUsedBroadMethodDrillPacketStructureRecovery = false; bool bUsedStrongRetainedMethodDrillRecoveryPosture = false; bool bUsedWeakRetainedMethodDrillRecoveryPosture = false; + bool bUsedReliableTrustedTightStructurePlanRecovery = false; + bool bUsedReliableTrustedBroadStructurePlanRecovery = false; bool IsStructurallyValid() const { @@ -193,6 +195,10 @@ struct FHyperTwistCoachDashboardQueueRecoveryWeighting int32 MethodDrillUpstreamWeakCount = 0; int32 ReliableTrustedTightPlanHistoryCount = 0; int32 ReliableTrustedBroadPlanHistoryCount = 0; + int32 ReliableTrustedTightPlanLaunchCount = 0; + int32 ReliableTrustedTightPlanLaunchReducedCount = 0; + int32 ReliableTrustedBroadPlanPromoteCount = 0; + int32 ReliableTrustedBroadPlanPromoteReducedCount = 0; int32 ReliableTrustedTightPlanBiasCount = 0; int32 ReliableTrustedBroadPlanBiasCount = 0; float PromoteAveragePressureDelta = 0.0f; @@ -208,6 +214,7 @@ struct FHyperTwistCoachDashboardQueueRecoveryWeighting bool bHasMethodDrillOutcomeSignal = false; bool bHasMethodDrillMemorySignal = false; bool bHasReliableTrustedPlanSignal = false; + bool bHasReliableTrustedPlanOutcomeSignal = false; bool IsStructurallyValid() const { @@ -299,6 +306,8 @@ struct FHyperTwistCoachDashboardHandoffHistoryEntry bool bUsedMethodDrillWeighting = false; bool bUsedStrongRetainedMethodDrillRecoveryPosture = false; bool bUsedWeakRetainedMethodDrillRecoveryPosture = false; + bool bUsedReliableTrustedTightStructurePlanHistory = false; + bool bUsedReliableTrustedBroadStructurePlanHistory = false; bool IsStructurallyValid() const { @@ -1429,6 +1438,8 @@ private: bool bUsedBroadMethodDrillPacketStructureRecovery, bool bUsedStrongRetainedMethodDrillRecoveryPosture, bool bUsedWeakRetainedMethodDrillRecoveryPosture, + bool bUsedReliableTrustedTightStructurePlanRecovery, + bool bUsedReliableTrustedBroadStructurePlanRecovery, bool bSucceeded ); void RecordCoachHandoffHistorySnapshot( @@ -1444,7 +1455,9 @@ private: bool bUsedDeferredFirstSuppressionSignal, bool bUsedMethodDrillWeighting, bool bUsedStrongRetainedMethodDrillRecoveryPosture, - bool bUsedWeakRetainedMethodDrillRecoveryPosture + bool bUsedWeakRetainedMethodDrillRecoveryPosture, + bool bUsedReliableTrustedTightStructurePlanHistory, + bool bUsedReliableTrustedBroadStructurePlanHistory ); void RecordQueueSuppressionSnapshot(); void RecordClosureRecoverySnapshot();