From bd54c5c5718965f9dae3c71aa2a1a710f7fd6630 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Mon, 11 May 2026 20:29:55 +0200 Subject: [PATCH] Expose run state recap band --- .../HyperTwistCoachDashboardWidget.cpp | 85 +++++++++++++++++++ .../HyperTwistCoachDashboardWidget.h | 4 + .../HyperTwistTrainingTypes.h | 85 +++++++++++++++++++ ...RTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md | 4 +- ..._BAND_INSPECT_SURFACE_PACKET_2026-05-11.md | 52 ++++++++++++ 5 files changed, 228 insertions(+), 2 deletions(-) create mode 100644 docs/arch/HYPERTWIST_PHASE4_DASHBOARD_RUN_STATE_RECAP_BAND_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 c13ffa4..829526f 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -14711,6 +14711,91 @@ UHyperTwistCoachDashboardWidget::GetDisplayedRunRecapActionControlInspectSurface return Surface; } +FHyperTwistTrainingCoachDashboardRunStateRecapBandInspectSurface +UHyperTwistCoachDashboardWidget::GetDisplayedRunStateRecapBandInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardRunStateRecapBandInspectSurface Surface; + Surface.Headline = TEXT("Run-state recap band"); + + const FHyperTwistTrainingCoachDashboardActiveRunStatusInspectSurface ActiveRunSurface = + GetDisplayedActiveRunStatusInspectSurface(); + const FHyperTwistTrainingCoachDashboardRunRecapStatusInspectSurface RunRecapStatusSurface = + GetDisplayedRunRecapStatusInspectSurface(); + const FHyperTwistTrainingCoachDashboardRunRecapDetailInspectSurface RunRecapDetailSurface = + GetDisplayedRunRecapDetailInspectSurface(); + const FHyperTwistTrainingCoachDashboardRunRecapActionControlInspectSurface RunRecapActionSurface = + GetDisplayedRunRecapActionControlInspectSurface(); + + Surface.ActiveRunStatusLine = ActiveRunSurface.StatusLine.IsEmpty() + ? TEXT("Active run status: unavailable.") + : ActiveRunSurface.StatusLine; + Surface.ActiveRunSummaryLine = ActiveRunSurface.SummaryLine.IsEmpty() + ? TEXT("Active run summary: unavailable.") + : ActiveRunSurface.SummaryLine; + Surface.RunRecapStatusLine = RunRecapStatusSurface.StatusLine.IsEmpty() + ? TEXT("Run recap status: unavailable.") + : RunRecapStatusSurface.StatusLine; + Surface.RunRecapDetailLine = RunRecapDetailSurface.DetailLine.IsEmpty() + ? TEXT("Run recap detail: unavailable.") + : RunRecapDetailSurface.DetailLine; + Surface.RunRecapActionStatusLine = RunRecapActionSurface.StatusLine.IsEmpty() + ? TEXT("Run recap action control: unavailable.") + : RunRecapActionSurface.StatusLine; + Surface.TrainingSessionId = !RunRecapStatusSurface.TrainingSessionId.IsEmpty() + ? RunRecapStatusSurface.TrainingSessionId + : (ActiveRunSurface.TrainingSessionId.IsEmpty() ? TEXT("n/a") : ActiveRunSurface.TrainingSessionId); + Surface.SessionStateLabel = !ActiveRunSurface.SessionStateLabel.IsEmpty() + ? ActiveRunSurface.SessionStateLabel + : (RunRecapStatusSurface.SessionStateLabel.IsEmpty() ? TEXT("n/a") : RunRecapStatusSurface.SessionStateLabel); + Surface.ActiveDeckLabel = !ActiveRunSurface.ActiveDeckLabel.IsEmpty() + ? ActiveRunSurface.ActiveDeckLabel + : (RunRecapStatusSurface.DeckLabel.IsEmpty() ? TEXT("n/a") : RunRecapStatusSurface.DeckLabel); + Surface.RecapSourceLabel = RunRecapStatusSurface.SourceLabel.IsEmpty() + ? TEXT("none") + : RunRecapStatusSurface.SourceLabel; + Surface.RepeatLabel = RunRecapActionSurface.RepeatLabel.IsEmpty() + ? TEXT("Repeat Run") + : RunRecapActionSurface.RepeatLabel; + Surface.DismissLabel = RunRecapActionSurface.DismissLabel.IsEmpty() + ? TEXT("Dismiss Recap") + : RunRecapActionSurface.DismissLabel; + Surface.AttemptCount = ActiveRunSurface.AttemptCount > 0 + ? ActiveRunSurface.AttemptCount + : RunRecapDetailSurface.AttemptCount; + Surface.CompletedAttemptCount = ActiveRunSurface.CompletedAttemptCount > 0 + ? ActiveRunSurface.CompletedAttemptCount + : RunRecapDetailSurface.CompletedAttemptCount; + Surface.SuccessRate = RunRecapDetailSurface.SuccessRate; + Surface.bHasActiveRun = ActiveRunSurface.bHasActiveRun || RunRecapStatusSurface.bHasActiveRun || RunRecapActionSurface.bHasActiveRun; + Surface.bHasDisplayedRunRecap = RunRecapStatusSurface.bHasDisplayedRunRecap || RunRecapDetailSurface.bHasDisplayedRunRecap || RunRecapActionSurface.bHasDisplayedRunRecap; + Surface.bHasRetainedRunRecap = RunRecapStatusSurface.bHasRetainedRunRecap || RunRecapActionSurface.bHasRetainedRunRecap; + Surface.bRepeatEnabled = RunRecapActionSurface.bRepeatEnabled; + Surface.bDismissEnabled = RunRecapActionSurface.bDismissEnabled; + Surface.bClosedLoopIdleDashboard = ActiveRunSurface.bClosedLoopIdleDashboard; + Surface.StatusLine = FString::Printf( + TEXT("Run-state recap band: session %s | state %s | recap %s | repeat %s | dismiss %s"), + *Surface.TrainingSessionId, + *Surface.SessionStateLabel, + *Surface.RecapSourceLabel, + Surface.bRepeatEnabled ? TEXT("enabled") : TEXT("disabled"), + Surface.bDismissEnabled ? TEXT("enabled") : TEXT("disabled")); + Surface.DetailLine = FString::Printf( + TEXT("%s | %s | %s | %s | %s | deck %s | attempts %d | completed %d | success %.2f | active run %s | retained recap %s | closed-loop idle %s"), + *Surface.ActiveRunStatusLine, + *Surface.ActiveRunSummaryLine, + *Surface.RunRecapStatusLine, + *Surface.RunRecapDetailLine, + *Surface.RunRecapActionStatusLine, + *Surface.ActiveDeckLabel, + Surface.AttemptCount, + Surface.CompletedAttemptCount, + Surface.SuccessRate, + Surface.bHasActiveRun ? TEXT("yes") : TEXT("no"), + Surface.bHasRetainedRunRecap ? TEXT("yes") : TEXT("no"), + Surface.bClosedLoopIdleDashboard ? TEXT("yes") : TEXT("no")); + return Surface; +} + FHyperTwistTrainingCoachDashboardTemplateLaunchStatusInspectSurface UHyperTwistCoachDashboardWidget::GetDisplayedTemplateLaunchStatusInspectSurface() const { diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h index e00a7a6..70a5809 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h @@ -983,6 +983,10 @@ public: FHyperTwistTrainingCoachDashboardRunRecapActionControlInspectSurface GetDisplayedRunRecapActionControlInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardRunStateRecapBandInspectSurface + GetDisplayedRunStateRecapBandInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") FHyperTwistTrainingCoachDashboardTemplateLaunchStatusInspectSurface GetDisplayedTemplateLaunchStatusInspectSurface() const; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index ef5c9d5..5693645 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -16689,6 +16689,91 @@ struct FHyperTwistTrainingCoachDashboardRunRecapActionControlInspectSurface } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardRunStateRecapBandInspectSurface +{ + 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 ActiveRunStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ActiveRunSummaryLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RunRecapStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RunRecapDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RunRecapActionStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString TrainingSessionId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SessionStateLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString ActiveDeckLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecapSourceLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RepeatLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DismissLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 AttemptCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 CompletedAttemptCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float SuccessRate = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasActiveRun = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasDisplayedRunRecap = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasRetainedRunRecap = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bRepeatEnabled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bDismissEnabled = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bClosedLoopIdleDashboard = false; + + bool IsStructurallyValid() const + { + return !StatusLine.IsEmpty() + || !DetailLine.IsEmpty() + || bHasActiveRun + || bHasDisplayedRunRecap + || bRepeatEnabled + || bDismissEnabled; + } +}; + USTRUCT(BlueprintType) struct FHyperTwistTrainingCoachDashboardTemplateLaunchStatusInspectSurface { diff --git a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md index bba6d40..e64f272 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 chooses the next adjacent live dashboard consumer band in the method-drill operations neighborhood and adds a single method-drill-operational seam over the already-landed method-drill diagnostics and method-drill follow-up action surfaces, so gameplay/Blueprint callers can inspect that whole method-drill operational dashboard cluster without stitching two adjacent getters together - - 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, the method-drill follow-up-history band, the method-drill operational band, the guidance-preview band, and the guidance-reasoning 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 chooses the next adjacent live dashboard consumer band in the run-state / recap neighborhood and adds a single run-state-recap seam over the already-landed active-run status plus run-recap status/detail/action-control surfaces, so gameplay/Blueprint callers can inspect that whole run-state recap dashboard cluster without stitching four adjacent getters together + - 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, the method-drill follow-up-history band, the method-drill operational band, the guidance-preview band, the guidance-reasoning band, and the run-state recap 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_RUN_STATE_RECAP_BAND_INSPECT_SURFACE_PACKET_2026-05-11.md b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_RUN_STATE_RECAP_BAND_INSPECT_SURFACE_PACKET_2026-05-11.md new file mode 100644 index 0000000..5e1e706 --- /dev/null +++ b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_RUN_STATE_RECAP_BAND_INSPECT_SURFACE_PACKET_2026-05-11.md @@ -0,0 +1,52 @@ +# HyperTwist Phase 4 dashboard run-state recap band inspect surface packet + +- bounded Phase `4` dashboard-consumer slice +- date: `2026-05-11` + +## Intent + +Deliberately choose the next adjacent live dashboard consumer band in the run-state / recap neighborhood and expose the active-run status plus run-recap status, detail, and action-control cluster as one inspectable gameplay and Blueprint seam. + +## Why this packet exists + +`UHyperTwistCoachDashboardWidget` already exposed four adjacent run-state / recap surfaces: + +- `GetDisplayedActiveRunStatusInspectSurface()` +- `GetDisplayedRunRecapStatusInspectSurface()` +- `GetDisplayedRunRecapDetailInspectSurface()` +- `GetDisplayedRunRecapActionControlInspectSurface()` + +But callers that wanted to reason about that whole run-state recap dashboard cluster still had to stitch four adjacent getters together manually. + +## What changed + +- added `FHyperTwistTrainingCoachDashboardRunStateRecapBandInspectSurface` +- added `GetDisplayedRunStateRecapBandInspectSurface()` +- composed the new surface entirely over the already-landed active-run status and run-recap status/detail/action-control surfaces +- 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 adjacent run-state recap dashboard band through one surface +- active-run status/summary and run-recap status/detail/action-control lines together +- session identity, session state, active deck, recap source, repeat/dismiss posture, attempt counts, and success posture + +without stitching four separate adjacent getters together manually. + +## 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, the method-drill follow-up-history band, the method-drill operational band, the guidance-preview band, the guidance-reasoning band, and the run-state recap band as landed baseline, then deliberately choose another adjacent live dashboard consumer band instead of reopening already-landed surfaces by drift.