From e328bfe0064cee96eb6e258957ccddee6f80883c Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Mon, 11 May 2026 16:02:28 +0200 Subject: [PATCH] Expose method drill history dashboard bands --- .../HyperTwistCoachDashboardWidget.cpp | 292 ++++++++++++++ .../HyperTwistCoachDashboardWidget.h | 12 + .../HyperTwistTrainingTypes.h | 364 ++++++++++++++++++ ...RTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md | 4 +- ...LL_HISTORY_TRIO_BANDS_PACKET_2026-05-11.md | 62 +++ 5 files changed, 732 insertions(+), 2 deletions(-) create mode 100644 docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_HISTORY_TRIO_BANDS_PACKET_2026-05-11.md diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index 9a99455..80d2031 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -7324,6 +7324,95 @@ UHyperTwistCoachDashboardWidget::GetDisplayedQueueRecoveryStatusInspectSurface() return Surface; } +FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryBandInspectSurface +UHyperTwistCoachDashboardWidget::GetDisplayedMethodDrillRecoveryOutcomeHistoryBandInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryBandInspectSurface Surface; + Surface.Headline = TEXT("Method-drill recovery outcome history band"); + + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryStatusInspectSurface StatusSurface = + GetDisplayedMethodDrillRecoveryOutcomeHistoryStatusInspectSurface(); + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryDetailInspectSurface DetailSurface = + GetDisplayedMethodDrillRecoveryOutcomeHistoryDetailInspectSurface(); + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface NavigationSurface = + GetDisplayedMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface(); + + Surface.HistoryStatusLine = StatusSurface.StatusLine.IsEmpty() + ? TEXT("Method-drill recovery outcome history status: unavailable.") + : StatusSurface.StatusLine; + Surface.HistoryDetailLine = DetailSurface.DetailLine.IsEmpty() + ? TEXT("Method-drill recovery outcome history detail: unavailable.") + : DetailSurface.DetailLine; + Surface.HistoryNavigationStatusLine = NavigationSurface.StatusLine.IsEmpty() + ? TEXT("Method-drill recovery outcome history navigation: unavailable.") + : NavigationSurface.StatusLine; + Surface.HistoryNavigationDetailLine = NavigationSurface.DetailLine.IsEmpty() + ? TEXT("Method-drill recovery outcome history navigation detail: unavailable.") + : NavigationSurface.DetailLine; + Surface.SelectedEntryOrdinal = StatusSurface.SelectedEntryOrdinal.IsEmpty() + ? (NavigationSurface.SelectedEntryOrdinal.IsEmpty() ? TEXT("none") : NavigationSurface.SelectedEntryOrdinal) + : StatusSurface.SelectedEntryOrdinal; + Surface.RecordedAtUtc = StatusSurface.RecordedAtUtc.IsEmpty() ? TEXT("n/a") : StatusSurface.RecordedAtUtc; + Surface.AppliedActionLabel = !StatusSurface.AppliedActionLabel.IsEmpty() + ? StatusSurface.AppliedActionLabel + : (NavigationSurface.AppliedActionLabel.IsEmpty() ? TEXT("n/a") : NavigationSurface.AppliedActionLabel); + Surface.VerdictLine = !StatusSurface.VerdictLine.IsEmpty() + ? StatusSurface.VerdictLine + : (NavigationSurface.VerdictLine.IsEmpty() ? TEXT("n/a") : NavigationSurface.VerdictLine); + Surface.SourceDescription = !StatusSurface.SourceDescription.IsEmpty() + ? StatusSurface.SourceDescription + : (NavigationSurface.SourceDescription.IsEmpty() ? TEXT("n/a") : NavigationSurface.SourceDescription); + Surface.PacketStructureRecoveryLine = StatusSurface.PacketStructureRecoveryLine.IsEmpty() + ? TEXT("none") + : StatusSurface.PacketStructureRecoveryLine; + Surface.RetainedPostureLine = StatusSurface.RetainedPostureLine.IsEmpty() + ? TEXT("n/a") + : StatusSurface.RetainedPostureLine; + Surface.ReliablePlanRecoveryLine = StatusSurface.ReliablePlanRecoveryLine.IsEmpty() + ? TEXT("none") + : StatusSurface.ReliablePlanRecoveryLine; + Surface.PreviousLabel = NavigationSurface.PreviousLabel.IsEmpty() ? TEXT("Prev Drill Recovery") : NavigationSurface.PreviousLabel; + Surface.NextLabel = NavigationSurface.NextLabel.IsEmpty() ? TEXT("Next Drill Recovery") : NavigationSurface.NextLabel; + Surface.SelectedHistoryIndex = StatusSurface.SelectedHistoryIndex; + Surface.HistoryEntryCount = StatusSurface.HistoryEntryCount; + Surface.BeforePressureScore = DetailSurface.BeforePressureScore; + Surface.AfterPressureScore = DetailSurface.AfterPressureScore; + Surface.BeforeDeferredEventCount = DetailSurface.BeforeDeferredEventCount; + Surface.AfterDeferredEventCount = DetailSurface.AfterDeferredEventCount; + Surface.bHasSelectedEntry = StatusSurface.bHasSelectedEntry || DetailSurface.bHasSelectedEntry || NavigationSurface.bHasSelectedEntry; + Surface.bSelectedEntryIsLatest = StatusSurface.bSelectedEntryIsLatest || NavigationSurface.bSelectedEntryIsLatest; + Surface.bPreviousEnabled = NavigationSurface.bPreviousEnabled; + Surface.bNextEnabled = NavigationSurface.bNextEnabled; + Surface.bSucceeded = DetailSurface.bSucceeded; + Surface.bReducedFriction = DetailSurface.bReducedFriction; + Surface.bShiftedFriction = DetailSurface.bShiftedFriction; + Surface.bUsedDeferredFirstSuppressionSignal = DetailSurface.bUsedDeferredFirstSuppressionSignal; + Surface.bUsedMethodDrillHandoffSignal = DetailSurface.bUsedMethodDrillHandoffSignal; + Surface.StatusLine = FString::Printf( + TEXT("Drill-recovery-outcome band: selected %s | action %s | verdict %s | navigation %s/%s"), + *Surface.SelectedEntryOrdinal, + *Surface.AppliedActionLabel, + *Surface.VerdictLine, + Surface.bPreviousEnabled ? TEXT("enabled") : TEXT("disabled"), + Surface.bNextEnabled ? TEXT("enabled") : TEXT("disabled")); + Surface.DetailLine = FString::Printf( + TEXT("%s | %s | %s | %s | source %s | packet recovery %s | retained posture %s | reliable plan %s | before/after pressure %.2f/%.2f | before/after deferred %d/%d | latest %s"), + *Surface.HistoryStatusLine, + *Surface.HistoryDetailLine, + *Surface.HistoryNavigationStatusLine, + *Surface.HistoryNavigationDetailLine, + *Surface.SourceDescription, + *Surface.PacketStructureRecoveryLine, + *Surface.RetainedPostureLine, + *Surface.ReliablePlanRecoveryLine, + Surface.BeforePressureScore, + Surface.AfterPressureScore, + Surface.BeforeDeferredEventCount, + Surface.AfterDeferredEventCount, + Surface.bSelectedEntryIsLatest ? TEXT("yes") : TEXT("no")); + return Surface; +} + FHyperTwistTrainingCoachDashboardGuidanceDecisionHistoryBandInspectSurface UHyperTwistCoachDashboardWidget::GetDisplayedGuidanceDecisionHistoryBandInspectSurface() const { @@ -7436,6 +7525,103 @@ UHyperTwistCoachDashboardWidget::GetDisplayedGuidanceDecisionHistoryBandInspectS return Surface; } +FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryBandInspectSurface +UHyperTwistCoachDashboardWidget::GetDisplayedMethodDrillRecoveryMemoryHistoryBandInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryBandInspectSurface Surface; + Surface.Headline = TEXT("Method-drill recovery memory history band"); + + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryStatusInspectSurface StatusSurface = + GetDisplayedMethodDrillRecoveryMemoryHistoryStatusInspectSurface(); + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryDetailInspectSurface DetailSurface = + GetDisplayedMethodDrillRecoveryMemoryHistoryDetailInspectSurface(); + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryNavigationInspectSurface NavigationSurface = + GetDisplayedMethodDrillRecoveryMemoryHistoryNavigationInspectSurface(); + + Surface.HistoryStatusLine = StatusSurface.StatusLine.IsEmpty() + ? TEXT("Method-drill recovery memory history status: unavailable.") + : StatusSurface.StatusLine; + Surface.HistoryDetailLine = DetailSurface.DetailLine.IsEmpty() + ? TEXT("Method-drill recovery memory history detail: unavailable.") + : DetailSurface.DetailLine; + Surface.HistoryNavigationStatusLine = NavigationSurface.StatusLine.IsEmpty() + ? TEXT("Method-drill recovery memory history navigation: unavailable.") + : NavigationSurface.StatusLine; + Surface.HistoryNavigationDetailLine = NavigationSurface.DetailLine.IsEmpty() + ? TEXT("Method-drill recovery memory history navigation detail: unavailable.") + : NavigationSurface.DetailLine; + Surface.SelectedEntryOrdinal = StatusSurface.SelectedEntryOrdinal.IsEmpty() + ? (NavigationSurface.SelectedEntryOrdinal.IsEmpty() ? TEXT("none") : NavigationSurface.SelectedEntryOrdinal) + : StatusSurface.SelectedEntryOrdinal; + Surface.RecordedAtUtc = StatusSurface.RecordedAtUtc.IsEmpty() ? TEXT("n/a") : StatusSurface.RecordedAtUtc; + Surface.PreferredRecoveryActionLabel = !StatusSurface.PreferredRecoveryActionLabel.IsEmpty() + ? StatusSurface.PreferredRecoveryActionLabel + : (NavigationSurface.PreferredRecoveryActionLabel.IsEmpty() ? TEXT("n/a") : NavigationSurface.PreferredRecoveryActionLabel); + Surface.PreferredRecoveryActionSourceDescription = + !StatusSurface.PreferredRecoveryActionSourceDescription.IsEmpty() + ? StatusSurface.PreferredRecoveryActionSourceDescription + : (NavigationSurface.PreferredRecoveryActionSourceDescription.IsEmpty() + ? TEXT("n/a") + : NavigationSurface.PreferredRecoveryActionSourceDescription); + Surface.RecommendedHandoffKindLabel = !StatusSurface.RecommendedHandoffKindLabel.IsEmpty() + ? StatusSurface.RecommendedHandoffKindLabel + : (NavigationSurface.RecommendedHandoffKindLabel.IsEmpty() ? TEXT("n/a") : NavigationSurface.RecommendedHandoffKindLabel); + Surface.DominantBiasLine = !StatusSurface.DominantBiasLine.IsEmpty() + ? StatusSurface.DominantBiasLine + : (NavigationSurface.DominantBiasLine.IsEmpty() ? TEXT("n/a") : NavigationSurface.DominantBiasLine); + Surface.GeneratedGuidancePacketKindLabel = !StatusSurface.GeneratedGuidancePacketKindLabel.IsEmpty() + ? StatusSurface.GeneratedGuidancePacketKindLabel + : (NavigationSurface.GeneratedGuidancePacketKindLabel.IsEmpty() + ? TEXT("none") + : NavigationSurface.GeneratedGuidancePacketKindLabel); + Surface.GeneratedPlanPostureLabel = !StatusSurface.GeneratedPlanPostureLabel.IsEmpty() + ? StatusSurface.GeneratedPlanPostureLabel + : (NavigationSurface.GeneratedPlanPostureLabel.IsEmpty() ? TEXT("n/a") : NavigationSurface.GeneratedPlanPostureLabel); + Surface.PlanSourceLine = DetailSurface.PlanSourceLine.IsEmpty() ? TEXT("none") : DetailSurface.PlanSourceLine; + Surface.PlanAlignmentLine = DetailSurface.PlanAlignmentLine.IsEmpty() ? TEXT("n/a") : DetailSurface.PlanAlignmentLine; + Surface.ComparisonPreferenceLine = DetailSurface.ComparisonPreferenceLine.IsEmpty() + ? TEXT("n/a") + : DetailSurface.ComparisonPreferenceLine; + Surface.PreviousLabel = NavigationSurface.PreviousLabel.IsEmpty() ? TEXT("Prev Drill Memory") : NavigationSurface.PreviousLabel; + Surface.NextLabel = NavigationSurface.NextLabel.IsEmpty() ? TEXT("Next Drill Memory") : NavigationSurface.NextLabel; + Surface.SelectedEntryIndex = StatusSurface.SelectedEntryIndex; + Surface.HistoryEntryCount = StatusSurface.HistoryEntryCount; + Surface.GeneratedGuidancePacketFocusCaseCount = DetailSurface.GeneratedGuidancePacketFocusCaseCount; + Surface.MethodDrillRecoveryHistoryCount = DetailSurface.MethodDrillRecoveryHistoryCount; + Surface.MethodDrillRecoveryAverageOutcomeScore = DetailSurface.MethodDrillRecoveryAverageOutcomeScore; + Surface.bHasSelectedEntry = StatusSurface.bHasSelectedEntry || DetailSurface.bHasSelectedEntry || NavigationSurface.bHasSelectedEntry; + Surface.bSelectedEntryIsLatest = StatusSurface.bSelectedEntryIsLatest || NavigationSurface.bSelectedEntryIsLatest; + Surface.bPreviousEnabled = NavigationSurface.bPreviousEnabled; + Surface.bNextEnabled = NavigationSurface.bNextEnabled; + Surface.bStrongPressureDominant = DetailSurface.bStrongPressureDominant; + Surface.bWeakPressureDominant = DetailSurface.bWeakPressureDominant; + Surface.bUsedMethodDrillRecoveryMemoryForRecovery = DetailSurface.bUsedMethodDrillRecoveryMemoryForRecovery; + Surface.bUsedMethodDrillRecoveryMemoryForHandoff = DetailSurface.bUsedMethodDrillRecoveryMemoryForHandoff; + Surface.StatusLine = FString::Printf( + TEXT("Drill-recovery-memory band: selected %s | recovery %s | handoff %s | packet %s | navigation %s/%s"), + *Surface.SelectedEntryOrdinal, + *Surface.PreferredRecoveryActionLabel, + *Surface.RecommendedHandoffKindLabel, + *Surface.GeneratedGuidancePacketKindLabel, + Surface.bPreviousEnabled ? TEXT("enabled") : TEXT("disabled"), + Surface.bNextEnabled ? TEXT("enabled") : TEXT("disabled")); + Surface.DetailLine = FString::Printf( + TEXT("%s | %s | %s | %s | bias %s | plan source %s | plan align %s | comparison %s | focus cases %d | recovery history %d avg %.1f | latest %s"), + *Surface.HistoryStatusLine, + *Surface.HistoryDetailLine, + *Surface.HistoryNavigationStatusLine, + *Surface.HistoryNavigationDetailLine, + *Surface.DominantBiasLine, + *Surface.PlanSourceLine, + *Surface.PlanAlignmentLine, + *Surface.ComparisonPreferenceLine, + Surface.GeneratedGuidancePacketFocusCaseCount, + Surface.MethodDrillRecoveryHistoryCount, + Surface.MethodDrillRecoveryAverageOutcomeScore, + Surface.bSelectedEntryIsLatest ? TEXT("yes") : TEXT("no")); + return Surface; +} + FHyperTwistTrainingCoachDashboardQueueRecoveryDetailInspectSurface UHyperTwistCoachDashboardWidget::GetDisplayedQueueRecoveryDetailInspectSurface() const { @@ -9532,6 +9718,112 @@ UHyperTwistCoachDashboardWidget::GetDisplayedMethodDrillFollowUpHistoryNavigatio return Surface; } +FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryBandInspectSurface +UHyperTwistCoachDashboardWidget::GetDisplayedMethodDrillFollowUpHistoryBandInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryBandInspectSurface Surface; + Surface.Headline = TEXT("Method-drill follow-up history band"); + + const FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryStatusInspectSurface StatusSurface = + GetDisplayedMethodDrillFollowUpHistoryStatusInspectSurface(); + const FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryDetailInspectSurface DetailSurface = + GetDisplayedMethodDrillFollowUpHistoryDetailInspectSurface(); + const FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryNavigationInspectSurface NavigationSurface = + GetDisplayedMethodDrillFollowUpHistoryNavigationInspectSurface(); + + Surface.HistoryStatusLine = StatusSurface.StatusLine.IsEmpty() + ? TEXT("Method-drill follow-up history status: unavailable.") + : StatusSurface.StatusLine; + Surface.HistoryDetailLine = DetailSurface.DetailLine.IsEmpty() + ? TEXT("Method-drill follow-up history detail: unavailable.") + : DetailSurface.DetailLine; + Surface.HistoryNavigationStatusLine = NavigationSurface.StatusLine.IsEmpty() + ? TEXT("Method-drill follow-up history navigation: unavailable.") + : NavigationSurface.StatusLine; + Surface.HistoryNavigationDetailLine = NavigationSurface.DetailLine.IsEmpty() + ? TEXT("Method-drill follow-up history navigation detail: unavailable.") + : NavigationSurface.DetailLine; + Surface.SelectedEntryOrdinal = StatusSurface.SelectedEntryOrdinal.IsEmpty() + ? (NavigationSurface.SelectedEntryOrdinal.IsEmpty() ? TEXT("none") : NavigationSurface.SelectedEntryOrdinal) + : StatusSurface.SelectedEntryOrdinal; + Surface.RecordedAtUtc = StatusSurface.RecordedAtUtc.IsEmpty() ? TEXT("n/a") : StatusSurface.RecordedAtUtc; + Surface.StageLabel = !StatusSurface.StageLabel.IsEmpty() + ? StatusSurface.StageLabel + : (NavigationSurface.StageLabel.IsEmpty() ? TEXT("n/a") : NavigationSurface.StageLabel); + Surface.DiagnosticStateLabel = DetailSurface.DiagnosticStateLabel.IsEmpty() + ? (NavigationSurface.DiagnosticStateLabel.IsEmpty() ? TEXT("n/a") : NavigationSurface.DiagnosticStateLabel) + : DetailSurface.DiagnosticStateLabel; + Surface.RecommendedReviewGradeLabel = !StatusSurface.RecommendedReviewGradeLabel.IsEmpty() + ? StatusSurface.RecommendedReviewGradeLabel + : (NavigationSurface.RecommendedReviewGradeLabel.IsEmpty() + ? TEXT("n/a") + : NavigationSurface.RecommendedReviewGradeLabel); + Surface.SuggestedModeLabel = !StatusSurface.SuggestedModeLabel.IsEmpty() + ? StatusSurface.SuggestedModeLabel + : (NavigationSurface.SuggestedModeLabel.IsEmpty() ? TEXT("n/a") : NavigationSurface.SuggestedModeLabel); + Surface.SuggestedSelectionLabel = DetailSurface.SuggestedSelectionLabel.IsEmpty() + ? TEXT("n/a") + : DetailSurface.SuggestedSelectionLabel; + Surface.OutcomePreferenceLine = !StatusSurface.OutcomePreferenceLine.IsEmpty() + ? StatusSurface.OutcomePreferenceLine + : (NavigationSurface.OutcomePreferenceLine.IsEmpty() ? TEXT("n/a") : NavigationSurface.OutcomePreferenceLine); + Surface.PacketStructureLabel = !StatusSurface.PacketStructureLabel.IsEmpty() + ? StatusSurface.PacketStructureLabel + : (NavigationSurface.PacketStructureLabel.IsEmpty() ? TEXT("default") : NavigationSurface.PacketStructureLabel); + Surface.PacketLaneLabel = DetailSurface.PacketLaneLabel.IsEmpty() ? TEXT("none") : DetailSurface.PacketLaneLabel; + Surface.PacketStanceLabel = !StatusSurface.PacketStanceLabel.IsEmpty() + ? StatusSurface.PacketStanceLabel + : (NavigationSurface.PacketStanceLabel.IsEmpty() ? TEXT("none") : NavigationSurface.PacketStanceLabel); + Surface.SourceRunId = DetailSurface.SourceRunId.IsEmpty() ? TEXT("n/a") : DetailSurface.SourceRunId; + Surface.SourceDrillId = DetailSurface.SourceDrillId.IsEmpty() ? TEXT("n/a") : DetailSurface.SourceDrillId; + Surface.SourceSessionId = DetailSurface.SourceSessionId.IsEmpty() ? TEXT("n/a") : DetailSurface.SourceSessionId; + Surface.PreviousLabel = NavigationSurface.PreviousLabel.IsEmpty() ? TEXT("Prev Drill Follow-Up") : NavigationSurface.PreviousLabel; + Surface.NextLabel = NavigationSurface.NextLabel.IsEmpty() ? TEXT("Next Drill Follow-Up") : NavigationSurface.NextLabel; + Surface.SelectedEntryIndex = StatusSurface.SelectedEntryIndex; + Surface.HistoryEntryCount = StatusSurface.HistoryEntryCount; + Surface.MatchingHistoryCount = StatusSurface.MatchingHistoryCount; + Surface.FocusCaseCount = DetailSurface.FocusCaseCount; + Surface.LaunchedCaseCount = DetailSurface.LaunchedCaseCount; + Surface.CompletedAttemptCount = DetailSurface.CompletedAttemptCount; + Surface.TotalMistakes = DetailSurface.TotalMistakes; + Surface.SuccessRate = DetailSurface.SuccessRate; + Surface.AverageSuccessRate = DetailSurface.AverageSuccessRate; + Surface.AverageMistakes = DetailSurface.AverageMistakes; + Surface.bHasSelectedEntry = StatusSurface.bHasSelectedEntry || DetailSurface.bHasSelectedEntry || NavigationSurface.bHasSelectedEntry; + Surface.bSelectedEntryIsLatest = StatusSurface.bSelectedEntryIsLatest || NavigationSurface.bSelectedEntryIsLatest; + Surface.bPreviousEnabled = NavigationSurface.bPreviousEnabled; + Surface.bNextEnabled = NavigationSurface.bNextEnabled; + Surface.bHasHistoryWeighting = StatusSurface.bHasHistoryWeighting || DetailSurface.bHasHistoryWeighting || NavigationSurface.bHasHistoryWeighting; + Surface.bPreferDrillFollowUp = StatusSurface.bPreferDrillFollowUp || DetailSurface.bPreferDrillFollowUp || NavigationSurface.bPreferDrillFollowUp; + Surface.bPreferCoachHandoff = StatusSurface.bPreferCoachHandoff || DetailSurface.bPreferCoachHandoff || NavigationSurface.bPreferCoachHandoff; + Surface.bHasUpstreamStructureSignal = StatusSurface.bHasUpstreamStructureSignal || DetailSurface.bHasUpstreamStructureSignal || NavigationSurface.bHasUpstreamStructureSignal; + Surface.StatusLine = FString::Printf( + TEXT("Drill-follow-up-history band: selected %s | stage %s | review %s | navigation %s/%s | weighting %s"), + *Surface.SelectedEntryOrdinal, + *Surface.StageLabel, + *Surface.RecommendedReviewGradeLabel, + Surface.bPreviousEnabled ? TEXT("enabled") : TEXT("disabled"), + Surface.bNextEnabled ? TEXT("enabled") : TEXT("disabled"), + Surface.bHasHistoryWeighting ? TEXT("yes") : TEXT("no")); + Surface.DetailLine = FString::Printf( + TEXT("%s | %s | %s | %s | source drill %s | mode %s | selection %s | packet %s/%s/%s | focus %d | launched %d | success %.2f | latest %s"), + *Surface.HistoryStatusLine, + *Surface.HistoryDetailLine, + *Surface.HistoryNavigationStatusLine, + *Surface.HistoryNavigationDetailLine, + *Surface.SourceDrillId, + *Surface.SuggestedModeLabel, + *Surface.SuggestedSelectionLabel, + *Surface.PacketStructureLabel, + *Surface.PacketLaneLabel, + *Surface.PacketStanceLabel, + Surface.FocusCaseCount, + Surface.LaunchedCaseCount, + Surface.SuccessRate, + Surface.bSelectedEntryIsLatest ? TEXT("yes") : TEXT("no")); + return Surface; +} + FHyperTwistTrainingCoachDashboardHandoffHistoryInspectSurface UHyperTwistCoachDashboardWidget::GetSelectedHandoffHistoryInspectSurface() const { diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h index 1af3b2c..d9a0011 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h @@ -783,6 +783,10 @@ public: FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface GetDisplayedMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryBandInspectSurface + GetDisplayedMethodDrillRecoveryOutcomeHistoryBandInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryInspectSurface GetSelectedMethodDrillRecoveryMemoryHistoryInspectSurface() const; @@ -799,6 +803,10 @@ public: FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryNavigationInspectSurface GetDisplayedMethodDrillRecoveryMemoryHistoryNavigationInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryBandInspectSurface + GetDisplayedMethodDrillRecoveryMemoryHistoryBandInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryInspectSurface GetSelectedMethodDrillFollowUpHistoryInspectSurface() const; @@ -815,6 +823,10 @@ public: FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryNavigationInspectSurface GetDisplayedMethodDrillFollowUpHistoryNavigationInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryBandInspectSurface + GetDisplayedMethodDrillFollowUpHistoryBandInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") FHyperTwistTrainingCoachDashboardHandoffHistoryInspectSurface GetSelectedHandoffHistoryInspectSurface() const; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index e0221a3..abb1372 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -9103,6 +9103,117 @@ struct FHyperTwistTrainingCoachDashboardQueueSuppressionHistoryNavigationInspect } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryBandInspectSurface +{ + 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 HistoryStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryNavigationStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryNavigationDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SelectedEntryOrdinal; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecordedAtUtc; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString AppliedActionLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString VerdictLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SourceDescription; + + 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") + FString PreviousLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString NextLabel; + + 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") + bool bHasSelectedEntry = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bSelectedEntryIsLatest = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bPreviousEnabled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bNextEnabled = 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 bUsedDeferredFirstSuppressionSignal = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bUsedMethodDrillHandoffSignal = false; + + bool IsStructurallyValid() const + { + return !StatusLine.IsEmpty() + || !DetailLine.IsEmpty() + || bHasSelectedEntry + || bPreviousEnabled + || bNextEnabled; + } +}; + USTRUCT(BlueprintType) struct FHyperTwistTrainingCoachDashboardClosureRecoveryHistoryInspectSurface { @@ -9247,6 +9358,120 @@ struct FHyperTwistTrainingCoachDashboardClosureRecoveryHistoryNavigationInspectS } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryBandInspectSurface +{ + 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 HistoryStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryNavigationStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryNavigationDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SelectedEntryOrdinal; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecordedAtUtc; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PreferredRecoveryActionLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PreferredRecoveryActionSourceDescription; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecommendedHandoffKindLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DominantBiasLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedGuidancePacketKindLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GeneratedPlanPostureLabel; + + 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 PreviousLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString NextLabel; + + 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") + float MethodDrillRecoveryAverageOutcomeScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasSelectedEntry = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bSelectedEntryIsLatest = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bPreviousEnabled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bNextEnabled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bStrongPressureDominant = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bWeakPressureDominant = 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 + || bPreviousEnabled + || bNextEnabled; + } +}; + USTRUCT(BlueprintType) struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface { @@ -10905,6 +11130,145 @@ struct FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryDetailInspectS } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryBandInspectSurface +{ + 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 HistoryStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryNavigationStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString HistoryNavigationDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SelectedEntryOrdinal; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecordedAtUtc; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString StageLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DiagnosticStateLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecommendedReviewGradeLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SuggestedModeLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SuggestedSelectionLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString OutcomePreferenceLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PacketStructureLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PacketLaneLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PacketStanceLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SourceRunId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SourceDrillId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SourceSessionId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PreviousLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString NextLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 SelectedEntryIndex = INDEX_NONE; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 HistoryEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 MatchingHistoryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 FocusCaseCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 LaunchedCaseCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedAttemptCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 TotalMistakes = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float SuccessRate = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AverageSuccessRate = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float AverageMistakes = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasSelectedEntry = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bSelectedEntryIsLatest = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bPreviousEnabled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bNextEnabled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasHistoryWeighting = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bPreferDrillFollowUp = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bPreferCoachHandoff = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasUpstreamStructureSignal = false; + + bool IsStructurallyValid() const + { + return !StatusLine.IsEmpty() + || !DetailLine.IsEmpty() + || bHasSelectedEntry + || bHasHistoryWeighting + || bPreviousEnabled + || bNextEnabled; + } +}; + USTRUCT(BlueprintType) struct FHyperTwistTrainingCoachDashboardHandoffHistoryStatusInspectSurface { diff --git a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md index fd01df8..204a1e1 100644 --- a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md +++ b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md @@ -77,8 +77,8 @@ Current correction call from the source-exposed audit and current execution refr - the latest landed bounded `Phase 4` packet deliberately chooses another adjacent live dashboard consumer band and adds a single queue scheduling / recovery seam over the already-landed queue counts / status, schedule horizon, schedule policy / friction, and queue recovery live status/detail surfaces, so gameplay/Blueprint callers can inspect that whole scheduling-and-recovery dashboard cluster without stitching five adjacent getters together - the latest landed bounded `Phase 4` packet deliberately chooses another adjacent live dashboard consumer band and adds a single closure-recovery seam over the already-landed closure-recovery live status/detail and closure-recovery history navigation surfaces, so gameplay/Blueprint callers can inspect that whole closure-recovery dashboard cluster without stitching three adjacent getters together - the latest landed bounded `Phase 4` packet deliberately chooses another adjacent live dashboard consumer band and adds a single queue-suppression seam over the already-landed queue-suppression live summary/detail and queue-suppression history navigation surfaces, so gameplay/Blueprint callers can inspect that whole queue-suppression dashboard cluster without stitching three adjacent getters together - - the latest landed bounded `Phase 4` packet deliberately continues across the remaining adjacent authored-history dashboard consumer pair and adds a single guidance-decision-history seam plus a single template-launch-history seam over their already-landed status/detail/navigation surfaces, so gameplay/Blueprint callers can inspect each whole history cluster without stitching three adjacent getters together per cluster - - with the retained-history text-band lane, the template-launch / preview action-control band, the execution-action-control band, the verification / recognition / review-policy status band, the selected-queue band, the queue scheduling / recovery band, the closure-recovery band, the queue-suppression band, the handoff-history band, the guidance-decision-history band, and the template-launch-history band now all closed baseline, the next best clean move is to deliberately choose another adjacent live dashboard consumer band rather than reopen already-landed surfaces by drift + - the latest landed bounded `Phase 4` packet deliberately continues through the remaining adjacent method-drill authored-history dashboard trio and adds a single method-drill recovery-outcome-history seam, a single method-drill recovery-memory-history seam, and a single method-drill follow-up-history seam over their already-landed status/detail/navigation surfaces, so gameplay/Blueprint callers can inspect each whole retained method-drill history cluster without stitching three adjacent getters together per cluster + - with the retained-history text-band lane, the template-launch / preview action-control band, the execution-action-control band, the verification / recognition / review-policy status band, the selected-queue band, the queue scheduling / recovery band, the closure-recovery band, the queue-suppression band, the handoff-history band, the guidance-decision-history band, the template-launch-history band, the method-drill recovery-outcome-history band, the method-drill recovery-memory-history band, and the method-drill follow-up-history band now all closed baseline, the next best clean move is to deliberately choose another adjacent live dashboard consumer band rather than reopen already-landed surfaces by 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 ## Donor portfolio phase taxonomy diff --git a/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_HISTORY_TRIO_BANDS_PACKET_2026-05-11.md b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_HISTORY_TRIO_BANDS_PACKET_2026-05-11.md new file mode 100644 index 0000000..2919e55 --- /dev/null +++ b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_HISTORY_TRIO_BANDS_PACKET_2026-05-11.md @@ -0,0 +1,62 @@ +# HyperTwist Phase 4 dashboard method-drill history trio bands packet + +- bounded Phase `4` dashboard-consumer slice +- date: `2026-05-11` + +## Intent + +Continue through the remaining adjacent retained method-drill history dashboard trio and expose the recovery-outcome-history, recovery-memory-history, and follow-up-history clusters as inspectable gameplay and Blueprint seams. + +## Why this packet exists + +`UHyperTwistCoachDashboardWidget` already exposed three adjacent surfaces for each of these retained method-drill history clusters: + +- `GetDisplayedMethodDrillRecoveryOutcomeHistoryStatusInspectSurface()` +- `GetDisplayedMethodDrillRecoveryOutcomeHistoryDetailInspectSurface()` +- `GetDisplayedMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface()` + +- `GetDisplayedMethodDrillRecoveryMemoryHistoryStatusInspectSurface()` +- `GetDisplayedMethodDrillRecoveryMemoryHistoryDetailInspectSurface()` +- `GetDisplayedMethodDrillRecoveryMemoryHistoryNavigationInspectSurface()` + +- `GetDisplayedMethodDrillFollowUpHistoryStatusInspectSurface()` +- `GetDisplayedMethodDrillFollowUpHistoryDetailInspectSurface()` +- `GetDisplayedMethodDrillFollowUpHistoryNavigationInspectSurface()` + +Callers that wanted to reason about any whole retained method-drill history cluster still had to stitch three adjacent getters together manually per cluster. + +## What changed + +- added `FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryBandInspectSurface` +- added `GetDisplayedMethodDrillRecoveryOutcomeHistoryBandInspectSurface()` +- added `FHyperTwistTrainingCoachDashboardMethodDrillRecoveryMemoryHistoryBandInspectSurface` +- added `GetDisplayedMethodDrillRecoveryMemoryHistoryBandInspectSurface()` +- added `FHyperTwistTrainingCoachDashboardMethodDrillFollowUpHistoryBandInspectSurface` +- added `GetDisplayedMethodDrillFollowUpHistoryBandInspectSurface()` +- composed each new surface entirely over the already-landed status/detail/navigation surfaces for its corresponding retained method-drill history cluster +- kept the packet bounded by avoiding any new backend derivation or new widget-state caching + +## 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 whole retained method-drill recovery-outcome-history dashboard band through one surface +- the whole retained method-drill recovery-memory-history dashboard band through one surface +- the whole retained method-drill follow-up-history dashboard band through one surface +- retained recovery outcome posture, retained recovery memory posture, and retained follow-up weighting/posture without stitching three adjacent getters together for each cluster + +## Validation + +- full `Development Editor | Win64` MSBuild on `UnrealHyperTwist.sln` + - passed with `0 Warning(s), 0 Error(s)` + +## Next clean slice + +Treat the retained-history text-band lane, the template-launch / preview action-control band, the execution-action-control band, the verification / recognition / review-policy status band, the selected-queue band, the queue scheduling / recovery band, the closure-recovery band, the queue-suppression band, the handoff-history band, the guidance-decision-history band, the template-launch-history band, the method-drill recovery-outcome-history band, the method-drill recovery-memory-history band, and the method-drill follow-up-history band as landed baseline, then deliberately choose another adjacent live dashboard consumer band instead of reopening already-landed surfaces by drift.