From b0cf20aa8ba8f673df3fe0cc5a7cea24d2084281 Mon Sep 17 00:00:00 2001 From: axiomlogicnexus Date: Mon, 11 May 2026 15:37:03 +0200 Subject: [PATCH] Expose dashboard queue suppression band --- .../HyperTwistCoachDashboardWidget.cpp | 121 +++++++++++++ .../HyperTwistCoachDashboardWidget.h | 4 + .../HyperTwistTrainingTypes.h | 160 ++++++++++++++++++ ...RTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md | 3 +- ..._BAND_INSPECT_SURFACE_PACKET_2026-05-11.md | 52 ++++++ 5 files changed, 339 insertions(+), 1 deletion(-) create mode 100644 docs/arch/HYPERTWIST_PHASE4_DASHBOARD_QUEUE_SUPPRESSION_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 420ab5c..6466222 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp @@ -7778,6 +7778,127 @@ UHyperTwistCoachDashboardWidget::GetDisplayedQueueSuppressionHistoryNavigationIn return Surface; } +FHyperTwistTrainingCoachDashboardQueueSuppressionBandInspectSurface +UHyperTwistCoachDashboardWidget::GetDisplayedQueueSuppressionBandInspectSurface() const +{ + FHyperTwistTrainingCoachDashboardQueueSuppressionBandInspectSurface Surface; + Surface.Headline = TEXT("Queue-suppression band"); + + const FHyperTwistTrainingCoachDashboardQueueSuppressionSummaryInspectSurface SummarySurface = + GetDisplayedQueueSuppressionSummaryInspectSurface(); + const FHyperTwistTrainingCoachDashboardQueueSuppressionDetailInspectSurface DetailSurface = + GetDisplayedQueueSuppressionDetailInspectSurface(); + const FHyperTwistTrainingCoachDashboardQueueSuppressionHistoryNavigationInspectSurface NavigationSurface = + GetDisplayedQueueSuppressionHistoryNavigationInspectSurface(); + + Surface.QueueSuppressionSummaryLine = SummarySurface.StatusLine.IsEmpty() + ? TEXT("Queue suppression summary: unavailable.") + : SummarySurface.StatusLine; + Surface.QueueSuppressionDetailLine = DetailSurface.DetailLine.IsEmpty() + ? TEXT("Queue suppression detail: unavailable.") + : DetailSurface.DetailLine; + Surface.QueueSuppressionNavigationStatusLine = NavigationSurface.StatusLine.IsEmpty() + ? TEXT("Queue suppression navigation: unavailable.") + : NavigationSurface.StatusLine; + Surface.QueueSuppressionNavigationDetailLine = NavigationSurface.DetailLine.IsEmpty() + ? TEXT("Queue suppression navigation detail: unavailable.") + : NavigationSurface.DetailLine; + Surface.GuidanceLaneLabel = SummarySurface.GuidanceLaneLabel.IsEmpty() + ? TEXT("none") + : SummarySurface.GuidanceLaneLabel; + Surface.PreferredRecoveryActionLabel = !NavigationSurface.PreferredRecoveryActionLabel.IsEmpty() + ? NavigationSurface.PreferredRecoveryActionLabel + : (SummarySurface.PreferredRecoveryActionLabel.IsEmpty() + ? TEXT("n/a") + : SummarySurface.PreferredRecoveryActionLabel); + Surface.DominantDeferralReasonLabel = !NavigationSurface.DominantDeferralReasonLabel.IsEmpty() + ? NavigationSurface.DominantDeferralReasonLabel + : (DetailSurface.DominantDeferralReasonLabel.IsEmpty() + ? TEXT("n/a") + : DetailSurface.DominantDeferralReasonLabel); + Surface.PrimarySuppressionReason = SummarySurface.PrimarySuppressionReason.IsEmpty() + ? TEXT("not suppressed") + : SummarySurface.PrimarySuppressionReason; + Surface.FollowUpSuppressionReason = SummarySurface.FollowUpSuppressionReason.IsEmpty() + ? TEXT("not suppressed") + : SummarySurface.FollowUpSuppressionReason; + Surface.QueueId = DetailSurface.QueueId.IsEmpty() ? TEXT("n/a") : DetailSurface.QueueId; + Surface.NextDeferredEntryId = DetailSurface.NextDeferredEntryId.IsEmpty() + ? TEXT("none") + : DetailSurface.NextDeferredEntryId; + Surface.NextManualRescheduleEntryId = DetailSurface.NextManualRescheduleEntryId.IsEmpty() + ? TEXT("none") + : DetailSurface.NextManualRescheduleEntryId; + Surface.EarliestDeferredUntilUtc = DetailSurface.EarliestDeferredUntilUtc.IsEmpty() + ? TEXT("n/a") + : DetailSurface.EarliestDeferredUntilUtc; + Surface.PreviousLabel = NavigationSurface.PreviousLabel.IsEmpty() + ? TEXT("Prev Suppression") + : NavigationSurface.PreviousLabel; + Surface.NextLabel = NavigationSurface.NextLabel.IsEmpty() + ? TEXT("Next Suppression") + : NavigationSurface.NextLabel; + Surface.SelectedEntryOrdinal = NavigationSurface.SelectedEntryOrdinal.IsEmpty() + ? TEXT("none") + : NavigationSurface.SelectedEntryOrdinal; + Surface.RecordedAtUtc = NavigationSurface.RecordedAtUtc.IsEmpty() + ? TEXT("n/a") + : NavigationSurface.RecordedAtUtc; + Surface.SelectedLaneLabel = NavigationSurface.SelectedLaneLabel.IsEmpty() + ? TEXT("none") + : NavigationSurface.SelectedLaneLabel; + Surface.SelectedEntryIndex = NavigationSurface.SelectedEntryIndex; + Surface.HistoryEntryCount = NavigationSurface.HistoryEntryCount; + Surface.TotalQueueEntryCount = SummarySurface.TotalQueueEntryCount; + Surface.ReadyQueueEntryCount = SummarySurface.ReadyQueueEntryCount; + Surface.DeferredQueueEntryCount = SummarySurface.DeferredQueueEntryCount; + Surface.ManualRescheduleEntryCount = DetailSurface.ManualRescheduleEntryCount; + Surface.ArchiveAwareDeferredEntryCount = DetailSurface.ArchiveAwareDeferredEntryCount; + Surface.BlockedFollowUpDeferredEntryCount = DetailSurface.BlockedFollowUpDeferredEntryCount; + Surface.DeferredEventCount = DetailSurface.DeferredEventCount; + Surface.PromotedEventCount = DetailSurface.PromotedEventCount; + Surface.ManualRescheduleEventCount = DetailSurface.ManualRescheduleEventCount; + Surface.ReschedulePressureScore = DetailSurface.ReschedulePressureScore; + Surface.PreferredGuidanceLane = SummarySurface.PreferredGuidanceLane; + Surface.PreferredRecoveryAction = SummarySurface.PreferredRecoveryAction; + Surface.bHasPrimaryQueueSuppression = SummarySurface.bHasPrimaryQueueSuppression; + Surface.bHasFollowUpQueueSuppression = SummarySurface.bHasFollowUpQueueSuppression; + Surface.bHasAnyQueueSuppression = SummarySurface.bHasAnyQueueSuppression; + Surface.bHasBlockedFollowUpDeferrals = DetailSurface.bHasBlockedFollowUpDeferrals; + Surface.bHasArchiveAwareDeferrals = DetailSurface.bHasArchiveAwareDeferrals; + Surface.bNeedsManualRescheduleReview = DetailSurface.bNeedsManualRescheduleReview; + Surface.bHasOutstandingDeferredWork = DetailSurface.bHasOutstandingDeferredWork; + Surface.bHasCompletionGap = DetailSurface.bHasCompletionGap; + Surface.bHasSelectedEntry = NavigationSurface.bHasSelectedEntry; + Surface.bSelectedEntryIsLatest = NavigationSurface.bSelectedEntryIsLatest; + Surface.bPreviousEnabled = NavigationSurface.bPreviousEnabled; + Surface.bNextEnabled = NavigationSurface.bNextEnabled; + Surface.StatusLine = FString::Printf( + TEXT("Queue-suppression band: lane %s | recovery %s | selected %s | suppression %s | navigation %s/%s"), + *Surface.GuidanceLaneLabel, + *Surface.PreferredRecoveryActionLabel, + *Surface.SelectedEntryOrdinal, + Surface.bHasAnyQueueSuppression ? TEXT("active") : TEXT("idle"), + Surface.bPreviousEnabled ? TEXT("enabled") : TEXT("disabled"), + Surface.bNextEnabled ? TEXT("enabled") : TEXT("disabled")); + Surface.DetailLine = FString::Printf( + TEXT("%s | %s | %s | %s | queue %s | dominant reason %s | primary %s | follow-up %s | total %d | deferred %d | pressure %.2f | recorded %s | latest %s"), + *Surface.QueueSuppressionSummaryLine, + *Surface.QueueSuppressionDetailLine, + *Surface.QueueSuppressionNavigationStatusLine, + *Surface.QueueSuppressionNavigationDetailLine, + *Surface.QueueId, + *Surface.DominantDeferralReasonLabel, + *Surface.PrimarySuppressionReason, + *Surface.FollowUpSuppressionReason, + Surface.TotalQueueEntryCount, + Surface.DeferredQueueEntryCount, + Surface.ReschedulePressureScore, + *Surface.RecordedAtUtc, + Surface.bSelectedEntryIsLatest ? TEXT("yes") : TEXT("no")); + return Surface; +} + FHyperTwistTrainingCoachDashboardClosureRecoveryHistoryInspectSurface UHyperTwistCoachDashboardWidget::GetSelectedClosureRecoveryHistoryInspectSurface() const { diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h index faf66ff..97180b7 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistCoachDashboardWidget.h @@ -755,6 +755,10 @@ public: FHyperTwistTrainingCoachDashboardQueueSuppressionHistoryNavigationInspectSurface GetDisplayedQueueSuppressionHistoryNavigationInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") + FHyperTwistTrainingCoachDashboardQueueSuppressionBandInspectSurface + GetDisplayedQueueSuppressionBandInspectSurface() const; + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard") FHyperTwistTrainingCoachDashboardClosureRecoveryHistoryInspectSurface GetSelectedClosureRecoveryHistoryInspectSurface() const; diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h index fc43cab..d60ea34 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingTypes.h @@ -8684,6 +8684,166 @@ struct FHyperTwistTrainingCoachDashboardQueueSuppressionDetailInspectSurface } }; +USTRUCT(BlueprintType) +struct FHyperTwistTrainingCoachDashboardQueueSuppressionBandInspectSurface +{ + 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 QueueSuppressionSummaryLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString QueueSuppressionDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString QueueSuppressionNavigationStatusLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString QueueSuppressionNavigationDetailLine; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString GuidanceLaneLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PreferredRecoveryActionLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString DominantDeferralReasonLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PrimarySuppressionReason; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString FollowUpSuppressionReason; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString QueueId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString NextDeferredEntryId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString NextManualRescheduleEntryId; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString EarliestDeferredUntilUtc; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString PreviousLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString NextLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SelectedEntryOrdinal; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString RecordedAtUtc; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + FString SelectedLaneLabel; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 SelectedEntryIndex = INDEX_NONE; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 HistoryEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 TotalQueueEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ReadyQueueEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 DeferredQueueEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ManualRescheduleEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ArchiveAwareDeferredEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 BlockedFollowUpDeferredEntryCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 DeferredEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 PromotedEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + int32 ManualRescheduleEventCount = 0; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + float ReschedulePressureScore = 0.0f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + EHyperTwistTrainingCoachGuidanceLane PreferredGuidanceLane = + EHyperTwistTrainingCoachGuidanceLane::None; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + EHyperTwistTrainingQueueRecoveryAction PreferredRecoveryAction = + EHyperTwistTrainingQueueRecoveryAction::None; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasPrimaryQueueSuppression = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasFollowUpQueueSuppression = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasAnyQueueSuppression = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasBlockedFollowUpDeferrals = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasArchiveAwareDeferrals = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bNeedsManualRescheduleReview = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasOutstandingDeferredWork = false; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist") + bool bHasCompletionGap = false; + + 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; + + bool IsStructurallyValid() const + { + return !StatusLine.IsEmpty() + || !DetailLine.IsEmpty() + || bHasAnyQueueSuppression + || bHasOutstandingDeferredWork + || bHasSelectedEntry + || bPreviousEnabled + || bNextEnabled; + } +}; + USTRUCT(BlueprintType) struct FHyperTwistTrainingCoachDashboardQueueRecoveryOutcomeInspectSurface { diff --git a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md index 063991d..f88ed67 100644 --- a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md +++ b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md @@ -76,7 +76,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 composite selected-queue seam over the already-landed selected-queue navigation, start-selected action, selected-queue summary, and selected queue-entry detail surfaces, so gameplay/Blueprint callers can inspect that whole queue-focused dashboard cluster without stitching four adjacent getters together - 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 - - 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, and the closure-recovery 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 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 + - 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, and the queue-suppression 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_QUEUE_SUPPRESSION_BAND_INSPECT_SURFACE_PACKET_2026-05-11.md b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_QUEUE_SUPPRESSION_BAND_INSPECT_SURFACE_PACKET_2026-05-11.md new file mode 100644 index 0000000..cb57647 --- /dev/null +++ b/docs/arch/HYPERTWIST_PHASE4_DASHBOARD_QUEUE_SUPPRESSION_BAND_INSPECT_SURFACE_PACKET_2026-05-11.md @@ -0,0 +1,52 @@ +# HyperTwist Phase 4 dashboard queue suppression band inspect surface packet + +- bounded Phase `4` dashboard-consumer slice +- date: `2026-05-11` + +## Intent + +Deliberately choose another adjacent live dashboard consumer band and expose the queue-suppression summary, queue-suppression detail, and queue-suppression history navigation cluster as one inspectable gameplay and Blueprint seam. + +## Why this packet exists + +`UHyperTwistCoachDashboardWidget` already exposed three adjacent queue-suppression surfaces: + +- `GetDisplayedQueueSuppressionSummaryInspectSurface()` +- `GetDisplayedQueueSuppressionDetailInspectSurface()` +- `GetDisplayedQueueSuppressionHistoryNavigationInspectSurface()` + +But callers that wanted to reason about that whole queue-suppression dashboard cluster still had to stitch those adjacent getters together manually. + +## What changed + +- added `FHyperTwistTrainingCoachDashboardQueueSuppressionBandInspectSurface` +- added `GetDisplayedQueueSuppressionBandInspectSurface()` +- composed the new surface entirely over the already-landed queue-suppression live summary, queue-suppression detail, and queue-suppression history navigation 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 queue-suppression dashboard band through one surface +- queue-suppression live summary/detail plus history-navigation status/detail lines together +- guidance lane, preferred recovery action, dominant deferral reason, suppression reasons, queue id, deferred/manual entry context, and selected entry ordinal/recorded time context +- suppression posture, deferred/manual pressure posture, and navigation enablement posture + +without stitching three 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, and the queue-suppression band as landed baseline, then deliberately choose another adjacent live dashboard consumer band instead of reopening already-landed surfaces by drift.