Collapse stale dashboard idle recovery surface
This commit is contained in:
parent
2dda2ecd87
commit
fda93534d6
2 changed files with 152 additions and 3 deletions
|
|
@ -13536,6 +13536,23 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
|
|||
|| CachedCoachSchedulePolicySummary.bNeedsManualRescheduleReview
|
||||
|| CachedCoachQueueExecutionSummary.bHasOutstandingDeferredWork
|
||||
|| CachedCoachQueueExecutionSummary.bHasCompletionGap;
|
||||
const bool bShouldPresentClosedLoopIdleDashboard =
|
||||
!bHasLiveAttemptTimer
|
||||
&& !bHasActiveRun
|
||||
&& !CachedCoachPanelState.bCanStartQueuedRun
|
||||
&& !CachedCoachPanelState.bCanStartCoachFollowUpRun
|
||||
&& !CachedCoachPanelState.bCanStartCoachRecommendedRun
|
||||
&& !CachedCoachPanelState.bHasCoachGuidance
|
||||
&& !CachedCoachPanelState.bHasFollowUpGuidance
|
||||
&& CachedCoachPanelState.TotalQueueEntryCount == 0
|
||||
&& CachedCoachPanelState.ReadyQueueEntryCount == 0
|
||||
&& CachedCoachPanelState.DeferredQueueEntryCount == 0
|
||||
&& !bHasQueueRecoveryFriction
|
||||
&& (
|
||||
bQueueRecoveryMemorySource
|
||||
|| !CachedCoachPanelState.PreferredGuidanceSourceLabel.IsEmpty()
|
||||
|| HandoffRecommendationKind
|
||||
!= HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None);
|
||||
FString QueueRecoveryStatusLine = bQueueRecoveryMemorySource
|
||||
? FString::Printf(
|
||||
TEXT("Recovery: %s lane | Source: %s | Action: %s | Mode: %s | Selection: %s | Upstream: %s | Learned: %s | Stance: %s%s%s"),
|
||||
|
|
@ -13690,6 +13707,38 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
|
|||
: TEXT("trusted broad redirect recovery")
|
||||
);
|
||||
}
|
||||
if (bShouldPresentClosedLoopIdleDashboard)
|
||||
{
|
||||
QueueRecoveryStatusLine =
|
||||
TEXT("Recovery: closed and idle; no queue-memory recovery override is active.");
|
||||
QueueRecoveryDetailLine =
|
||||
TEXT("Recovery detail: no deferred queue work, no completion gap, and no actionable continuation remains in the retained handoff surface.");
|
||||
HandoffRecommendationKind = HyperTwistCoachDashboardWidgetInternal::EHandoffRecommendationKind::None;
|
||||
DisplayedCoachHandoffRecommendationKind = EHyperTwistTrainingCoachHandoffKind::None;
|
||||
bDisplayedCoachHandoffRecommendationUsedDeferredFirstSuppressionSignal = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedMethodDrillWeighting = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedAlignedTightPacketAcceptedHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedAlignedBroadPacketAcceptedHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedAcceptedAlignedTightPacketOutcomeTrust = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedAcceptedAlignedBroadPacketOutcomeTrust = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedTightPacketOutcomeTrust = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedBroadPacketOutcomeTrust = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedTightPacketOutcomeHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedBroadPacketOutcomeHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedTightPacketExactHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedBroadPacketExactHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedTightPacketExactOutcomeHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedBroadPacketExactOutcomeHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedTightPacketExactOutcomeAcceptedHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedBroadPacketExactOutcomeAcceptedHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedTightPacketExactOutcomeReliableHistory = false;
|
||||
bDisplayedCoachHandoffRecommendationUsedReliableAcceptedAlignedBroadPacketExactOutcomeReliableHistory = false;
|
||||
DisplayedCoachHandoffMethodDrillRecoveryMemoryStartActionSourceLabel.Reset();
|
||||
CoachHandoffRecommendationStatusLine =
|
||||
TEXT("Handoff recommendation: none; the coach-to-review loop is idle.");
|
||||
CoachHandoffRecommendationDetailLine =
|
||||
TEXT("Handoff detail: retained closure history remains inspectable, but no queued, follow-up, or recommended continuation is active.");
|
||||
}
|
||||
RecordMethodDrillRecoveryMemoryHistorySnapshot(
|
||||
QueueRecoveryWeighting,
|
||||
QueueRecoveryStatusLine,
|
||||
|
|
@ -14155,7 +14204,8 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
|
|||
: TEXT("Drill recovery memory detail: retained upstream strong-vs-weak drill-recovery pressure, resulting generated packet lane, and resulting plan-source vs generated-plan alignment will accumulate here for later comparison.");
|
||||
const FString PreferredDeferredRecoveryEntryId = FindFirstDeferredQueueEntryId();
|
||||
const bool bCanApplyQueueRecovery =
|
||||
!bHasLiveAttemptTimer
|
||||
!bShouldPresentClosedLoopIdleDashboard
|
||||
&& !bHasLiveAttemptTimer
|
||||
&& (bQueueRecoveryMemorySource || bHasQueueRecoveryFriction)
|
||||
&& (!PreferredDeferredRecoveryEntryId.IsEmpty()
|
||||
|| CachedCoachPanelState.bCanStartQueuedRun
|
||||
|
|
@ -14168,7 +14218,9 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
|
|||
&& (CachedCoachPanelState.bCanStartCoachFollowUpRun
|
||||
|| CachedCoachPanelState.bCanStartCoachRecommendedRun)));
|
||||
const FString QueueRecoveryActionLabel =
|
||||
!PreferredDeferredRecoveryEntryId.IsEmpty() && !bPreferLaunchRecoveryAction
|
||||
bShouldPresentClosedLoopIdleDashboard
|
||||
? TEXT("No Recovery Action")
|
||||
: (!PreferredDeferredRecoveryEntryId.IsEmpty() && !bPreferLaunchRecoveryAction
|
||||
? (bQueueRecoveryFollowUp
|
||||
? TEXT("Promote Follow-Up Recovery")
|
||||
: (bQueueRecoveryRecommended
|
||||
|
|
@ -14180,7 +14232,7 @@ void UHyperTwistCoachDashboardWidget::UpdateDashboardPresentation()
|
|||
? TEXT("Start Recommended Recovery")
|
||||
: (CachedCoachPanelState.bCanStartQueuedRun
|
||||
? TEXT("Launch Queue Recovery")
|
||||
: TEXT("Apply Recovery"))));
|
||||
: TEXT("Apply Recovery")))));
|
||||
const FString GuidancePreviewSelectionLine =
|
||||
SelectedGuidancePreviewCase != nullptr && ActivePreviewDeck != nullptr
|
||||
? FString::Printf(
|
||||
|
|
|
|||
|
|
@ -0,0 +1,97 @@
|
|||
# HyperTwist Phase 4 post-review dashboard idle-surface packet
|
||||
|
||||
Created on `2026-05-06`
|
||||
|
||||
Status:
|
||||
|
||||
- first-party HyperTwist packet
|
||||
- bounded Phase `4` coach-to-review validation slice
|
||||
|
||||
## Purpose
|
||||
|
||||
This packet closes the last stale dashboard narration seam after the recognition-assisted coach-to-review loop is already idle-clean underneath.
|
||||
|
||||
The open tasks are:
|
||||
|
||||
- stop letting retained queue-recovery memory and retained handoff history read as live continuation pressure once there is no active run, no active queue, and no remaining review pressure
|
||||
- keep retained closure history inspectable without leaving the dashboard status and action surface in a ghost-recovery posture
|
||||
|
||||
It is not:
|
||||
|
||||
- a new repository-state packet
|
||||
- a new queue-state packet
|
||||
- a new coach-brief derivation packet
|
||||
- a dashboard layout redesign
|
||||
|
||||
## Scope
|
||||
|
||||
Bounded lane:
|
||||
|
||||
- detect the closed-loop idle dashboard state after the already-landed post-review idle-closure logic has removed real continuation work
|
||||
- collapse queue-recovery and handoff recommendation narration back to explicit idle wording in that state
|
||||
- disable the recovery action button in that state so the visible action surface matches the already-idle runtime state
|
||||
|
||||
Out of scope:
|
||||
|
||||
- changing retained repository context ownership
|
||||
- changing queue execution history retention
|
||||
- changing review-plan persistence
|
||||
- widening into broader consumer/UI work
|
||||
|
||||
## Why this was the right next packet
|
||||
|
||||
Before this slice:
|
||||
|
||||
- repository-backed carryover, clear-run, queue-idle, idle-review-plan, completed-review, and post-review idle-closure packets were already landed
|
||||
- the subsystem-level panel state could already collapse to true idle once the review loop was exhausted
|
||||
|
||||
But one stale surface still remained:
|
||||
|
||||
- the dashboard widget could still narrate recovery-memory and handoff recommendation pressure from retained history, even when the underlying coach panel state no longer exposed any live continuation action
|
||||
|
||||
That meant:
|
||||
|
||||
- product state could already be truthful underneath
|
||||
- while the widget still looked like there was recovery or handoff work left to do
|
||||
|
||||
So the next honest move was:
|
||||
|
||||
- keep the retained history for inspection
|
||||
- but collapse the visible queue-recovery and handoff recommendation surface back to explicit idle once the loop is genuinely closed
|
||||
|
||||
## What landed
|
||||
|
||||
Primary code changes:
|
||||
|
||||
- `UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistCoachDashboardWidget.cpp`
|
||||
- `UpdateDashboardPresentation()` now detects the retained closed-loop idle dashboard state
|
||||
- queue-recovery status/detail text is replaced with explicit idle wording in that state
|
||||
- handoff recommendation status/detail text is replaced with explicit idle wording in that state
|
||||
- retained handoff recommendation display flags are cleared in that state
|
||||
- the recovery action button is relabeled and disabled in that state
|
||||
|
||||
## Product effect
|
||||
|
||||
The dashboard surface is now aligned with the already-landed state closures:
|
||||
|
||||
- exhausted review programs no longer leave recovery-memory narration behind on the dashboard
|
||||
- retained closure history remains inspectable without masquerading as live queue or handoff pressure
|
||||
- the visible recovery button no longer implies that an idle-closed loop still has an action to apply
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- when there is no active run, no active queue, no pending review plan, no carryover pressure, and no actionable coach continuation, the dashboard does not narrate queue recovery or handoff recommendation pressure from retained history
|
||||
- the dashboard presents explicit idle wording for those surfaces instead
|
||||
- the recovery action button is disabled in that state
|
||||
- retained closure history remains inspectable
|
||||
- full product build succeeds
|
||||
|
||||
## Validation checklist
|
||||
|
||||
1. build `UnrealHyperTwist.sln` / `UnrealHyperTwistEditor`
|
||||
2. confirm exhausted post-review retained history no longer presents recovery-memory narration as live pressure
|
||||
3. confirm handoff recommendation narration also collapses to explicit idle wording
|
||||
4. confirm the recovery action button is disabled and truthfully labeled in that state
|
||||
5. confirm retained closure history still exists for inspection
|
||||
|
||||
That is the packet.
|
||||
Loading…
Add table
Reference in a new issue