diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp index c75c686..7599d7e 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Private/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.cpp @@ -1273,6 +1273,59 @@ UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachGeneratedModeSelectorOp return FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface(); } +FHyperTwistTrainingCoachGeneratedModeSelectorOptionActionabilitySurface +UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachGeneratedModeSelectorOptionActionabilitySurface( + UObject* WorldContextObject, + const FString& SelectorId +) +{ + if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject)) + { + const FHyperTwistTrainingRunState RunState = TrainingSubsystem->GetActiveRunState(); + const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface OptionMenuSurface = + GetActiveTrainingCoachGeneratedModeSelectorOptionMenuSurface( + WorldContextObject, + SelectorId + ); + return UHyperTwistTrainingCoachLibrary::DeriveCoachGeneratedModeSelectorOptionActionabilitySurface( + RunState.ActiveDeck, + SelectorId, + OptionMenuSurface + ); + } + + return FHyperTwistTrainingCoachGeneratedModeSelectorOptionActionabilitySurface(); +} + +FHyperTwistTrainingCoachGeneratedModeSelectorOptionDispatchSurface +UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachGeneratedModeSelectorOptionDispatchSurface( + UObject* WorldContextObject, + const FString& SelectorId +) +{ + if (GetTrainingSubsystem(WorldContextObject) != nullptr) + { + const FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface OptionMenuSurface = + GetActiveTrainingCoachGeneratedModeSelectorOptionMenuSurface( + WorldContextObject, + SelectorId + ); + const FHyperTwistTrainingCoachGeneratedModeSelectorOptionActionabilitySurface + OptionActionabilitySurface = + GetActiveTrainingCoachGeneratedModeSelectorOptionActionabilitySurface( + WorldContextObject, + SelectorId + ); + return UHyperTwistTrainingCoachLibrary::DeriveCoachGeneratedModeSelectorOptionDispatchSurface( + SelectorId, + OptionMenuSurface, + OptionActionabilitySurface + ); + } + + return FHyperTwistTrainingCoachGeneratedModeSelectorOptionDispatchSurface(); +} + TArray UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingLearnerMethodSegments(UObject* WorldContextObject) { if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject)) diff --git a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h index 4036ba8..b3ec1ea 100644 --- a/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h +++ b/UnrealHyperTwist/Source/UnrealHyperTwist/Public/HyperTwistTraining/HyperTwistTrainingRuntimeLibrary.h @@ -328,6 +328,20 @@ public: const FString& SelectorId ); + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject")) + static FHyperTwistTrainingCoachGeneratedModeSelectorOptionActionabilitySurface + GetActiveTrainingCoachGeneratedModeSelectorOptionActionabilitySurface( + UObject* WorldContextObject, + const FString& SelectorId + ); + + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject")) + static FHyperTwistTrainingCoachGeneratedModeSelectorOptionDispatchSurface + GetActiveTrainingCoachGeneratedModeSelectorOptionDispatchSurface( + UObject* WorldContextObject, + const FString& SelectorId + ); + UFUNCTION(BlueprintPure, Category = "HyperTwist|Training", meta = (WorldContext = "WorldContextObject")) static TArray GetActiveTrainingLearnerMethodSegments(UObject* WorldContextObject); diff --git a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md index 7484542..8e30143 100644 --- a/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md +++ b/docs/HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md @@ -68,8 +68,8 @@ Current correction call from the source-exposed audit and current execution refr - the imported generated-mode gap is closed; request/config/selection plumbing and the bounded clean-room executor are already landed in first-party code - the latest landed bounded `Phase 4` packet closes the retained-idle comparison/outcome actionability gap at the end of the recognition-assisted coach-to-review continuity lane, and the final retained-surface confirmation pass now leaves that closure lane functionally complete - the retained idle widget surface now keeps retained comparison and decision history inspectable without continuing to advertise live launch or guidance-outcome actions once the coach-to-review loop has already collapsed to truthful closed-loop idle - - the latest landed bounded `Phase 4` packet stays on that same deliberate `UHyperTwistTrainingRuntimeLibrary` world-context consumer lane and adds active generated-mode selector roster and selector option-menu surfaces over the already-landed generated-mode selector/application context surface plus active run-state and imported selector-choice posture, so gameplay/Blueprint callers can explain selector resolution, unresolved coverage, selected values, and per-selector imported option availability without reading raw selector arrays or cached choice payloads directly - - the current next bounded packet should stay on that same runtime-library consumer lane only if a real world-context gameplay or Blueprint caller still needs one more thin derived coach/generated-mode display contract or displayed-action convenience helper over already-cached state; inside that lane the next aligned pair is the runtime-library generated-mode selector option actionability and selector option dispatch surfaces, otherwise choose the next roadmap lane deliberately instead of extending runtime-consumer widening by drift + - the latest landed bounded `Phase 4` packet stays on that same deliberate `UHyperTwistTrainingRuntimeLibrary` world-context consumer lane and adds active generated-mode selector option actionability and selector option dispatch surfaces over the already-landed selector option-menu surface plus active run-state deck, so gameplay/Blueprint callers can explain owned-case coverage, selection-only choices, direct-launch versus generated-choice dispatch posture, and current-selection dispatchability without reading raw case-lookup or option-detail arrays directly + - the current next bounded packet should stay on that same runtime-library consumer lane only if a real world-context gameplay or Blueprint caller still needs one more thin derived coach/generated-mode display contract or displayed-action convenience helper over already-cached state; inside that lane the next aligned pair is the runtime-library generated-mode selector option execution-impact and selector option request-alignment surfaces, otherwise choose the next roadmap lane deliberately instead of extending runtime-consumer widening 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 ## Current execution-reality references diff --git a/docs/arch/HYPERTWIST_PHASE4_RUNTIME_LIBRARY_GENERATED_MODE_SELECTOR_OPTION_ACTIONABILITY_DISPATCH_SURFACE_PACKET_2026-05-09.md b/docs/arch/HYPERTWIST_PHASE4_RUNTIME_LIBRARY_GENERATED_MODE_SELECTOR_OPTION_ACTIONABILITY_DISPATCH_SURFACE_PACKET_2026-05-09.md new file mode 100644 index 0000000..4bec590 --- /dev/null +++ b/docs/arch/HYPERTWIST_PHASE4_RUNTIME_LIBRARY_GENERATED_MODE_SELECTOR_OPTION_ACTIONABILITY_DISPATCH_SURFACE_PACKET_2026-05-09.md @@ -0,0 +1,52 @@ +# HyperTwist Phase 4 runtime-library generated-mode selector option actionability and dispatch surface packet + +- bounded Phase `4` runtime-consumer slice +- date: `2026-05-09` + +## Intent + +Stay on the deliberate `UHyperTwistTrainingRuntimeLibrary` world-context consumer lane and expose the next truthful generated-mode selector interaction contracts above the already-landed selector option-menu surface. + +## Why this packet exists + +The prior runtime-library packet let world-context callers explain selector resolution, unresolved coverage, selected values, and per-selector imported option availability. + +But callers still had to inspect raw case-lookup results and option-detail arrays if they needed to explain: + +- which options currently map to owned cases +- which options remain selection-only +- whether the current selection supports direct case launch +- whether choosing an option routes through direct owned-case launch or generated-choice application + +That kept the runtime-library world-context seam behind the already-landed panel-widget and session-actor selector option actionability and dispatch display-contract lane. + +## What changed + +- added `GetActiveTrainingCoachGeneratedModeSelectorOptionActionabilitySurface()` +- added `GetActiveTrainingCoachGeneratedModeSelectorOptionDispatchSurface()` +- derived the selector option actionability surface from the active run deck, selected `SelectorId`, and the already-landed runtime-library selector option-menu surface +- derived the selector option dispatch surface from that same `SelectorId`, the runtime-library selector option-menu surface, and the runtime-library selector option actionability surface +- kept the runtime-library lane purely compositional over already-cached coach/generated-mode state without reopening backend derivation + +## Files + +- `C:\HyperTwist\UnrealHyperTwist\Source\UnrealHyperTwist\Public\HyperTwistTraining\HyperTwistTrainingRuntimeLibrary.h` +- `C:\HyperTwist\UnrealHyperTwist\Source\UnrealHyperTwist\Private\HyperTwistTraining\HyperTwistTrainingRuntimeLibrary.cpp` +- `C:\HyperTwist\docs\HYPERTWIST_ROADMAP_OVERHAUL_EXPANSION_GUIDE.md` + +## Outcome + +World-context gameplay and Blueprint callers can now ask the runtime library for: + +- the truthful per-option owned-case coverage posture +- the truthful per-option dispatch posture for the active selector + +without reading raw case-lookup results, option-entry arrays, or current-selection coverage state directly. + +## Validation + +- full `Development Editor | Win64` MSBuild on `UnrealHyperTwist.sln` + +## Next clean slice + +Stay on this runtime-library consumer lane only if a real world-context caller still needs one more thin derived coach/generated-mode display contract or displayed-action convenience helper over already-cached state. The next aligned pair inside that lane would be the runtime-library generated-mode selector option execution-impact and selector option request-alignment surfaces, because those are the next truthful selector-execution contracts above the newly-landed selector option actionability and dispatch surfaces.