Expose runtime generated-mode selector roster and option menu

This commit is contained in:
axiomlogicnexus 2026-05-09 05:10:44 +02:00
parent cbdf775721
commit a95231b77f
4 changed files with 118 additions and 2 deletions

View file

@ -1220,6 +1220,59 @@ UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachGeneratedModeSelectorAp
return FHyperTwistTrainingCoachGeneratedModeSelectorApplicationContextSurface();
}
FHyperTwistTrainingCoachGeneratedModeSelectorRosterSurface
UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachGeneratedModeSelectorRosterSurface(
UObject* WorldContextObject
)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))
{
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->GetActiveRunState();
FHyperTwistTrainingImportedRuntimeSelectionState ImportedRuntimeSelectionState;
TrainingSubsystem->TryGetActiveImportedRuntimeSelectionState(ImportedRuntimeSelectionState);
const FHyperTwistTrainingCoachGeneratedModeSelectorApplicationContextSurface
SelectorApplicationContextSurface =
GetActiveTrainingCoachGeneratedModeSelectorApplicationContextSurface(
WorldContextObject
);
return UHyperTwistTrainingCoachLibrary::DeriveCoachGeneratedModeSelectorRosterSurface(
RunState.ActiveDeck,
ImportedRuntimeSelectionState,
SelectorApplicationContextSurface
);
}
return FHyperTwistTrainingCoachGeneratedModeSelectorRosterSurface();
}
FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface
UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingCoachGeneratedModeSelectorOptionMenuSurface(
UObject* WorldContextObject,
const FString& SelectorId
)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))
{
const FHyperTwistTrainingRunState RunState = TrainingSubsystem->GetActiveRunState();
FHyperTwistTrainingImportedRuntimeSelectionState ImportedRuntimeSelectionState;
TrainingSubsystem->TryGetActiveImportedRuntimeSelectionState(ImportedRuntimeSelectionState);
const FHyperTwistTrainingCoachGeneratedModeSelectorRosterSurface SelectorRosterSurface =
GetActiveTrainingCoachGeneratedModeSelectorRosterSurface(WorldContextObject);
return UHyperTwistTrainingCoachLibrary::DeriveCoachGeneratedModeSelectorOptionMenuSurface(
RunState.ActiveDeck,
ImportedRuntimeSelectionState,
SelectorId,
SelectorRosterSurface
);
}
return FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface();
}
TArray<FHyperTwistTrainingMethodSegment> UHyperTwistTrainingRuntimeLibrary::GetActiveTrainingLearnerMethodSegments(UObject* WorldContextObject)
{
if (UHyperTwistTrainingSubsystem* TrainingSubsystem = GetTrainingSubsystem(WorldContextObject))

View file

@ -317,6 +317,17 @@ public:
static FHyperTwistTrainingCoachGeneratedModeSelectorApplicationContextSurface
GetActiveTrainingCoachGeneratedModeSelectorApplicationContextSurface(UObject* WorldContextObject);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachGeneratedModeSelectorRosterSurface
GetActiveTrainingCoachGeneratedModeSelectorRosterSurface(UObject* WorldContextObject);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach", meta = (WorldContext = "WorldContextObject"))
static FHyperTwistTrainingCoachGeneratedModeSelectorOptionMenuSurface
GetActiveTrainingCoachGeneratedModeSelectorOptionMenuSurface(
UObject* WorldContextObject,
const FString& SelectorId
);
UFUNCTION(BlueprintPure, Category = "HyperTwist|Training", meta = (WorldContext = "WorldContextObject"))
static TArray<FHyperTwistTrainingMethodSegment> GetActiveTrainingLearnerMethodSegments(UObject* WorldContextObject);

View file

@ -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 launch/execution context and generated-mode selector/application context surfaces over the already-cached active coach panel state, readiness/eligibility and verification/recognition/review-policy context surfaces, active run state, imported runtime selection state, and imported generated-mode launch-config posture, so gameplay/Blueprint callers can explain generated-mode request, execution, selector coverage, and stored-request refresh posture without reading raw request, selection, runtime-surface, or launch-config fields 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 roster and selector option-menu 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 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 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

View file

@ -0,0 +1,52 @@
# HyperTwist Phase 4 runtime-library generated-mode selector roster and option-menu 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 display contracts above the already-landed selector/application context surface.
## Why this packet exists
The prior runtime-library packet let world-context callers explain generated-mode request posture, execution readiness, selector coverage, and stored-request refresh posture.
But callers still had to inspect raw imported selector arrays and cached selector-choice payloads if they needed to explain:
- which selectors are currently unresolved
- which unresolved selectors still expose imported options
- what the selected value is for one selector
- which option entries are currently available for a chosen selector
That kept the runtime-library world-context seam behind the already-landed panel-widget and session-actor selector roster and option-menu display-contract lane.
## What changed
- added `GetActiveTrainingCoachGeneratedModeSelectorRosterSurface()`
- added `GetActiveTrainingCoachGeneratedModeSelectorOptionMenuSurface()`
- derived the selector roster surface from the active run deck, active imported runtime selection state, and the already-landed runtime-library selector/application context surface
- derived the selector option-menu surface from that same active run deck and imported runtime selection state, keyed by `SelectorId`, over the runtime-library selector roster 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 active selector roster posture
- the truthful per-selector imported option-menu posture
without reading raw selector arrays, selector-choice payloads, selected values, or per-option imported metadata 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 actionability and selector option dispatch surfaces, because those are the next truthful selector-interaction contracts above the newly-landed selector option-menu surface.