From 38a86cd3b5db43d6bccae52a99d2589e951f4131 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Mon, 11 May 2026 05:03:54 +0200 Subject: [PATCH] Expose dashboard method-drill recovery history status and detail surfaces --- .../HyperTwistCoachDashboardWidget.cpp | 116 ++++++++++++ .../HyperTwistCoachDashboardWidget.h | 10 + .../HyperTwistTrainingTypes.h | 177 ++++++++++++++++++ ...RTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md | 4 +- ...ETAIL_INSPECT_SURFACE_PACKET_2026-05-11.md | 54 ++++++ 5 files changed, 359 insertions(+), 2 deletions(-) create mode 100644 docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_RECOVERY_OUTCOME_HISTORY_STATUS_DETAIL_INSPECT_SURFACE_PACKET_2026-05-11.md diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp index e77a104..9955550 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -8057,6 +8057,120 @@ UHyperTwistCoachDashboardWidget::GetSelectedMethodDrillRecoveryOutcomeHistoryIns return Surface; } +FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryStatusInspectSurface +UHyperTwistCoachDashboardWidget::GetDisplayedMethodDrillRecoveryOutcomeHistoryStatusInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryStatusInspectSurface Surface; + Surface.Headline = TEXT("Method-drill recovery outcome history status"); + + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface HistorySurface = + GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface(); + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface NavigationSurface = + GetDisplayedMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface(); + + Surface.StatusLine = !DisplayedMethodDrillRecoveryOutcomeHistoryStatusLine.IsEmpty() + ? DisplayedMethodDrillRecoveryOutcomeHistoryStatusLine + : HistorySurface.StatusLine; + Surface.SelectedEntryOrdinal = NavigationSurface.SelectedEntryOrdinal.IsEmpty() + ? TEXT("none") + : NavigationSurface.SelectedEntryOrdinal; + Surface.RecordedAtUtc = + HistorySurface.RecordedAtUtc.IsEmpty() ? TEXT("n/a") : HistorySurface.RecordedAtUtc; + Surface.AppliedActionLabel = !HistorySurface.AppliedActionLabel.IsEmpty() + ? HistorySurface.AppliedActionLabel + : (NavigationSurface.AppliedActionLabel.IsEmpty() + ? TEXT("n/a") + : NavigationSurface.AppliedActionLabel); + Surface.VerdictLine = !HistorySurface.VerdictLine.IsEmpty() + ? HistorySurface.VerdictLine + : (NavigationSurface.VerdictLine.IsEmpty() ? TEXT("n/a") : NavigationSurface.VerdictLine); + Surface.SourceDescription = !HistorySurface.SourceDescription.IsEmpty() + ? HistorySurface.SourceDescription + : (NavigationSurface.SourceDescription.IsEmpty() + ? TEXT("n/a") + : NavigationSurface.SourceDescription); + Surface.PacketStructureRecoveryLine = HistorySurface.PacketStructureRecoveryLine.IsEmpty() + ? TEXT("none") + : HistorySurface.PacketStructureRecoveryLine; + Surface.RetainedPostureLine = HistorySurface.RetainedPostureLine.IsEmpty() + ? TEXT("n/a") + : HistorySurface.RetainedPostureLine; + Surface.ReliablePlanRecoveryLine = HistorySurface.ReliablePlanRecoveryLine.IsEmpty() + ? TEXT("none") + : HistorySurface.ReliablePlanRecoveryLine; + Surface.SelectedHistoryIndex = HistorySurface.SelectedHistoryIndex; + Surface.HistoryEntryCount = HistorySurface.HistoryEntryCount; + Surface.bHasSelectedEntry = HistorySurface.bHasSelectedEntry; + Surface.bSelectedEntryIsLatest = NavigationSurface.bSelectedEntryIsLatest; + return Surface; +} + +FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryDetailInspectSurface +UHyperTwistCoachDashboardWidget::GetDisplayedMethodDrillRecoveryOutcomeHistoryDetailInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryDetailInspectSurface Surface; + Surface.Headline = TEXT("Method-drill recovery outcome history detail"); + + const FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface HistorySurface = + GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface(); + + Surface.DetailLine = !DisplayedMethodDrillRecoveryOutcomeHistoryDetailLine.IsEmpty() + ? DisplayedMethodDrillRecoveryOutcomeHistoryDetailLine + : HistorySurface.DetailLine; + Surface.SourceLabel = HistorySurface.SourceLabel.IsEmpty() ? TEXT("n/a") : HistorySurface.SourceLabel; + Surface.SourceDescription = + HistorySurface.SourceDescription.IsEmpty() ? TEXT("n/a") : HistorySurface.SourceDescription; + Surface.AppliedActionLabel = + HistorySurface.AppliedActionLabel.IsEmpty() ? TEXT("n/a") : HistorySurface.AppliedActionLabel; + Surface.VerdictLine = HistorySurface.VerdictLine.IsEmpty() ? TEXT("n/a") : HistorySurface.VerdictLine; + Surface.PacketStructureRecoveryLine = HistorySurface.PacketStructureRecoveryLine.IsEmpty() + ? TEXT("none") + : HistorySurface.PacketStructureRecoveryLine; + Surface.RetainedPostureLine = HistorySurface.RetainedPostureLine.IsEmpty() + ? TEXT("n/a") + : HistorySurface.RetainedPostureLine; + Surface.ReliablePlanRecoveryLine = HistorySurface.ReliablePlanRecoveryLine.IsEmpty() + ? TEXT("none") + : HistorySurface.ReliablePlanRecoveryLine; + Surface.SelectedHistoryIndex = HistorySurface.SelectedHistoryIndex; + Surface.HistoryEntryCount = HistorySurface.HistoryEntryCount; + Surface.BeforePressureScore = HistorySurface.BeforePressureScore; + Surface.AfterPressureScore = HistorySurface.AfterPressureScore; + Surface.BeforeDeferredEventCount = HistorySurface.BeforeDeferredEventCount; + Surface.AfterDeferredEventCount = HistorySurface.AfterDeferredEventCount; + Surface.AppliedAction = HistorySurface.AppliedAction; + Surface.bHasSelectedEntry = HistorySurface.bHasSelectedEntry; + Surface.bSucceeded = HistorySurface.bSucceeded; + Surface.bReducedFriction = HistorySurface.bReducedFriction; + Surface.bShiftedFriction = HistorySurface.bShiftedFriction; + Surface.bBeforeBlockedFollowUp = HistorySurface.bBeforeBlockedFollowUp; + Surface.bAfterBlockedFollowUp = HistorySurface.bAfterBlockedFollowUp; + Surface.bBeforeOutstandingDeferred = HistorySurface.bBeforeOutstandingDeferred; + Surface.bAfterOutstandingDeferred = HistorySurface.bAfterOutstandingDeferred; + Surface.bBeforeCompletionGap = HistorySurface.bBeforeCompletionGap; + Surface.bAfterCompletionGap = HistorySurface.bAfterCompletionGap; + Surface.bUsedDeferredFirstSuppressionSignal = + HistorySurface.bUsedDeferredFirstSuppressionSignal; + Surface.bUsedMethodDrillHandoffSignal = HistorySurface.bUsedMethodDrillHandoffSignal; + Surface.bUsedNarrowMethodDrillPacketStructureRecovery = + HistorySurface.bUsedNarrowMethodDrillPacketStructureRecovery; + Surface.bUsedBroadMethodDrillPacketStructureRecovery = + HistorySurface.bUsedBroadMethodDrillPacketStructureRecovery; + Surface.bUsedStrongRetainedMethodDrillRecoveryPosture = + HistorySurface.bUsedStrongRetainedMethodDrillRecoveryPosture; + Surface.bUsedWeakRetainedMethodDrillRecoveryPosture = + HistorySurface.bUsedWeakRetainedMethodDrillRecoveryPosture; + Surface.bUsedReliableTrustedTightStructurePlanRecovery = + HistorySurface.bUsedReliableTrustedTightStructurePlanRecovery; + Surface.bUsedReliableTrustedBroadStructurePlanRecovery = + HistorySurface.bUsedReliableTrustedBroadStructurePlanRecovery; + Surface.bUsedReliableAlignedTrustedTightStructurePlanRecovery = + HistorySurface.bUsedReliableAlignedTrustedTightStructurePlanRecovery; + Surface.bUsedReliableAlignedTrustedBroadStructurePlanRecovery = + HistorySurface.bUsedReliableAlignedTrustedBroadStructurePlanRecovery; + return Surface; +} + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface UHyperTwistCoachDashboardWidget::GetDisplayedMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface() const { @@ -27652,11 +27766,13 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation() MethodDrillRecoveryHistoryHeaderTextBlock->SetText(FText::FromString( TEXT("[Drill Recovery History]"))); } + DisplayedMethodDrillRecoveryOutcomeHistoryStatusLine = MethodDrillRecoveryHistoryStatusLine; if (MethodDrillRecoveryHistoryStatusTextBlock != nullptr) { MethodDrillRecoveryHistoryStatusTextBlock->SetText(FText::FromString( MethodDrillRecoveryHistoryStatusLine)); } + DisplayedMethodDrillRecoveryOutcomeHistoryDetailLine = MethodDrillRecoveryHistoryDetailLine; if (MethodDrillRecoveryHistoryDetailTextBlock != nullptr) { MethodDrillRecoveryHistoryDetailTextBlock->SetText(FText::FromString( diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h index 3388d69..9710d83 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h @@ -767,6 +767,14 @@ public: FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspectSurface GetSelectedMethodDrillRecoveryOutcomeHistoryInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryStatusInspectSurface + GetDisplayedMethodDrillRecoveryOutcomeHistoryStatusInspectSurface() const; + + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryDetailInspectSurface + GetDisplayedMethodDrillRecoveryOutcomeHistoryDetailInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface GetDisplayedMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface() const; @@ -2152,6 +2160,8 @@ private: FString DisplayedSchedulePolicyLine; FString DisplayedClosureRecoveryStatusLine; FString DisplayedClosureRecoveryDetailLine; + FString DisplayedMethodDrillRecoveryOutcomeHistoryStatusLine; + FString DisplayedMethodDrillRecoveryOutcomeHistoryDetailLine; FString DisplayedHandoffHistoryStatusLine; FString DisplayedHandoffHistoryDetailLine; FString DisplayedGuidanceDecisionHistoryStatusLine; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index 66bb888..d6dc9c5 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -9216,6 +9216,183 @@ struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryInspect } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryStatusInspectSurface +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString Headline; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString StatusLine; + + 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") + int32 SelectedHistoryIndex = INDEX_NONE; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 HistoryEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasSelectedEntry = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bSelectedEntryIsLatest = false; + + bool IsStructurallyValid() const + { + return !StatusLine.IsEmpty() + || bHasSelectedEntry + || HistoryEntryCount > 0; + } +}; + +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryDetailInspectSurface +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString Headline; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DetailLine; + + 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 !DetailLine.IsEmpty() + || bHasSelectedEntry + || HistoryEntryCount > 0; + } +}; + USTRUCT(BlueprintType) struct FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryNavigationInspectSurface { diff --git a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md index 118db09..bc2ebf2 100644 --- a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md +++ b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md @@ -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 stays adjacent in that same retained-history dashboard lane and adds the dedicated method-drill follow-up history status/detail inspect pair over the exact displayed retained-history lines already shown by the widget, so gameplay/Blueprint callers can inspect the current retained drill-follow-up text band directly without scraping text blocks or routing only through the broader selected-history and navigation surfaces - - the retained method-drill-follow-up-history band is now functionally complete enough to stop widening it by drift; the next best clean move is to stay in the same retained-history dashboard neighborhood and expose the displayed method-drill recovery outcome history status/detail pair over the current method-drill-recovery-history text band + - the latest landed bounded `Phase 4` packet stays adjacent in that same retained-history dashboard lane and adds the dedicated method-drill recovery outcome history status/detail inspect pair over the exact displayed retained-history lines already shown by the widget, so gameplay/Blueprint callers can inspect the current retained drill-recovery text band directly without scraping text blocks or routing only through the broader selected-history and navigation surfaces + - the retained method-drill-recovery-history band is now functionally complete enough to stop widening it by drift; the next best clean move is to stay in the same retained-history dashboard neighborhood and expose the displayed method-drill recovery memory history status/detail pair over the current method-drill-recovery-memory-history text band - 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_RECOVERY_OUTCOME_HISTORY_STATUS_DETAIL_INSPECT_SURFACE_PACKET_2026-05-11.md b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_RECOVERY_OUTCOME_HISTORY_STATUS_DETAIL_INSPECT_SURFACE_PACKET_2026-05-11.md new file mode 100644 index 0000000..9b6c3b6 --- /dev/null +++ b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_METHOD_DRILL_RECOVERY_OUTCOME_HISTORY_STATUS_DETAIL_INSPECT_SURFACE_PACKET_2026-05-11.md @@ -0,0 +1,54 @@ +# HyperTwist Phase 4 dashboard method-drill recovery outcome history status detail inspect surface packet + +- bounded Phase `4` dashboard-consumer slice +- date: `2026-05-11` + +## Intent + +Stay adjacent in the retained-history dashboard lane and expose the dedicated method-drill recovery outcome history text band directly to gameplay and Blueprint callers. + +## Why this packet exists + +`UHyperTwistCoachDashboardWidget` already displayed: + +- the current `Drill Recovery History` status line +- the current `Drill Recovery History` detail line + +But those two lines only surfaced through `MethodDrillRecoveryHistoryStatusTextBlock` and `MethodDrillRecoveryHistoryDetailTextBlock`. Callers could inspect the selected retained recovery outcome and the prev/next navigation posture separately, but there was still no dedicated inspect surface for the exact retained-history text band the dashboard was already presenting. + +## What changed + +- added `FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryStatusInspectSurface` +- added `FHyperTwistTrainingCoachDashboardMethodDrillRecoveryOutcomeHistoryDetailInspectSurface` +- added `GetDisplayedMethodDrillRecoveryOutcomeHistoryStatusInspectSurface()` +- added `GetDisplayedMethodDrillRecoveryOutcomeHistoryDetailInspectSurface()` +- retained the exact displayed method-drill-recovery-history status/detail lines inside the widget so the new surfaces report the same live strings the dashboard is already presenting +- composed the status surface over the already-landed selected method-drill-recovery-outcome history and method-drill-recovery-outcome history navigation surfaces +- composed the detail surface over the already-landed selected method-drill-recovery-outcome history surface so the packet stayed bounded and reused the same retained-history derivation + +## 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 exact displayed method-drill-recovery-history status line +- the exact displayed method-drill-recovery-history detail line +- selected retained entry ordinal, recorded time, applied action, verdict, source description, packet recovery posture, retained posture, and reliable-plan recovery context +- selected retained before/after pressure and deferred counts plus blocked-follow-up, deferred, completion-gap, and weighted recovery signal posture + +without scraping widget text blocks or stitching together the selected-history and navigation wrappers manually. + +## Validation + +- full `Development Editor | Win64` MSBuild on `UnrealHyperTwist.sln` + - passed with `0 Warning(s), 0 Error(s)` + +## Next clean slice + +Treat the retained method-drill-recovery-history band as functionally complete enough and stay in the same retained-history dashboard neighborhood to expose the displayed method-drill recovery memory history status/detail pair over the current method-drill-recovery-memory-history text band.