Expose dashboard guidance preview band

This commit is contained in:
axiomlogicnexus 2026-05-11 16:13:45 +02:00
parent e328bfe006
commit e7dd389fe2
5 changed files with 317 additions and 2 deletions

View file

@ -12253,6 +12253,137 @@ UHyperTwistCoachDashboardWidget::GetDisplayedGuidancePreviewLaunchActionControlI
return Surface;
}
FHyperTwistTrainingCoachDashboardGuidancePreviewBandInspectSurface
UHyperTwistCoachDashboardWidget::GetDisplayedGuidancePreviewBandInspectSurface() const
{
FHyperTwistTrainingCoachDashboardGuidancePreviewBandInspectSurface Surface;
Surface.Headline = TEXT("Guidance preview band");
const FHyperTwistTrainingCoachDashboardGuidancePreviewSelectionInspectSurface SelectionSurface =
GetDisplayedGuidancePreviewSelectionInspectSurface();
const FHyperTwistTrainingCoachDashboardGuidancePreviewCaseDetailInspectSurface CaseDetailSurface =
GetDisplayedGuidancePreviewCaseDetailInspectSurface();
const FHyperTwistTrainingCoachDashboardGuidancePreviewCaseNavigationInspectSurface NavigationSurface =
GetDisplayedGuidancePreviewCaseNavigationInspectSurface();
const FHyperTwistTrainingCoachDashboardGuidancePreviewLaunchActionControlInspectSurface ActionControlSurface =
GetDisplayedGuidancePreviewLaunchActionControlInspectSurface();
const FHyperTwistTrainingCoachDashboardGuidanceDeckPreviewInspectSurface RecommendedDeckSurface =
GetDisplayedRecommendedGuidanceDeckPreviewInspectSurface();
const FHyperTwistTrainingCoachDashboardGuidanceDeckPreviewInspectSurface FollowUpDeckSurface =
GetDisplayedFollowUpGuidanceDeckPreviewInspectSurface();
Surface.PreviewSelectionStatusLine = SelectionSurface.StatusLine.IsEmpty()
? TEXT("Guidance preview selection: unavailable.")
: SelectionSurface.StatusLine;
Surface.PreviewCaseDetailStatusLine = CaseDetailSurface.StatusLine.IsEmpty()
? TEXT("Guidance preview case detail: unavailable.")
: CaseDetailSurface.StatusLine;
Surface.PreviewCaseNavigationStatusLine = NavigationSurface.StatusLine.IsEmpty()
? TEXT("Guidance preview case navigation: unavailable.")
: NavigationSurface.StatusLine;
Surface.PreviewLaunchControlStatusLine = ActionControlSurface.StatusLine.IsEmpty()
? TEXT("Guidance preview launch control: unavailable.")
: ActionControlSurface.StatusLine;
Surface.RecommendedDeckStatusLine = RecommendedDeckSurface.StatusLine.IsEmpty()
? TEXT("Recommended guidance deck: unavailable.")
: RecommendedDeckSurface.StatusLine;
Surface.FollowUpDeckStatusLine = FollowUpDeckSurface.StatusLine.IsEmpty()
? TEXT("Follow-up guidance deck: unavailable.")
: FollowUpDeckSurface.StatusLine;
Surface.ActivePreviewLaneLabel = !SelectionSurface.ActivePreviewLaneLabel.IsEmpty()
? SelectionSurface.ActivePreviewLaneLabel
: (ActionControlSurface.ActivePreviewLaneLabel.IsEmpty()
? TEXT("none")
: ActionControlSurface.ActivePreviewLaneLabel);
Surface.DeckId = SelectionSurface.DeckId.IsEmpty() ? TEXT("n/a") : SelectionSurface.DeckId;
Surface.DeckTitle = SelectionSurface.DeckTitle.IsEmpty() ? TEXT("n/a") : SelectionSurface.DeckTitle;
Surface.DeckLabel = !SelectionSurface.DeckLabel.IsEmpty()
? SelectionSurface.DeckLabel
: (ActionControlSurface.DeckLabel.IsEmpty() ? TEXT("n/a") : ActionControlSurface.DeckLabel);
Surface.SelectionPolicyLabel = SelectionSurface.SelectionPolicyLabel.IsEmpty()
? TEXT("n/a")
: SelectionSurface.SelectionPolicyLabel;
Surface.SelectedCaseId = !SelectionSurface.SelectedCaseId.IsEmpty()
? SelectionSurface.SelectedCaseId
: (NavigationSurface.SelectedCaseId.IsEmpty() ? TEXT("none") : NavigationSurface.SelectedCaseId);
Surface.SelectedCasePromptLabel = !SelectionSurface.SelectedCasePromptLabel.IsEmpty()
? SelectionSurface.SelectedCasePromptLabel
: (NavigationSurface.SelectedCasePromptLabel.IsEmpty()
? TEXT("n/a")
: NavigationSurface.SelectedCasePromptLabel);
Surface.SelectedCaseOrdinal = NavigationSurface.SelectedCaseOrdinal.IsEmpty()
? TEXT("none")
: NavigationSurface.SelectedCaseOrdinal;
Surface.StartPreviewDeckLabel = ActionControlSurface.StartPreviewDeckLabel.IsEmpty()
? TEXT("Start Preview Deck")
: ActionControlSurface.StartPreviewDeckLabel;
Surface.StartSelectedPreviewCaseLabel = ActionControlSurface.StartSelectedPreviewCaseLabel.IsEmpty()
? TEXT("Start Selected Preview Case")
: ActionControlSurface.StartSelectedPreviewCaseLabel;
Surface.RecommendedDeckLabel = RecommendedDeckSurface.DeckLabel.IsEmpty()
? TEXT("n/a")
: RecommendedDeckSurface.DeckLabel;
Surface.FollowUpDeckLabel = FollowUpDeckSurface.DeckLabel.IsEmpty()
? TEXT("n/a")
: FollowUpDeckSurface.DeckLabel;
Surface.RecommendedBriefHeadline = RecommendedDeckSurface.BriefHeadline.IsEmpty()
? TEXT("n/a")
: RecommendedDeckSurface.BriefHeadline;
Surface.FollowUpBriefHeadline = FollowUpDeckSurface.BriefHeadline.IsEmpty()
? TEXT("n/a")
: FollowUpDeckSurface.BriefHeadline;
Surface.SelectedCaseIndex = SelectionSurface.SelectedCaseIndex;
Surface.TotalCaseCount = SelectionSurface.TotalCaseCount;
Surface.RecommendedCaseCount = RecommendedDeckSurface.CaseCount;
Surface.FollowUpCaseCount = FollowUpDeckSurface.CaseCount;
Surface.bHasActivePreviewDeck =
SelectionSurface.bHasActivePreviewDeck
|| CaseDetailSurface.bHasActivePreviewDeck
|| NavigationSurface.bHasActivePreviewDeck
|| ActionControlSurface.bHasActivePreviewDeck;
Surface.bHasSelectedCase =
SelectionSurface.bHasSelectedCase
|| CaseDetailSurface.bHasSelectedCase
|| NavigationSurface.bHasSelectedCase
|| ActionControlSurface.bHasSelectedCase;
Surface.bPreviousEnabled = NavigationSurface.bPreviousEnabled;
Surface.bNextEnabled = NavigationSurface.bNextEnabled;
Surface.bStartPreviewDeckEnabled = ActionControlSurface.bStartPreviewDeckEnabled;
Surface.bStartSelectedPreviewCaseEnabled = ActionControlSurface.bStartSelectedPreviewCaseEnabled;
Surface.bHasRecommendedDeck = RecommendedDeckSurface.bHasDeck || RecommendedDeckSurface.bHasBrief;
Surface.bHasFollowUpDeck = FollowUpDeckSurface.bHasDeck || FollowUpDeckSurface.bHasBrief;
Surface.bClosedLoopIdleDashboard =
SelectionSurface.bClosedLoopIdleDashboard
|| CaseDetailSurface.bClosedLoopIdleDashboard
|| NavigationSurface.bClosedLoopIdleDashboard
|| ActionControlSurface.bClosedLoopIdleDashboard
|| RecommendedDeckSurface.bClosedLoopIdleDashboard
|| FollowUpDeckSurface.bClosedLoopIdleDashboard;
Surface.StatusLine = FString::Printf(
TEXT("Guidance preview band: lane %s | case %s | navigation %s/%s | start deck %s | start case %s"),
*Surface.ActivePreviewLaneLabel,
*Surface.SelectedCaseOrdinal,
Surface.bPreviousEnabled ? TEXT("enabled") : TEXT("disabled"),
Surface.bNextEnabled ? TEXT("enabled") : TEXT("disabled"),
Surface.bStartPreviewDeckEnabled ? TEXT("enabled") : TEXT("disabled"),
Surface.bStartSelectedPreviewCaseEnabled ? TEXT("enabled") : TEXT("disabled"));
Surface.DetailLine = FString::Printf(
TEXT("%s | %s | %s | %s | %s | %s | deck %s | selected case %s | recommended cases %d | follow-up cases %d | active preview deck %s | closed-loop idle %s"),
*Surface.PreviewSelectionStatusLine,
*Surface.PreviewCaseDetailStatusLine,
*Surface.PreviewCaseNavigationStatusLine,
*Surface.PreviewLaunchControlStatusLine,
*Surface.RecommendedDeckStatusLine,
*Surface.FollowUpDeckStatusLine,
*Surface.DeckLabel,
*Surface.SelectedCaseId,
Surface.RecommendedCaseCount,
Surface.FollowUpCaseCount,
Surface.bHasActivePreviewDeck ? TEXT("yes") : TEXT("no"),
Surface.bClosedLoopIdleDashboard ? TEXT("yes") : TEXT("no"));
return Surface;
}
FHyperTwistTrainingCoachDashboardMethodDrillDiagnosticsInspectSurface
UHyperTwistCoachDashboardWidget::GetDisplayedMethodDrillDiagnosticsInspectSurface() const
{

View file

@ -915,6 +915,10 @@ public:
FHyperTwistTrainingCoachDashboardGuidancePreviewLaunchActionControlInspectSurface
GetDisplayedGuidancePreviewLaunchActionControlInspectSurface() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard")
FHyperTwistTrainingCoachDashboardGuidancePreviewBandInspectSurface
GetDisplayedGuidancePreviewBandInspectSurface() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard")
FHyperTwistTrainingCoachDashboardMethodDrillDiagnosticsInspectSurface
GetDisplayedMethodDrillDiagnosticsInspectSurface() const;

View file

@ -13960,6 +13960,132 @@ struct FHyperTwistTrainingCoachDashboardGuidanceDeckPreviewInspectSurface
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachDashboardGuidancePreviewBandInspectSurface
{
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 PreviewSelectionStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PreviewCaseDetailStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PreviewCaseNavigationStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString PreviewLaunchControlStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RecommendedDeckStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FollowUpDeckStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ActivePreviewLaneLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString DeckId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString DeckTitle;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString DeckLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SelectionPolicyLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SelectedCaseId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SelectedCasePromptLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString SelectedCaseOrdinal;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString StartPreviewDeckLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString StartSelectedPreviewCaseLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RecommendedDeckLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FollowUpDeckLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RecommendedBriefHeadline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString FollowUpBriefHeadline;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 SelectedCaseIndex = INDEX_NONE;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 TotalCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 RecommendedCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
int32 FollowUpCaseCount = 0;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasActivePreviewDeck = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasSelectedCase = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bPreviousEnabled = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bNextEnabled = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bStartPreviewDeckEnabled = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bStartSelectedPreviewCaseEnabled = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasRecommendedDeck = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasFollowUpDeck = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bClosedLoopIdleDashboard = false;
bool IsStructurallyValid() const
{
return !StatusLine.IsEmpty()
|| !DetailLine.IsEmpty()
|| bHasActivePreviewDeck
|| bHasSelectedCase
|| bStartPreviewDeckEnabled
|| bStartSelectedPreviewCaseEnabled
|| bHasRecommendedDeck
|| bHasFollowUpDeck;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachDashboardHandoffRecommendationInspectSurface
{

View file

@ -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 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 latest landed bounded `Phase 4` packet deliberately chooses the next adjacent live dashboard consumer band in the active preview neighborhood and adds a single guidance-preview seam over the already-landed preview selection, preview case detail/navigation, preview launch control, and recommended/follow-up deck preview surfaces, so gameplay/Blueprint callers can inspect that whole preview-focused dashboard cluster without stitching six 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, and the guidance-preview 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

View file

@ -0,0 +1,54 @@
# HyperTwist Phase 4 dashboard guidance preview 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 active preview neighborhood and expose the guidance preview selection, case detail, case navigation, launch control, and recommended/follow-up deck preview cluster as one inspectable gameplay and Blueprint seam.
## Why this packet exists
`UHyperTwistCoachDashboardWidget` already exposed six adjacent preview-focused surfaces:
- `GetDisplayedGuidancePreviewSelectionInspectSurface()`
- `GetDisplayedGuidancePreviewCaseDetailInspectSurface()`
- `GetDisplayedGuidancePreviewCaseNavigationInspectSurface()`
- `GetDisplayedGuidancePreviewLaunchActionControlInspectSurface()`
- `GetDisplayedRecommendedGuidanceDeckPreviewInspectSurface()`
- `GetDisplayedFollowUpGuidanceDeckPreviewInspectSurface()`
But callers that wanted to reason about that whole preview-focused dashboard cluster still had to stitch six adjacent getters together manually.
## What changed
- added `FHyperTwistTrainingCoachDashboardGuidancePreviewBandInspectSurface`
- added `GetDisplayedGuidancePreviewBandInspectSurface()`
- composed the new surface entirely over the already-landed preview selection, preview case detail/navigation, preview launch control, and recommended/follow-up deck preview 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 guidance preview dashboard band through one surface
- preview selection, preview case detail/navigation, preview launch control, and recommended/follow-up deck preview status lines together
- active preview lane, deck/case identity, preview start-control posture, and recommended/follow-up deck availability posture
without stitching six 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, and the guidance-preview band as landed baseline, then deliberately choose another adjacent live dashboard consumer band instead of reopening already-landed surfaces by drift.