Label retained drill recovery posture upstream

This commit is contained in:
axiomlogicnexus 2026-04-29 15:08:50 +02:00
parent 43f3b154ff
commit fff0233d3c
4 changed files with 572 additions and 61 deletions

View file

@ -177,7 +177,8 @@ namespace HyperTwistCoachDashboardWidgetInternal
bool IsQueueRecoveryMemorySource(const FString& SourceLabel)
{
return SourceLabel.StartsWith(TEXT("coach-memory-queue-"))
|| IsDashboardHandoffGuidanceSource(SourceLabel);
|| IsDashboardHandoffGuidanceSource(SourceLabel)
|| SourceLabel.StartsWith(TEXT("coach-memory-method-drill-recovery-"));
}
FString DescribeCoachMemorySourceLabel(const FString& SourceLabel)
@ -222,26 +223,50 @@ namespace HyperTwistCoachDashboardWidgetInternal
{
return TEXT("accepted strong drill-recovery-memory queued handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-queued"))
{
return TEXT("accepted strong retained drill-recovery-posture queued handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-strong-follow-up"))
{
return TEXT("accepted strong drill-recovery-memory follow-up handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-follow-up"))
{
return TEXT("accepted strong retained drill-recovery-posture follow-up handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-strong-recommended"))
{
return TEXT("accepted strong drill-recovery-memory recommended handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-recommended"))
{
return TEXT("accepted strong retained drill-recovery-posture recommended handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-queued"))
{
return TEXT("accepted weak drill-recovery-memory queued handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-queued"))
{
return TEXT("accepted weak retained drill-recovery-posture queued handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-follow-up"))
{
return TEXT("accepted weak drill-recovery-memory follow-up handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-follow-up"))
{
return TEXT("accepted weak retained drill-recovery-posture follow-up handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-recommended"))
{
return TEXT("accepted weak drill-recovery-memory recommended handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-recommended"))
{
return TEXT("accepted weak retained drill-recovery-posture recommended handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-queued"))
{
return TEXT("accepted queued handoff history");
@ -302,26 +327,50 @@ namespace HyperTwistCoachDashboardWidgetInternal
{
return TEXT("accepted strong drill-recovery-memory queued dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued"))
{
return TEXT("accepted strong retained drill-recovery-posture queued dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up"))
{
return TEXT("accepted strong drill-recovery-memory follow-up dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up"))
{
return TEXT("accepted strong retained drill-recovery-posture follow-up dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended"))
{
return TEXT("accepted strong drill-recovery-memory recommended dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended"))
{
return TEXT("accepted strong retained drill-recovery-posture recommended dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued"))
{
return TEXT("accepted weak drill-recovery-memory queued dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued"))
{
return TEXT("accepted weak retained drill-recovery-posture queued dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up"))
{
return TEXT("accepted weak drill-recovery-memory follow-up dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up"))
{
return TEXT("accepted weak retained drill-recovery-posture follow-up dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended"))
{
return TEXT("accepted weak drill-recovery-memory recommended dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended"))
{
return TEXT("accepted weak retained drill-recovery-posture recommended dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-queued"))
{
return TEXT("accepted deferred-overflow queued outcome handoff");
@ -382,10 +431,18 @@ namespace HyperTwistCoachDashboardWidgetInternal
{
return TEXT("successful retained drill-recovery-memory history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong"))
{
return TEXT("successful retained drill-recovery-posture history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak"))
{
return TEXT("weak retained drill-recovery-memory history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak"))
{
return TEXT("weak retained drill-recovery-posture history");
}
return SourceLabel.IsEmpty() ? TEXT("n/a") : SourceLabel;
}
@ -409,18 +466,25 @@ namespace HyperTwistCoachDashboardWidgetInternal
const bool bDeferredFirstSuppressionDriven,
const bool bMethodDrillDriven = false,
const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias =
EMethodDrillRecoveryMemoryBias::None)
EMethodDrillRecoveryMemoryBias::None,
const bool bRetainedMethodDrillRecoveryPostureDriven = false)
{
if (MethodDrillRecoveryMemoryBias == EMethodDrillRecoveryMemoryBias::Strong)
{
switch (HandoffKind)
{
case EHyperTwistTrainingCoachHandoffKind::Queue:
return TEXT("dashboard-handoff-method-drill-recovery-strong-queued");
return bRetainedMethodDrillRecoveryPostureDriven
? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")
: TEXT("dashboard-handoff-method-drill-recovery-strong-queued");
case EHyperTwistTrainingCoachHandoffKind::FollowUp:
return TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up");
return bRetainedMethodDrillRecoveryPostureDriven
? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")
: TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up");
case EHyperTwistTrainingCoachHandoffKind::Recommended:
return TEXT("dashboard-handoff-method-drill-recovery-strong-recommended");
return bRetainedMethodDrillRecoveryPostureDriven
? TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended")
: TEXT("dashboard-handoff-method-drill-recovery-strong-recommended");
default:
return FString();
}
@ -430,11 +494,17 @@ namespace HyperTwistCoachDashboardWidgetInternal
switch (HandoffKind)
{
case EHyperTwistTrainingCoachHandoffKind::Queue:
return TEXT("dashboard-handoff-method-drill-recovery-weak-queued");
return bRetainedMethodDrillRecoveryPostureDriven
? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")
: TEXT("dashboard-handoff-method-drill-recovery-weak-queued");
case EHyperTwistTrainingCoachHandoffKind::FollowUp:
return TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up");
return bRetainedMethodDrillRecoveryPostureDriven
? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")
: TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up");
case EHyperTwistTrainingCoachHandoffKind::Recommended:
return TEXT("dashboard-handoff-method-drill-recovery-weak-recommended");
return bRetainedMethodDrillRecoveryPostureDriven
? TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended")
: TEXT("dashboard-handoff-method-drill-recovery-weak-recommended");
default:
return FString();
}
@ -1247,6 +1317,25 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture()
MethodDrillRecoveryMemoryHistoryEntries,
true
);
const bool bUseStrongRetainedMethodDrillRecoveryPosture =
!bHasDeferredFirstSuppressionSignal
&& QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount > 0
&& (QueueRecoveryWeighting.PreferredActionKind
== FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery
|| (!QueueRecoveryWeighting.IsStructurallyValid() && bUpstreamPrefersLaunchRecovery))
&& (QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchReducedCount > 0
|| QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount
>= QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteCount);
const bool bUseWeakRetainedMethodDrillRecoveryPosture =
!bHasDeferredFirstSuppressionSignal
&& !DeferredEntryId.IsEmpty()
&& QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteCount > 0
&& (QueueRecoveryWeighting.PreferredActionKind
== FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::PromoteDeferred
|| (!QueueRecoveryWeighting.IsStructurallyValid() && !bUpstreamPrefersLaunchRecovery))
&& (QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteReducedCount > 0
|| QueueRecoveryWeighting.WeakRetainedMethodDrillPromoteCount
>= QueueRecoveryWeighting.StrongRetainedMethodDrillLaunchCount);
auto StartRunAndRefresh = [this](const FHyperTwistTrainingRunState& RunState)
{
@ -1267,7 +1356,8 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture()
bHasDeferredFirstSuppressionSignal,
bPrefersFollowUp,
bUseMethodDrillRecoverySignal,
RetainedMethodDrillRecoveryMemoryBias
bUseStrongRetainedMethodDrillRecoveryPosture,
bUseWeakRetainedMethodDrillRecoveryPosture
](
const TCHAR* AppliedActionLabel,
const FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind ActionKind,
@ -1284,12 +1374,12 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture()
bBeforeCompletionGap,
bHasDeferredFirstSuppressionSignal && bPrefersFollowUp,
bUseMethodDrillRecoverySignal,
bUseMethodDrillRecoverySignal
&& RetainedMethodDrillRecoveryMemoryBias
== HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong,
bUseMethodDrillRecoverySignal
&& RetainedMethodDrillRecoveryMemoryBias
== HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak,
bUseStrongRetainedMethodDrillRecoveryPosture
&& ActionKind
== FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::LaunchRecovery,
bUseWeakRetainedMethodDrillRecoveryPosture
&& ActionKind
== FHyperTwistCoachDashboardQueueRecoveryOutcome::EActionKind::PromoteDeferred,
bSucceeded
);
UpdateDashboardPresentation();
@ -1299,7 +1389,8 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture()
[
bHasDeferredFirstSuppressionSignal,
bUseMethodDrillRecoverySignal,
RetainedMethodDrillRecoveryMemoryBias
RetainedMethodDrillRecoveryMemoryBias,
bUseStrongRetainedMethodDrillRecoveryPosture
](
const EHyperTwistTrainingCoachHandoffKind HandoffKind)
{
@ -1310,6 +1401,16 @@ bool UHyperTwistCoachDashboardWidget::ApplyQueueRecoveryPosture()
true
);
}
if (bUseStrongRetainedMethodDrillRecoveryPosture)
{
return HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel(
HandoffKind,
false,
false,
HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong,
true
);
}
if (bUseMethodDrillRecoverySignal)
{
return HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel(
@ -6928,6 +7029,8 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
bool bHandoffRecommendationUsedDeferredFirstSuppressionSignal = false;
bool bHandoffRecommendationUsedMethodDrillWeighting = false;
bool bHandoffRecommendationUsedMethodDrillRecoveryMemory = false;
bool bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture = false;
bool bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture = false;
const HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias
CurrentMethodDrillRecoveryMemoryBias =
HyperTwistCoachDashboardWidgetInternal::ResolveMethodDrillRecoveryMemoryBias(
@ -6954,6 +7057,44 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
!= HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None
? RetainedMethodDrillRecoveryMemoryHandoffBias
: CurrentMethodDrillRecoveryMemoryBias;
auto UsesStrongRetainedMethodDrillRecoveryPostureForKind = [
&HandoffHistoryBias
](const HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind Kind)
{
switch (Kind)
{
case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue:
return HandoffHistoryBias.StrongRetainedMethodDrillQueueAcceptedDeltaCount > 0
|| HandoffHistoryBias.StrongRetainedMethodDrillQueueRecommendationCount > 0;
case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::FollowUp:
return HandoffHistoryBias.StrongRetainedMethodDrillFollowUpAcceptedDeltaCount > 0
|| HandoffHistoryBias.StrongRetainedMethodDrillFollowUpRecommendationCount > 0;
case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Recommended:
return HandoffHistoryBias.StrongRetainedMethodDrillRecommendedAcceptedDeltaCount > 0
|| HandoffHistoryBias.StrongRetainedMethodDrillRecommendedRecommendationCount > 0;
default:
return false;
}
};
auto UsesWeakRetainedMethodDrillRecoveryPostureForKind = [
&HandoffHistoryBias
](const HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind Kind)
{
switch (Kind)
{
case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Queue:
return HandoffHistoryBias.WeakRetainedMethodDrillQueueAcceptedDeltaCount > 0
|| HandoffHistoryBias.WeakRetainedMethodDrillQueueRecommendationCount > 0;
case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::FollowUp:
return HandoffHistoryBias.WeakRetainedMethodDrillFollowUpAcceptedDeltaCount > 0
|| HandoffHistoryBias.WeakRetainedMethodDrillFollowUpRecommendationCount > 0;
case HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::Recommended:
return HandoffHistoryBias.WeakRetainedMethodDrillRecommendedAcceptedDeltaCount > 0
|| HandoffHistoryBias.WeakRetainedMethodDrillRecommendedRecommendationCount > 0;
default:
return false;
}
};
if (!bCanUseCoachHandoff)
{
CoachHandoffRecommendationStatusLine =
@ -7358,11 +7499,45 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
}
bDisplayedCoachHandoffRecommendationUsedDeferredFirstSuppressionSignal =
bHandoffRecommendationUsedDeferredFirstSuppressionSignal;
bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture =
!bHandoffRecommendationUsedDeferredFirstSuppressionSignal
&& HandoffRecommendationKind
!= HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None
&& EffectiveMethodDrillRecoveryMemoryHandoffBias
== HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong
&& UsesStrongRetainedMethodDrillRecoveryPostureForKind(HandoffRecommendationKind)
&& (bHandoffRecommendationUsedHistory
|| bHandoffRecommendationUsedMethodDrillRecoveryMemory);
bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture =
!bHandoffRecommendationUsedDeferredFirstSuppressionSignal
&& HandoffRecommendationKind
!= HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None
&& EffectiveMethodDrillRecoveryMemoryHandoffBias
== HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak
&& UsesWeakRetainedMethodDrillRecoveryPostureForKind(HandoffRecommendationKind)
&& (bHandoffRecommendationUsedHistory
|| bHandoffRecommendationUsedMethodDrillRecoveryMemory);
bDisplayedCoachHandoffRecommendationUsedMethodDrillWeighting =
bHandoffRecommendationUsedMethodDrillWeighting
|| bHandoffRecommendationUsedMethodDrillRecoveryMemory;
if (bHandoffRecommendationUsedMethodDrillRecoveryMemory
&& RetainedMethodDrillRecoveryMemoryHandoffBias
|| bHandoffRecommendationUsedMethodDrillRecoveryMemory
|| bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture
|| bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture;
if (bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture
|| bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture)
{
DisplayedCoachHandoffMethodDrillRecoveryMemoryStartActionSourceLabel =
HyperTwistCoachDashboardWidgetInternal::DashboardHandoffSourceLabel(
DisplayedCoachHandoffRecommendationKind,
false,
false,
bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture
? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong
: HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak,
true
);
}
else if (bHandoffRecommendationUsedMethodDrillRecoveryMemory
&& EffectiveMethodDrillRecoveryMemoryHandoffBias
!= HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None)
{
DisplayedCoachHandoffMethodDrillRecoveryMemoryStartActionSourceLabel =
@ -7370,7 +7545,7 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
DisplayedCoachHandoffRecommendationKind,
false,
false,
RetainedMethodDrillRecoveryMemoryHandoffBias
EffectiveMethodDrillRecoveryMemoryHandoffBias
);
}
@ -7482,12 +7657,8 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
bRecommendedReadyForHandoff,
bHandoffRecommendationUsedDeferredFirstSuppressionSignal,
bHandoffRecommendationUsedMethodDrillWeighting,
bHandoffRecommendationUsedMethodDrillRecoveryMemory
&& EffectiveMethodDrillRecoveryMemoryHandoffBias
== HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong,
bHandoffRecommendationUsedMethodDrillRecoveryMemory
&& EffectiveMethodDrillRecoveryMemoryHandoffBias
== HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak
bHandoffRecommendationUsedStrongRetainedMethodDrillRecoveryPosture,
bHandoffRecommendationUsedWeakRetainedMethodDrillRecoveryPosture
);
FString QueuedRunLabel = CachedCoachPanelState.NextQueueSourceLabel.IsEmpty()
? TEXT("Start Queue")

View file

@ -47,7 +47,13 @@ namespace HyperTwistTrainingCoachLibraryInternal
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended");
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended");
}
bool IsMethodDrillRecoveryMemorySource(const FString& SourceLabel)
@ -55,6 +61,8 @@ namespace HyperTwistTrainingCoachLibraryInternal
return IsMethodDrillDashboardHandoffSource(SourceLabel)
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-weak")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak");
}
@ -62,18 +70,30 @@ namespace HyperTwistTrainingCoachLibraryInternal
bool IsStrongMethodDrillRecoveryMemorySource(const FString& SourceLabel)
{
return SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-strong-"))
|| SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-"))
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong");
}
bool IsWeakMethodDrillRecoveryMemorySource(const FString& SourceLabel)
{
return SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-weak-"))
|| SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-"))
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-weak")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak");
}
@ -108,7 +128,8 @@ namespace HyperTwistTrainingCoachLibraryInternal
bool IsQueueRecoveryMemorySource(const FString& SourceLabel)
{
return SourceLabel.StartsWith(TEXT("coach-memory-queue-"))
|| IsDashboardHandoffGuidanceSource(SourceLabel);
|| IsDashboardHandoffGuidanceSource(SourceLabel)
|| IsMethodDrillRecoveryMemorySource(SourceLabel);
}
FString DescribeCoachMemorySourceLabel(const FString& SourceLabel)
@ -173,6 +194,18 @@ namespace HyperTwistTrainingCoachLibraryInternal
{
return TEXT("accepted strong drill-recovery-memory recommended handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-queued"))
{
return TEXT("accepted strong retained drill-recovery-posture queued handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-follow-up"))
{
return TEXT("accepted strong retained drill-recovery-posture follow-up handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-recommended"))
{
return TEXT("accepted strong retained drill-recovery-posture recommended handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-weak-queued"))
{
return TEXT("accepted weak drill-recovery-memory queued handoff history");
@ -185,6 +218,18 @@ namespace HyperTwistTrainingCoachLibraryInternal
{
return TEXT("accepted weak drill-recovery-memory recommended handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-queued"))
{
return TEXT("accepted weak retained drill-recovery-posture queued handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-follow-up"))
{
return TEXT("accepted weak retained drill-recovery-posture follow-up handoff history");
}
if (SourceLabel == TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-recommended"))
{
return TEXT("accepted weak retained drill-recovery-posture recommended handoff history");
}
if (SourceLabel == TEXT("coach-memory-queue-follow-up"))
{
return TEXT("queue follow-up recovery memory");
@ -241,6 +286,18 @@ namespace HyperTwistTrainingCoachLibraryInternal
{
return TEXT("accepted strong drill-recovery-memory recommended dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued"))
{
return TEXT("accepted strong retained drill-recovery-posture queued dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up"))
{
return TEXT("accepted strong retained drill-recovery-posture follow-up dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended"))
{
return TEXT("accepted strong retained drill-recovery-posture recommended dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued"))
{
return TEXT("accepted weak drill-recovery-memory queued dashboard handoff");
@ -253,6 +310,18 @@ namespace HyperTwistTrainingCoachLibraryInternal
{
return TEXT("accepted weak drill-recovery-memory recommended dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued"))
{
return TEXT("accepted weak retained drill-recovery-posture queued dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up"))
{
return TEXT("accepted weak retained drill-recovery-posture follow-up dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended"))
{
return TEXT("accepted weak retained drill-recovery-posture recommended dashboard handoff");
}
if (SourceLabel == TEXT("dashboard-guidance-outcome-deferred-overflow-queued"))
{
return TEXT("accepted deferred-overflow queued outcome handoff");
@ -317,6 +386,14 @@ namespace HyperTwistTrainingCoachLibraryInternal
{
return TEXT("weak retained drill-recovery-memory history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong"))
{
return TEXT("successful retained drill-recovery-posture history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak"))
{
return TEXT("weak retained drill-recovery-posture history");
}
return SourceLabel.IsEmpty() ? TEXT("none") : SourceLabel;
}

View file

@ -79,9 +79,15 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended")
|| SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-"));
}
@ -89,14 +95,36 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
{
return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended");
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended");
}
bool IsWeakMethodDrillRecoveryDashboardHandoffSource(const FString& SourceLabel)
{
return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended");
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended");
}
bool IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource(
const FString& SourceLabel)
{
return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended");
}
bool IsWeakRetainedMethodDrillRecoveryPostureDashboardHandoffSource(
const FString& SourceLabel)
{
return SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended");
}
bool IsMethodDrillRecoveryCoachMemorySource(const FString& SourceLabel)
@ -104,7 +132,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
return SourceLabel == TEXT("coach-memory-method-drill-recovery-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-weak")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak");
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-memory-weak")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-posture-weak");
}
EHyperTwistTrainingCoachHandoffKind DashboardHandoffKindFromSourceLabel(const FString& SourceLabel)
@ -114,7 +144,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
|| SourceLabel == TEXT("dashboard-handoff-deferred-first-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued"))
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-queued")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-queued"))
{
return EHyperTwistTrainingCoachHandoffKind::Queue;
}
@ -123,7 +155,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
|| SourceLabel == TEXT("dashboard-handoff-deferred-first-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up"))
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-follow-up")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-follow-up"))
{
return EHyperTwistTrainingCoachHandoffKind::FollowUp;
}
@ -132,7 +166,9 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
|| SourceLabel == TEXT("dashboard-handoff-deferred-first-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-strong-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended"))
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-weak-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-strong-recommended")
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recovery-posture-weak-recommended"))
{
return EHyperTwistTrainingCoachHandoffKind::Recommended;
}
@ -153,7 +189,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
const bool bDeferredFirstDriven = false,
const bool bMethodDrillDriven = false,
const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias =
EMethodDrillRecoveryMemoryBias::None
EMethodDrillRecoveryMemoryBias::None,
const bool bRetainedMethodDrillRecoveryPostureDriven = false
)
{
switch (HandoffKind)
@ -164,11 +201,19 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
if (MethodDrillRecoveryMemoryBias
== EMethodDrillRecoveryMemoryBias::Strong)
{
if (bRetainedMethodDrillRecoveryPostureDriven)
{
return TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-queued");
}
return TEXT("coach-memory-dashboard-method-drill-recovery-strong-queued");
}
if (MethodDrillRecoveryMemoryBias
== EMethodDrillRecoveryMemoryBias::Weak)
{
if (bRetainedMethodDrillRecoveryPostureDriven)
{
return TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-queued");
}
return TEXT("coach-memory-dashboard-method-drill-recovery-weak-queued");
}
return TEXT("coach-memory-dashboard-method-drill-queued");
@ -186,11 +231,19 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
if (MethodDrillRecoveryMemoryBias
== EMethodDrillRecoveryMemoryBias::Strong)
{
if (bRetainedMethodDrillRecoveryPostureDriven)
{
return TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-follow-up");
}
return TEXT("coach-memory-dashboard-method-drill-recovery-strong-follow-up");
}
if (MethodDrillRecoveryMemoryBias
== EMethodDrillRecoveryMemoryBias::Weak)
{
if (bRetainedMethodDrillRecoveryPostureDriven)
{
return TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-follow-up");
}
return TEXT("coach-memory-dashboard-method-drill-recovery-weak-follow-up");
}
return TEXT("coach-memory-dashboard-method-drill-follow-up");
@ -208,11 +261,19 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
if (MethodDrillRecoveryMemoryBias
== EMethodDrillRecoveryMemoryBias::Strong)
{
if (bRetainedMethodDrillRecoveryPostureDriven)
{
return TEXT("coach-memory-dashboard-method-drill-recovery-posture-strong-recommended");
}
return TEXT("coach-memory-dashboard-method-drill-recovery-strong-recommended");
}
if (MethodDrillRecoveryMemoryBias
== EMethodDrillRecoveryMemoryBias::Weak)
{
if (bRetainedMethodDrillRecoveryPostureDriven)
{
return TEXT("coach-memory-dashboard-method-drill-recovery-posture-weak-recommended");
}
return TEXT("coach-memory-dashboard-method-drill-recovery-weak-recommended");
}
return TEXT("coach-memory-dashboard-method-drill-recommended");
@ -611,6 +672,24 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
WeakMethodDrillRecoveryMemoryStartedCount
- WeakMethodDrillRecoveryMemoryCompletedCount
);
const int32 StrongRetainedMethodDrillRecoveryPostureStartedCount =
QueueExecutionSummary.StartedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount;
const int32 StrongRetainedMethodDrillRecoveryPostureCompletedCount =
QueueExecutionSummary.CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount;
const int32 StrongRetainedMethodDrillRecoveryPostureOutstandingCount = FMath::Max(
0,
StrongRetainedMethodDrillRecoveryPostureStartedCount
- StrongRetainedMethodDrillRecoveryPostureCompletedCount
);
const int32 WeakRetainedMethodDrillRecoveryPostureStartedCount =
QueueExecutionSummary.StartedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount;
const int32 WeakRetainedMethodDrillRecoveryPostureCompletedCount =
QueueExecutionSummary.CompletedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount;
const int32 WeakRetainedMethodDrillRecoveryPostureOutstandingCount = FMath::Max(
0,
WeakRetainedMethodDrillRecoveryPostureStartedCount
- WeakRetainedMethodDrillRecoveryPostureCompletedCount
);
if (MethodDrillRecoveryStartedCount > 0)
{
Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount;
@ -662,6 +741,24 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
1,
3)
: 0;
const int32 RetainedMethodDrillRecoveryPostureLaunchBias =
StrongRetainedMethodDrillRecoveryPostureStartedCount > 0
? FMath::Clamp(
(StrongRetainedMethodDrillRecoveryPostureCompletedCount * 2)
- StrongRetainedMethodDrillRecoveryPostureOutstandingCount
+ 1,
1,
3)
: 0;
const int32 RetainedMethodDrillRecoveryPosturePromoteBias =
WeakRetainedMethodDrillRecoveryPostureStartedCount > 0
? FMath::Clamp(
(WeakRetainedMethodDrillRecoveryPostureOutstandingCount * 2)
- WeakRetainedMethodDrillRecoveryPostureCompletedCount
+ 1,
1,
3)
: 0;
if (ExplicitQueuedHandoffSignal > 0
|| ExplicitFollowUpHandoffSignal > 0
|| ExplicitRecommendedHandoffSignal > 0)
@ -669,11 +766,16 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
if (ExplicitQueuedHandoffSignal >= ExplicitFollowUpHandoffSignal
&& ExplicitQueuedHandoffSignal >= ExplicitRecommendedHandoffSignal)
{
const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias =
const bool bRetainedMethodDrillRecoveryPostureDriven =
ExplicitMethodDrillQueuedHandoffSignal > 0
&& RetainedMethodDrillRecoveryPostureLaunchBias > 0;
const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias =
bRetainedMethodDrillRecoveryPostureDriven
? EMethodDrillRecoveryMemoryBias::Strong
: (ExplicitMethodDrillQueuedHandoffSignal > 0
&& RetainedMethodDrillRecoveryLaunchBias > 0
? EMethodDrillRecoveryMemoryBias::Strong
: EMethodDrillRecoveryMemoryBias::None;
: EMethodDrillRecoveryMemoryBias::None);
Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Queue;
Snapshot.PreferredCoachHandoffSourceLabel =
HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel(
@ -681,16 +783,22 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
ExplicitDeferredOverflowQueuedHandoffSignal > 0,
ExplicitDeferredFirstQueuedHandoffSignal > 0,
ExplicitMethodDrillQueuedHandoffSignal > 0,
MethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias,
bRetainedMethodDrillRecoveryPostureDriven
);
}
else if (ExplicitFollowUpHandoffSignal >= ExplicitRecommendedHandoffSignal)
{
const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias =
const bool bRetainedMethodDrillRecoveryPostureDriven =
ExplicitMethodDrillFollowUpHandoffSignal > 0
&& RetainedMethodDrillRecoveryPostureLaunchBias > 0;
const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias =
bRetainedMethodDrillRecoveryPostureDriven
? EMethodDrillRecoveryMemoryBias::Strong
: (ExplicitMethodDrillFollowUpHandoffSignal > 0
&& RetainedMethodDrillRecoveryLaunchBias > 0
? EMethodDrillRecoveryMemoryBias::Strong
: EMethodDrillRecoveryMemoryBias::None;
: EMethodDrillRecoveryMemoryBias::None);
Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp;
Snapshot.PreferredCoachHandoffSourceLabel =
HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel(
@ -698,16 +806,22 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
ExplicitDeferredOverflowFollowUpHandoffSignal > 0,
ExplicitDeferredFirstFollowUpHandoffSignal > 0,
ExplicitMethodDrillFollowUpHandoffSignal > 0,
MethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias,
bRetainedMethodDrillRecoveryPostureDriven
);
}
else
{
const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias =
const bool bRetainedMethodDrillRecoveryPostureDriven =
ExplicitMethodDrillRecommendedHandoffSignal > 0
&& RetainedMethodDrillRecoveryPosturePromoteBias > 0;
const EMethodDrillRecoveryMemoryBias MethodDrillRecoveryMemoryBias =
bRetainedMethodDrillRecoveryPostureDriven
? EMethodDrillRecoveryMemoryBias::Weak
: (ExplicitMethodDrillRecommendedHandoffSignal > 0
&& RetainedMethodDrillRecoveryPromoteBias > 0
? EMethodDrillRecoveryMemoryBias::Weak
: EMethodDrillRecoveryMemoryBias::None;
: EMethodDrillRecoveryMemoryBias::None);
Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Recommended;
Snapshot.PreferredCoachHandoffSourceLabel =
HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel(
@ -715,7 +829,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
ExplicitDeferredOverflowRecommendedHandoffSignal > 0,
ExplicitDeferredFirstRecommendedHandoffSignal > 0,
ExplicitMethodDrillRecommendedHandoffSignal > 0,
MethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias,
bRetainedMethodDrillRecoveryPostureDriven
);
}
}
@ -728,7 +843,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
+ ExplicitMethodDrillQueuedHandoffSignal
+ ExplicitMethodDrillFollowUpHandoffSignal
+ MethodDrillRecoveryLaunchBias
+ RetainedMethodDrillRecoveryLaunchBias;
+ RetainedMethodDrillRecoveryLaunchBias
+ RetainedMethodDrillRecoveryPostureLaunchBias;
const int32 WeightedRecommendedRecoverySignal =
ExplicitRecommendedRecoverySignal
+ ExplicitRecommendedHandoffSignal
@ -736,7 +852,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
+ ExplicitDeferredFirstRecommendedHandoffSignal
+ ExplicitMethodDrillRecommendedHandoffSignal
+ MethodDrillRecoveryPromoteBias
+ RetainedMethodDrillRecoveryPromoteBias;
+ RetainedMethodDrillRecoveryPromoteBias
+ RetainedMethodDrillRecoveryPosturePromoteBias;
const bool bQueueHistoryPrefersFollowUp =
DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp
|| (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp
@ -754,7 +871,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
+ (DominantDeferredLane != EHyperTwistTrainingCoachGuidanceLane::None ? 1.5f : 0.0f)
- (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f)
+ (static_cast<float>(MethodDrillRecoveryPromoteBias) * 1.5f)
+ (static_cast<float>(RetainedMethodDrillRecoveryPromoteBias) * 1.75f);
+ (static_cast<float>(RetainedMethodDrillRecoveryPromoteBias) * 1.75f)
+ (static_cast<float>(RetainedMethodDrillRecoveryPosturePromoteBias) * 2.0f);
const float LaunchRecoveryActionPressure =
(QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f)
+ (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 2.5f : 0.0f)
@ -770,7 +888,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
+ static_cast<float>(ExplicitMethodDrillFollowUpHandoffSignal)
+ static_cast<float>(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f
+ (static_cast<float>(MethodDrillRecoveryLaunchBias) * 1.75f)
+ (static_cast<float>(RetainedMethodDrillRecoveryLaunchBias) * 2.0f);
+ (static_cast<float>(RetainedMethodDrillRecoveryLaunchBias) * 2.0f)
+ (static_cast<float>(RetainedMethodDrillRecoveryPostureLaunchBias) * 2.25f);
if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f)
{
if (PromoteRecoveryActionPressure > LaunchRecoveryActionPressure)
@ -799,6 +918,29 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
}
}
if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery
&& RetainedMethodDrillRecoveryPostureLaunchBias > 0
&& (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty()
|| Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history"))
|| HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillDashboardHandoffSource(
Snapshot.PreferredQueueRecoveryActionSourceLabel)
|| HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource(
Snapshot.PreferredQueueRecoveryActionSourceLabel)))
{
Snapshot.PreferredQueueRecoveryActionSourceLabel =
TEXT("coach-memory-method-drill-recovery-posture-strong");
}
else if (Snapshot.PreferredQueueRecoveryAction
== EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred
&& RetainedMethodDrillRecoveryPosturePromoteBias > 0
&& (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty()
|| Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history"))
|| HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource(
Snapshot.PreferredQueueRecoveryActionSourceLabel)))
{
Snapshot.PreferredQueueRecoveryActionSourceLabel =
TEXT("coach-memory-method-drill-recovery-posture-weak");
}
else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery
&& RetainedMethodDrillRecoveryLaunchBias > 0
&& (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty()
|| Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history"))
@ -6770,6 +6912,24 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
WeakMethodDrillRecoveryMemoryStartedCount
- WeakMethodDrillRecoveryMemoryCompletedCount
);
const int32 StrongRetainedMethodDrillRecoveryPostureStartedCount =
QueueExecutionSummary.StartedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount;
const int32 StrongRetainedMethodDrillRecoveryPostureCompletedCount =
QueueExecutionSummary.CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount;
const int32 StrongRetainedMethodDrillRecoveryPostureOutstandingCount = FMath::Max(
0,
StrongRetainedMethodDrillRecoveryPostureStartedCount
- StrongRetainedMethodDrillRecoveryPostureCompletedCount
);
const int32 WeakRetainedMethodDrillRecoveryPostureStartedCount =
QueueExecutionSummary.StartedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount;
const int32 WeakRetainedMethodDrillRecoveryPostureCompletedCount =
QueueExecutionSummary.CompletedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount;
const int32 WeakRetainedMethodDrillRecoveryPostureOutstandingCount = FMath::Max(
0,
WeakRetainedMethodDrillRecoveryPostureStartedCount
- WeakRetainedMethodDrillRecoveryPostureCompletedCount
);
if (MethodDrillRecoveryStartedCount > 0)
{
Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount;
@ -6821,6 +6981,24 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
1,
3)
: 0;
const int32 RetainedMethodDrillRecoveryPostureLaunchBias =
StrongRetainedMethodDrillRecoveryPostureStartedCount > 0
? FMath::Clamp(
(StrongRetainedMethodDrillRecoveryPostureCompletedCount * 2)
- StrongRetainedMethodDrillRecoveryPostureOutstandingCount
+ 1,
1,
3)
: 0;
const int32 RetainedMethodDrillRecoveryPosturePromoteBias =
WeakRetainedMethodDrillRecoveryPostureStartedCount > 0
? FMath::Clamp(
(WeakRetainedMethodDrillRecoveryPostureOutstandingCount * 2)
- WeakRetainedMethodDrillRecoveryPostureCompletedCount
+ 1,
1,
3)
: 0;
if (ExplicitQueuedHandoffSignal > 0
|| ExplicitFollowUpHandoffSignal > 0
|| ExplicitRecommendedHandoffSignal > 0)
@ -6828,12 +7006,17 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
if (ExplicitQueuedHandoffSignal >= ExplicitFollowUpHandoffSignal
&& ExplicitQueuedHandoffSignal >= ExplicitRecommendedHandoffSignal)
{
const bool bRetainedMethodDrillRecoveryPostureDriven =
ExplicitMethodDrillQueuedHandoffSignal > 0
&& RetainedMethodDrillRecoveryPostureLaunchBias > 0;
const HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias =
ExplicitMethodDrillQueuedHandoffSignal > 0
bRetainedMethodDrillRecoveryPostureDriven
? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Strong
: (ExplicitMethodDrillQueuedHandoffSignal > 0
&& RetainedMethodDrillRecoveryLaunchBias > 0
? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Strong
: HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None;
: HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None);
Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Queue;
Snapshot.PreferredCoachHandoffSourceLabel =
HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel(
@ -6841,17 +7024,23 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
ExplicitDeferredOverflowQueuedHandoffSignal > 0,
ExplicitDeferredFirstQueuedHandoffSignal > 0,
ExplicitMethodDrillQueuedHandoffSignal > 0,
MethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias,
bRetainedMethodDrillRecoveryPostureDriven
);
}
else if (ExplicitFollowUpHandoffSignal >= ExplicitRecommendedHandoffSignal)
{
const bool bRetainedMethodDrillRecoveryPostureDriven =
ExplicitMethodDrillFollowUpHandoffSignal > 0
&& RetainedMethodDrillRecoveryPostureLaunchBias > 0;
const HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias =
ExplicitMethodDrillFollowUpHandoffSignal > 0
bRetainedMethodDrillRecoveryPostureDriven
? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Strong
: (ExplicitMethodDrillFollowUpHandoffSignal > 0
&& RetainedMethodDrillRecoveryLaunchBias > 0
? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Strong
: HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None;
: HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None);
Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::FollowUp;
Snapshot.PreferredCoachHandoffSourceLabel =
HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel(
@ -6859,17 +7048,23 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
ExplicitDeferredOverflowFollowUpHandoffSignal > 0,
ExplicitDeferredFirstFollowUpHandoffSignal > 0,
ExplicitMethodDrillFollowUpHandoffSignal > 0,
MethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias,
bRetainedMethodDrillRecoveryPostureDriven
);
}
else
{
const bool bRetainedMethodDrillRecoveryPostureDriven =
ExplicitMethodDrillRecommendedHandoffSignal > 0
&& RetainedMethodDrillRecoveryPosturePromoteBias > 0;
const HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias =
ExplicitMethodDrillRecommendedHandoffSignal > 0
bRetainedMethodDrillRecoveryPostureDriven
? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Weak
: (ExplicitMethodDrillRecommendedHandoffSignal > 0
&& RetainedMethodDrillRecoveryPromoteBias > 0
? HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::Weak
: HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None;
: HyperTwistTrainingRepositoryLibraryInternal::EMethodDrillRecoveryMemoryBias::None);
Snapshot.PreferredCoachHandoffKind = EHyperTwistTrainingCoachHandoffKind::Recommended;
Snapshot.PreferredCoachHandoffSourceLabel =
HyperTwistTrainingRepositoryLibraryInternal::CoachMemoryDashboardSourceLabel(
@ -6877,7 +7072,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
ExplicitDeferredOverflowRecommendedHandoffSignal > 0,
ExplicitDeferredFirstRecommendedHandoffSignal > 0,
ExplicitMethodDrillRecommendedHandoffSignal > 0,
MethodDrillRecoveryMemoryBias
MethodDrillRecoveryMemoryBias,
bRetainedMethodDrillRecoveryPostureDriven
);
}
}
@ -6890,7 +7086,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
+ ExplicitMethodDrillQueuedHandoffSignal
+ ExplicitMethodDrillFollowUpHandoffSignal
+ MethodDrillRecoveryLaunchBias
+ RetainedMethodDrillRecoveryLaunchBias;
+ RetainedMethodDrillRecoveryLaunchBias
+ RetainedMethodDrillRecoveryPostureLaunchBias;
const int32 WeightedRecommendedRecoverySignal =
ExplicitRecommendedRecoverySignal
+ ExplicitRecommendedHandoffSignal
@ -6898,7 +7095,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
+ ExplicitDeferredFirstRecommendedHandoffSignal
+ ExplicitMethodDrillRecommendedHandoffSignal
+ MethodDrillRecoveryPromoteBias
+ RetainedMethodDrillRecoveryPromoteBias;
+ RetainedMethodDrillRecoveryPromoteBias
+ RetainedMethodDrillRecoveryPosturePromoteBias;
const bool bQueueHistoryPrefersFollowUp =
DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp
|| (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp
@ -6916,7 +7114,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
+ (DominantDeferredLane != EHyperTwistTrainingCoachGuidanceLane::None ? 1.5f : 0.0f)
- (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f)
+ (static_cast<float>(MethodDrillRecoveryPromoteBias) * 1.5f)
+ (static_cast<float>(RetainedMethodDrillRecoveryPromoteBias) * 1.75f);
+ (static_cast<float>(RetainedMethodDrillRecoveryPromoteBias) * 1.75f)
+ (static_cast<float>(RetainedMethodDrillRecoveryPosturePromoteBias) * 2.0f);
const float LaunchRecoveryActionPressure =
(QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f)
+ (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 2.5f : 0.0f)
@ -6932,7 +7131,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
+ static_cast<float>(ExplicitMethodDrillFollowUpHandoffSignal)
+ static_cast<float>(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f
+ (static_cast<float>(MethodDrillRecoveryLaunchBias) * 1.75f)
+ (static_cast<float>(RetainedMethodDrillRecoveryLaunchBias) * 2.0f);
+ (static_cast<float>(RetainedMethodDrillRecoveryLaunchBias) * 2.0f)
+ (static_cast<float>(RetainedMethodDrillRecoveryPostureLaunchBias) * 2.25f);
if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f)
{
if (PromoteRecoveryActionPressure > LaunchRecoveryActionPressure)
@ -6961,6 +7161,29 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
}
}
if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery
&& RetainedMethodDrillRecoveryPostureLaunchBias > 0
&& (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty()
|| Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history"))
|| HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillDashboardHandoffSource(
Snapshot.PreferredQueueRecoveryActionSourceLabel)
|| HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource(
Snapshot.PreferredQueueRecoveryActionSourceLabel)))
{
Snapshot.PreferredQueueRecoveryActionSourceLabel =
TEXT("coach-memory-method-drill-recovery-posture-strong");
}
else if (Snapshot.PreferredQueueRecoveryAction
== EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred
&& RetainedMethodDrillRecoveryPosturePromoteBias > 0
&& (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty()
|| Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history"))
|| HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource(
Snapshot.PreferredQueueRecoveryActionSourceLabel)))
{
Snapshot.PreferredQueueRecoveryActionSourceLabel =
TEXT("coach-memory-method-drill-recovery-posture-weak");
}
else if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery
&& RetainedMethodDrillRecoveryLaunchBias > 0
&& (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty()
|| Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history"))
@ -8832,6 +9055,12 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito
const bool bWeakMethodDrillRecoveryDashboardHandoff =
HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryDashboardHandoffSource(
HistoryEntry.StartActionSourceLabel);
const bool bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff =
HyperTwistTrainingRepositoryLibraryInternal::IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource(
HistoryEntry.StartActionSourceLabel);
const bool bWeakRetainedMethodDrillRecoveryPostureDashboardHandoff =
HyperTwistTrainingRepositoryLibraryInternal::IsWeakRetainedMethodDrillRecoveryPostureDashboardHandoffSource(
HistoryEntry.StartActionSourceLabel);
if (DashboardHandoffKind == EHyperTwistTrainingCoachHandoffKind::Queue)
{
Summary.StartedQueuedHandoffEventCount += 1;
@ -8888,6 +9117,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito
{
Summary.StartedWeakMethodDrillRecoveryMemoryHandoffEventCount += 1;
}
if (bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff)
{
Summary.StartedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount += 1;
}
if (bWeakRetainedMethodDrillRecoveryPostureDashboardHandoff)
{
Summary.StartedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount += 1;
}
if (Summary.LastStartedAtUtc.IsEmpty()
|| HyperTwistTrainingRepositoryLibraryInternal::CompareUtcStrings(
HistoryEntry.EventAtUtc,
@ -8944,6 +9181,12 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito
const bool bWeakMethodDrillRecoveryDashboardHandoff =
HyperTwistTrainingRepositoryLibraryInternal::IsWeakMethodDrillRecoveryDashboardHandoffSource(
HistoryEntry.StartActionSourceLabel);
const bool bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff =
HyperTwistTrainingRepositoryLibraryInternal::IsStrongRetainedMethodDrillRecoveryPostureDashboardHandoffSource(
HistoryEntry.StartActionSourceLabel);
const bool bWeakRetainedMethodDrillRecoveryPostureDashboardHandoff =
HyperTwistTrainingRepositoryLibraryInternal::IsWeakRetainedMethodDrillRecoveryPostureDashboardHandoffSource(
HistoryEntry.StartActionSourceLabel);
const EHyperTwistTrainingCoachHandoffKind CompletedHandoffKind =
HyperTwistTrainingRepositoryLibraryInternal::DashboardHandoffKindFromSourceLabel(
HistoryEntry.StartActionSourceLabel);
@ -8967,6 +9210,14 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito
{
Summary.CompletedWeakMethodDrillRecoveryMemoryHandoffEventCount += 1;
}
if (bStrongRetainedMethodDrillRecoveryPostureDashboardHandoff)
{
Summary.CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount += 1;
}
if (bWeakRetainedMethodDrillRecoveryPostureDashboardHandoff)
{
Summary.CompletedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount += 1;
}
}
CompletedCountsByEntryId.FindOrAdd(HistoryEntry.EntryId) += 1;
if (Summary.LastCompletedAtUtc.IsEmpty()

View file

@ -3690,6 +3690,18 @@ struct FHyperTwistTrainingCoachSessionQueueExecutionSummary
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 CompletedWeakMethodDrillRecoveryMemoryHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 StartedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 CompletedStrongRetainedMethodDrillRecoveryPostureHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 StartedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 CompletedWeakRetainedMethodDrillRecoveryPostureHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 PromotedFollowUpEventCount = 0;