Refine coach archive retention and horizon logic

This commit is contained in:
axiomlogicnexus 2026-04-26 03:40:16 +02:00
parent 840a8e5d0b
commit 8d740cb997
11 changed files with 2545 additions and 1 deletions

View file

@ -1113,6 +1113,176 @@ FHyperTwistTrainingCoachActionPlanOutcomeSummary UHyperTwistContractLibrary::Mak
);
}
FHyperTwistTrainingCoachActionSequenceSummary UHyperTwistContractLibrary::MakeSampleTrainingCoachActionSequenceSummary()
{
FHyperTwistTrainingRepositoryState RepositoryState = MakeSampleTrainingRepositoryState();
const FHyperTwistTrainingCoachActionPlan RootPlan = MakeSampleTrainingCoachActionPlan();
const FHyperTwistCoachBrief FollowUpBrief = MakeSampleTrainingCoachFollowUpBrief();
const FHyperTwistTrainingCoachActionPlan FollowUpPlan =
UHyperTwistTrainingRepositoryLibrary::BuildCoachActionPlan(
FollowUpBrief,
TEXT("coach_follow_up_training_session_02"),
TEXT("2026-04-28T12:20:00Z")
);
if (FollowUpPlan.IsStructurallyValid())
{
RepositoryState = UHyperTwistTrainingRepositoryLibrary::UpsertCoachActionPlan(
RepositoryState,
FollowUpPlan
);
return UHyperTwistTrainingRepositoryLibrary::DeriveCoachActionSequenceSummary(
RepositoryState,
FollowUpPlan,
TEXT("2026-04-28T12:20:00Z")
);
}
return UHyperTwistTrainingRepositoryLibrary::DeriveCoachActionSequenceSummary(
RepositoryState,
RootPlan,
TEXT("2026-04-28T12:20:00Z")
);
}
FHyperTwistTrainingCoachActionClosureSummary UHyperTwistContractLibrary::MakeSampleTrainingCoachActionClosureSummary()
{
FHyperTwistTrainingRepositoryState RepositoryState = MakeSampleTrainingRepositoryState();
const FHyperTwistTrainingCoachActionPlan RootPlan = MakeSampleTrainingCoachActionPlan();
const FHyperTwistCoachBrief FollowUpBrief = MakeSampleTrainingCoachFollowUpBrief();
const FHyperTwistTrainingCoachActionPlan FollowUpPlan =
UHyperTwistTrainingRepositoryLibrary::BuildCoachActionPlan(
FollowUpBrief,
TEXT("coach_follow_up_training_session_02"),
TEXT("2026-04-28T12:20:00Z")
);
if (FollowUpPlan.IsStructurallyValid())
{
RepositoryState = UHyperTwistTrainingRepositoryLibrary::UpsertCoachActionPlan(
RepositoryState,
FollowUpPlan
);
return UHyperTwistTrainingRepositoryLibrary::DeriveCoachActionClosureSummary(
RepositoryState,
FollowUpPlan,
TEXT("2026-04-28T12:20:00Z")
);
}
return UHyperTwistTrainingRepositoryLibrary::DeriveCoachActionClosureSummary(
RepositoryState,
RootPlan,
TEXT("2026-04-28T12:20:00Z")
);
}
FHyperTwistTrainingCoachClosureMemorySummary UHyperTwistContractLibrary::MakeSampleTrainingCoachClosureMemorySummary()
{
const FHyperTwistTrainingRunStepResult StepResult = MakeSampleTrainingRunStepResult();
if (!StepResult.IsStructurallyValid())
{
return FHyperTwistTrainingCoachClosureMemorySummary();
}
return UHyperTwistTrainingRepositoryLibrary::DeriveCoachClosureMemorySummary(
MakeSampleTrainingRepositoryState(),
StepResult.UpdatedRunState.Session.UserId,
TEXT("2026-04-28T12:20:00Z")
);
}
FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistContractLibrary::MakeSampleTrainingCoachRecommendationHistorySummary()
{
const FHyperTwistTrainingRunStepResult StepResult = MakeSampleTrainingRunStepResult();
if (!StepResult.IsStructurallyValid())
{
return FHyperTwistTrainingCoachRecommendationHistorySummary();
}
FHyperTwistTrainingRepositoryState RepositoryState = MakeSampleTrainingRepositoryState();
const FHyperTwistCoachBrief FollowUpBrief = MakeSampleTrainingCoachFollowUpBrief();
const FHyperTwistTrainingCoachActionPlan FollowUpPlan =
UHyperTwistTrainingRepositoryLibrary::BuildCoachActionPlan(
FollowUpBrief,
TEXT("coach_follow_up_training_session_02"),
TEXT("2026-04-28T12:20:00Z")
);
if (FollowUpPlan.IsStructurallyValid())
{
RepositoryState = UHyperTwistTrainingRepositoryLibrary::UpsertCoachActionPlan(
RepositoryState,
FollowUpPlan
);
}
return UHyperTwistTrainingRepositoryLibrary::DeriveCoachRecommendationHistorySummary(
RepositoryState,
StepResult.UpdatedRunState.Session.UserId,
TEXT("2026-04-28T12:20:00Z")
);
}
FHyperTwistTrainingCoachCarryForwardPolicySummary UHyperTwistContractLibrary::MakeSampleTrainingCoachCarryForwardPolicySummary()
{
const FHyperTwistTrainingRunStepResult StepResult = MakeSampleTrainingRunStepResult();
if (!StepResult.IsStructurallyValid())
{
return FHyperTwistTrainingCoachCarryForwardPolicySummary();
}
FHyperTwistTrainingRepositoryState RepositoryState = MakeSampleTrainingRepositoryState();
const FHyperTwistCoachBrief FollowUpBrief = MakeSampleTrainingCoachFollowUpBrief();
const FHyperTwistTrainingCoachActionPlan FollowUpPlan =
UHyperTwistTrainingRepositoryLibrary::BuildCoachActionPlan(
FollowUpBrief,
TEXT("coach_follow_up_training_session_02"),
TEXT("2026-04-28T12:20:00Z")
);
if (FollowUpPlan.IsStructurallyValid())
{
RepositoryState = UHyperTwistTrainingRepositoryLibrary::UpsertCoachActionPlan(
RepositoryState,
FollowUpPlan
);
}
return UHyperTwistTrainingRepositoryLibrary::DeriveCoachCarryForwardPolicySummary(
RepositoryState,
StepResult.UpdatedRunState.Session.UserId,
TEXT("2026-04-28T12:20:00Z")
);
}
FHyperTwistTrainingCoachArchivePolicySummary UHyperTwistContractLibrary::MakeSampleTrainingCoachArchivePolicySummary()
{
const FHyperTwistTrainingRunStepResult StepResult = MakeSampleTrainingRunStepResult();
if (!StepResult.IsStructurallyValid())
{
return FHyperTwistTrainingCoachArchivePolicySummary();
}
FHyperTwistTrainingRepositoryState RepositoryState = MakeSampleTrainingRepositoryState();
const FHyperTwistCoachBrief FollowUpBrief = MakeSampleTrainingCoachFollowUpBrief();
const FHyperTwistTrainingCoachActionPlan FollowUpPlan =
UHyperTwistTrainingRepositoryLibrary::BuildCoachActionPlan(
FollowUpBrief,
TEXT("coach_follow_up_training_session_02"),
TEXT("2026-04-28T12:20:00Z")
);
if (FollowUpPlan.IsStructurallyValid())
{
RepositoryState = UHyperTwistTrainingRepositoryLibrary::UpsertCoachActionPlan(
RepositoryState,
FollowUpPlan
);
}
return UHyperTwistTrainingRepositoryLibrary::DeriveCoachArchivePolicySummary(
RepositoryState,
StepResult.UpdatedRunState.Session.UserId,
TEXT("2026-04-28T12:20:00Z")
);
}
FHyperTwistCoachBrief UHyperTwistContractLibrary::MakeSampleTrainingCoachFollowUpBrief()
{
return UHyperTwistTrainingCoachLibrary::DeriveCoachFollowUpBrief(

View file

@ -60,6 +60,84 @@ TArray<FHyperTwistCoachSignal> UHyperTwistTrainingCoachLibrary::DeriveCoachSigna
{
TArray<FHyperTwistCoachSignal> Signals;
if (CoachMemorySnapshot.EscalatedCoachSequenceCount > 0
|| CoachMemorySnapshot.EscalationCaseIds.Num() > 0)
{
const float Score = 96.0f
+ FMath::Min(static_cast<float>(CoachMemorySnapshot.EscalatedCoachSequenceCount) * 4.0f, 8.0f)
+ FMath::Min(static_cast<float>(CoachMemorySnapshot.EscalationCaseIds.Num()), 6.0f);
FHyperTwistCoachSignal Signal = HyperTwistTrainingCoachLibraryInternal::MakeSignal(
TEXT("coach_escalation"),
EHyperTwistCoachFocusLane::Accuracy,
Score,
TEXT("Escalation is needed for unresolved coaching cases"),
FString::Printf(
TEXT("escalatedSequences=%d, escalationCases=%d, followUpReady=%d"),
CoachMemorySnapshot.EscalatedCoachSequenceCount,
CoachMemorySnapshot.EscalationCaseIds.Num(),
CoachMemorySnapshot.FollowUpReadyCoachSequenceCount),
EHyperTwistTrainingDeliveryMode::CoachReviewed,
EHyperTwistTrainingSelectionPolicy::Scripted);
Signal.SuggestedDeckId = CoachMemorySnapshot.FocusDeckId;
Signal.SuggestedMethodSegmentId = CoachMemorySnapshot.FocusMethodSegmentId;
Signal.SuggestedCaseIds = CoachMemorySnapshot.EscalationCaseIds.Num() > 0
? CoachMemorySnapshot.EscalationCaseIds
: CoachMemorySnapshot.PersistentCoachWeakCaseIds;
Signals.Add(Signal);
}
if (CoachMemorySnapshot.bHasRepeatRecommendationPressure
&& CoachMemorySnapshot.RecurringCoachCaseIds.Num() > 0)
{
const float Score = 78.0f
+ FMath::Min(static_cast<float>(CoachMemorySnapshot.RepeatRecommendationSequenceCount) * 3.0f, 9.0f)
+ FMath::Min(static_cast<float>(CoachMemorySnapshot.RecurringCoachCaseIds.Num()), 6.0f);
FHyperTwistCoachSignal Signal = HyperTwistTrainingCoachLibraryInternal::MakeSignal(
TEXT("repeat_recommendation"),
EHyperTwistCoachFocusLane::Stability,
Score,
TEXT("Recurring coach cases need consolidation"),
FString::Printf(
TEXT("repeatSequences=%d, recurringCases=%d, dominantMode=%d"),
CoachMemorySnapshot.RepeatRecommendationSequenceCount,
CoachMemorySnapshot.RecurringCoachCaseIds.Num(),
static_cast<int32>(CoachMemorySnapshot.DominantCoachSuggestedMode)),
CoachMemorySnapshot.DominantCoachSuggestedMode,
CoachMemorySnapshot.DominantCoachSelectionPolicy);
Signal.SuggestedDeckId = CoachMemorySnapshot.FocusDeckId;
Signal.SuggestedMethodSegmentId = CoachMemorySnapshot.FocusMethodSegmentId;
Signal.SuggestedCaseIds = CoachMemorySnapshot.PinnedCarryForwardCaseIds.Num() > 0
? CoachMemorySnapshot.PinnedCarryForwardCaseIds
: CoachMemorySnapshot.RecurringCoachCaseIds;
Signals.Add(Signal);
}
if (CoachMemorySnapshot.bNeedsArchiveRetentionTuning
|| CoachMemorySnapshot.ArchiveReopenRiskCaseIds.Num() > 0)
{
const float Score = 58.0f
+ FMath::Min(CoachMemorySnapshot.ArchiveRetentionTuningScore * 0.35f, 22.0f)
+ FMath::Min(static_cast<float>(CoachMemorySnapshot.ArchiveReopenRiskCaseIds.Num()) * 5.0f, 15.0f);
FHyperTwistCoachSignal Signal = HyperTwistTrainingCoachLibraryInternal::MakeSignal(
TEXT("archive_retention"),
EHyperTwistCoachFocusLane::Stability,
Score,
TEXT("Archive retention needs tuning"),
FString::Printf(
TEXT("reopenRisk=%d, provisionalArchive=%d, stableArchive=%d"),
CoachMemorySnapshot.ArchiveReopenRiskCaseIds.Num(),
CoachMemorySnapshot.ProvisionalArchivedCoachCaseIds.Num(),
CoachMemorySnapshot.StableArchivedCoachCaseIds.Num()),
CoachMemorySnapshot.DominantCoachSuggestedMode,
CoachMemorySnapshot.DominantCoachSelectionPolicy);
Signal.SuggestedDeckId = CoachMemorySnapshot.FocusDeckId;
Signal.SuggestedMethodSegmentId = CoachMemorySnapshot.FocusMethodSegmentId;
Signal.SuggestedCaseIds = CoachMemorySnapshot.ArchiveReopenRiskCaseIds.Num() > 0
? CoachMemorySnapshot.ArchiveReopenRiskCaseIds
: CoachMemorySnapshot.ProvisionalArchivedCoachCaseIds;
Signals.Add(Signal);
}
if (CoachMemorySnapshot.bNeedsCoachIntervention
|| ReviewProgramSummary.bNeedsCoachIntervention
|| LearnerDeckStateSummary.OverdueCaseCount >= 3)
@ -330,7 +408,26 @@ FHyperTwistCoachBrief UHyperTwistTrainingCoachLibrary::DeriveCoachBrief(
if (Brief.FocusCaseIds.Num() == 0)
{
if (Brief.bNeedsCoachReview && CoachMemorySnapshot.OverdueCaseIds.Num() > 0)
if (CoachMemorySnapshot.EscalationCaseIds.Num() > 0)
{
Brief.FocusCaseIds = CoachMemorySnapshot.EscalationCaseIds;
}
else if (CoachMemorySnapshot.bHasPinnedCarryForwardPressure
&& CoachMemorySnapshot.PinnedCarryForwardCaseIds.Num() > 0)
{
Brief.FocusCaseIds = CoachMemorySnapshot.PinnedCarryForwardCaseIds;
}
else if (CoachMemorySnapshot.bHasRepeatRecommendationPressure
&& CoachMemorySnapshot.RecurringCoachCaseIds.Num() > 0)
{
Brief.FocusCaseIds = CoachMemorySnapshot.RecurringCoachCaseIds;
}
else if (CoachMemorySnapshot.bNeedsArchiveRetentionTuning
&& CoachMemorySnapshot.ArchiveReopenRiskCaseIds.Num() > 0)
{
Brief.FocusCaseIds = CoachMemorySnapshot.ArchiveReopenRiskCaseIds;
}
else if (Brief.bNeedsCoachReview && CoachMemorySnapshot.OverdueCaseIds.Num() > 0)
{
Brief.FocusCaseIds = CoachMemorySnapshot.OverdueCaseIds;
}
@ -364,6 +461,9 @@ FHyperTwistCoachBrief UHyperTwistTrainingCoachLibrary::DeriveCoachFollowUpBrief(
: ActionPlan.ReferenceUtc;
Brief.TrainingSessionId = OutcomeSummary.SourceSessionId;
Brief.SourceReviewPlanId = CurrentBrief.SourceReviewPlanId;
Brief.CarryForwardPlanId = ActionPlan.PlanId;
Brief.RootPlanId = !ActionPlan.RootPlanId.IsEmpty() ? ActionPlan.RootPlanId : ActionPlan.PlanId;
Brief.FollowUpDepth = ActionPlan.FollowUpDepth + 1;
Brief.FocusDeckId = !OutcomeSummary.FocusDeckId.IsEmpty()
? OutcomeSummary.FocusDeckId
: ActionPlan.FocusDeckId;

View file

@ -276,6 +276,78 @@ FHyperTwistTrainingCoachActionPlanOutcomeSummary UHyperTwistTrainingRuntimeLibra
return FHyperTwistTrainingCoachActionPlanOutcomeSummary();
}
FHyperTwistTrainingCoachActionSequenceSummary UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachActionSequenceSummary(
UObject* WorldContextObject
)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))
{
return TrainingSubsystem->GetActiveCoachActionSequenceSummary();
}
return FHyperTwistTrainingCoachActionSequenceSummary();
}
FHyperTwistTrainingCoachActionClosureSummary UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachActionClosureSummary(
UObject* WorldContextObject
)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))
{
return TrainingSubsystem->GetActiveCoachActionClosureSummary();
}
return FHyperTwistTrainingCoachActionClosureSummary();
}
FHyperTwistTrainingCoachClosureMemorySummary UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachClosureMemorySummary(
UObject* WorldContextObject
)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))
{
return TrainingSubsystem->GetActiveCoachClosureMemorySummary();
}
return FHyperTwistTrainingCoachClosureMemorySummary();
}
FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachRecommendationHistorySummary(
UObject* WorldContextObject
)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))
{
return TrainingSubsystem->GetActiveCoachRecommendationHistorySummary();
}
return FHyperTwistTrainingCoachRecommendationHistorySummary();
}
FHyperTwistTrainingCoachCarryForwardPolicySummary UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachCarryForwardPolicySummary(
UObject* WorldContextObject
)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))
{
return TrainingSubsystem->GetActiveCoachCarryForwardPolicySummary();
}
return FHyperTwistTrainingCoachCarryForwardPolicySummary();
}
FHyperTwistTrainingCoachArchivePolicySummary UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachArchivePolicySummary(
UObject* WorldContextObject
)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))
{
return TrainingSubsystem->GetActiveCoachArchivePolicySummary();
}
return FHyperTwistTrainingCoachArchivePolicySummary();
}
FHyperTwistCoachBrief UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachFollowUpBrief(UObject* WorldContextObject)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))

View file

@ -123,6 +123,36 @@ FHyperTwistTrainingCoachActionPlanOutcomeSummary UHyperTwistTrainingSubsystem::G
return ActiveCoachActionPlanOutcomeSummary;
}
FHyperTwistTrainingCoachActionSequenceSummary UHyperTwistTrainingSubsystem::GetActiveCoachActionSequenceSummary() const
{
return ActiveCoachActionSequenceSummary;
}
FHyperTwistTrainingCoachActionClosureSummary UHyperTwistTrainingSubsystem::GetActiveCoachActionClosureSummary() const
{
return ActiveCoachActionClosureSummary;
}
FHyperTwistTrainingCoachClosureMemorySummary UHyperTwistTrainingSubsystem::GetActiveCoachClosureMemorySummary() const
{
return ActiveCoachClosureMemorySummary;
}
FHyperTwistTrainingCoachRecommendationHistorySummary UHyperTwistTrainingSubsystem::GetActiveCoachRecommendationHistorySummary() const
{
return ActiveCoachRecommendationHistorySummary;
}
FHyperTwistTrainingCoachCarryForwardPolicySummary UHyperTwistTrainingSubsystem::GetActiveCoachCarryForwardPolicySummary() const
{
return ActiveCoachCarryForwardPolicySummary;
}
FHyperTwistTrainingCoachArchivePolicySummary UHyperTwistTrainingSubsystem::GetActiveCoachArchivePolicySummary() const
{
return ActiveCoachArchivePolicySummary;
}
FHyperTwistCoachBrief UHyperTwistTrainingSubsystem::GetActiveCoachFollowUpBrief() const
{
return ActiveCoachFollowUpBrief;
@ -1176,6 +1206,12 @@ void UHyperTwistTrainingSubsystem::RefreshRepositoryViews()
ActiveCoachActionPlan = FHyperTwistTrainingCoachActionPlan();
ActiveCoachActionPlanSummary = FHyperTwistTrainingCoachActionPlanSummary();
ActiveCoachActionPlanOutcomeSummary = FHyperTwistTrainingCoachActionPlanOutcomeSummary();
ActiveCoachActionSequenceSummary = FHyperTwistTrainingCoachActionSequenceSummary();
ActiveCoachActionClosureSummary = FHyperTwistTrainingCoachActionClosureSummary();
ActiveCoachClosureMemorySummary = FHyperTwistTrainingCoachClosureMemorySummary();
ActiveCoachRecommendationHistorySummary = FHyperTwistTrainingCoachRecommendationHistorySummary();
ActiveCoachCarryForwardPolicySummary = FHyperTwistTrainingCoachCarryForwardPolicySummary();
ActiveCoachArchivePolicySummary = FHyperTwistTrainingCoachArchivePolicySummary();
ActiveCoachFollowUpBrief = FHyperTwistCoachBrief();
ActiveLearnerMethodSegments.Reset();
ActiveLearnerPresets.Reset();
@ -1237,6 +1273,26 @@ void UHyperTwistTrainingSubsystem::RefreshRepositoryViews()
ActiveRunState.Session.UserId,
ActiveLearnerDeckStateSummary.ReferenceUtc
);
ActiveCoachClosureMemorySummary = UHyperTwistTrainingRepositoryLibrary::DeriveCoachClosureMemorySummary(
TrainingRepositoryState,
ActiveRunState.Session.UserId,
ActiveLearnerDeckStateSummary.ReferenceUtc
);
ActiveCoachRecommendationHistorySummary = UHyperTwistTrainingRepositoryLibrary::DeriveCoachRecommendationHistorySummary(
TrainingRepositoryState,
ActiveRunState.Session.UserId,
ActiveLearnerDeckStateSummary.ReferenceUtc
);
ActiveCoachCarryForwardPolicySummary = UHyperTwistTrainingRepositoryLibrary::DeriveCoachCarryForwardPolicySummary(
TrainingRepositoryState,
ActiveRunState.Session.UserId,
ActiveLearnerDeckStateSummary.ReferenceUtc
);
ActiveCoachArchivePolicySummary = UHyperTwistTrainingRepositoryLibrary::DeriveCoachArchivePolicySummary(
TrainingRepositoryState,
ActiveRunState.Session.UserId,
ActiveLearnerDeckStateSummary.ReferenceUtc
);
ActiveReplayReviewAnalytics = UHyperTwistReplayReviewLibrary::DeriveReplayReviewAnalytics(
ActiveRunState.ReplayPacket
);
@ -1284,6 +1340,20 @@ void UHyperTwistTrainingSubsystem::RefreshRepositoryViews()
ActiveLearnerDeckStateSummary.ReferenceUtc
)
: FHyperTwistTrainingCoachActionPlanOutcomeSummary();
ActiveCoachActionSequenceSummary = ActiveCoachActionPlan.IsStructurallyValid()
? UHyperTwistTrainingRepositoryLibrary::DeriveCoachActionSequenceSummary(
TrainingRepositoryState,
ActiveCoachActionPlan,
ActiveLearnerDeckStateSummary.ReferenceUtc
)
: FHyperTwistTrainingCoachActionSequenceSummary();
ActiveCoachActionClosureSummary = ActiveCoachActionPlan.IsStructurallyValid()
? UHyperTwistTrainingRepositoryLibrary::DeriveCoachActionClosureSummary(
TrainingRepositoryState,
ActiveCoachActionPlan,
ActiveLearnerDeckStateSummary.ReferenceUtc
)
: FHyperTwistTrainingCoachActionClosureSummary();
ActiveCoachSignals = UHyperTwistTrainingCoachLibrary::DeriveCoachSignals(
ActiveRunSummary,
ActiveDeckScopedStats,
@ -1305,6 +1375,7 @@ void UHyperTwistTrainingSubsystem::RefreshRepositoryViews()
ActiveRecognitionReplaySummary
);
ActiveCoachFollowUpBrief = ActiveCoachActionPlanOutcomeSummary.IsStructurallyValid()
&& ActiveCoachActionClosureSummary.bShouldSpawnFollowUp
? UHyperTwistTrainingCoachLibrary::DeriveCoachFollowUpBrief(
ActiveCoachBrief,
ActiveCoachActionPlan,

View file

@ -185,6 +185,24 @@ public:
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistTrainingCoachActionPlanOutcomeSummary MakeSampleTrainingCoachActionPlanOutcomeSummary();
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistTrainingCoachActionSequenceSummary MakeSampleTrainingCoachActionSequenceSummary();
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistTrainingCoachActionClosureSummary MakeSampleTrainingCoachActionClosureSummary();
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistTrainingCoachClosureMemorySummary MakeSampleTrainingCoachClosureMemorySummary();
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistTrainingCoachRecommendationHistorySummary MakeSampleTrainingCoachRecommendationHistorySummary();
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistTrainingCoachCarryForwardPolicySummary MakeSampleTrainingCoachCarryForwardPolicySummary();
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistTrainingCoachArchivePolicySummary MakeSampleTrainingCoachArchivePolicySummary();
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
static FHyperTwistCoachBrief MakeSampleTrainingCoachFollowUpBrief();

View file

@ -87,6 +87,15 @@ struct FHyperTwistCoachBrief
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SourceReviewPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString CarryForwardPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RootPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 FollowUpDepth = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistCoachPriority Priority = EHyperTwistCoachPriority::Informational;

View file

@ -361,6 +361,48 @@ public:
const FString& ReferenceUtc
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Repository|Coach")
static FHyperTwistTrainingCoachActionSequenceSummary DeriveCoachActionSequenceSummary(
const FHyperTwistTrainingRepositoryState& RepositoryState,
const FHyperTwistTrainingCoachActionPlan& AnchorPlan,
const FString& ReferenceUtc
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Repository|Coach")
static FHyperTwistTrainingCoachActionClosureSummary DeriveCoachActionClosureSummary(
const FHyperTwistTrainingRepositoryState& RepositoryState,
const FHyperTwistTrainingCoachActionPlan& AnchorPlan,
const FString& ReferenceUtc
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Repository|Coach")
static FHyperTwistTrainingCoachClosureMemorySummary DeriveCoachClosureMemorySummary(
const FHyperTwistTrainingRepositoryState& RepositoryState,
const FString& UserId,
const FString& ReferenceUtc
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Repository|Coach")
static FHyperTwistTrainingCoachRecommendationHistorySummary DeriveCoachRecommendationHistorySummary(
const FHyperTwistTrainingRepositoryState& RepositoryState,
const FString& UserId,
const FString& ReferenceUtc
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Repository|Coach")
static FHyperTwistTrainingCoachCarryForwardPolicySummary DeriveCoachCarryForwardPolicySummary(
const FHyperTwistTrainingRepositoryState& RepositoryState,
const FString& UserId,
const FString& ReferenceUtc
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Repository|Coach")
static FHyperTwistTrainingCoachArchivePolicySummary DeriveCoachArchivePolicySummary(
const FHyperTwistTrainingRepositoryState& RepositoryState,
const FString& UserId,
const FString& ReferenceUtc
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Repository")
static FHyperTwistTrainingCaseRecommendation MakeCaseRecommendation(
const FHyperTwistTrainingCase& TrainingCase,

View file

@ -90,6 +90,30 @@ public:
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachActionPlanOutcomeSummary GetActiveTrainingCoachActionPlanOutcomeSummary(UObject* WorldContextObject);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachActionSequenceSummary GetActiveTrainingCoachActionSequenceSummary(UObject* WorldContextObject);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachActionClosureSummary GetActiveTrainingCoachActionClosureSummary(UObject* WorldContextObject);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachClosureMemorySummary GetActiveTrainingCoachClosureMemorySummary(UObject* WorldContextObject);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachRecommendationHistorySummary GetActiveTrainingCoachRecommendationHistorySummary(
UObject* WorldContextObject
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachCarryForwardPolicySummary GetActiveTrainingCoachCarryForwardPolicySummary(
UObject* WorldContextObject
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachArchivePolicySummary GetActiveTrainingCoachArchivePolicySummary(
UObject* WorldContextObject
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistCoachBrief GetActiveTrainingCoachFollowUpBrief(UObject* WorldContextObject);

View file

@ -83,6 +83,24 @@ public:
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachActionPlanOutcomeSummary GetActiveCoachActionPlanOutcomeSummary() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachActionSequenceSummary GetActiveCoachActionSequenceSummary() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachActionClosureSummary GetActiveCoachActionClosureSummary() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachClosureMemorySummary GetActiveCoachClosureMemorySummary() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachRecommendationHistorySummary GetActiveCoachRecommendationHistorySummary() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachCarryForwardPolicySummary GetActiveCoachCarryForwardPolicySummary() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistTrainingCoachArchivePolicySummary GetActiveCoachArchivePolicySummary() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
FHyperTwistCoachBrief GetActiveCoachFollowUpBrief() const;
@ -414,6 +432,24 @@ private:
UPROPERTY()
FHyperTwistTrainingCoachActionPlanOutcomeSummary ActiveCoachActionPlanOutcomeSummary;
UPROPERTY()
FHyperTwistTrainingCoachActionSequenceSummary ActiveCoachActionSequenceSummary;
UPROPERTY()
FHyperTwistTrainingCoachActionClosureSummary ActiveCoachActionClosureSummary;
UPROPERTY()
FHyperTwistTrainingCoachClosureMemorySummary ActiveCoachClosureMemorySummary;
UPROPERTY()
FHyperTwistTrainingCoachRecommendationHistorySummary ActiveCoachRecommendationHistorySummary;
UPROPERTY()
FHyperTwistTrainingCoachCarryForwardPolicySummary ActiveCoachCarryForwardPolicySummary;
UPROPERTY()
FHyperTwistTrainingCoachArchivePolicySummary ActiveCoachArchivePolicySummary;
UPROPERTY()
FHyperTwistCoachBrief ActiveCoachFollowUpBrief;

View file

@ -1734,6 +1734,39 @@ struct FHyperTwistTrainingCoachMemorySnapshot
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> PendingReviewPlanIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ArchivedResolvedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> PersistentCoachWeakCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> EscalationCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> RecurringCoachCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> SuppressedResolvedCoachCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> PinnedCarryForwardCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> LongTermArchivedCoachCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ExpiredCarryForwardCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> StableArchivedCoachCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ProvisionalArchivedCoachCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ArchiveReopenRiskCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString LastTrainingAtUtc;
@ -1743,6 +1776,31 @@ struct FHyperTwistTrainingCoachMemorySnapshot
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ActiveTrainingDayStreak = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ClosedCoachSequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 EscalatedCoachSequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 FollowUpReadyCoachSequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 RepeatRecommendationSequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingDeliveryMode DominantCoachSuggestedMode = EHyperTwistTrainingDeliveryMode::Timer;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingSelectionPolicy DominantCoachSelectionPolicy =
EHyperTwistTrainingSelectionPolicy::Weighted;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ArchiveStabilityScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ArchiveRetentionTuningScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNeedsCoachIntervention = false;
@ -1751,6 +1809,18 @@ struct FHyperTwistTrainingCoachMemorySnapshot
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNeedsCadenceRecovery = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasRepeatRecommendationPressure = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasPinnedCarryForwardPressure = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasStableArchiveMemory = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNeedsArchiveRetentionTuning = false;
};
USTRUCT(BlueprintType)
@ -2714,6 +2784,12 @@ struct FHyperTwistTrainingCoachActionPlan
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SourceReviewPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ParentPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RootPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusDeckId;
@ -2750,6 +2826,9 @@ struct FHyperTwistTrainingCoachActionPlan
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingCoachActionPlanState PlanState = EHyperTwistTrainingCoachActionPlanState::Draft;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 FollowUpDepth = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString CreatedAtUtc;
@ -2961,6 +3040,465 @@ struct FHyperTwistTrainingCoachActionPlanOutcomeSummary
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachActionSequenceSummary
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString UserId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReferenceUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RootPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString LatestPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusDeckId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusMethodSegmentId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 PlanCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 CarryForwardPlanCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ActivePlanCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 CompletedPlanCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 AbortedPlanCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 MaxFollowUpDepth = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 TotalFocusCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 UnresolvedFollowUpCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float AverageCompletionRate = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float AverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float LatestOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasOpenPlan = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNeedsMoreFollowUp = false;
bool IsStructurallyValid() const
{
return !UserId.IsEmpty() && !RootPlanId.IsEmpty() && PlanCount > 0;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachActionClosureSummary
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString UserId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReferenceUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RootPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString LatestPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusDeckId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusMethodSegmentId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ClosureLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingDeliveryMode RecommendedNextMode = EHyperTwistTrainingDeliveryMode::Timer;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ResolvedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> PersistentWeakCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> UnresolvedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 TotalAttemptCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 RepeatedFailureCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ResolvedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 PersistentWeakCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 UnresolvedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ClosureScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bSequenceClosed = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bShouldArchiveResolvedCases = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bShouldSpawnFollowUp = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNeedsEscalation = false;
bool IsStructurallyValid() const
{
return !UserId.IsEmpty() && !RootPlanId.IsEmpty();
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachClosureMemorySummary
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString UserId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReferenceUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusRootPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusDeckId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusMethodSegmentId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusClosureLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 SequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ClosedSequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 EscalatedSequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 FollowUpReadySequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ArchivedResolvedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 PersistentWeakCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float AverageClosureScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ArchivedResolvedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> PersistentWeakCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> EscalationCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasEscalationPressure = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasFollowUpPressure = false;
bool IsStructurallyValid() const
{
return !UserId.IsEmpty() && SequenceCount > 0;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachRecommendationHistorySummary
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString UserId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReferenceUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString LatestPlanId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusDeckId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusMethodSegmentId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString DominantPrimaryActionLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingDeliveryMode DominantSuggestedMode = EHyperTwistTrainingDeliveryMode::Timer;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingSelectionPolicy DominantSelectionPolicy =
EHyperTwistTrainingSelectionPolicy::Weighted;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 SequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 PlanCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 RepeatRecommendationSequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 EscalatedSequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 FollowUpReadySequenceCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 RecurringCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ArchivedResolvedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 EscalationCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float AverageClosureScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float AverageFollowUpDepth = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> RecurringCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ArchivedResolvedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> EscalationCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasRepeatRecommendationPressure = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bShouldBiasCoachReviewed = false;
bool IsStructurallyValid() const
{
return !UserId.IsEmpty() && SequenceCount > 0;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachCarryForwardPolicySummary
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString UserId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReferenceUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusDeckId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusMethodSegmentId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingDeliveryMode DominantSuggestedMode = EHyperTwistTrainingDeliveryMode::Timer;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingSelectionPolicy DominantSelectionPolicy =
EHyperTwistTrainingSelectionPolicy::Weighted;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> SuppressedResolvedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> PinnedCarryForwardCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> RecurringCarryForwardCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> EscalationCarryForwardCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 SuppressedResolvedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 PinnedCarryForwardCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 RecurringCarryForwardCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 EscalationCarryForwardCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float CarryForwardIntensityScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bSuppressResolvedResurfacing = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bPinRecurringCases = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bBiasCoachReviewed = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNeedsEscalationHandOff = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasActiveCarryForwardPressure = false;
bool IsStructurallyValid() const
{
return !UserId.IsEmpty();
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachArchivePolicySummary
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString UserId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReferenceUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusDeckId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FocusMethodSegmentId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingDeliveryMode DominantSuggestedMode = EHyperTwistTrainingDeliveryMode::Timer;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingSelectionPolicy DominantSelectionPolicy =
EHyperTwistTrainingSelectionPolicy::Weighted;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> LongTermArchivedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ExpiredCarryForwardCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> RetainedCarryForwardCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> EscalationRetainedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> SuppressedResolvedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> StableLongTermArchivedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ProvisionalArchivedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
TArray<FString> ReopenRiskArchivedCaseIds;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 LongTermArchivedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ExpiredCarryForwardCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 RetainedCarryForwardCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 EscalationRetainedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 SuppressedResolvedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 StableLongTermArchivedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ProvisionalArchivedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ReopenRiskArchivedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ArchiveStabilityScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ArchiveRetentionTuningScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bShouldExpireResolvedCarryForward = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bShouldRetainEscalationCarryForward = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasStableArchiveMemory = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasActiveArchivePressure = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNeedsArchiveRetentionTuning = false;
bool IsStructurallyValid() const
{
return !UserId.IsEmpty();
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingRepositoryState
{