Expose dashboard verification recognition policy band

This commit is contained in:
axiomlogicnexus 2026-05-11 05:47:38 +02:00
parent cc6c719234
commit 10e5cf88aa
5 changed files with 272 additions and 1 deletions

View file

@ -14872,6 +14872,101 @@ UHyperTwistCoachDashboardWidget::GetDisplayedReviewPolicyStatusInspectSurface()
return Surface;
}
FHyperTwistTrainingCoachDashboardVerificationRecognitionPolicyBandInspectSurface
UHyperTwistCoachDashboardWidget::GetDisplayedVerificationRecognitionPolicyBandInspectSurface() const
{
FHyperTwistTrainingCoachDashboardVerificationRecognitionPolicyBandInspectSurface Surface;
Surface.Headline = TEXT("Verification / recognition / review-policy band");
const FHyperTwistTrainingCoachDashboardVerificationActionInspectSurface VerificationActionSurface =
GetDisplayedVerificationActionInspectSurface();
const FHyperTwistTrainingCoachDashboardRepositoryVerificationStatusInspectSurface RepositorySurface =
GetDisplayedRepositoryVerificationStatusInspectSurface();
const FHyperTwistTrainingCoachDashboardRecognitionStatusInspectSurface RecognitionSurface =
GetDisplayedRecognitionStatusInspectSurface();
const FHyperTwistTrainingCoachDashboardReviewPolicyStatusInspectSurface ReviewPolicySurface =
GetDisplayedReviewPolicyStatusInspectSurface();
Surface.VerificationActionStatusLine = VerificationActionSurface.StatusLine.IsEmpty()
? TEXT("Verification action: unavailable.")
: VerificationActionSurface.StatusLine;
Surface.RepositoryVerificationStatusLine = RepositorySurface.StatusLine.IsEmpty()
? TEXT("Repository verification status: unavailable.")
: RepositorySurface.StatusLine;
Surface.RecognitionStatusLine = RecognitionSurface.StatusLine.IsEmpty()
? TEXT("Recognition status: unavailable.")
: RecognitionSurface.StatusLine;
Surface.ReviewPolicyStatusLine = ReviewPolicySurface.StatusLine.IsEmpty()
? TEXT("Review-policy status: unavailable.")
: ReviewPolicySurface.StatusLine;
Surface.VerifyLabel = VerificationActionSurface.VerifyLabel.IsEmpty()
? TEXT("Verify")
: VerificationActionSurface.VerifyLabel;
Surface.RepositoryPath = !RepositorySurface.RepositoryPath.IsEmpty()
? RepositorySurface.RepositoryPath
: (VerificationActionSurface.RepositoryPath.IsEmpty()
? TEXT("not yet verified")
: VerificationActionSurface.RepositoryPath);
Surface.LatestVerificationNote = !RepositorySurface.LatestNote.IsEmpty()
? RepositorySurface.LatestNote
: (VerificationActionSurface.LatestNote.IsEmpty()
? TEXT("none")
: VerificationActionSurface.LatestNote);
Surface.GeneratedLaunchRequestDetail = RepositorySurface.GeneratedLaunchRequestDetail.IsEmpty()
? TEXT("n/a")
: RepositorySurface.GeneratedLaunchRequestDetail;
Surface.GeneratedExecutionDetail = RepositorySurface.GeneratedExecutionDetail.IsEmpty()
? TEXT("n/a")
: RepositorySurface.GeneratedExecutionDetail;
Surface.RecognitionRunModeLabel = RecognitionSurface.RunModeLabel.IsEmpty()
? TEXT("n/a")
: RecognitionSurface.RunModeLabel;
Surface.ReviewPolicyRunModeLabel = ReviewPolicySurface.RunModeLabel.IsEmpty()
? TEXT("n/a")
: ReviewPolicySurface.RunModeLabel;
Surface.bVerifyEnabled = VerificationActionSurface.bVerifyEnabled;
Surface.bHasResolvedPath = RepositorySurface.bHasResolvedPath || VerificationActionSurface.bHasResolvedPath;
Surface.bDidRoundTripPass = RepositorySurface.bDidRoundTripPass || VerificationActionSurface.bDidRoundTripPass;
Surface.bSaveSucceeded = RepositorySurface.bSaveSucceeded || VerificationActionSurface.bSaveSucceeded;
Surface.bLoadSucceeded = RepositorySurface.bLoadSucceeded || VerificationActionSurface.bLoadSucceeded;
Surface.bCountsMatched = RepositorySurface.bCountsMatched || VerificationActionSurface.bCountsMatched;
Surface.bStateMatched = RepositorySurface.bStateMatched || VerificationActionSurface.bStateMatched;
Surface.bIntegrityMatched = RepositorySurface.bIntegrityMatched || VerificationActionSurface.bIntegrityMatched;
Surface.bDerivedMatched = RepositorySurface.bDerivedMatched || VerificationActionSurface.bDerivedMatched;
Surface.bHasGeneratedLaunchRequest = RepositorySurface.bHasGeneratedLaunchRequest;
Surface.bHasGeneratedExecutionTarget = RepositorySurface.bHasGeneratedExecutionTarget;
Surface.bCanExecuteGeneratedLaunchRequest = RepositorySurface.bCanExecuteGeneratedLaunchRequest;
Surface.bGeneratedExecutionWillRefreshRequest = RepositorySurface.bGeneratedExecutionWillRefreshRequest;
Surface.bHasActiveRun = RecognitionSurface.bHasActiveRun || ReviewPolicySurface.bHasActiveRun;
Surface.bHasLiveAttemptTimer =
RecognitionSurface.bHasLiveAttemptTimer || ReviewPolicySurface.bHasLiveAttemptTimer;
Surface.bHasRunnableCurrentCase = ReviewPolicySurface.bHasRunnableCurrentCase;
Surface.bHasRecognitionStatus = RecognitionSurface.bHasRecognitionStatus;
Surface.bHasRecognitionDetail = RecognitionSurface.bHasRecognitionDetail;
Surface.bHasReviewPolicyStatus = ReviewPolicySurface.bHasReviewPolicyStatus;
Surface.bHasReviewPolicyDetail = ReviewPolicySurface.bHasReviewPolicyDetail;
Surface.StatusLine = FString::Printf(
TEXT("Status band: verify %s | repository %s | recognition %s | review policy %s"),
Surface.bVerifyEnabled ? TEXT("ready") : TEXT("idle"),
Surface.bDidRoundTripPass ? TEXT("passed") : TEXT("pending"),
Surface.bHasRecognitionStatus ? TEXT("ready") : TEXT("pending"),
Surface.bHasReviewPolicyStatus ? TEXT("ready") : TEXT("pending"));
Surface.DetailLine = FString::Printf(
TEXT("%s | %s | %s | %s | path %s | note %s | recognition mode %s | review mode %s | active run %s | live timer %s | runnable case %s"),
*Surface.VerificationActionStatusLine,
*Surface.RepositoryVerificationStatusLine,
*Surface.RecognitionStatusLine,
*Surface.ReviewPolicyStatusLine,
*Surface.RepositoryPath,
*Surface.LatestVerificationNote,
*Surface.RecognitionRunModeLabel,
*Surface.ReviewPolicyRunModeLabel,
Surface.bHasActiveRun ? TEXT("yes") : TEXT("no"),
Surface.bHasLiveAttemptTimer ? TEXT("yes") : TEXT("no"),
Surface.bHasRunnableCurrentCase ? TEXT("yes") : TEXT("no"));
return Surface;
}
FHyperTwistTrainingCoachDashboardSelectedQueueNavigationInspectSurface
UHyperTwistCoachDashboardWidget::GetDisplayedSelectedQueueNavigationInspectSurface() const
{

View file

@ -1019,6 +1019,10 @@ public:
FHyperTwistTrainingCoachDashboardReviewPolicyStatusInspectSurface
GetDisplayedReviewPolicyStatusInspectSurface() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard")
FHyperTwistTrainingCoachDashboardVerificationRecognitionPolicyBandInspectSurface
GetDisplayedVerificationRecognitionPolicyBandInspectSurface() const;
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach|Dashboard")
FHyperTwistTrainingCoachDashboardSelectedQueueNavigationInspectSurface
GetDisplayedSelectedQueueNavigationInspectSurface() const;

View file

@ -13847,6 +13847,124 @@ struct FHyperTwistTrainingCoachDashboardReviewPolicyStatusInspectSurface
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachDashboardVerificationRecognitionPolicyBandInspectSurface
{
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 VerificationActionStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RepositoryVerificationStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RecognitionStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReviewPolicyStatusLine;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString VerifyLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RepositoryPath;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString LatestVerificationNote;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedLaunchRequestDetail;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString GeneratedExecutionDetail;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString RecognitionRunModeLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
FString ReviewPolicyRunModeLabel;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bVerifyEnabled = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasResolvedPath = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bDidRoundTripPass = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bSaveSucceeded = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bLoadSucceeded = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bCountsMatched = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bStateMatched = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bIntegrityMatched = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bDerivedMatched = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasGeneratedLaunchRequest = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasGeneratedExecutionTarget = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bCanExecuteGeneratedLaunchRequest = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bGeneratedExecutionWillRefreshRequest = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasActiveRun = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasLiveAttemptTimer = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasRunnableCurrentCase = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasRecognitionStatus = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasRecognitionDetail = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasReviewPolicyStatus = false;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
bool bHasReviewPolicyDetail = false;
bool IsStructurallyValid() const
{
return !StatusLine.IsEmpty()
|| !DetailLine.IsEmpty()
|| bVerifyEnabled
|| bHasRecognitionStatus
|| bHasReviewPolicyStatus
|| bDidRoundTripPass;
}
};
USTRUCT(BlueprintType)
struct FHyperTwistTrainingCoachDashboardSelectedQueueNavigationInspectSurface
{

View file

@ -72,7 +72,8 @@ Current correction call from the source-exposed audit and current execution refr
- the latest landed bounded `Phase 4` packet stays adjacent in that same retained-history dashboard lane and adds the dedicated method-drill recovery memory 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-memory text band directly without scraping text blocks or routing only through the broader selected-history and navigation surfaces
- the latest landed bounded `Phase 4` packet also closes the adjacent preferred template-launch plus recommended/follow-up preview action control band with a single composite inspect seam over those three already-landed action surfaces, so gameplay/Blueprint callers can inspect that whole action cluster without stitching three separate action getters together
- the latest landed bounded `Phase 4` packet deliberately chooses the next adjacent live dashboard consumer band and adds a single composite execution-action-control seam over attempt-result action enablement, run-control enablement, and queue-action enablement, so gameplay/Blueprint callers can inspect that whole execution-control cluster without stitching three separate control surfaces together
- with the retained-history text-band lane, the template-launch / preview action-control band, and the execution-action-control 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 text-band or action-control surfaces by drift
- the latest landed bounded `Phase 4` packet deliberately chooses another adjacent live dashboard consumer band and adds a single composite verification / recognition / review-policy seam over the already-landed verification action, repository verification status, recognition status, and review-policy status surfaces, so gameplay/Blueprint callers can inspect that whole status 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, and the verification / recognition / review-policy status 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 text-band or action-control/status 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,53 @@
# HyperTwist Phase 4 dashboard verification recognition review-policy 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 verification, repository verification, recognition, and review-policy cluster as one inspectable gameplay and Blueprint seam.
## Why this packet exists
`UHyperTwistCoachDashboardWidget` already exposed four adjacent status/action surfaces:
- `GetDisplayedVerificationActionInspectSurface()`
- `GetDisplayedRepositoryVerificationStatusInspectSurface()`
- `GetDisplayedRecognitionStatusInspectSurface()`
- `GetDisplayedReviewPolicyStatusInspectSurface()`
But callers that wanted to reason about that whole adjacent status cluster still had to stitch those four getters together manually even though the widget presents them as one nearby dashboard band.
## What changed
- added `FHyperTwistTrainingCoachDashboardVerificationRecognitionPolicyBandInspectSurface`
- added `GetDisplayedVerificationRecognitionPolicyBandInspectSurface()`
- composed the new surface entirely over the already-landed verification action, repository verification status, recognition status, and review-policy status 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 verification / recognition / review-policy dashboard band through one surface
- the verification action, repository verification, recognition, and review-policy status lines together
- verify label, repository path, latest verification note, generated launch/execution detail, and recognition/review-mode context
- round-trip verification posture, generated launch/execution posture, active-run/live-timer/runnable-case posture, and aggregate recognition/review-policy availability 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, and the verification / recognition / review-policy status band as landed baseline, then deliberately choose another adjacent live dashboard consumer band instead of reopening already-landed surfaces by drift.