Expose dashboard method-drill recovery history inspect surfaces

This commit is contained in:
axiomlogicnexus 2026-05-09 17:39:53 +02:00
parent 47ab518373
commit 28d846ec1d
5 changed files with 887 additions and 2 deletions

View file

@ -7381,6 +7381,453 @@ UHyperTwistCoachDashboardWidget::GetSelectedClosureRecoveryHistoryInspectSurface
return Surface;
}
FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface
UHyperTwistCoachDashboardWidget::GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface() const
{
FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface Surface;
Surface.Headline = TEXT("Method-drill recovery outcome history");
TArray<int32> MethodDrillRecoveryHistoryIndices;
HyperTwistCoachDashboardWidgetInternal::CollectMethodDrillRecoveryOutcomeIndices(
QueueRecoveryOutcomeHistory,
MethodDrillRecoveryHistoryIndices);
const int32 SelectedHistoryPosition =
MethodDrillRecoveryHistoryIndices.IndexOfByKey(SelectedMethodDrillRecoveryOutcomeIndex);
const FHyperTwistCoachDashboardQueueRecoveryOutcome* SelectedOutcome =
SelectedMethodDrillRecoveryOutcomeIndex >= 0
&& SelectedMethodDrillRecoveryOutcomeIndex < QueueRecoveryOutcomeHistory.Num()
? &QueueRecoveryOutcomeHistory[SelectedMethodDrillRecoveryOutcomeIndex]
: nullptr;
Surface.HistoryEntryCount = MethodDrillRecoveryHistoryIndices.Num();
Surface.SelectedHistoryIndex = SelectedHistoryPosition;
Surface.bHasSelectedEntry =
SelectedOutcome != nullptr
&& SelectedOutcome->IsStructurallyValid()
&& SelectedHistoryPosition != INDEX_NONE;
if (!Surface.bHasSelectedEntry)
{
Surface.StatusLine =
TEXT("Drill recovery history: no retained drill-weighted queue-recovery outcomes recorded yet.");
Surface.DetailLine =
TEXT("Drill recovery detail: when drill-weighted queue recovery actions are applied, their retained before/after friction outcomes will accumulate here for later comparison against generic recovery.");
return Surface;
}
Surface.RecordedAtUtc = SelectedOutcome->RecordedAtUtc;
Surface.SourceLabel = SelectedOutcome->SourceLabel;
Surface.SourceDescription =
HyperTwistCoachDashboardWidgetInternal::DescribeCoachMemorySourceLabel(
SelectedOutcome->SourceLabel);
Surface.AppliedActionLabel = SelectedOutcome->AppliedActionLabel;
Surface.AppliedAction =
HyperTwistCoachDashboardWidgetInternal::ToQueueRecoveryAction(
SelectedOutcome->ActionKind);
Surface.BeforePressureScore = SelectedOutcome->BeforePressureScore;
Surface.AfterPressureScore = SelectedOutcome->AfterPressureScore;
Surface.BeforeDeferredEventCount = SelectedOutcome->BeforeDeferredEventCount;
Surface.AfterDeferredEventCount = SelectedOutcome->AfterDeferredEventCount;
Surface.bSucceeded = SelectedOutcome->bSucceeded;
Surface.bReducedFriction = SelectedOutcome->bReducedFriction;
Surface.bShiftedFriction = SelectedOutcome->bShiftedFriction;
Surface.bBeforeBlockedFollowUp = SelectedOutcome->bBeforeBlockedFollowUp;
Surface.bAfterBlockedFollowUp = SelectedOutcome->bAfterBlockedFollowUp;
Surface.bBeforeOutstandingDeferred = SelectedOutcome->bBeforeOutstandingDeferred;
Surface.bAfterOutstandingDeferred = SelectedOutcome->bAfterOutstandingDeferred;
Surface.bBeforeCompletionGap = SelectedOutcome->bBeforeCompletionGap;
Surface.bAfterCompletionGap = SelectedOutcome->bAfterCompletionGap;
Surface.bUsedDeferredFirstSuppressionSignal =
SelectedOutcome->bUsedDeferredFirstSuppressionSignal;
Surface.bUsedMethodDrillHandoffSignal = SelectedOutcome->bUsedMethodDrillHandoffSignal;
Surface.bUsedNarrowMethodDrillPacketStructureRecovery =
SelectedOutcome->bUsedNarrowMethodDrillPacketStructureRecovery;
Surface.bUsedBroadMethodDrillPacketStructureRecovery =
SelectedOutcome->bUsedBroadMethodDrillPacketStructureRecovery;
Surface.bUsedStrongRetainedMethodDrillRecoveryPosture =
SelectedOutcome->bUsedStrongRetainedMethodDrillRecoveryPosture;
Surface.bUsedWeakRetainedMethodDrillRecoveryPosture =
SelectedOutcome->bUsedWeakRetainedMethodDrillRecoveryPosture;
Surface.bUsedReliableTrustedTightStructurePlanRecovery =
SelectedOutcome->bUsedReliableTrustedTightStructurePlanRecovery;
Surface.bUsedReliableTrustedBroadStructurePlanRecovery =
SelectedOutcome->bUsedReliableTrustedBroadStructurePlanRecovery;
Surface.bUsedReliableAlignedTrustedTightStructurePlanRecovery =
SelectedOutcome->bUsedReliableAlignedTrustedTightStructurePlanRecovery;
Surface.bUsedReliableAlignedTrustedBroadStructurePlanRecovery =
SelectedOutcome->bUsedReliableAlignedTrustedBroadStructurePlanRecovery;
Surface.VerdictLine = !SelectedOutcome->bSucceeded
? TEXT("failed")
: (SelectedOutcome->bReducedFriction
? TEXT("reduced friction")
: (SelectedOutcome->bShiftedFriction
? TEXT("shifted friction")
: TEXT("no immediate change")));
Surface.PacketStructureRecoveryLine =
SelectedOutcome->bUsedNarrowMethodDrillPacketStructureRecovery
? TEXT("narrow continuation")
: (SelectedOutcome->bUsedBroadMethodDrillPacketStructureRecovery
? TEXT("broad redirect")
: TEXT("none"));
Surface.RetainedPostureLine =
HyperTwistCoachDashboardWidgetInternal::DescribeRetainedMethodDrillRecoveryPosture(
SelectedOutcome->bUsedStrongRetainedMethodDrillRecoveryPosture,
SelectedOutcome->bUsedWeakRetainedMethodDrillRecoveryPosture);
Surface.ReliablePlanRecoveryLine =
SelectedOutcome->bUsedReliableAlignedTrustedTightStructurePlanRecovery
? TEXT("aligned reliable tight continuation")
: (SelectedOutcome->bUsedReliableAlignedTrustedBroadStructurePlanRecovery
? TEXT("aligned reliable broad redirect")
: (SelectedOutcome->bUsedReliableTrustedTightStructurePlanRecovery
? TEXT("trusted tight continuation")
: (SelectedOutcome->bUsedReliableTrustedBroadStructurePlanRecovery
? TEXT("trusted broad redirect")
: TEXT("none"))));
Surface.StatusLine = FString::Printf(
TEXT("Drill recovery history: %d entries | selected %d/%d | %s | %s | Packet recovery: %s | Stance: %s | Recorded: %s"),
MethodDrillRecoveryHistoryIndices.Num(),
SelectedHistoryPosition + 1,
MethodDrillRecoveryHistoryIndices.Num(),
*SelectedOutcome->AppliedActionLabel,
*Surface.VerdictLine,
*Surface.PacketStructureRecoveryLine,
*Surface.RetainedPostureLine,
*SelectedOutcome->RecordedAtUtc);
Surface.DetailLine = FString::Printf(
TEXT("Source: %s | Pressure %.2f -> %.2f | Deferred %d -> %d | Blocked follow-up %s -> %s | Outstanding deferred %s -> %s | Completion gap %s -> %s | deferred-first weighted: %s | packet-structure recovery: %s | retained posture: %s"),
*Surface.SourceDescription,
SelectedOutcome->BeforePressureScore,
SelectedOutcome->AfterPressureScore,
SelectedOutcome->BeforeDeferredEventCount,
SelectedOutcome->AfterDeferredEventCount,
SelectedOutcome->bBeforeBlockedFollowUp ? TEXT("yes") : TEXT("no"),
SelectedOutcome->bAfterBlockedFollowUp ? TEXT("yes") : TEXT("no"),
SelectedOutcome->bBeforeOutstandingDeferred ? TEXT("yes") : TEXT("no"),
SelectedOutcome->bAfterOutstandingDeferred ? TEXT("yes") : TEXT("no"),
SelectedOutcome->bBeforeCompletionGap ? TEXT("yes") : TEXT("no"),
SelectedOutcome->bAfterCompletionGap ? TEXT("yes") : TEXT("no"),
SelectedOutcome->bUsedDeferredFirstSuppressionSignal ? TEXT("yes") : TEXT("no"),
*Surface.PacketStructureRecoveryLine,
*Surface.RetainedPostureLine);
return Surface;
}
FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface
UHyperTwistCoachDashboardWidget::GetSelectedMethodDrillRecoveryMemoryHistoryInspectSurface() const
{
FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface Surface;
Surface.Headline = TEXT("Method-drill recovery memory history");
const HyperTwistCoachDashboardWidgetInternal::FMethodDrillRecoveryPlanComparisonSummary PlanComparisonSummary =
HyperTwistCoachDashboardWidgetInternal::DeriveMethodDrillRecoveryPlanComparisonSummary(
MethodDrillRecoveryMemoryHistoryEntries);
const FHyperTwistCoachDashboardMethodDrillRecoveryMemoryHistoryEntry* SelectedEntry =
SelectedMethodDrillRecoveryMemoryHistoryIndex >= 0
&& SelectedMethodDrillRecoveryMemoryHistoryIndex
< MethodDrillRecoveryMemoryHistoryEntries.Num()
? &MethodDrillRecoveryMemoryHistoryEntries[SelectedMethodDrillRecoveryMemoryHistoryIndex]
: nullptr;
Surface.SelectedEntryIndex = SelectedMethodDrillRecoveryMemoryHistoryIndex;
Surface.HistoryEntryCount = MethodDrillRecoveryMemoryHistoryEntries.Num();
Surface.bHasSelectedEntry =
SelectedEntry != nullptr && SelectedEntry->IsStructurallyValid();
if (!Surface.bHasSelectedEntry)
{
Surface.StatusLine =
TEXT("Drill recovery memory history: no retained upstream drill-recovery memory shifts recorded yet.");
Surface.DetailLine =
TEXT("Drill recovery memory detail: retained upstream strong-vs-weak drill-recovery pressure, resulting generated packet lane, and resulting plan-source vs generated-plan alignment will accumulate here for later comparison.");
return Surface;
}
const HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias MemoryBias =
SelectedEntry->bStrongPressureDominant
? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Strong
: (SelectedEntry->bWeakPressureDominant
? HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::Weak
: HyperTwistCoachDashboardWidgetInternal::EMethodDrillRecoveryMemoryBias::None);
Surface.RecordedAtUtc = SelectedEntry->RecordedAtUtc;
Surface.PreferredRecoveryAction = SelectedEntry->PreferredRecoveryAction;
Surface.PreferredRecoveryActionLabel =
SelectedEntry->PreferredRecoveryAction == EHyperTwistTrainingQueueRecoveryAction::None
? TEXT("none")
: HyperTwistCoachDashboardWidgetInternal::EnumDisplayName(
SelectedEntry->PreferredRecoveryAction);
Surface.PreferredRecoveryActionSourceLabel =
SelectedEntry->PreferredRecoveryActionSourceLabel;
Surface.PreferredRecoveryActionSourceDescription =
SelectedEntry->PreferredRecoveryActionSourceLabel.IsEmpty()
? TEXT("n/a")
: HyperTwistCoachDashboardWidgetInternal::DescribeCoachMemorySourceLabel(
SelectedEntry->PreferredRecoveryActionSourceLabel);
Surface.RecommendedHandoffKindLabel = SelectedEntry->RecommendedHandoffKindLabel;
Surface.QueueRecoveryStatusLine = SelectedEntry->QueueRecoveryStatusLine;
Surface.HandoffRecommendationStatusLine =
SelectedEntry->HandoffRecommendationStatusLine;
Surface.GeneratedGuidancePacketKindLabel =
SelectedEntry->GeneratedGuidancePacketKindLabel.IsEmpty()
? TEXT("none")
: SelectedEntry->GeneratedGuidancePacketKindLabel;
Surface.GeneratedGuidancePacketSourceLabel =
SelectedEntry->GeneratedGuidancePacketSourceLabel;
Surface.GeneratedGuidancePacketSourceDescription =
SelectedEntry->GeneratedGuidancePacketSourceLabel.IsEmpty()
? TEXT("n/a")
: HyperTwistCoachDashboardWidgetInternal::DescribeCoachMemorySourceLabel(
SelectedEntry->GeneratedGuidancePacketSourceLabel);
Surface.GeneratedGuidancePacketHeadline =
SelectedEntry->GeneratedGuidancePacketHeadline.IsEmpty()
? TEXT("n/a")
: SelectedEntry->GeneratedGuidancePacketHeadline;
Surface.GeneratedGuidancePacketActionLabel =
SelectedEntry->GeneratedGuidancePacketActionLabel.IsEmpty()
? TEXT("n/a")
: SelectedEntry->GeneratedGuidancePacketActionLabel;
Surface.GeneratedGuidancePacketFocusCaseCount =
SelectedEntry->GeneratedGuidancePacketFocusCaseCount;
Surface.GeneratedPlanSuggestedMode = SelectedEntry->GeneratedPlanSuggestedMode;
Surface.GeneratedPlanModeLabel =
SelectedEntry->GeneratedGuidancePacketKindLabel.IsEmpty()
? TEXT("n/a")
: HyperTwistCoachDashboardWidgetInternal::EnumDisplayName(
SelectedEntry->GeneratedPlanSuggestedMode);
Surface.GeneratedPlanSuggestedSelectionPolicy =
SelectedEntry->GeneratedPlanSuggestedSelectionPolicy;
Surface.GeneratedPlanSelectionLabel =
SelectedEntry->GeneratedGuidancePacketKindLabel.IsEmpty()
? TEXT("n/a")
: HyperTwistCoachDashboardWidgetInternal::EnumDisplayName(
SelectedEntry->GeneratedPlanSuggestedSelectionPolicy);
Surface.GeneratedPlanPostureLabel =
SelectedEntry->GeneratedPlanPostureLabel.IsEmpty()
? TEXT("n/a")
: SelectedEntry->GeneratedPlanPostureLabel;
Surface.DominantPressureLine =
SelectedEntry->bStrongPressureDominant
? TEXT("strong")
: (SelectedEntry->bWeakPressureDominant ? TEXT("weak") : TEXT("balanced"));
Surface.StructureBiasLine =
SelectedEntry->bNarrowPacketStructureRecoveryDominant
? TEXT("narrow continuation")
: (SelectedEntry->bBroadPacketStructureRecoveryDominant
? TEXT("broad redirect")
: TEXT("none"));
Surface.ReliablePlanLine = [&]() -> FString
{
if (SelectedEntry->bReliableAlignedTrustedTightStructurePlanOutcomeDominant)
{
return TEXT("aligned reliable trusted tight launched-plan continuation");
}
if (SelectedEntry->bReliableAlignedTrustedBroadStructurePlanOutcomeDominant)
{
return TEXT("aligned reliable trusted broad launched-plan redirect");
}
if (SelectedEntry->bReliableAlignedTrustedTightStructurePlanDominant)
{
return TEXT("aligned reliable trusted tight continuation");
}
if (SelectedEntry->bReliableAlignedTrustedBroadStructurePlanDominant)
{
return TEXT("aligned reliable trusted broad redirect");
}
if (SelectedEntry->bReliableTrustedTightStructurePlanDominant)
{
return TEXT("reliable trusted tight continuation");
}
if (SelectedEntry->bReliableTrustedBroadStructurePlanDominant)
{
return TEXT("reliable trusted broad redirect");
}
return TEXT("none");
}();
Surface.MemoryBiasLine =
HyperTwistCoachDashboardWidgetInternal::DescribeMethodDrillRecoveryMemoryBias(
MemoryBias);
Surface.PlanSourceLine =
SelectedEntry->PreferredRecoveryActionSourceLabel.IsEmpty()
? TEXT("none")
: HyperTwistCoachDashboardWidgetInternal::DescribeMethodDrillRecoveryPlanSourceLabel(
SelectedEntry->PreferredRecoveryActionSourceLabel);
Surface.PlanAlignmentLine =
HyperTwistCoachDashboardWidgetInternal::DescribeMethodDrillRecoveryPlanAlignment(
*SelectedEntry);
Surface.ComparisonPreferenceLine =
HyperTwistCoachDashboardWidgetInternal::DescribeMethodDrillRecoveryPlanComparisonPreference(
PlanComparisonSummary);
Surface.GeneratedPacketStanceLine =
SelectedEntry->bGeneratedPacketUsedStrongRetainedMethodDrillRecoveryPosture
? TEXT("strong retained drill-recovery continuation")
: (SelectedEntry->bGeneratedPacketUsedWeakRetainedMethodDrillRecoveryPosture
? TEXT("weak retained drill-recovery redirect")
: (SelectedEntry->bGeneratedPacketUsedGenericMethodDrillRecoveryMemory
? TEXT("generic drill-recovery memory")
: TEXT("none")));
Surface.MethodDrillRecoveryHistoryCount = SelectedEntry->MethodDrillRecoveryHistoryCount;
Surface.StrongMethodDrillRecoveryHistoryCount =
SelectedEntry->StrongMethodDrillRecoveryHistoryCount;
Surface.WeakMethodDrillRecoveryHistoryCount =
SelectedEntry->WeakMethodDrillRecoveryHistoryCount;
Surface.NarrowMethodDrillPacketStructureRecoveryLaunchCount =
SelectedEntry->NarrowMethodDrillPacketStructureRecoveryLaunchCount;
Surface.NarrowMethodDrillPacketStructureRecoveryLaunchReducedCount =
SelectedEntry->NarrowMethodDrillPacketStructureRecoveryLaunchReducedCount;
Surface.BroadMethodDrillPacketStructureRecoveryPromoteCount =
SelectedEntry->BroadMethodDrillPacketStructureRecoveryPromoteCount;
Surface.BroadMethodDrillPacketStructureRecoveryPromoteReducedCount =
SelectedEntry->BroadMethodDrillPacketStructureRecoveryPromoteReducedCount;
Surface.TrustedTightMethodDrillRecoveryStructurePlanHistoryCount =
SelectedEntry->TrustedTightMethodDrillRecoveryStructurePlanHistoryCount;
Surface.TrustedBroadMethodDrillRecoveryStructurePlanHistoryCount =
SelectedEntry->TrustedBroadMethodDrillRecoveryStructurePlanHistoryCount;
Surface.TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore =
SelectedEntry->TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore;
Surface.TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore =
SelectedEntry->TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore;
Surface.ReliableTrustedTightMethodDrillRecoveryStructurePlanHistoryCount =
SelectedEntry->ReliableTrustedTightMethodDrillRecoveryStructurePlanHistoryCount;
Surface.ReliableTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount =
SelectedEntry->ReliableTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount;
Surface.ReliableTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore =
SelectedEntry->ReliableTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore;
Surface.ReliableTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore =
SelectedEntry->ReliableTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore;
Surface.ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanHistoryCount =
SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanHistoryCount;
Surface.ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount =
SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount;
Surface.ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore =
SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore;
Surface.ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore =
SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore;
Surface.ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeHistoryCount =
SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeHistoryCount;
Surface.ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeHistoryCount =
SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeHistoryCount;
Surface.ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeAverageScore =
SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeAverageScore;
Surface.ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeAverageScore =
SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeAverageScore;
Surface.MethodDrillRecoveryAverageOutcomeScore =
SelectedEntry->MethodDrillRecoveryAverageOutcomeScore;
Surface.bStrongPressureDominant = SelectedEntry->bStrongPressureDominant;
Surface.bWeakPressureDominant = SelectedEntry->bWeakPressureDominant;
Surface.bNarrowPacketStructureRecoveryDominant =
SelectedEntry->bNarrowPacketStructureRecoveryDominant;
Surface.bBroadPacketStructureRecoveryDominant =
SelectedEntry->bBroadPacketStructureRecoveryDominant;
Surface.bReliableTrustedTightStructurePlanDominant =
SelectedEntry->bReliableTrustedTightStructurePlanDominant;
Surface.bReliableTrustedBroadStructurePlanDominant =
SelectedEntry->bReliableTrustedBroadStructurePlanDominant;
Surface.bReliableAlignedTrustedTightStructurePlanDominant =
SelectedEntry->bReliableAlignedTrustedTightStructurePlanDominant;
Surface.bReliableAlignedTrustedBroadStructurePlanDominant =
SelectedEntry->bReliableAlignedTrustedBroadStructurePlanDominant;
Surface.bReliableAlignedTrustedTightStructurePlanOutcomeDominant =
SelectedEntry->bReliableAlignedTrustedTightStructurePlanOutcomeDominant;
Surface.bReliableAlignedTrustedBroadStructurePlanOutcomeDominant =
SelectedEntry->bReliableAlignedTrustedBroadStructurePlanOutcomeDominant;
Surface.bGeneratedPacketUsedStrongRetainedMethodDrillRecoveryPosture =
SelectedEntry->bGeneratedPacketUsedStrongRetainedMethodDrillRecoveryPosture;
Surface.bGeneratedPacketUsedWeakRetainedMethodDrillRecoveryPosture =
SelectedEntry->bGeneratedPacketUsedWeakRetainedMethodDrillRecoveryPosture;
Surface.bGeneratedPacketUsedGenericMethodDrillRecoveryMemory =
SelectedEntry->bGeneratedPacketUsedGenericMethodDrillRecoveryMemory;
Surface.bGeneratedPlanUsedTightStructureContinuationPosture =
SelectedEntry->bGeneratedPlanUsedTightStructureContinuationPosture;
Surface.bGeneratedPlanUsedBroadStructureRedirectPosture =
SelectedEntry->bGeneratedPlanUsedBroadStructureRedirectPosture;
Surface.bGeneratedPlanUsedReliableTrustedTightStructureContinuationPosture =
SelectedEntry->bGeneratedPlanUsedReliableTrustedTightStructureContinuationPosture;
Surface.bGeneratedPlanUsedReliableTrustedBroadStructureRedirectPosture =
SelectedEntry->bGeneratedPlanUsedReliableTrustedBroadStructureRedirectPosture;
Surface.bGeneratedPlanUsedReliableAlignedTrustedTightStructureContinuationPosture =
SelectedEntry->bGeneratedPlanUsedReliableAlignedTrustedTightStructureContinuationPosture;
Surface.bGeneratedPlanUsedReliableAlignedTrustedBroadStructureRedirectPosture =
SelectedEntry->bGeneratedPlanUsedReliableAlignedTrustedBroadStructureRedirectPosture;
Surface.bUsedMethodDrillRecoveryMemoryForRecovery =
SelectedEntry->bUsedMethodDrillRecoveryMemoryForRecovery;
Surface.bUsedMethodDrillRecoveryMemoryForHandoff =
SelectedEntry->bUsedMethodDrillRecoveryMemoryForHandoff;
Surface.StatusLine = FString::Printf(
TEXT("Drill recovery memory history: %d entries | selected %d/%d | %s | %s | Packet: %s | Stance: %s | Plan source: %s | Plan align: %s | Reliable stance: %s | Plan: %s | Recorded: %s"),
MethodDrillRecoveryMemoryHistoryEntries.Num(),
SelectedMethodDrillRecoveryMemoryHistoryIndex + 1,
MethodDrillRecoveryMemoryHistoryEntries.Num(),
*Surface.PreferredRecoveryActionLabel,
*SelectedEntry->RecommendedHandoffKindLabel,
*Surface.GeneratedGuidancePacketKindLabel,
*Surface.MemoryBiasLine,
*Surface.PlanSourceLine,
*Surface.PlanAlignmentLine,
*Surface.ReliablePlanLine,
*Surface.GeneratedPlanPostureLabel,
*SelectedEntry->RecordedAtUtc);
Surface.DetailLine = FString::Printf(
TEXT("Source: %s | Strong/weak/history %d/%d/%d avg %.1f | Structure recovery narrow %d/%d broad %d/%d | Trusted plan history tight/broad %d/%d avg %.1f/%.1f | Aligned reliable plan outcome history tight/broad %d/%d avg %.1f/%.1f | Aligned reliable plan history tight/broad %d/%d avg %.1f/%.1f | Reliable trusted plan history tight/broad %d/%d avg %.1f/%.1f | Dominant pressure: %s | Structure bias: %s | Reliable stance: %s | Stance: %s | Recovery memory tipped: %s | Handoff memory tipped: %s | Packet kind: %s | Packet source: %s | Packet headline: %s | Packet action: %s | Packet focus %d | Plan mode: %s | Plan selection: %s | Plan posture: %s | Plan source: %s | Plan alignment: %s | Plan comparison tight aligned/diverged %d/%d broad aligned/diverged %d/%d aligned reliable tight aligned/diverged %d/%d aligned reliable broad aligned/diverged %d/%d reliable tight aligned/diverged %d/%d reliable broad aligned/diverged %d/%d | Plan preferred: %s | Tight/broad structure plan: %s/%s | Packet stance: %s | Recovery posture: %s | Handoff posture: %s"),
*Surface.PreferredRecoveryActionSourceDescription,
SelectedEntry->StrongMethodDrillRecoveryHistoryCount,
SelectedEntry->WeakMethodDrillRecoveryHistoryCount,
SelectedEntry->MethodDrillRecoveryHistoryCount,
SelectedEntry->MethodDrillRecoveryAverageOutcomeScore,
SelectedEntry->NarrowMethodDrillPacketStructureRecoveryLaunchCount,
SelectedEntry->NarrowMethodDrillPacketStructureRecoveryLaunchReducedCount,
SelectedEntry->BroadMethodDrillPacketStructureRecoveryPromoteCount,
SelectedEntry->BroadMethodDrillPacketStructureRecoveryPromoteReducedCount,
SelectedEntry->TrustedTightMethodDrillRecoveryStructurePlanHistoryCount,
SelectedEntry->TrustedBroadMethodDrillRecoveryStructurePlanHistoryCount,
SelectedEntry->TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore,
SelectedEntry->TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore,
SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeHistoryCount,
SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeHistoryCount,
SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeAverageScore,
SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeAverageScore,
SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanHistoryCount,
SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount,
SelectedEntry->ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore,
SelectedEntry->ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore,
SelectedEntry->ReliableTrustedTightMethodDrillRecoveryStructurePlanHistoryCount,
SelectedEntry->ReliableTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount,
SelectedEntry->ReliableTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore,
SelectedEntry->ReliableTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore,
*Surface.DominantPressureLine,
*Surface.StructureBiasLine,
*Surface.ReliablePlanLine,
*Surface.MemoryBiasLine,
SelectedEntry->bUsedMethodDrillRecoveryMemoryForRecovery ? TEXT("yes") : TEXT("no"),
SelectedEntry->bUsedMethodDrillRecoveryMemoryForHandoff ? TEXT("yes") : TEXT("no"),
*Surface.GeneratedGuidancePacketKindLabel,
*Surface.GeneratedGuidancePacketSourceDescription,
*Surface.GeneratedGuidancePacketHeadline,
*Surface.GeneratedGuidancePacketActionLabel,
SelectedEntry->GeneratedGuidancePacketFocusCaseCount,
*Surface.GeneratedPlanModeLabel,
*Surface.GeneratedPlanSelectionLabel,
*Surface.GeneratedPlanPostureLabel,
*Surface.PlanSourceLine,
*Surface.PlanAlignmentLine,
PlanComparisonSummary.TightPlanAlignedCount,
PlanComparisonSummary.TightPlanDivergedCount,
PlanComparisonSummary.BroadPlanAlignedCount,
PlanComparisonSummary.BroadPlanDivergedCount,
PlanComparisonSummary.ReliableAlignedTrustedTightPlanAlignedCount,
PlanComparisonSummary.ReliableAlignedTrustedTightPlanDivergedCount,
PlanComparisonSummary.ReliableAlignedTrustedBroadPlanAlignedCount,
PlanComparisonSummary.ReliableAlignedTrustedBroadPlanDivergedCount,
PlanComparisonSummary.ReliableTrustedTightPlanAlignedCount,
PlanComparisonSummary.ReliableTrustedTightPlanDivergedCount,
PlanComparisonSummary.ReliableTrustedBroadPlanAlignedCount,
PlanComparisonSummary.ReliableTrustedBroadPlanDivergedCount,
*Surface.ComparisonPreferenceLine,
SelectedEntry->bGeneratedPlanUsedTightStructureContinuationPosture
? TEXT("yes")
: TEXT("no"),
SelectedEntry->bGeneratedPlanUsedBroadStructureRedirectPosture
? TEXT("yes")
: TEXT("no"),
*Surface.GeneratedPacketStanceLine,
*SelectedEntry->QueueRecoveryStatusLine,
*SelectedEntry->HandoffRecommendationStatusLine);
return Surface;
}
bool UHyperTwistCoachDashboardWidget::SelectPreviousMethodDrillFollowUpHistoryEntry()
{
if (MethodDrillFollowUpHistoryEntries.Num() <= 0)

View file

@ -739,6 +739,14 @@ public:
FHyperTwistTrainingCoachDashboardClosureRecoveryHistoryInspectSurface
GetSelectedClosureRecoveryHistoryInspectSurface() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard")
FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface
GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard")
FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface
GetSelectedMethodDrillRecoveryMemoryHistoryInspectSurface() const;
UFUNCTION(BlueprintCallable, Category = "HyperTwist|Training|Coach|Dashboard")
bool SelectPreviousMethodDrillFollowUpHistoryEntry();

View file

@ -8657,6 +8657,386 @@ struct FHyperTwistTrainingCoachDashboardClosureRecoveryHistoryInspectSurface
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString Headline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString StatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString DetailLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RecordedAtUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SourceLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SourceDescription;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString AppliedActionLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString VerdictLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PacketStructureRecoveryLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RetainedPostureLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReliablePlanRecoveryLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 SelectedHistoryIndex = INDEX_NONE;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 HistoryEntryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float BeforePressureScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float AfterPressureScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 BeforeDeferredEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 AfterDeferredEventCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingQueueRecoveryAction AppliedAction =
EHyperTwistTrainingQueueRecoveryAction::None;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasSelectedEntry = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bSucceeded = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bReducedFriction = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bShiftedFriction = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bBeforeBlockedFollowUp = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bAfterBlockedFollowUp = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bBeforeOutstandingDeferred = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bAfterOutstandingDeferred = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bBeforeCompletionGap = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bAfterCompletionGap = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedDeferredFirstSuppressionSignal = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedMethodDrillHandoffSignal = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedNarrowMethodDrillPacketStructureRecovery = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedBroadMethodDrillPacketStructureRecovery = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedStrongRetainedMethodDrillRecoveryPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedWeakRetainedMethodDrillRecoveryPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedReliableTrustedTightStructurePlanRecovery = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedReliableTrustedBroadStructurePlanRecovery = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedReliableAlignedTrustedTightStructurePlanRecovery = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedReliableAlignedTrustedBroadStructurePlanRecovery = false;
bool IsStructurallyValid() const
{
return !StatusLine.IsEmpty()
|| !DetailLine.IsEmpty()
|| bHasSelectedEntry
|| HistoryEntryCount > 0;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString Headline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString StatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString DetailLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RecordedAtUtc;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PreferredRecoveryActionLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PreferredRecoveryActionSourceLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PreferredRecoveryActionSourceDescription;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RecommendedHandoffKindLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString QueueRecoveryStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString HandoffRecommendationStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedGuidancePacketKindLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedGuidancePacketSourceLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedGuidancePacketSourceDescription;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedGuidancePacketHeadline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedGuidancePacketActionLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedPlanModeLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedPlanSelectionLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedPlanPostureLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString DominantPressureLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString StructureBiasLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReliablePlanLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString MemoryBiasLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PlanSourceLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PlanAlignmentLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ComparisonPreferenceLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedPacketStanceLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 SelectedEntryIndex = INDEX_NONE;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 HistoryEntryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 GeneratedGuidancePacketFocusCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 MethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 StrongMethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 WeakMethodDrillRecoveryHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 NarrowMethodDrillPacketStructureRecoveryLaunchCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 NarrowMethodDrillPacketStructureRecoveryLaunchReducedCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 BroadMethodDrillPacketStructureRecoveryPromoteCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 BroadMethodDrillPacketStructureRecoveryPromoteReducedCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 TrustedTightMethodDrillRecoveryStructurePlanHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 TrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float TrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float TrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ReliableTrustedTightMethodDrillRecoveryStructurePlanHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ReliableTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ReliableTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ReliableTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeHistoryCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ReliableAlignedTrustedTightMethodDrillRecoveryStructurePlanOutcomeAverageScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float ReliableAlignedTrustedBroadMethodDrillRecoveryStructurePlanOutcomeAverageScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
float MethodDrillRecoveryAverageOutcomeScore = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingQueueRecoveryAction PreferredRecoveryAction =
EHyperTwistTrainingQueueRecoveryAction::None;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingDeliveryMode GeneratedPlanSuggestedMode =
EHyperTwistTrainingDeliveryMode::Timer;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
EHyperTwistTrainingSelectionPolicy GeneratedPlanSuggestedSelectionPolicy =
EHyperTwistTrainingSelectionPolicy::Weighted;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasSelectedEntry = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bStrongPressureDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bWeakPressureDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNarrowPacketStructureRecoveryDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bBroadPacketStructureRecoveryDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bReliableTrustedTightStructurePlanDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bReliableTrustedBroadStructurePlanDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bReliableAlignedTrustedTightStructurePlanDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bReliableAlignedTrustedBroadStructurePlanDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bReliableAlignedTrustedTightStructurePlanOutcomeDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bReliableAlignedTrustedBroadStructurePlanOutcomeDominant = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPacketUsedStrongRetainedMethodDrillRecoveryPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPacketUsedWeakRetainedMethodDrillRecoveryPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPacketUsedGenericMethodDrillRecoveryMemory = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPlanUsedTightStructureContinuationPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPlanUsedBroadStructureRedirectPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPlanUsedReliableTrustedTightStructureContinuationPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPlanUsedReliableTrustedBroadStructureRedirectPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPlanUsedReliableAlignedTrustedTightStructureContinuationPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedPlanUsedReliableAlignedTrustedBroadStructureRedirectPosture = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedMethodDrillRecoveryMemoryForRecovery = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bUsedMethodDrillRecoveryMemoryForHandoff = false;
bool IsStructurallyValid() const
{
return !StatusLine.IsEmpty()
|| !DetailLine.IsEmpty()
|| bHasSelectedEntry
|| HistoryEntryCount > 0;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachGeneratedModeLaunchExecutionContextSurface
{

View file

@ -69,8 +69,8 @@ Current correction call from the source-exposed audit and current execution refr
- the latest landed bounded `Phase 4` packet closes the retained-idle comparison/outcome actionability gap at the end of the recognition-assisted coach-to-review continuity lane, and the final retained-surface confirmation pass now leaves that closure lane functionally complete
- the retained idle widget surface now keeps retained comparison and decision history inspectable without continuing to advertise live launch or guidance-outcome actions once the coach-to-review loop has already collapsed to truthful closed-loop idle
- the now-complete deliberate `UHyperTwistTrainingRuntimeLibrary` world-context consumer lane reaches through active generated-mode selector option owned-execution split-phase current-selection merged ordered roster phase-id lookup, normalized-order lookup, and evaluation-order lookup inspect surfaces, so gameplay/Blueprint callers can inspect one retained merged-roster row directly by phase id, normalized order, or evaluation order without scanning the merged roster array or re-running inspect derivation details directly
- the latest landed bounded `Phase 4` packet pivots deliberately to the next broader orchestration lane in `UHyperTwistCoachDashboardWidget` and adds displayed queue-recovery outcome, selected queue-suppression history, and selected closure-recovery history inspect surfaces over already-retained dashboard state, so gameplay/Blueprint callers can inspect retained recovery posture shifts without scraping dashboard text blocks or reopening backend derivation
- the current next bounded packet should stay on that same dashboard retained-history inspect lane only while a real gameplay or Blueprint caller still needs one more thin inspect contract over already-retained dashboard recovery state; the next clean move inside that lane is the method-drill recovery outcome history and method-drill recovery memory history inspect pair rather than widening back into backend continuity or runtime-library drift
- the latest landed bounded `Phase 4` packet stays on that same deliberate `UHyperTwistCoachDashboardWidget` retained-history inspect lane and adds selected method-drill recovery outcome history and selected method-drill recovery memory history inspect surfaces over already-retained dashboard state, so gameplay/Blueprint callers can inspect retained drill-recovery outcome shifts and upstream recovery-memory posture without scraping dashboard text blocks or reopening recovery-memory comparison derivation
- the current next bounded packet should stay on that same dashboard retained-history inspect lane only while a real gameplay or Blueprint caller still needs one more thin inspect contract over already-retained dashboard history state; the next clean move inside that lane is the method-drill follow-up history and handoff history inspect pair rather than widening back into backend continuity or runtime-library drift
- the current execution-discipline rule that broad refactor / monolith-splitting work should not interrupt the active bounded roadmap packet unless structure is actually blocking it
## Current execution-reality references

View file

@ -0,0 +1,50 @@
# HyperTwist Phase 4 dashboard method-drill recovery outcome and memory history inspect surface packet
- bounded Phase `4` dashboard-consumer slice
- date: `2026-05-09`
## Intent
Stay on the deliberate `UHyperTwistCoachDashboardWidget` retained-history inspect lane and expose the next two retained method-drill recovery history families directly to gameplay and Blueprint callers.
## Why this packet exists
The dashboard already retained:
- filtered method-drill recovery outcomes inside queue-recovery history
- selected method-drill recovery memory history entries
But that state still only surfaced through dashboard text blocks and selection actions. Callers still had to scrape widget presentation or reopen recovery-memory comparison derivation to inspect retained drill-recovery posture directly.
## What changed
- added `FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface`
- added `FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface`
- added `GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface()`
- added `GetSelectedMethodDrillRecoveryMemoryHistoryInspectSurface()`
- kept the packet bounded to `UHyperTwistCoachDashboardWidget` plus shared surface types, with no dashboard redesign and no backend continuity changes
## Files
- `C:\HyperTwist\UnrealHyperTwist\Source\UnrealHyperTwist\Public\HyperTwistTraining\HyperTwistTrainingTypes.h`
- `C:\HyperTwist\UnrealHyperTwist\Source\UnrealHyperTwist\Public\HyperTwistTraining\HyperTwistCoachDashboardWidget.h`
- `C:\HyperTwist\UnrealHyperTwist\Source\UnrealHyperTwist\Private\HyperTwistTraining\HyperTwistCoachDashboardWidget.cpp`
- `C:\HyperTwist\docs\HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md`
## Outcome
Gameplay and Blueprint callers can now inspect:
- the selected retained method-drill recovery outcome entry with action, before/after pressure, deferred-work posture, packet-structure recovery, retained drill-recovery stance, and reliable-plan recovery posture
- the selected retained method-drill recovery memory entry with preferred recovery action, source attribution, generated packet context, generated plan posture, recovery-memory bias, plan-source alignment, and retained comparison counts
without scraping dashboard text blocks or reopening recovery-memory comparison derivation.
## Validation
- full `Development Editor | Win64` MSBuild on `UnrealHyperTwist.sln`
- passed with `0 Warning(s), 0 Error(s)`
## Next clean slice
Stay on this dashboard retained-history inspect lane only while a real gameplay or Blueprint caller still needs one more thin inspect contract over already-retained dashboard history state. The next clean move is the method-drill follow-up history and handoff history inspect pair.