Derive drill recovery memory upstream

This commit is contained in:
axiomlogicnexus 2026-04-29 04:20:05 +02:00
parent ad3e9ad19d
commit f36b521fb7
5 changed files with 258 additions and 9 deletions

View file

@ -254,6 +254,14 @@ namespace HyperTwistCoachDashboardWidgetInternal
{
return TEXT("weak method-drill follow-up history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-strong"))
{
return TEXT("successful drill-driven recovery history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-weak"))
{
return TEXT("weak drill-driven recovery history");
}
return SourceLabel.IsEmpty() ? TEXT("n/a") : SourceLabel;
}

View file

@ -44,6 +44,13 @@ namespace HyperTwistTrainingCoachLibraryInternal
|| SourceLabel == TEXT("dashboard-handoff-method-drill-recommended");
}
bool IsMethodDrillRecoveryMemorySource(const FString& SourceLabel)
{
return IsMethodDrillDashboardHandoffSource(SourceLabel)
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-weak");
}
FString DescribeCoachHandoffKind(const EHyperTwistTrainingCoachHandoffKind HandoffKind)
{
switch (HandoffKind)
@ -207,6 +214,14 @@ namespace HyperTwistTrainingCoachLibraryInternal
{
return TEXT("weak method-drill follow-up history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-strong"))
{
return TEXT("successful drill-driven recovery history");
}
if (SourceLabel == TEXT("coach-memory-method-drill-recovery-weak"))
{
return TEXT("weak drill-driven recovery history");
}
return SourceLabel.IsEmpty() ? TEXT("none") : SourceLabel;
}
@ -1134,7 +1149,7 @@ TArray<FHyperTwistCoachSignal> UHyperTwistTrainingCoachLibrary::DeriveCoachSigna
CoachMemorySnapshot.PreferredQueueRecoveryAction
== EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery;
const bool bMethodDrillRecoveryActionSource =
HyperTwistTrainingCoachLibraryInternal::IsMethodDrillDashboardHandoffSource(
HyperTwistTrainingCoachLibraryInternal::IsMethodDrillRecoveryMemorySource(
CoachMemorySnapshot.PreferredQueueRecoveryActionSourceLabel
);
const float Score = 66.0f

View file

@ -79,6 +79,12 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
|| SourceLabel.StartsWith(TEXT("coach-memory-dashboard-method-drill-"));
}
bool IsMethodDrillRecoveryCoachMemorySource(const FString& SourceLabel)
{
return SourceLabel == TEXT("coach-memory-method-drill-recovery-strong")
|| SourceLabel == TEXT("coach-memory-method-drill-recovery-weak");
}
EHyperTwistTrainingCoachHandoffKind DashboardHandoffKindFromSourceLabel(const FString& SourceLabel)
{
if (SourceLabel == TEXT("dashboard-handoff-queued")
@ -508,6 +514,51 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
0,
4
);
const int32 MethodDrillRecoveryStartedCount =
QueueExecutionSummary.StartedMethodDrillQueuedHandoffEventCount
+ QueueExecutionSummary.StartedMethodDrillFollowUpHandoffEventCount
+ QueueExecutionSummary.StartedMethodDrillRecommendedHandoffEventCount;
const int32 MethodDrillRecoveryCompletedCount =
QueueExecutionSummary.CompletedMethodDrillQueuedHandoffEventCount
+ QueueExecutionSummary.CompletedMethodDrillFollowUpHandoffEventCount
+ QueueExecutionSummary.CompletedMethodDrillRecommendedHandoffEventCount;
const int32 MethodDrillRecoveryOutstandingCount = FMath::Max(
0,
MethodDrillRecoveryStartedCount - MethodDrillRecoveryCompletedCount
);
if (MethodDrillRecoveryStartedCount > 0)
{
Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount;
Snapshot.StrongMethodDrillRecoveryHistoryCount += MethodDrillRecoveryCompletedCount;
Snapshot.WeakMethodDrillRecoveryHistoryCount += MethodDrillRecoveryOutstandingCount;
Snapshot.MethodDrillRecoveryAverageOutcomeScore =
(static_cast<float>(MethodDrillRecoveryCompletedCount) * 100.0f)
/ static_cast<float>(MethodDrillRecoveryStartedCount);
}
const bool bStrongMethodDrillRecoveryHistory =
MethodDrillRecoveryStartedCount >= 2
&& MethodDrillRecoveryCompletedCount >= MethodDrillRecoveryOutstandingCount
&& Snapshot.MethodDrillRecoveryAverageOutcomeScore >= 55.0f;
const bool bWeakMethodDrillRecoveryHistory =
MethodDrillRecoveryStartedCount >= 2
&& MethodDrillRecoveryOutstandingCount > MethodDrillRecoveryCompletedCount
&& Snapshot.MethodDrillRecoveryAverageOutcomeScore <= 45.0f;
const int32 MethodDrillRecoveryLaunchBias = bStrongMethodDrillRecoveryHistory
? FMath::Clamp(
MethodDrillRecoveryCompletedCount
- MethodDrillRecoveryOutstandingCount
+ (Snapshot.MethodDrillRecoveryAverageOutcomeScore >= 75.0f ? 1 : 0),
1,
3)
: 0;
const int32 MethodDrillRecoveryPromoteBias = bWeakMethodDrillRecoveryHistory
? FMath::Clamp(
MethodDrillRecoveryOutstandingCount
- MethodDrillRecoveryCompletedCount
+ (QueueExecutionSummary.bHasCompletionGap ? 1 : 0),
1,
3)
: 0;
if (ExplicitQueuedHandoffSignal > 0
|| ExplicitFollowUpHandoffSignal > 0
|| ExplicitRecommendedHandoffSignal > 0)
@ -554,13 +605,15 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
+ ExplicitDeferredFirstQueuedHandoffSignal
+ ExplicitDeferredFirstFollowUpHandoffSignal
+ ExplicitMethodDrillQueuedHandoffSignal
+ ExplicitMethodDrillFollowUpHandoffSignal;
+ ExplicitMethodDrillFollowUpHandoffSignal
+ MethodDrillRecoveryLaunchBias;
const int32 WeightedRecommendedRecoverySignal =
ExplicitRecommendedRecoverySignal
+ ExplicitRecommendedHandoffSignal
+ ExplicitDeferredOverflowRecommendedHandoffSignal
+ ExplicitDeferredFirstRecommendedHandoffSignal
+ ExplicitMethodDrillRecommendedHandoffSignal;
+ ExplicitMethodDrillRecommendedHandoffSignal
+ MethodDrillRecoveryPromoteBias;
const bool bQueueHistoryPrefersFollowUp =
DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp
|| (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp
@ -576,7 +629,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
+ FMath::Min(static_cast<float>(QueueExecutionSummary.DeferredEventCount) * 0.75f, 3.0f)
+ FMath::Min(static_cast<float>(QueueExecutionSummary.PromotedEventCount), 3.0f)
+ (DominantDeferredLane != EHyperTwistTrainingCoachGuidanceLane::None ? 1.5f : 0.0f)
- (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f);
- (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f)
+ (static_cast<float>(MethodDrillRecoveryPromoteBias) * 1.5f);
const float LaunchRecoveryActionPressure =
(QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f)
+ (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 2.5f : 0.0f)
@ -590,7 +644,8 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
+ static_cast<float>(ExplicitDeferredFirstFollowUpHandoffSignal) * 0.5f
+ static_cast<float>(ExplicitMethodDrillQueuedHandoffSignal)
+ static_cast<float>(ExplicitMethodDrillFollowUpHandoffSignal)
+ static_cast<float>(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f;
+ static_cast<float>(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f
+ (static_cast<float>(MethodDrillRecoveryLaunchBias) * 1.75f);
if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f)
{
if (PromoteRecoveryActionPressure > LaunchRecoveryActionPressure)
@ -618,6 +673,29 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
Snapshot.PreferredQueueRecoveryActionSourceLabel = TEXT("queue-history-balanced-pressure");
}
}
if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery
&& bStrongMethodDrillRecoveryHistory
&& (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-strong");
}
else if (Snapshot.PreferredQueueRecoveryAction
== EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred
&& bWeakMethodDrillRecoveryHistory
&& (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty()
|| Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history"))
|| HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource(
Snapshot.PreferredQueueRecoveryActionSourceLabel)))
{
Snapshot.PreferredQueueRecoveryActionSourceLabel =
TEXT("coach-memory-method-drill-recovery-weak");
}
if (bQueueHistoryPrefersFollowUp)
{
@ -634,6 +712,14 @@ namespace HyperTwistTrainingRepositoryLibraryInternal
- (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 1 : 0)
);
}
if (MethodDrillRecoveryLaunchBias > 0)
{
Snapshot.FollowUpGuidanceContinueBias += MethodDrillRecoveryLaunchBias;
}
if (MethodDrillRecoveryPromoteBias > 0)
{
Snapshot.RecommendedGuidanceContinueBias += MethodDrillRecoveryPromoteBias;
}
if (bQueueHistoryPrefersFollowUp
&& Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred)
{
@ -6461,6 +6547,51 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
0,
4
);
const int32 MethodDrillRecoveryStartedCount =
QueueExecutionSummary.StartedMethodDrillQueuedHandoffEventCount
+ QueueExecutionSummary.StartedMethodDrillFollowUpHandoffEventCount
+ QueueExecutionSummary.StartedMethodDrillRecommendedHandoffEventCount;
const int32 MethodDrillRecoveryCompletedCount =
QueueExecutionSummary.CompletedMethodDrillQueuedHandoffEventCount
+ QueueExecutionSummary.CompletedMethodDrillFollowUpHandoffEventCount
+ QueueExecutionSummary.CompletedMethodDrillRecommendedHandoffEventCount;
const int32 MethodDrillRecoveryOutstandingCount = FMath::Max(
0,
MethodDrillRecoveryStartedCount - MethodDrillRecoveryCompletedCount
);
if (MethodDrillRecoveryStartedCount > 0)
{
Snapshot.MethodDrillRecoveryHistoryCount += MethodDrillRecoveryStartedCount;
Snapshot.StrongMethodDrillRecoveryHistoryCount += MethodDrillRecoveryCompletedCount;
Snapshot.WeakMethodDrillRecoveryHistoryCount += MethodDrillRecoveryOutstandingCount;
Snapshot.MethodDrillRecoveryAverageOutcomeScore =
(static_cast<float>(MethodDrillRecoveryCompletedCount) * 100.0f)
/ static_cast<float>(MethodDrillRecoveryStartedCount);
}
const bool bStrongMethodDrillRecoveryHistory =
MethodDrillRecoveryStartedCount >= 2
&& MethodDrillRecoveryCompletedCount >= MethodDrillRecoveryOutstandingCount
&& Snapshot.MethodDrillRecoveryAverageOutcomeScore >= 55.0f;
const bool bWeakMethodDrillRecoveryHistory =
MethodDrillRecoveryStartedCount >= 2
&& MethodDrillRecoveryOutstandingCount > MethodDrillRecoveryCompletedCount
&& Snapshot.MethodDrillRecoveryAverageOutcomeScore <= 45.0f;
const int32 MethodDrillRecoveryLaunchBias = bStrongMethodDrillRecoveryHistory
? FMath::Clamp(
MethodDrillRecoveryCompletedCount
- MethodDrillRecoveryOutstandingCount
+ (Snapshot.MethodDrillRecoveryAverageOutcomeScore >= 75.0f ? 1 : 0),
1,
3)
: 0;
const int32 MethodDrillRecoveryPromoteBias = bWeakMethodDrillRecoveryHistory
? FMath::Clamp(
MethodDrillRecoveryOutstandingCount
- MethodDrillRecoveryCompletedCount
+ (QueueExecutionSummary.bHasCompletionGap ? 1 : 0),
1,
3)
: 0;
if (ExplicitQueuedHandoffSignal > 0
|| ExplicitFollowUpHandoffSignal > 0
|| ExplicitRecommendedHandoffSignal > 0)
@ -6507,13 +6638,15 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
+ ExplicitDeferredFirstQueuedHandoffSignal
+ ExplicitDeferredFirstFollowUpHandoffSignal
+ ExplicitMethodDrillQueuedHandoffSignal
+ ExplicitMethodDrillFollowUpHandoffSignal;
+ ExplicitMethodDrillFollowUpHandoffSignal
+ MethodDrillRecoveryLaunchBias;
const int32 WeightedRecommendedRecoverySignal =
ExplicitRecommendedRecoverySignal
+ ExplicitRecommendedHandoffSignal
+ ExplicitDeferredOverflowRecommendedHandoffSignal
+ ExplicitDeferredFirstRecommendedHandoffSignal
+ ExplicitMethodDrillRecommendedHandoffSignal;
+ ExplicitMethodDrillRecommendedHandoffSignal
+ MethodDrillRecoveryPromoteBias;
const bool bQueueHistoryPrefersFollowUp =
DominantDeferredLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp
|| (DominantCompletedLane == EHyperTwistTrainingCoachGuidanceLane::FollowUp
@ -6529,7 +6662,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
+ FMath::Min(static_cast<float>(QueueExecutionSummary.DeferredEventCount) * 0.75f, 3.0f)
+ FMath::Min(static_cast<float>(QueueExecutionSummary.PromotedEventCount), 3.0f)
+ (DominantDeferredLane != EHyperTwistTrainingCoachGuidanceLane::None ? 1.5f : 0.0f)
- (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f);
- (QueueExecutionSummary.bHasCompletionGap ? 1.0f : 0.0f)
+ (static_cast<float>(MethodDrillRecoveryPromoteBias) * 1.5f);
const float LaunchRecoveryActionPressure =
(QueueExecutionSummary.bHasCompletionGap ? 4.0f : 0.0f)
+ (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 2.5f : 0.0f)
@ -6543,7 +6677,8 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
+ static_cast<float>(ExplicitDeferredFirstFollowUpHandoffSignal) * 0.5f
+ static_cast<float>(ExplicitMethodDrillQueuedHandoffSignal)
+ static_cast<float>(ExplicitMethodDrillFollowUpHandoffSignal)
+ static_cast<float>(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f;
+ static_cast<float>(ExplicitMethodDrillRecommendedHandoffSignal) * 0.5f
+ (static_cast<float>(MethodDrillRecoveryLaunchBias) * 1.75f);
if (PromoteRecoveryActionPressure > 0.0f || LaunchRecoveryActionPressure > 0.0f)
{
if (PromoteRecoveryActionPressure > LaunchRecoveryActionPressure)
@ -6571,6 +6706,29 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
Snapshot.PreferredQueueRecoveryActionSourceLabel = TEXT("queue-history-balanced-pressure");
}
}
if (Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::LaunchRecovery
&& bStrongMethodDrillRecoveryHistory
&& (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-strong");
}
else if (Snapshot.PreferredQueueRecoveryAction
== EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred
&& bWeakMethodDrillRecoveryHistory
&& (Snapshot.PreferredQueueRecoveryActionSourceLabel.IsEmpty()
|| Snapshot.PreferredQueueRecoveryActionSourceLabel.StartsWith(TEXT("queue-history"))
|| HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillRecoveryCoachMemorySource(
Snapshot.PreferredQueueRecoveryActionSourceLabel)))
{
Snapshot.PreferredQueueRecoveryActionSourceLabel =
TEXT("coach-memory-method-drill-recovery-weak");
}
if (bQueueHistoryPrefersFollowUp)
{
@ -6587,6 +6745,14 @@ FHyperTwistTrainingCoachMemorySnapshot UHyperTwistTrainingRepositoryLibrary::Der
- (QueueExecutionSummary.bHasBlockedFollowUpFriction ? 1 : 0)
);
}
if (MethodDrillRecoveryLaunchBias > 0)
{
Snapshot.FollowUpGuidanceContinueBias += MethodDrillRecoveryLaunchBias;
}
if (MethodDrillRecoveryPromoteBias > 0)
{
Snapshot.RecommendedGuidanceContinueBias += MethodDrillRecoveryPromoteBias;
}
if (bQueueHistoryPrefersFollowUp
&& Snapshot.PreferredQueueRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::PromoteDeferred)
{
@ -8470,6 +8636,25 @@ FHyperTwistTrainingCoachSessionQueueExecutionSummary UHyperTwistTrainingReposito
{
Summary.CompletedRecommendedEventCount += 1;
}
if (HyperTwistTrainingRepositoryLibraryInternal::IsMethodDrillDashboardHandoffSource(
HistoryEntry.StartActionSourceLabel))
{
const EHyperTwistTrainingCoachHandoffKind CompletedHandoffKind =
HyperTwistTrainingRepositoryLibraryInternal::DashboardHandoffKindFromSourceLabel(
HistoryEntry.StartActionSourceLabel);
if (CompletedHandoffKind == EHyperTwistTrainingCoachHandoffKind::Queue)
{
Summary.CompletedMethodDrillQueuedHandoffEventCount += 1;
}
else if (CompletedHandoffKind == EHyperTwistTrainingCoachHandoffKind::FollowUp)
{
Summary.CompletedMethodDrillFollowUpHandoffEventCount += 1;
}
else if (CompletedHandoffKind == EHyperTwistTrainingCoachHandoffKind::Recommended)
{
Summary.CompletedMethodDrillRecommendedHandoffEventCount += 1;
}
}
CompletedCountsByEntryId.FindOrAdd(HistoryEntry.EntryId) += 1;
if (Summary.LastCompletedAtUtc.IsEmpty()
|| HyperTwistTrainingRepositoryLibraryInternal::CompareUtcStrings(

View file

@ -600,6 +600,14 @@ FHyperTwistTrainingCoachPanelState UHyperTwistTrainingSubsystem::GetActiveCoachP
ActiveCoachMemorySnapshot.WeakMethodDrillFollowUpHistoryCount;
PanelState.MethodDrillFollowUpAverageOutcomeScore =
ActiveCoachMemorySnapshot.MethodDrillFollowUpAverageOutcomeScore;
PanelState.MethodDrillRecoveryHistoryCount =
ActiveCoachMemorySnapshot.MethodDrillRecoveryHistoryCount;
PanelState.StrongMethodDrillRecoveryHistoryCount =
ActiveCoachMemorySnapshot.StrongMethodDrillRecoveryHistoryCount;
PanelState.WeakMethodDrillRecoveryHistoryCount =
ActiveCoachMemorySnapshot.WeakMethodDrillRecoveryHistoryCount;
PanelState.MethodDrillRecoveryAverageOutcomeScore =
ActiveCoachMemorySnapshot.MethodDrillRecoveryAverageOutcomeScore;
PanelState.bRepositoryVerificationPassed = ActiveRepositoryRoundTripVerification.bDidRoundTripPass;
PanelState.bRepositoryVerificationNeedsAttention = ActiveRepositoryRoundTripVerification.ResolvedPath.IsEmpty()
|| !ActiveRepositoryRoundTripVerification.bDidRoundTripPass;

View file

@ -1935,6 +1935,18 @@ struct FHyperTwistTrainingCoachMemorySnapshot
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float MethodDrillFollowUpAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 MethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 StrongMethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 WeakMethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float MethodDrillRecoveryAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNeedsCoachIntervention = false;
@ -3657,6 +3669,15 @@ struct FHyperTwistTrainingCoachSessionQueueExecutionSummary
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 StartedMethodDrillRecommendedHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 CompletedMethodDrillQueuedHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 CompletedMethodDrillFollowUpHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 CompletedMethodDrillRecommendedHandoffEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 PromotedFollowUpEventCount = 0;
@ -4831,6 +4852,18 @@ struct FHyperTwistTrainingCoachPanelState
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float MethodDrillFollowUpAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 MethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 StrongMethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 WeakMethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float MethodDrillRecoveryAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 SignalCount = 0;