Expose run state recap band
This commit is contained in:
parent
92c6ac67c1
commit
bd54c5c571
5 changed files with 228 additions and 2 deletions
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
Loading…
Add table
Reference in a new issue